gh-151130: Add more tests for PyWeakref_* C API (GH-151131) · python/cpython@c3cd75a

GitHub

@@ -0,0 +1,136 @@

1+importweakref

2+importunittest

3+fromtest.supportimportimport_helper

4+5+_testcapi=import_helper.import_module('_testcapi')

6+_testlimitedcapi=import_helper.import_module('_testlimitedcapi')

7+NULL=None

8+9+classObject:

10+pass

11+12+classRef(weakref.ReferenceType):

13+pass

14+15+16+classCAPIWeakrefTest(unittest.TestCase):

17+deftest_pyweakref_check(self):

18+# Test PyWeakref_Check()

19+check=_testlimitedcapi.pyweakref_check

20+obj=Object()

21+self.assertEqual(check(obj), 0)

22+self.assertEqual(check(weakref.ref(obj)), 1)

23+self.assertEqual(check(Ref(obj)), 1)

24+self.assertEqual(check(weakref.proxy(obj)), 1)

25+26+# CRASHES check(NULL)

27+28+deftest_pyweakref_checkref(self):

29+# Test PyWeakref_CheckRef()

30+checkref=_testlimitedcapi.pyweakref_checkref

31+obj=Object()

32+self.assertEqual(checkref(obj), 0)

33+self.assertEqual(checkref(weakref.ref(obj)), 1)

34+self.assertEqual(checkref(Ref(obj)), 1)

35+self.assertEqual(checkref(weakref.proxy(obj)), 0)

36+37+# CRASHES checkref(NULL)

38+39+deftest_pyweakref_checkrefexact(self):

40+# Test PyWeakref_CheckRefExact()

41+checkrefexact=_testlimitedcapi.pyweakref_checkrefexact

42+obj=Object()

43+self.assertEqual(checkrefexact(obj), 0)

44+self.assertEqual(checkrefexact(weakref.ref(obj)), 1)

45+self.assertEqual(checkrefexact(Ref(obj)), 0)

46+self.assertEqual(checkrefexact(weakref.proxy(obj)), 0)

47+48+# CRASHES checkrefexact(NULL)

49+50+deftest_pyweakref_checkproxy(self):

51+# Test PyWeakref_CheckProxy()

52+checkproxy=_testlimitedcapi.pyweakref_checkproxy

53+obj=Object()

54+self.assertEqual(checkproxy(obj), 0)

55+self.assertEqual(checkproxy(weakref.ref(obj)), 0)

56+self.assertEqual(checkproxy(Ref(obj)), 0)

57+self.assertEqual(checkproxy(weakref.proxy(obj)), 1)

58+59+# CRASHES checkproxy(NULL)

60+61+deftest_pyweakref_getref(self):

62+# Test PyWeakref_GetRef()

63+getref=_testcapi.pyweakref_getref

64+obj=Object()

65+wr=weakref.ref(obj)

66+wp=weakref.proxy(obj)

67+self.assertEqual(getref(wr), (1, obj))

68+self.assertEqual(getref(wp), (1, obj))

69+delobj

70+self.assertEqual(getref(wr), 0)

71+self.assertEqual(getref(wp), 0)

72+73+self.assertRaises(TypeError, getref, 42)

74+self.assertRaises(SystemError, getref, NULL)

75+76+deftest_pyweakref_isdead(self):

77+# Test PyWeakref_IsDead()

78+isdead=_testcapi.pyweakref_isdead

79+obj=Object()

80+wr=weakref.ref(obj)

81+wp=weakref.proxy(obj)

82+self.assertEqual(isdead(wr), 0)

83+self.assertEqual(isdead(wp), 0)

84+delobj

85+self.assertEqual(isdead(wr), 1)

86+self.assertEqual(isdead(wp), 1)

87+88+self.assertRaises(TypeError, isdead, 42)

89+self.assertRaises(SystemError, isdead, NULL)

90+91+deftest_pyweakref_newref(self):

92+# Test PyWeakref_NewRef()

93+newref=_testlimitedcapi.pyweakref_newref

94+obj=Object()

95+wr=newref(obj)

96+self.assertIs(type(wr), weakref.ReferenceType)

97+# PyWeakref_NewRef() handles None callback as NULL callback

98+wr=newref(obj, None)

99+self.assertIs(type(wr), weakref.ReferenceType)

100+log= []

101+wr=newref(obj, log.append)

102+self.assertIs(type(wr), weakref.ReferenceType)

103+self.assertEqual(log, [])

104+delobj

105+self.assertEqual(log, [wr])

106+107+self.assertRaises(TypeError, newref, [])

108+# CRASHES newref(NULL)

109+110+deftest_pyweakref_newproxy(self):

111+# Test PyWeakref_NewProxy()

112+newproxy=_testlimitedcapi.pyweakref_newproxy

113+obj=Object()

114+wp=newproxy(obj)

115+self.assertIs(type(wp), weakref.ProxyType)

116+# PyWeakref_NewProxy() handles None callback as NULL callback

117+wp=newproxy(obj, None)

118+self.assertIs(type(wp), weakref.ProxyType)

119+log= []

120+wp=newproxy(obj, log.append)

121+self.assertIs(type(wp), weakref.ProxyType)

122+self.assertEqual(log, [])

123+delobj

124+self.assertEqual(log, [wp])

125+126+deffunc():

127+pass

128+wp=newproxy(func)

129+self.assertIs(type(wp), weakref.CallableProxyType)

130+131+self.assertRaises(TypeError, newproxy, [])

132+# CRASHES newproxy(NULL)

133+134+135+if__name__=="__main__":

136+unittest.main()