diff options
author | ostr00000 <ostr00000@gmail.com> | 2023-02-13 22:50:13 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-13 22:50:13 +0100 |
commit | ade4c68d86f30d58d35e3eaf4c530af780bbf7e2 (patch) | |
tree | f8228e8d87ca9039e86609147a7d89c2dce0fbab /tests/test_utils.py | |
parent | e4f594fbd78c8014d921c4feb3d53e5fba509d61 (diff) | |
download | astroid-git-ade4c68d86f30d58d35e3eaf4c530af780bbf7e2.tar.gz |
Fix `are_exclusive` function for walrus operator (#2023)
Diffstat (limited to 'tests/test_utils.py')
-rw-r--r-- | tests/test_utils.py | 77 |
1 files changed, 76 insertions, 1 deletions
diff --git a/tests/test_utils.py b/tests/test_utils.py index 60d58662..417b0dc0 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -4,7 +4,10 @@ import unittest -from astroid import Uninferable, builder, nodes +import pytest + +from astroid import Uninferable, builder, extract_node, nodes +from astroid.const import PY38_PLUS from astroid.exceptions import InferenceError @@ -30,6 +33,78 @@ class InferenceUtil(unittest.TestCase): self.assertEqual(nodes.are_exclusive(xass1, xnames[1]), False) self.assertEqual(nodes.are_exclusive(xass1, xnames[2]), False) + @pytest.mark.skipif(not PY38_PLUS, reason="needs assignment expressions") + def test_not_exclusive_walrus_operator(self) -> None: + node_if, node_body, node_or_else = extract_node( + """ + if val := True: #@ + print(val) #@ + else: + print(val) #@ + """ + ) + node_if: nodes.If + node_walrus = next(node_if.nodes_of_class(nodes.NamedExpr)) + + assert nodes.are_exclusive(node_walrus, node_if) is False + assert nodes.are_exclusive(node_walrus, node_body) is False + assert nodes.are_exclusive(node_walrus, node_or_else) is False + + assert nodes.are_exclusive(node_if, node_body) is False + assert nodes.are_exclusive(node_if, node_or_else) is False + assert nodes.are_exclusive(node_body, node_or_else) is True + + @pytest.mark.skipif(not PY38_PLUS, reason="needs assignment expressions") + def test_not_exclusive_walrus_multiple(self) -> None: + node_if, body_1, body_2, or_else_1, or_else_2 = extract_node( + """ + if (val := True) or (val_2 := True): #@ + print(val) #@ + print(val_2) #@ + else: + print(val) #@ + print(val_2) #@ + """ + ) + node_if: nodes.If + walruses = list(node_if.nodes_of_class(nodes.NamedExpr)) + + assert nodes.are_exclusive(node_if, walruses[0]) is False + assert nodes.are_exclusive(node_if, walruses[1]) is False + + assert nodes.are_exclusive(walruses[0], walruses[1]) is False + + assert nodes.are_exclusive(walruses[0], body_1) is False + assert nodes.are_exclusive(walruses[0], body_2) is False + assert nodes.are_exclusive(walruses[1], body_1) is False + assert nodes.are_exclusive(walruses[1], body_2) is False + + assert nodes.are_exclusive(walruses[0], or_else_1) is False + assert nodes.are_exclusive(walruses[0], or_else_2) is False + assert nodes.are_exclusive(walruses[1], or_else_1) is False + assert nodes.are_exclusive(walruses[1], or_else_2) is False + + @pytest.mark.skipif(not PY38_PLUS, reason="needs assignment expressions") + def test_not_exclusive_walrus_operator_nested(self) -> None: + node_if, node_body, node_or_else = extract_node( + """ + if all((last_val := i) % 2 == 0 for i in range(10)): #@ + print(last_val) #@ + else: + print(last_val) #@ + """ + ) + node_if: nodes.If + node_walrus = next(node_if.nodes_of_class(nodes.NamedExpr)) + + assert nodes.are_exclusive(node_walrus, node_if) is False + assert nodes.are_exclusive(node_walrus, node_body) is False + assert nodes.are_exclusive(node_walrus, node_or_else) is False + + assert nodes.are_exclusive(node_if, node_body) is False + assert nodes.are_exclusive(node_if, node_or_else) is False + assert nodes.are_exclusive(node_body, node_or_else) is True + def test_if(self) -> None: module = builder.parse( """ |