[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)