Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 37 additions & 2 deletions Lib/test/test_ast/test_ast.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

from test import support
from test.support import os_helper
from test.support import skip_emscripten_stack_overflow, skip_wasi_stack_overflow
from test.support import skip_emscripten_stack_overflow, skip_wasi_stack_overflow, skip_if_unlimited_stack_size
from test.support.ast_helper import ASTTestMixin
from test.support.import_helper import ensure_lazy_imports
from test.test_ast.utils import to_tuple
Expand Down Expand Up @@ -994,10 +994,12 @@ def next(self):
enum._test_simple_enum(_Precedence, _ast_unparse._Precedence)

@support.cpython_only
@skip_if_unlimited_stack_size
@skip_wasi_stack_overflow()
@skip_emscripten_stack_overflow()
def test_ast_recursion_limit(self):
crash_depth = 500_000
# Android test devices have less memory.
crash_depth = 100_000 if sys.platform == "android" else 500_000
success_depth = 200
if _testinternalcapi is not None:
remaining = _testinternalcapi.get_c_recursion_remaining()
Expand Down Expand Up @@ -1118,6 +1120,7 @@ def test_pickling(self):
ast2 = pickle.loads(pickle.dumps(tree, protocol))
self.assertEqual(to_tuple(ast2), to_tuple(tree))

@skip_if_unlimited_stack_size
def test_copy_with_parents(self):
# gh-120108
code = """
Expand Down Expand Up @@ -1436,6 +1439,14 @@ def test_replace_reject_unknown_instance_fields(self):
self.assertIs(node.ctx, context)
self.assertRaises(AttributeError, getattr, node, 'unknown')

@unittest.expectedFailure # TODO: RUSTPYTHON; Wrong error message
def test_replace_non_str_kwarg(self):
node = ast.Name(id="x")
errmsg = "got an unexpected keyword argument <object object"
with self.assertRaisesRegex(TypeError, errmsg):
node.__replace__(**{object(): "y"})


class ASTHelpers_Test(unittest.TestCase):
maxDiff = None

Expand Down Expand Up @@ -1977,6 +1988,7 @@ def test_level_as_none(self):
self.assertIn('sleep', ns)

@unittest.skip("TODO: RUSTPYTHON; crash")
@skip_if_unlimited_stack_size
@skip_emscripten_stack_overflow()
def test_recursion_direct(self):
e = ast.UnaryOp(op=ast.Not(), lineno=0, col_offset=0, operand=ast.Constant(1))
Expand All @@ -1986,6 +1998,7 @@ def test_recursion_direct(self):
compile(ast.Expression(e), "<test>", "eval")

@unittest.skip("TODO: RUSTPYTHON; crash")
@skip_if_unlimited_stack_size
@skip_emscripten_stack_overflow()
def test_recursion_indirect(self):
e = ast.UnaryOp(op=ast.Not(), lineno=0, col_offset=0, operand=ast.Constant(1))
Expand Down Expand Up @@ -3323,6 +3336,28 @@ class _AllFieldTypes(ast.AST):
self.assertIs(obj.a, None)
self.assertEqual(obj.b, [])

@unittest.expectedFailure # TODO: RUSTPYTHON
def test_non_str_kwarg(self):
warn_msg = "got an unexpected keyword argument <object object"
with (
self.assertRaises(TypeError),
self.assertWarnsRegex(DeprecationWarning, warn_msg),
):
ast.Name(**{object(): 'y'})

class FakeStr:
def __init__(self, value):
self.value = value

def __hash__(self):
return hash(self.value)

def __eq__(self, other):
return isinstance(other, str) and self.value == other

with self.assertRaisesRegex(TypeError, "got multiple values for argument"):
ast.Name("x", **{FakeStr('id'): 'y'})


@support.cpython_only
class ModuleStateTests(unittest.TestCase):
Expand Down
Loading