diff options
author | Brandt Bucher <brandt@python.org> | 2021-07-28 00:51:49 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-28 00:51:49 (GMT) |
commit | 38ddc8beb38d9a685de296a58b0741850e4853e5 (patch) | |
tree | bc7cbde77757e4da6518b8d7657806625b18f0d2 /Lib/test | |
parent | 196998e220d6ca030e5a1c8ad63fcaed8e049a98 (diff) | |
download | cpython-38ddc8beb38d9a685de296a58b0741850e4853e5.zip cpython-38ddc8beb38d9a685de296a58b0741850e4853e5.tar.gz cpython-38ddc8beb38d9a685de296a58b0741850e4853e5.tar.bz2 |
bpo-44600: Refactor new tracing tests (GH-27396)
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/test_patma.py | 141 |
1 files changed, 74 insertions, 67 deletions
diff --git a/Lib/test/test_patma.py b/Lib/test/test_patma.py index 96c1726..aa18e29 100644 --- a/Lib/test/test_patma.py +++ b/Lib/test/test_patma.py @@ -3059,78 +3059,85 @@ class TestValueErrors(unittest.TestCase): class TestTracing(unittest.TestCase): - def _test_trace(self, func, expected_linenos, *f_args): - actual_linenos = set() + @staticmethod + def _trace(func, *args, **kwargs): + actual_linenos = [] + def trace(frame, event, arg): - if frame.f_code.co_name == func.__name__: + if event == "line" and frame.f_code.co_name == func.__name__: + assert arg is None relative_lineno = frame.f_lineno - func.__code__.co_firstlineno - actual_linenos.add(relative_lineno) + actual_linenos.append(relative_lineno) return trace + old_trace = sys.gettrace() sys.settrace(trace) - func(*f_args) - sys.settrace(None) - self.assertSetEqual(actual_linenos, expected_linenos) - - def test_default_case_traces_correctly_a(self): - def default_no_assign(command): # 0 - match command.split(): # 1 - case ["go", direction] if direction in "nesw": # 2 - return f"go {direction}" # 3 - case ["go", _]: # 4 - return "no go" # 5 - case _: # 6 - return "default" # 7 - - self._test_trace(default_no_assign, {0, 1, 2, 3}, "go n") - self._test_trace(default_no_assign, {0, 1, 2, 4, 5}, "go x") - self._test_trace(default_no_assign, {0, 1, 2, 4, 6, 7}, "spam") - - def test_default_case_traces_correctly_b(self): - def default_wildcard_assign(command): # 0 - match command.split(): # 1 - case ["go", direction] if direction in "nesw": # 2 - return f"go {direction}" # 3 - case ["go", _]: # 4 - return "no go" # 5 - case x: # 6 - return x # 7 - - self._test_trace(default_wildcard_assign, {0, 1, 2, 3}, "go n") - self._test_trace(default_wildcard_assign, {0, 1, 2, 4, 5}, "go x") - self._test_trace(default_wildcard_assign, {0, 1, 2, 4, 6, 7}, "spam") - - def test_default_case_traces_correctly_c(self): - def no_default(command): # 0 - match command.split(): # 1 - case ["go", direction] if direction in "nesw": # 2 - return f"go {direction}" # 3 - case ["go", _]: # 4 - return "no go" # 5 - - self._test_trace(no_default, {0, 1, 2, 3}, "go n") - self._test_trace(no_default, {0, 1, 2, 4, 5}, "go x") - self._test_trace(no_default, {0, 1, 2, 4}, "spam") - - def test_default_case_traces_correctly_d(self): - def only_default_no_assign(command): # 0 - match command.split(): # 1 - case _: # 2 - return "default" # 3 - - self._test_trace(only_default_no_assign, {0, 1, 2, 3}, "go n") - self._test_trace(only_default_no_assign, {0, 1, 2, 3} , "go x") - self._test_trace(only_default_no_assign, {0, 1, 2, 3}, "spam") - - def test_default_case_traces_correctly_e(self): - def only_default_wildcard_assign(command): # 0 - match command.split(): # 1 - case x: # 2 - return x # 3 - - self._test_trace(only_default_wildcard_assign, {0, 1, 2, 3}, "go n") - self._test_trace(only_default_wildcard_assign, {0, 1, 2, 3} , "go x") - self._test_trace(only_default_wildcard_assign, {0, 1, 2, 3}, "spam") + try: + func(*args, **kwargs) + finally: + sys.settrace(old_trace) + return actual_linenos + + def test_default_wildcard(self): + def f(command): # 0 + match command.split(): # 1 + case ["go", direction] if direction in "nesw": # 2 + return f"go {direction}" # 3 + case ["go", _]: # 4 + return "no go" # 5 + case _: # 6 + return "default" # 7 + + self.assertListEqual(self._trace(f, "go n"), [1, 2, 3]) + self.assertListEqual(self._trace(f, "go x"), [1, 2, 4, 5]) + self.assertListEqual(self._trace(f, "spam"), [1, 2, 4, 6, 7]) + + def test_default_capture(self): + def f(command): # 0 + match command.split(): # 1 + case ["go", direction] if direction in "nesw": # 2 + return f"go {direction}" # 3 + case ["go", _]: # 4 + return "no go" # 5 + case x: # 6 + return x # 7 + + self.assertListEqual(self._trace(f, "go n"), [1, 2, 3]) + self.assertListEqual(self._trace(f, "go x"), [1, 2, 4, 5]) + self.assertListEqual(self._trace(f, "spam"), [1, 2, 4, 6, 7]) + + def test_no_default(self): + def f(command): # 0 + match command.split(): # 1 + case ["go", direction] if direction in "nesw": # 2 + return f"go {direction}" # 3 + case ["go", _]: # 4 + return "no go" # 5 + + self.assertListEqual(self._trace(f, "go n"), [1, 2, 3]) + self.assertListEqual(self._trace(f, "go x"), [1, 2, 4, 5]) + self.assertListEqual(self._trace(f, "spam"), [1, 2, 4]) + + def test_only_default_wildcard(self): + def f(command): # 0 + match command.split(): # 1 + case _: # 2 + return "default" # 3 + + self.assertListEqual(self._trace(f, "go n"), [1, 2, 3]) + self.assertListEqual(self._trace(f, "go x"), [1, 2, 3]) + self.assertListEqual(self._trace(f, "spam"), [1, 2, 3]) + + def test_only_default_capture(self): + def f(command): # 0 + match command.split(): # 1 + case x: # 2 + return x # 3 + + self.assertListEqual(self._trace(f, "go n"), [1, 2, 3]) + self.assertListEqual(self._trace(f, "go x"), [1, 2, 3]) + self.assertListEqual(self._trace(f, "spam"), [1, 2, 3]) + if __name__ == "__main__": """ |