GH-106135: Add more edge-"cases" to test_patma (GH-106271)

This commit is contained in:
Nikita Sobolev 2023-06-30 22:39:50 +03:00 committed by GitHub
parent 2062e11501
commit 904aef9942
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 131 additions and 0 deletions

View File

@ -2460,12 +2460,27 @@ class TestPatma(unittest.TestCase):
def __eq__(self, other):
return True
x = eq = Eq()
# None
y = None
match x:
case None:
y = 0
self.assertIs(x, eq)
self.assertEqual(y, None)
# True
y = None
match x:
case True:
y = 0
self.assertIs(x, eq)
self.assertEqual(y, None)
# False
y = None
match x:
case False:
y = 0
self.assertIs(x, eq)
self.assertEqual(y, None)
def test_patma_233(self):
x = False
@ -2668,6 +2683,83 @@ class TestPatma(unittest.TestCase):
setattr(c, "__attr", "spam") # setattr is needed because we're in a class scope
self.assertEqual(Outer().f(c), "spam")
def test_patma_250(self):
def f(x):
match x:
case {"foo": y} if y >= 0:
return True
case {"foo": y} if y < 0:
return False
self.assertIs(f({"foo": 1}), True)
self.assertIs(f({"foo": -1}), False)
def test_patma_251(self):
def f(v, x):
match v:
case x.attr if x.attr >= 0:
return True
case x.attr if x.attr < 0:
return False
case _:
return None
class X:
def __init__(self, attr):
self.attr = attr
self.assertIs(f(1, X(1)), True)
self.assertIs(f(-1, X(-1)), False)
self.assertIs(f(1, X(-1)), None)
def test_patma_252(self):
# Side effects must be possible in guards:
effects = []
def lt(x, y):
effects.append((x, y))
return x < y
res = None
match {"foo": 1}:
case {"foo": x} if lt(x, 0):
res = 0
case {"foo": x} if lt(x, 1):
res = 1
case {"foo": x} if lt(x, 2):
res = 2
self.assertEqual(res, 2)
self.assertEqual(effects, [(1, 0), (1, 1), (1, 2)])
def test_patma_253(self):
def f(v):
match v:
case [x] | x:
return x
self.assertEqual(f(1), 1)
self.assertEqual(f([1]), 1)
def test_patma_254(self):
def f(v):
match v:
case {"x": x} | x:
return x
self.assertEqual(f(1), 1)
self.assertEqual(f({"x": 1}), 1)
def test_patma_255(self):
x = []
match x:
case [] as z if z.append(None):
y = 0
case [None]:
y = 1
self.assertEqual(x, [None])
self.assertEqual(y, 1)
self.assertIs(z, x)
class TestSyntaxErrors(unittest.TestCase):
@ -2885,6 +2977,37 @@ class TestSyntaxErrors(unittest.TestCase):
pass
""")
def test_real_number_multiple_ops(self):
self.assert_syntax_error("""
match ...:
case 0 + 0j + 0:
pass
""")
def test_real_number_wrong_ops(self):
for op in ["*", "/", "@", "**", "%", "//"]:
with self.subTest(op=op):
self.assert_syntax_error(f"""
match ...:
case 0 {op} 0j:
pass
""")
self.assert_syntax_error(f"""
match ...:
case 0j {op} 0:
pass
""")
self.assert_syntax_error(f"""
match ...:
case -0j {op} 0:
pass
""")
self.assert_syntax_error(f"""
match ...:
case 0j {op} -0:
pass
""")
def test_wildcard_makes_remaining_patterns_unreachable_0(self):
self.assert_syntax_error("""
match ...:
@ -3067,6 +3190,14 @@ class TestTypeErrors(unittest.TestCase):
self.assertIs(y, None)
self.assertIs(z, None)
def test_class_pattern_not_type(self):
w = None
with self.assertRaises(TypeError):
match 1:
case max(0, 1):
w = 0
self.assertIsNone(w)
class TestValueErrors(unittest.TestCase):