|
3 | 3 | import dataclasses
|
4 | 4 | import enum
|
5 | 5 | import inspect
|
| 6 | +import sys |
6 | 7 | import unittest
|
7 | 8 |
|
8 | 9 |
|
@@ -3056,6 +3057,81 @@ class Keys:
|
3056 | 3057 | self.assertIs(z, None)
|
3057 | 3058 |
|
3058 | 3059 |
|
| 3060 | +class TestTracing(unittest.TestCase): |
| 3061 | + |
| 3062 | + def _test_trace(self, func, expected_linenos, *f_args): |
| 3063 | + actual_linenos = set() |
| 3064 | + def trace(frame, event, arg): |
| 3065 | + if frame.f_code.co_name == func.__name__: |
| 3066 | + relative_lineno = frame.f_lineno - func.__code__.co_firstlineno |
| 3067 | + actual_linenos.add(relative_lineno) |
| 3068 | + return trace |
| 3069 | + |
| 3070 | + sys.settrace(trace) |
| 3071 | + func(*f_args) |
| 3072 | + sys.settrace(None) |
| 3073 | + self.assertSetEqual(actual_linenos, expected_linenos) |
| 3074 | + |
| 3075 | + def test_default_case_traces_correctly_a(self): |
| 3076 | + def default_no_assign(command): # 0 |
| 3077 | + match command.split(): # 1 |
| 3078 | + case ["go", direction] if direction in "nesw": # 2 |
| 3079 | + return f"go {direction}" # 3 |
| 3080 | + case ["go", _]: # 4 |
| 3081 | + return "no go" # 5 |
| 3082 | + case _: # 6 |
| 3083 | + return "default" # 7 |
| 3084 | + |
| 3085 | + self._test_trace(default_no_assign, {0, 1, 2, 3}, "go n") |
| 3086 | + self._test_trace(default_no_assign, {0, 1, 2, 4, 5}, "go x") |
| 3087 | + self._test_trace(default_no_assign, {0, 1, 2, 4, 6, 7}, "spam") |
| 3088 | + |
| 3089 | + def test_default_case_traces_correctly_b(self): |
| 3090 | + def default_wildcard_assign(command): # 0 |
| 3091 | + match command.split(): # 1 |
| 3092 | + case ["go", direction] if direction in "nesw": # 2 |
| 3093 | + return f"go {direction}" # 3 |
| 3094 | + case ["go", _]: # 4 |
| 3095 | + return "no go" # 5 |
| 3096 | + case x: # 6 |
| 3097 | + return x # 7 |
| 3098 | + |
| 3099 | + self._test_trace(default_wildcard_assign, {0, 1, 2, 3}, "go n") |
| 3100 | + self._test_trace(default_wildcard_assign, {0, 1, 2, 4, 5}, "go x") |
| 3101 | + self._test_trace(default_wildcard_assign, {0, 1, 2, 4, 6, 7}, "spam") |
| 3102 | + |
| 3103 | + def test_default_case_traces_correctly_c(self): |
| 3104 | + def no_default(command): # 0 |
| 3105 | + match command.split(): # 1 |
| 3106 | + case ["go", direction] if direction in "nesw": # 2 |
| 3107 | + return f"go {direction}" # 3 |
| 3108 | + case ["go", _]: # 4 |
| 3109 | + return "no go" # 5 |
| 3110 | + |
| 3111 | + self._test_trace(no_default, {0, 1, 2, 3}, "go n") |
| 3112 | + self._test_trace(no_default, {0, 1, 2, 4, 5}, "go x") |
| 3113 | + self._test_trace(no_default, {0, 1, 2, 4}, "spam") |
| 3114 | + |
| 3115 | + def test_default_case_traces_correctly_d(self): |
| 3116 | + def only_default_no_assign(command): # 0 |
| 3117 | + match command.split(): # 1 |
| 3118 | + case _: # 2 |
| 3119 | + return "default" # 3 |
| 3120 | + |
| 3121 | + self._test_trace(only_default_no_assign, {0, 1, 2, 3}, "go n") |
| 3122 | + self._test_trace(only_default_no_assign, {0, 1, 2, 3} , "go x") |
| 3123 | + self._test_trace(only_default_no_assign, {0, 1, 2, 3}
EDBE
, "spam") |
| 3124 | + |
| 3125 | + def test_default_case_traces_correctly_e(self): |
| 3126 | + def only_default_wildcard_assign(command): # 0 |
| 3127 | + match command.split(): # 1 |
| 3128 | + case x: # 2 |
| 3129 | + return x # 3 |
| 3130 | + |
| 3131 | + self._test_trace(only_default_wildcard_assign, {0, 1, 2, 3}, "go n") |
| 3132 | + self._test_trace(only_default_wildcard_assign, {0, 1, 2, 3} , "go x") |
| 3133 | + self._test_trace(only_default_wildcard_assign, {0, 1, 2, 3}, "spam") |
| 3134 | + |
3059 | 3135 | if __name__ == "__main__":
|
3060 | 3136 | """
|
3061 | 3137 | # From inside environment using this Python, with pyperf installed:
|
|
0 commit comments