Skip to content

Commit 64ebb4f

Browse files
committed
Add tests for the generic descriptors
1 parent a71d91a commit 64ebb4f

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

Lib/test/test_descr.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6013,5 +6013,69 @@ class A(metaclass=M):
60136013
pass
60146014

60156015

6016+
class TestGenericDescriptors(unittest.TestCase):
6017+
def test___dict__(self):
6018+
class CustomClass:
6019+
pass
6020+
class SlotClass:
6021+
__slots__ = ['foo']
6022+
class SlotSubClass(SlotClass):
6023+
pass
6024+
class IntSubclass(int):
6025+
pass
6026+
6027+
dict_descriptor = CustomClass.__dict__['__dict__']
6028+
self.assertEqual(dict_descriptor.__objclass__, object)
6029+
6030+
for cls in CustomClass, SlotSubClass, IntSubclass:
6031+
with self.subTest(cls=cls):
6032+
self.assertIs(cls.__dict__['__dict__'], dict_descriptor)
6033+
instance = cls()
6034+
instance.attr = 123
6035+
self.assertEqual(
6036+
dict_descriptor.__get__(instance, cls),
6037+
{'attr': 123},
6038+
)
6039+
with self.assertRaises(AttributeError):
6040+
print(dict_descriptor.__get__(True, bool))
6041+
with self.assertRaises(AttributeError):
6042+
print(dict_descriptor.__get__(SlotClass(), SlotClass))
6043+
6044+
# delegation to type.__dict__
6045+
self.assertIsInstance(
6046+
dict_descriptor.__get__(type, type),
6047+
types.MappingProxyType,
6048+
)
6049+
6050+
def test___weakref__(self):
6051+
class CustomClass:
6052+
pass
6053+
class SlotClass:
6054+
__slots__ = ['foo']
6055+
class SlotSubClass(SlotClass):
6056+
pass
6057+
class IntSubclass(int):
6058+
pass
6059+
6060+
weakref_descriptor = CustomClass.__dict__['__weakref__']
6061+
self.assertEqual(weakref_descriptor.__objclass__, object)
6062+
6063+
for cls in CustomClass, SlotSubClass:
6064+
with self.subTest(cls=cls):
6065+
self.assertIs(cls.__dict__['__weakref__'], weakref_descriptor)
6066+
instance = cls()
6067+
instance.attr = 123
6068+
self.assertEqual(
6069+
weakref_descriptor.__get__(instance, cls),
6070+
None,
6071+
)
6072+
with self.assertRaises(AttributeError):
6073+
print(weakref_descriptor.__get__(True, bool))
6074+
with self.assertRaises(AttributeError):
6075+
print(weakref_descriptor.__get__(SlotClass(), SlotClass))
6076+
with self.assertRaises(AttributeError):
6077+
print(weakref_descriptor.__get__(IntSubclass(), IntSubclass))
6078+
6079+
60166080
if __name__ == "__main__":
60176081
unittest.main()

0 commit comments

Comments
 (0)