summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2024-05-09 09:09:40 (GMT)
committerGitHub <noreply@github.com>2024-05-09 09:09:40 (GMT)
commite9539568be8870ef5ab3908b483eec08a3df4820 (patch)
tree87791902505168098d239cb69c0170d47f369619 /Lib/test
parent530c3bb271d85e7700f627c5d64089d270286dfa (diff)
downloadcpython-e9539568be8870ef5ab3908b483eec08a3df4820.zip
cpython-e9539568be8870ef5ab3908b483eec08a3df4820.tar.gz
cpython-e9539568be8870ef5ab3908b483eec08a3df4820.tar.bz2
[3.12] gh-118033: Fix `__weakref__` not set for generic dataclasses (GH-118099) (#118822)
gh-118033: Fix `__weakref__` not set for generic dataclasses (GH-118099) (cherry picked from commit fa9b9cb11379806843ae03b1e4ad4ccd95a63c02) Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_dataclasses/__init__.py106
1 files changed, 106 insertions, 0 deletions
diff --git a/Lib/test/test_dataclasses/__init__.py b/Lib/test/test_dataclasses/__init__.py
index 4e05506..7c91770 100644
--- a/Lib/test/test_dataclasses/__init__.py
+++ b/Lib/test/test_dataclasses/__init__.py
@@ -3411,8 +3411,114 @@ class TestSlots(unittest.TestCase):
class B(A):
pass
+ self.assertEqual(B.__slots__, ())
B()
+ def test_dataclass_derived_generic(self):
+ T = typing.TypeVar('T')
+
+ @dataclass(slots=True, weakref_slot=True)
+ class A(typing.Generic[T]):
+ pass
+ self.assertEqual(A.__slots__, ('__weakref__',))
+ self.assertTrue(A.__weakref__)
+ A()
+
+ @dataclass(slots=True, weakref_slot=True)
+ class B[T2]:
+ pass
+ self.assertEqual(B.__slots__, ('__weakref__',))
+ self.assertTrue(B.__weakref__)
+ B()
+
+ def test_dataclass_derived_generic_from_base(self):
+ T = typing.TypeVar('T')
+
+ class RawBase: ...
+
+ @dataclass(slots=True, weakref_slot=True)
+ class C1(typing.Generic[T], RawBase):
+ pass
+ self.assertEqual(C1.__slots__, ())
+ self.assertTrue(C1.__weakref__)
+ C1()
+ @dataclass(slots=True, weakref_slot=True)
+ class C2(RawBase, typing.Generic[T]):
+ pass
+ self.assertEqual(C2.__slots__, ())
+ self.assertTrue(C2.__weakref__)
+ C2()
+
+ @dataclass(slots=True, weakref_slot=True)
+ class D[T2](RawBase):
+ pass
+ self.assertEqual(D.__slots__, ())
+ self.assertTrue(D.__weakref__)
+ D()
+
+ def test_dataclass_derived_generic_from_slotted_base(self):
+ T = typing.TypeVar('T')
+
+ class WithSlots:
+ __slots__ = ('a', 'b')
+
+ @dataclass(slots=True, weakref_slot=True)
+ class E1(WithSlots, Generic[T]):
+ pass
+ self.assertEqual(E1.__slots__, ('__weakref__',))
+ self.assertTrue(E1.__weakref__)
+ E1()
+ @dataclass(slots=True, weakref_slot=True)
+ class E2(Generic[T], WithSlots):
+ pass
+ self.assertEqual(E2.__slots__, ('__weakref__',))
+ self.assertTrue(E2.__weakref__)
+ E2()
+
+ @dataclass(slots=True, weakref_slot=True)
+ class F[T2](WithSlots):
+ pass
+ self.assertEqual(F.__slots__, ('__weakref__',))
+ self.assertTrue(F.__weakref__)
+ F()
+
+ def test_dataclass_derived_generic_from_slotted_base(self):
+ T = typing.TypeVar('T')
+
+ class WithWeakrefSlot:
+ __slots__ = ('__weakref__',)
+
+ @dataclass(slots=True, weakref_slot=True)
+ class G1(WithWeakrefSlot, Generic[T]):
+ pass
+ self.assertEqual(G1.__slots__, ())
+ self.assertTrue(G1.__weakref__)
+ G1()
+ @dataclass(slots=True, weakref_slot=True)
+ class G2(Generic[T], WithWeakrefSlot):
+ pass
+ self.assertEqual(G2.__slots__, ())
+ self.assertTrue(G2.__weakref__)
+ G2()
+
+ @dataclass(slots=True, weakref_slot=True)
+ class H[T2](WithWeakrefSlot):
+ pass
+ self.assertEqual(H.__slots__, ())
+ self.assertTrue(H.__weakref__)
+ H()
+
+ def test_dataclass_slot_dict(self):
+ class WithDictSlot:
+ __slots__ = ('__dict__',)
+
+ @dataclass(slots=True)
+ class A(WithDictSlot): ...
+
+ self.assertEqual(A.__slots__, ())
+ self.assertEqual(A().__dict__, {})
+ A()
+
class TestDescriptors(unittest.TestCase):
def test_set_name(self):