[Python-checkins] CVS: python/dist/src/Lib/test test_weakref.py,1.3,1.4

Fred L. Drake fdrake@users.sourceforge.net
Thu, 22 Mar 2001 20:22:47 -0800


Update of /cvsroot/python/python/dist/src/Lib/test
In directory usw-pr-cvs1:/tmp/cvs-serv17584

Modified Files:
	test_weakref.py 
Log Message:

Convert the weakref test suite to PyUNIT, and add tests that exercise weak
references on function objects and both bound and unbound methods.


Index: test_weakref.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_weakref.py,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -r1.3 -r1.4
*** test_weakref.py	2001/03/01 03:06:53	1.3
--- test_weakref.py	2001/03/23 04:22:45	1.4
***************
*** 1,136 ****
  import sys
  import weakref
  
! from test_support import TestFailed, verify
  
  
  class C:
!     pass
  
  
! print "Basic Weak References"
  
- print "-- Liveness and referent identity"
  
! o = C()
! ref = weakref.ref(o)
! verify(ref() is not None, "weak reference to live object should be live")
! o2 = ref()
! verify(ref() is not None, "weak ref should still be live")
! verify(o is o2, "<ref>() should return original object if live")
! del o, o2
! del ref
! 
! cbcalled = 0
! def callback(o):
!     global cbcalled
!     cbcalled = 1
! 
! o = C()
! ref2 = weakref.ref(o, callback)
! del o
! verify(cbcalled,
!        "callback did not properly set 'cbcalled'")
! verify(ref2() is None,
!        "ref2 should be dead after deleting object reference")
! del ref2
! 
! 
! print "-- Reference objects with callbacks"
! o = C()
! o.bar = 1
! ref1 = weakref.ref(o, id)
! ref2 = weakref.ref(o, id)
! del o
! verify(ref1() is None,
!        "expected reference to be invalidated")
! verify(ref2() is None,
!        "expected reference to be invalidated")
! 
! 
! print "-- Proxy objects with callbacks"
! o = C()
! o.bar = 1
! ref1 = weakref.proxy(o, id)
! ref2 = weakref.proxy(o, id)
! del o
! try:
!     ref1.bar
! except weakref.ReferenceError:
!     pass
! else:
!     raise TestFailed("expected ReferenceError exception")
! try:
!     ref2.bar
! except weakref.ReferenceError:
!     pass
! else:
!     raise TestFailed("expected ReferenceError exception")
! 
! 
! print "-- Re-use of weak reference objects"
! print "     reference objects"
! 
! o = C()
! ref1 = weakref.ref(o)
! # create a proxy to make sure that there's an intervening creation
! # between these two; it should make no difference
! proxy = weakref.proxy(o)
! ref2 = weakref.ref(o)
! verify(ref1 is ref2,
!        "reference object w/out callback should have been re-used")
! 
! o = C()
! proxy = weakref.proxy(o)
! ref1 = weakref.ref(o)
! ref2 = weakref.ref(o)
! verify(ref1 is ref2,
!        "reference object w/out callback should have been re-used")
! verify(weakref.getweakrefcount(o) == 2,
!        "wrong weak ref count for object")
! del proxy
! verify(weakref.getweakrefcount(o) == 1,
!        "wrong weak ref count for object after deleting proxy")
! 
! print "     proxy objects"
! 
! o = C()
! ref3 = weakref.proxy(o)
! ref4 = weakref.proxy(o)
! verify(ref3 is ref4,
!        "proxy object w/out callback should have been re-used")
! 
! 
! def clearing1(r):
!     print "clearing ref 1"
! 
! def clearing2(r):
!     print "clearing ref 2"
! 
! o = C()
! ref1 = weakref.ref(o, clearing1)
! ref2 = weakref.ref(o, clearing2)
! verify(weakref.getweakrefcount(o) == 2,
!        "got wrong number of weak reference objects")
! del o
! 
! o = C()
! ref1 = weakref.ref(o, clearing1)
! ref2 = weakref.ref(o, clearing2)
! del ref1
! verify(weakref.getweakrefs(o) == [ref2],
!        "list of refs does not match")
! del o
! 
! o = C()
! ref1 = weakref.ref(o, clearing1)
! ref2 = weakref.ref(o, clearing2)
! del ref2
! verify(weakref.getweakrefs(o) == [ref1],
!        "list of refs does not match")
! del o
  
