diff options
author | Pierre Sassoulas <pierre.sassoulas@gmail.com> | 2023-03-05 23:13:19 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-05 23:13:19 +0100 |
commit | 47faf97318731eeaa0fc8b77e63a1df2b1e0fe3a (patch) | |
tree | 43214af119b5dda5ce77ee040842f2eb62fcdc8d /tests | |
parent | 857232e0c3788167de9f9889bac8548df21deb31 (diff) | |
download | astroid-git-47faf97318731eeaa0fc8b77e63a1df2b1e0fe3a.tar.gz |
Add 'TryStar' nodes from Python 3.11 #1516 (#2028)
Co-authored-by: Jacob Walls <jacobtylerwalls@gmail.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_group_exceptions.py | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/tests/test_group_exceptions.py b/tests/test_group_exceptions.py new file mode 100644 index 00000000..173c25ed --- /dev/null +++ b/tests/test_group_exceptions.py @@ -0,0 +1,111 @@ +# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html +# For details: https://github.com/PyCQA/astroid/blob/main/LICENSE +# Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt +import textwrap + +import pytest + +from astroid import ( + AssignName, + ExceptHandler, + For, + Name, + TryExcept, + Uninferable, + bases, + extract_node, +) +from astroid.const import PY311_PLUS +from astroid.context import InferenceContext +from astroid.nodes import Expr, Raise, TryStar + + +@pytest.mark.skipif(not PY311_PLUS, reason="Requires Python 3.11 or higher") +def test_group_exceptions() -> None: + node = extract_node( + textwrap.dedent( + """ + try: + raise ExceptionGroup("group", [ValueError(654)]) + except ExceptionGroup as eg: + for err in eg.exceptions: + if isinstance(err, ValueError): + print("Handling ValueError") + elif isinstance(err, TypeError): + print("Handling TypeError")""" + ) + ) + assert isinstance(node, TryExcept) + handler = node.handlers[0] + exception_group_block_range = (1, 4) + assert node.block_range(lineno=1) == exception_group_block_range + assert node.block_range(lineno=2) == (2, 2) + assert node.block_range(lineno=5) == (5, 9) + assert isinstance(handler, ExceptHandler) + assert handler.type.name == "ExceptionGroup" + children = list(handler.get_children()) + assert len(children) == 3 + exception_group, short_name, for_loop = children + assert isinstance(exception_group, Name) + assert exception_group.block_range(1) == exception_group_block_range + assert isinstance(short_name, AssignName) + assert isinstance(for_loop, For) + + +@pytest.mark.skipif(not PY311_PLUS, reason="Requires Python 3.11 or higher") +def test_star_exceptions() -> None: + node = extract_node( + textwrap.dedent( + """ + try: + raise ExceptionGroup("group", [ValueError(654)]) + except* ValueError: + print("Handling ValueError") + except* TypeError: + print("Handling TypeError") + else: + sys.exit(127) + finally: + sys.exit(0)""" + ) + ) + assert isinstance(node, TryStar) + assert isinstance(node.body[0], Raise) + assert node.block_range(1) == (1, 11) + assert node.block_range(2) == (2, 2) + assert node.block_range(3) == (3, 3) + assert node.block_range(4) == (4, 4) + assert node.block_range(5) == (5, 5) + assert node.block_range(6) == (6, 6) + assert node.block_range(7) == (7, 7) + assert node.block_range(8) == (8, 8) + assert node.block_range(9) == (9, 9) + assert node.block_range(10) == (10, 10) + assert node.block_range(11) == (11, 11) + assert node.handlers + handler = node.handlers[0] + assert isinstance(handler, ExceptHandler) + assert handler.type.name == "ValueError" + orelse = node.orelse[0] + assert isinstance(orelse, Expr) + assert orelse.value.args[0].value == 127 + final = node.finalbody[0] + assert isinstance(final, Expr) + assert final.value.args[0].value == 0 + + +@pytest.mark.skipif(not PY311_PLUS, reason="Requires Python 3.11 or higher") +def test_star_exceptions_infer_name() -> None: + trystar = extract_node( + """ +try: + 1/0 +except* ValueError: + pass""" + ) + name = "arbitraryName" + context = InferenceContext() + context.lookupname = name + stmts = bases._infer_stmts([trystar], context) + assert list(stmts) == [Uninferable] + assert context.lookupname == name |