summaryrefslogtreecommitdiff
path: root/tests/test_utils.py
diff options
context:
space:
mode:
authorostr00000 <ostr00000@gmail.com>2023-02-13 22:50:13 +0100
committerGitHub <noreply@github.com>2023-02-13 22:50:13 +0100
commitade4c68d86f30d58d35e3eaf4c530af780bbf7e2 (patch)
treef8228e8d87ca9039e86609147a7d89c2dce0fbab /tests/test_utils.py
parente4f594fbd78c8014d921c4feb3d53e5fba509d61 (diff)
downloadastroid-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.py77
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(
"""