- print
- print "Weak Valued Dictionaries"
  
  class Object:
--- 1,201 ----
  import sys
+ import unittest
  import weakref
  
! from test_support import run_unittest, verify
  
  
  class C:
!     def method(self):
!         pass
  
  
! class Callable:
!     bar = None
! 
!     def __call__(self, x):
!         self.bar = x
  
  
! def create_function():
!     def f(): pass
!     return f
! 
! def create_bound_method():
!     return C().method
! 
! def create_unbound_method():
!     return C.method
! 
! 
! class TestBase(unittest.TestCase):
! 
!     def setUp(self):
!         self.cbcalled = 0
! 
!     def callback(self, ref):
!         self.cbcalled += 1
! 
! 
! class ReferencesTestCase(TestBase):
! 
!     def test_basic_ref(self):
!         self.check_basic_ref(C)
!         self.check_basic_ref(create_function)
!         self.check_basic_ref(create_bound_method)
!         self.check_basic_ref(create_unbound_method)
! 
!     def test_basic_callback(self):
!         self.check_basic_callback(C)
!         self.check_basic_callback(create_function)
!         self.check_basic_callback(create_bound_method)
!         self.check_basic_callback(create_unbound_method)
! 
!     def test_multiple_callbacks(self):
!         o = C()
!         ref1 = weakref.ref(o, self.callback)
!         ref2 = weakref.ref(o, self.callback)
!         del o
!         self.assert_(ref1() is None,
!                      "expected reference to be invalidated")
!         self.assert_(ref2() is None,
!                      "expected reference to be invalidated")
!         self.assert_(self.cbcalled == 2,
!                      "callback not called the right number of times")
! 
!     def test_proxy_ref(self):
!         o = C()
!         o.bar = 1
!         ref1 = weakref.proxy(o, self.callback)
!         ref2 = weakref.proxy(o, self.callback)
!         del o
! 
!         def check(proxy):
!             proxy.bar
! 
!         self.assertRaises(weakref.ReferenceError, check, ref1)
!         self.assertRaises(weakref.ReferenceError, check, ref2)
!         self.assert_(self.cbcalled == 2)
! 
!     def check_basic_ref(self, factory):
!         o = factory()
!         ref = weakref.ref(o)
!         self.assert_(ref() is not None,
!                      "weak reference to live object should be live")
!         o2 = ref()
!         self.assert_(o is o2,
!                      "<ref>() should return original object if live")
! 
!     def check_basic_callback(self, factory):
!         self.cbcalled = 0
!         o = factory()
!         ref = weakref.ref(o, self.callback)
!         del o
!         verify(self.cbcalled == 1,
!                "callback did not properly set 'cbcalled'")
!         verify(ref() is None,
!                "ref2 should be dead after deleting object reference")
! 
!     def test_ref_reuse(self):
!         o = C()
!         ref1 = weakref.ref(o)
!         # create a proxy to make sure that there's an intervening creation
!         # between these two; it should make no difference
!         proxy = weakref.proxy(o)
!         ref2 = weakref.ref(o)
!         self.assert_(ref1 is ref2,
!                      "reference object w/out callback should be re-used")
! 
!         o = C()
!         proxy = weakref.proxy(o)
!         ref1 = weakref.ref(o)
!         ref2 = weakref.ref(o)
!         self.assert_(ref1 is ref2,
!                      "reference object w/out callback should be re-used")
!         self.assert_(weakref.getweakrefcount(o) == 2,
!                      "wrong weak ref count for object")
!         del proxy
!         self.assert_(weakref.getweakrefcount(o) == 1,
!                      "wrong weak ref count for object after deleting proxy")
! 
!     def test_proxy_reuse(self):
!         o = C()
!         proxy1 = weakref.proxy(o)
!         ref = weakref.ref(o)
!         proxy2 = weakref.proxy(o)
!         self.assert_(proxy1 is proxy2,
!                      "proxy object w/out callback should have been re-used")
! 
!     def test_basic_proxy(self):
!         o = C()
!         self.check_proxy(o, weakref.proxy(o))
! 
!     def test_callable_proxy(self):
!         o = Callable()
!         ref1 = weakref.proxy(o)
! 
!         self.check_proxy(o, ref1)
! 
!         self.assert_(type(ref1) is weakref.CallableProxyType,
!                      "proxy is not of callable type")
!         ref1('twinkies!')
!         self.assert_(o.bar == 'twinkies!',
!                      "call through proxy not passed through to original")
! 
!         # expect due to too few args
!         self.assertRaises(TypeError, ref1)
! 
!         # expect due to too many args
!         self.assertRaises(TypeError, ref1, 1, 2, 3)
! 
!     def check_proxy(self, o, proxy):
!         o.foo = 1
!         self.assert_(proxy.foo == 1,
!                      "proxy does not reflect attribute addition")
!         o.foo = 2
!         self.assert_(proxy.foo == 2,
!                      "proxy does not reflect attribute modification")
!         del o.foo
!         self.assert_(not hasattr(proxy, 'foo'),
!                      "proxy does not reflect attribute removal")
! 
!         proxy.foo = 1
!         self.assert_(o.foo == 1,
!                      "object does not reflect attribute addition via proxy")
!         proxy.foo = 2
!         self.assert_(
!             o.foo == 2,
!             "object does not reflect attribute modification via proxy")
!         del proxy.foo
!         self.assert_(not hasattr(o, 'foo'),
!                      "object does not reflect attribute removal via proxy")
! 
!     def test_getweakrefcount(self):
!         o = C()
!         ref1 = weakref.ref(o)
!         ref2 = weakref.ref(o, self.callback)
!         self.assert_(weakref.getweakrefcount(o) == 2,
!                      "got wrong number of weak reference objects")
! 
!         proxy1 = weakref.proxy(o)
!         proxy2 = weakref.proxy(o, self.callback)
!         self.assert_(weakref.getweakrefcount(o) == 4,
!                      "got wrong number of weak reference objects")
! 
!     def test_getweakrefs(self):
!         o = C()
!         ref1 = weakref.ref(o, self.callback)
!         ref2 = weakref.ref(o, self.callback)
!         del ref1
!         self.assert_(weakref.getweakrefs(o) == [ref2],
!                      "list of refs does not match")
! 
!         o = C()
!         ref1 = weakref.ref(o, self.callback)
!         ref2 = weakref.ref(o, self.callback)
!         del ref2
!         self.assert_(weakref.getweakrefs(o) == [ref1],
!                      "list of refs does not match")
  
  
  class Object:
