diff options
author | Srinivas Thatiparthy (శ్రీనివాస్ తాటిపర్తి) <srinivasreddy@users.noreply.github.com> | 2018-10-19 22:24:50 +0530 |
---|---|---|
committer | Eric V. Smith <ericvsmith@users.noreply.github.com> | 2018-10-19 12:54:50 -0400 |
commit | dd13c88b5371e13fc16b84e2f9b8715d917de269 (patch) | |
tree | 3475ff0a6de876f3119334cd8ca4068773eabe57 /Lib/test/test_dataclasses.py | |
parent | 55f8249d65af3f1b83df81fa46f6fc6e452ed944 (diff) | |
download | cpython-git-dd13c88b5371e13fc16b84e2f9b8715d917de269.tar.gz |
bpo-33947: dataclasses no longer can raise RecursionError in repr (GF9916)
The reprlib code was copied here instead of importing reprlib. I'm not sure if we really need to avoid the import, but since I expect dataclasses to be more common that reprlib, it seems wise. Plus, the code is small.
Diffstat (limited to 'Lib/test/test_dataclasses.py')
-rwxr-xr-x | Lib/test/test_dataclasses.py | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index 6efe785bc3..ff6060c6d2 100755 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -3169,6 +3169,92 @@ class TestReplace(unittest.TestCase): replace(c, x=3) c = replace(c, x=3, y=5) self.assertEqual(c.x, 15) + + def test_recursive_repr(self): + @dataclass + class C: + f: "C" + + c = C(None) + c.f = c + self.assertEqual(repr(c), "TestReplace.test_recursive_repr.<locals>.C(f=...)") + + def test_recursive_repr_two_attrs(self): + @dataclass + class C: + f: "C" + g: "C" + + c = C(None, None) + c.f = c + c.g = c + self.assertEqual(repr(c), "TestReplace.test_recursive_repr_two_attrs" + ".<locals>.C(f=..., g=...)") + + def test_recursive_repr_indirection(self): + @dataclass + class C: + f: "D" + + @dataclass + class D: + f: "C" + + c = C(None) + d = D(None) + c.f = d + d.f = c + self.assertEqual(repr(c), "TestReplace.test_recursive_repr_indirection" + ".<locals>.C(f=TestReplace.test_recursive_repr_indirection" + ".<locals>.D(f=...))") + + def test_recursive_repr_indirection_two(self): + @dataclass + class C: + f: "D" + + @dataclass + class D: + f: "E" + + @dataclass + class E: + f: "C" + + c = C(None) + d = D(None) + e = E(None) + c.f = d + d.f = e + e.f = c + self.assertEqual(repr(c), "TestReplace.test_recursive_repr_indirection_two" + ".<locals>.C(f=TestReplace.test_recursive_repr_indirection_two" + ".<locals>.D(f=TestReplace.test_recursive_repr_indirection_two" + ".<locals>.E(f=...)))") + + def test_recursive_repr_two_attrs(self): + @dataclass + class C: + f: "C" + g: "C" + + c = C(None, None) + c.f = c + c.g = c + self.assertEqual(repr(c), "TestReplace.test_recursive_repr_two_attrs" + ".<locals>.C(f=..., g=...)") + + def test_recursive_repr_misc_attrs(self): + @dataclass + class C: + f: "C" + g: int + + c = C(None, 1) + c.f = c + self.assertEqual(repr(c), "TestReplace.test_recursive_repr_misc_attrs" + ".<locals>.C(f=..., g=1)") + ## def test_initvar(self): ## @dataclass ## class C: |