[Python-checkins] bpo-44600: Refactor new tracing tests (GH-27396) (GH-27404)

ambv webhook-mailer at python.org
Wed Jul 28 08:38:58 EDT 2021


https://github.com/python/cpython/commit/5502ee052fb4257ad7438dd1130c80e1a9c4bc7f
commit: 5502ee052fb4257ad7438dd1130c80e1a9c4bc7f
branch: 3.10
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: ambv <lukasz at langa.pl>
date: 2021-07-28T14:38:39+02:00
summary:

bpo-44600: Refactor new tracing tests (GH-27396) (GH-27404)

(cherry picked from commit 38ddc8beb38d9a685de296a58b0741850e4853e5)

Co-authored-by: Brandt Bucher <brandt at python.org>

files:
M Lib/test/test_patma.py

diff --git a/Lib/test/test_patma.py b/Lib/test/test_patma.py
index 96c1726b0f3c9..aa18e29e22548 100644
--- a/Lib/test/test_patma.py
+++ b/Lib/test/test_patma.py
@@ -3059,78 +3059,85 @@ class Keys:
 
 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__":
     """



More information about the Python-checkins mailing list