***************
*** 140,250 ****
          return "<Object %r>" % self.arg
  
- dict = weakref.mapping()
- objects = map(Object, range(10))
- for o in objects:
-     dict[o.arg] = o
- print "objects are stored in weak dict"
- for o in objects:
-     verify(weakref.getweakrefcount(o) == 1,
-            "wrong number of weak references to %r!" % o)
-     verify(o is dict[o.arg],
-            "wrong object returned by weak dict!")
- items1 = dict.items()
- items2 = dict.copy().items()
- items1.sort()
- items2.sort()
- verify(items1 == items2,
-        "cloning of weak-valued dictionary did not work!")
- del items1, items2
- dict.clear()
- print "weak dict test complete"
- 
- print
- print "Weak Keyed Dictionaries"
- 
- dict = weakref.mapping(weakkeys=1)
- objects = map(Object, range(10))
- for o in objects:
-     dict[o] = o.arg
- print "objects are stored in weak dict"
- for o in objects:
-     verify(weakref.getweakrefcount(o) == 1,
-            "wrong number of weak references to %r!" % o)
-     verify(o.arg is dict[o],
-            "wrong object returned by weak dict!")
- items1 = dict.items()
- items2 = dict.copy().items()
- items1.sort()
- items2.sort()
- verify(items1 == items2,
-        "cloning of weak-keyed dictionary did not work!")
- del items1, items2
- del objects, o
- verify(len(dict)==0, "deleting the keys did not clear the dictionary")
- print "weak key dict test complete"
- 
- 
- print
- print "Non-callable Proxy References"
- print "XXX -- tests not written!"
- 
- 
- def test_proxy(o, proxy):
-     o.foo = 1
-     verify(proxy.foo == 1,
-            "proxy does not reflect attribute addition")
-     o.foo = 2
-     verify(proxy.foo == 2,
-            "proxy does not reflect attribute modification")
-     del o.foo
-     verify(not hasattr(proxy, 'foo'),
-            "proxy does not reflect attribute removal")
- 
-     proxy.foo = 1
-     verify(o.foo == 1,
-            "object does not reflect attribute addition via proxy")
-     proxy.foo = 2
-     verify(o.foo == 2,
-            "object does not reflect attribute modification via proxy")
-     del proxy.foo
-     verify(not hasattr(o, 'foo'),
-            "object does not reflect attribute removal via proxy")
- 
  
