73 lines
1.9 KiB
Python
73 lines
1.9 KiB
Python
from django.dispatch.saferef import safeRef
|
|
from django.utils import unittest
|
|
|
|
|
|
class Test1(object):
|
|
def x(self):
|
|
pass
|
|
|
|
def test2(obj):
|
|
pass
|
|
|
|
class Test2(object):
|
|
def __call__(self, obj):
|
|
pass
|
|
|
|
class SaferefTests(unittest.TestCase):
|
|
def setUp(self):
|
|
ts = []
|
|
ss = []
|
|
for x in xrange(5000):
|
|
t = Test1()
|
|
ts.append(t)
|
|
s = safeRef(t.x, self._closure)
|
|
ss.append(s)
|
|
ts.append(test2)
|
|
ss.append(safeRef(test2, self._closure))
|
|
for x in xrange(30):
|
|
t = Test2()
|
|
ts.append(t)
|
|
s = safeRef(t, self._closure)
|
|
ss.append(s)
|
|
self.ts = ts
|
|
self.ss = ss
|
|
self.closureCount = 0
|
|
|
|
def tearDown(self):
|
|
del self.ts
|
|
del self.ss
|
|
|
|
def testIn(self):
|
|
"""Test the "in" operator for safe references (cmp)"""
|
|
for t in self.ts[:50]:
|
|
self.assertTrue(safeRef(t.x) in self.ss)
|
|
|
|
def testValid(self):
|
|
"""Test that the references are valid (return instance methods)"""
|
|
for s in self.ss:
|
|
self.assertTrue(s())
|
|
|
|
def testShortCircuit(self):
|
|
"""Test that creation short-circuits to reuse existing references"""
|
|
sd = {}
|
|
for s in self.ss:
|
|
sd[s] = 1
|
|
for t in self.ts:
|
|
if hasattr(t, 'x'):
|
|
self.assertTrue(sd.has_key(safeRef(t.x)))
|
|
self.assertTrue(safeRef(t.x) in sd)
|
|
else:
|
|
self.assertTrue(sd.has_key(safeRef(t)))
|
|
self.assertTrue(safeRef(t) in sd)
|
|
|
|
def testRepresentation(self):
|
|
"""Test that the reference object's representation works
|
|
|
|
XXX Doesn't currently check the results, just that no error
|
|
is raised
|
|
"""
|
|
repr(self.ss[-1])
|
|
|
|
def _closure(self, ref):
|
|
"""Dumb utility mechanism to increment deletion counter"""
|
|
self.closureCount +=1 |