]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
- add tests that exercise fixes for the PyWeakref_NewRef() and
authorFred Drake <fdrake@acm.org>
Tue, 3 Feb 2004 20:18:20 +0000 (20:18 +0000)
committerFred Drake <fdrake@acm.org>
Tue, 3 Feb 2004 20:18:20 +0000 (20:18 +0000)
  PyWeakref_NewProxy() constructors from the C API
- elaborate the getweakrefcount() and getweakrefs() tests slightly,
  including additional checks pulled from the trunk

Lib/test/test_weakref.py

index 87764f90d8970b333a7f66a5154954a6b145562b..a50e05a2d7c00de2f970854ba31f8c0fe6614549 100644 (file)
@@ -184,6 +184,38 @@ class ReferencesTestCase(TestBase):
         self.assertEqual(L3[:5], p3[:5])
         self.assertEqual(L3[2:5], p3[2:5])
 
+    # The PyWeakref_* C API is documented as allowing either NULL or
+    # None as the value for the callback, where either means "no
+    # callback".  The "no callback" ref and proxy objects are supposed
+    # to be shared so long as they exist by all callers so long as
+    # they are active.  In Python 2.3.3 and earlier, this guaranttee
+    # was not honored, and was broken in different ways for
+    # PyWeakref_NewRef() and PyWeakref_NewProxy().  (Two tests.)
+
+    def test_shared_ref_without_callback(self):
+        self.check_shared_without_callback(weakref.ref)
+
+    def test_shared_proxy_without_callback(self):
+        self.check_shared_without_callback(weakref.proxy)
+
+    def check_shared_without_callback(self, makeref):
+        o = Object(1)
+        p1 = makeref(o, None)
+        p2 = makeref(o, None)
+        self.assert_(p1 is p2, "both callbacks were None in the C API")
+        del p1, p2
+        p1 = makeref(o)
+        p2 = makeref(o, None)
+        self.assert_(p1 is p2, "callbacks were NULL, None in the C API")
+        del p1, p2
+        p1 = makeref(o)
+        p2 = makeref(o)
+        self.assert_(p1 is p2, "both callbacks were NULL in the C API")
+        del p1, p2
+        p1 = makeref(o, None)
+        p2 = makeref(o)
+        self.assert_(p1 is p2, "callbacks were None, NULL in the C API")
+
     def test_callable_proxy(self):
         o = Callable()
         ref1 = weakref.proxy(o)
@@ -250,6 +282,15 @@ class ReferencesTestCase(TestBase):
         self.assert_(weakref.getweakrefcount(o) == 4,
                      "got wrong number of weak reference objects")
 
+        del ref1, ref2, proxy1, proxy2
+        self.assert_(weakref.getweakrefcount(o) == 0,
+                     "weak reference objects not unlinked from"
+                     " referent when discarded.")
+
+        # assumes ints do not support weakrefs
+        self.assert_(weakref.getweakrefcount(1) == 0,
+                     "got wrong number of weak reference objects for int")
+
     def test_getweakrefs(self):
         o = C()
         ref1 = weakref.ref(o, self.callback)
@@ -265,6 +306,14 @@ class ReferencesTestCase(TestBase):
         self.assert_(weakref.getweakrefs(o) == [ref1],
                      "list of refs does not match")
 
+        del ref1
+        self.assert_(weakref.getweakrefs(o) == [],
+                     "list of refs not cleared")
+
+        # assumes ints do not support weakrefs
+        self.assert_(weakref.getweakrefs(1) == [],
+                     "list of refs does not match for int")
+
     def test_newstyle_number_ops(self):
         class F(float):
             pass