! o = C()
! test_proxy(o, weakref.proxy(o))
  
! print
! print "Callable Proxy References"
! 
! class Callable:
!     bar = None
!     def __call__(self, x):
!         self.bar = x
  
! o = Callable()
! ref1 = weakref.proxy(o)
  
- test_proxy(o, ref1)
  
! verify(type(ref1) is weakref.CallableProxyType,
!        "proxy is not of callable type")
! ref1('twinkies!')
! verify(o.bar == 'twinkies!',
!        "call through proxy not passed through to original")
! 
! try:
!     ref1()
! except TypeError:
!     # expect due to too few args
!     pass
! else:
!     raise TestFailed("did not catch expected TypeError -- too few args")
! 
! try:
!     ref1(1, 2, 3)
! except TypeError:
!     # expect due to too many args
!     pass
! else:
!     raise TestFailed("did not catch expected TypeError -- too many args")
--- 205,266 ----
          return "<Object %r>" % self.arg
  
  
! class MappingTestCase(TestBase):
  
!     COUNT = 10
  
!     def test_weak_values(self):
!         dict = weakref.mapping()
!         objects = map(Object, range(self.COUNT))
!         for o in objects:
!             dict[o.arg] = o
! 
!         for o in objects:
!             self.assert_(weakref.getweakrefcount(o) == 1,
!                          "wrong number of weak references to %r!" % o)
!             self.assert_(o is dict[o.arg],
!                          "wrong object returned by weak dict!")
!         items1 = dict.items()
!         items2 = dict.copy().items()
!         items1.sort()
!         items2.sort()
!         self.assert_(items1 == items2,
!                      "cloning of weak-valued dictionary did not work!")
!         del items1, items2
!         self.assert_(len(dict) == self.COUNT)
!         del objects[0]
!         self.assert_(len(dict) == (self.COUNT - 1),
!                      "deleting object did not cause dictionary update")
!         del objects, o
!         self.assert_(len(dict) == 0,
!                      "deleting the values did not clear the dictionary")
! 
!     def test_weak_keys(self):
!         dict = weakref.mapping(weakkeys=1)
!         objects = map(Object, range(self.COUNT))
!         for o in objects:
!             dict[o] = o.arg
! 
!         for o in objects:
!             self.assert_(weakref.getweakrefcount(o) == 1,
!                          "wrong number of weak references to %r!" % o)
!             self.assert_(o.arg is dict[o],
!                          "wrong object returned by weak dict!")
!         items1 = dict.items()
!         items2 = dict.copy().items()
!         items1.sort()
!         items2.sort()
!         self.assert_(items1 == items2,
!                      "cloning of weak-keyed dictionary did not work!")
!         del items1, items2
!         self.assert_(len(dict) == self.COUNT)
!         del objects[0]
!         self.assert_(len(dict) == (self.COUNT - 1),
!                      "deleting object did not cause dictionary update")
!         del objects, o
!         self.assert_(len(dict) == 0,
!                      "deleting the keys did not clear the dictionary")
  
  
! run_unittest(ReferencesTestCase)
! run_unittest(MappingTestCase)