|
| 1 | +import traceback |
1 | 2 | import unittest |
2 | 3 |
|
| 4 | +from test.support import BrokenIter |
| 5 | + |
3 | 6 | # For scope testing. |
4 | 7 | g = "Global variable" |
5 | 8 |
|
@@ -72,8 +75,7 @@ def test_local_visibility(self): |
72 | 75 | self.assertEqual(actual, expected) |
73 | 76 | self.assertEqual(v, "Local variable") |
74 | 77 |
|
75 | | - # TODO: RUSTPYTHON |
76 | | - @unittest.expectedFailure |
| 78 | + @unittest.expectedFailure # TODO: RUSTPYTHON |
77 | 79 | def test_illegal_assignment(self): |
78 | 80 | with self.assertRaisesRegex(SyntaxError, "cannot assign"): |
79 | 81 | compile("{x: y for y, x in ((1, 2), (3, 4))} = 5", "<test>", |
@@ -129,6 +131,41 @@ def test_star_expression(self): |
129 | 131 | self.assertEqual({i: i*i for i in [*range(4)]}, expected) |
130 | 132 | self.assertEqual({i: i*i for i in (*range(4),)}, expected) |
131 | 133 |
|
| 134 | + def test_exception_locations(self): |
| 135 | + # The location of an exception raised from __init__ or |
| 136 | + # __next__ should should be the iterator expression |
| 137 | + def init_raises(): |
| 138 | + try: |
| 139 | + {x:x for x in BrokenIter(init_raises=True)} |
| 140 | + except Exception as e: |
| 141 | + return e |
| 142 | + |
| 143 | + def next_raises(): |
| 144 | + try: |
| 145 | + {x:x for x in BrokenIter(next_raises=True)} |
| 146 | + except Exception as e: |
| 147 | + return e |
| 148 | + |
| 149 | + def iter_raises(): |
| 150 | + try: |
| 151 | + {x:x for x in BrokenIter(iter_raises=True)} |
| 152 | + except Exception as e: |
| 153 | + return e |
| 154 | + |
| 155 | + for func, expected in [(init_raises, "BrokenIter(init_raises=True)"), |
| 156 | + (next_raises, "BrokenIter(next_raises=True)"), |
| 157 | + (iter_raises, "BrokenIter(iter_raises=True)"), |
| 158 | + ]: |
| 159 | + with self.subTest(func): |
| 160 | + exc = func() |
| 161 | + f = traceback.extract_tb(exc.__traceback__)[0] |
| 162 | + indent = 16 |
| 163 | + co = func.__code__ |
| 164 | + self.assertEqual(f.lineno, co.co_firstlineno + 2) |
| 165 | + self.assertEqual(f.end_lineno, co.co_firstlineno + 2) |
| 166 | + self.assertEqual(f.line[f.colno - indent : f.end_colno - indent], |
| 167 | + expected) |
| 168 | + |
132 | 169 |
|
133 | 170 | if __name__ == "__main__": |
134 | 171 | unittest.main() |
0 commit comments