diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2022-02-25 08:25:12 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-25 08:25:12 (GMT) |
commit | 98c3bea4d1c7335135e60946d0ec8cd5031fb6c0 (patch) | |
tree | 830637b74544b62d641c04517ed7c6ba6fae5700 | |
parent | ad6c7003e38a9f8bdf8d865fb5fa0f3c03690315 (diff) | |
download | cpython-98c3bea4d1c7335135e60946d0ec8cd5031fb6c0.zip cpython-98c3bea4d1c7335135e60946d0ec8cd5031fb6c0.tar.gz cpython-98c3bea4d1c7335135e60946d0ec8cd5031fb6c0.tar.bz2 |
bpo-46820: Refactor tests for ambiguous end of numerical literal (GH-31494)
-rw-r--r-- | Lib/test/test_grammar.py | 114 |
1 files changed, 25 insertions, 89 deletions
diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py index d35530e..2e29cdb 100644 --- a/Lib/test/test_grammar.py +++ b/Lib/test/test_grammar.py @@ -214,99 +214,35 @@ class TokenTests(unittest.TestCase): check("1e+", "invalid decimal literal") def test_end_of_numerical_literals(self): - def check(test): - with self.assertWarns(DeprecationWarning): - compile(test, "<testcase>", "eval") - - def check_error(test): - with warnings.catch_warnings(record=True) as w: - with self.assertRaises(SyntaxError): - compile(test, "<testcase>", "eval") - self.assertEqual(w, []) - - check_error("0xfand x") - check("0o7and x") - check("0b1and x") - check("9and x") - check("0and x") - check("1.and x") - check("1e3and x") - check("1jand x") - - check("0xfor x") - check("0o7or x") - check("0b1or x") - check("9or x") - check_error("0or x") - check("1.or x") - check("1e3or x") - check("1jor x") - - check("0xfin x") - check("0o7in x") - check("0b1in x") - check("9in x") - check("0in x") - check("1.in x") - check("1e3in x") - check("1jin x") - - check("0xfnot in x") - check("0o7not in x") - check("0b1not in x") - check("9not in x") - check("0not in x") - check("1.not in x") - check("1e3not in x") - check("1jnot in x") - - with warnings.catch_warnings(): - warnings.simplefilter('ignore', SyntaxWarning) - check("0xfis x") - check("0o7is x") - check("0b1is x") - check("9is x") - check("0is x") - check("1.is x") - check("1e3is x") - check("1jis x") - - check("0xfif x else y") - check("0o7if x else y") - check("0b1if x else y") - check("9if x else y") - check("0if x else y") - check("1.if x else y") - check("1e3if x else y") - check("1jif x else y") - - check_error("x if 0xfelse y") - check("x if 0o7else y") - check("x if 0b1else y") - check("x if 9else y") - check("x if 0else y") - check("x if 1.else y") - check("x if 1e3else y") - check("x if 1jelse y") + def check(test, error=False): + with self.subTest(expr=test): + if error: + with warnings.catch_warnings(record=True) as w: + with self.assertRaises(SyntaxError): + compile(test, "<testcase>", "eval") + self.assertEqual(w, []) + else: + with self.assertWarns(DeprecationWarning): + compile(test, "<testcase>", "eval") + + for num in "0xf", "0o7", "0b1", "9", "0", "1.", "1e3", "1j": + compile(num, "<testcase>", "eval") + check(f"{num}and x", error=(num == "0xf")) + check(f"{num}or x", error=(num == "0")) + check(f"{num}in x") + check(f"{num}not in x") + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', '"is" with a literal', + SyntaxWarning) + check(f"{num}is x") + check(f"{num}if x else y") + check(f"x if {num}else y", error=(num == "0xf")) + check(f"[{num}for x in ()]") + check(f"{num}spam", error=True) check("[0x1ffor x in ()]") check("[0x1for x in ()]") check("[0xfor x in ()]") - check("[0o7for x in ()]") - check("[0b1for x in ()]") - check("[9for x in ()]") - check("[1.for x in ()]") - check("[1e3for x in ()]") - check("[1jfor x in ()]") - - check_error("0xfspam") - check_error("0o7spam") - check_error("0b1spam") - check_error("9spam") - check_error("0spam") - check_error("1.spam") - check_error("1e3spam") - check_error("1jspam") def test_string_literals(self): x = ''; y = ""; self.assertTrue(len(x) == 0 and x == y) |