|
| 1 | +import re |
1 | 2 | import types |
2 | 3 | import unittest |
3 | 4 | import weakref |
@@ -159,5 +160,45 @@ def test_locals_clear_locals(self): |
159 | 160 | self.assertEqual(inner.f_locals, {}) |
160 | 161 |
|
161 | 162 |
|
| 163 | +class ReprTest(unittest.TestCase): |
| 164 | + """ |
| 165 | + Tests for repr(frame). |
| 166 | + """ |
| 167 | + |
| 168 | + def test_repr(self): |
| 169 | + def outer(): |
| 170 | + x = 5 |
| 171 | + y = 6 |
| 172 | + def inner(): |
| 173 | + z = x + 2 |
| 174 | + 1/0 |
| 175 | + t = 9 |
| 176 | + return inner() |
| 177 | + |
| 178 | + offset = outer.__code__.co_firstlineno |
| 179 | + try: |
| 180 | + outer() |
| 181 | + except ZeroDivisionError as e: |
| 182 | + tb = e.__traceback__ |
| 183 | + frames = [] |
| 184 | + while tb: |
| 185 | + frames.append(tb.tb_frame) |
| 186 | + tb = tb.tb_next |
| 187 | + else: |
| 188 | + self.fail("should have raised") |
| 189 | + |
| 190 | + f_this, f_outer, f_inner = frames |
| 191 | + file_repr = re.escape(repr(__file__)) |
| 192 | + self.assertRegex(repr(f_this), |
| 193 | + r"^<frame at 0x[0-9a-fA-F]+, file %s, line %d, code test_repr>$" |
| 194 | + % (file_repr, offset + 23)) |
| 195 | + self.assertRegex(repr(f_outer), |
| 196 | + r"^<frame at 0x[0-9a-fA-F]+, file %s, line %d, code outer>$" |
| 197 | + % (file_repr, offset + 7)) |
| 198 | + self.assertRegex(repr(f_inner), |
| 199 | + r"^<frame at 0x[0-9a-fA-F]+, file %s, line %d, code inner>$" |
| 200 | + % (file_repr, offset + 5)) |
| 201 | + |
| 202 | + |
162 | 203 | if __name__ == "__main__": |
163 | 204 | unittest.main() |
0 commit comments