195 lines
4.2 KiB
Python
195 lines
4.2 KiB
Python
from __future__ import print_function
|
|
|
|
import unittest
|
|
import gc
|
|
|
|
import wrapt
|
|
|
|
class TestWeakFunctionProxy(unittest.TestCase):
|
|
|
|
def test_isinstance(self):
|
|
def function(a, b):
|
|
return a, b
|
|
|
|
proxy = wrapt.WeakFunctionProxy(function)
|
|
|
|
self.assertTrue(isinstance(proxy, type(function)))
|
|
|
|
def test_no_callback(self):
|
|
def function(a, b):
|
|
return a, b
|
|
|
|
proxy = wrapt.WeakFunctionProxy(function)
|
|
|
|
self.assertEqual(proxy(1, 2), (1, 2))
|
|
|
|
function = None
|
|
gc.collect()
|
|
|
|
def test_call_expired(self):
|
|
def function(a, b):
|
|
return a, b
|
|
|
|
proxy = wrapt.WeakFunctionProxy(function)
|
|
|
|
self.assertEqual(proxy(1, 2), (1, 2))
|
|
|
|
function = None
|
|
gc.collect()
|
|
|
|
def run(*args):
|
|
proxy()
|
|
|
|
self.assertRaises(ReferenceError, run, ())
|
|
|
|
def test_function(self):
|
|
def function(a, b):
|
|
return a, b
|
|
|
|
result = []
|
|
|
|
def callback(proxy):
|
|
result.append(id(proxy))
|
|
|
|
proxy = wrapt.WeakFunctionProxy(function, callback)
|
|
|
|
self.assertEqual(proxy(1, 2), (1, 2))
|
|
|
|
function = None
|
|
gc.collect()
|
|
|
|
self.assertEqual(len(result), 1)
|
|
self.assertEqual(id(proxy), result[0])
|
|
|
|
def test_instancemethod_delete_instance(self):
|
|
class Class(object):
|
|
def function(self, a, b):
|
|
return a, b
|
|
|
|
result = []
|
|
|
|
def callback(proxy):
|
|
result.append(id(proxy))
|
|
|
|
c = Class()
|
|
|
|
proxy = wrapt.WeakFunctionProxy(c.function, callback)
|
|
|
|
self.assertEqual(proxy(1, 2), (1, 2))
|
|
|
|
c = None
|
|
gc.collect()
|
|
|
|
self.assertEqual(len(result), 1)
|
|
self.assertEqual(id(proxy), result[0])
|
|
|
|
def test_instancemethod_delete_function(self):
|
|
class Class(object):
|
|
def function(self, a, b):
|
|
return a, b
|
|
|
|
result = []
|
|
|
|
def callback(proxy):
|
|
result.append(id(proxy))
|
|
|
|
c = Class()
|
|
|
|
proxy = wrapt.WeakFunctionProxy(c.function, callback)
|
|
|
|
self.assertEqual(proxy(1, 2), (1, 2))
|
|
|
|
del c
|
|
del Class.function
|
|
gc.collect()
|
|
|
|
self.assertEqual(len(result), 1)
|
|
self.assertEqual(id(proxy), result[0])
|
|
|
|
def test_instancemethod_delete_function_and_instance(self):
|
|
class Class(object):
|
|
def function(self, a, b):
|
|
return a, b
|
|
|
|
result = []
|
|
|
|
def callback(proxy):
|
|
result.append(id(proxy))
|
|
|
|
c = Class()
|
|
|
|
proxy = wrapt.WeakFunctionProxy(c.function, callback)
|
|
|
|
self.assertEqual(proxy(1, 2), (1, 2))
|
|
|
|
c = None
|
|
del Class.function
|
|
gc.collect()
|
|
|
|
self.assertEqual(len(result), 1)
|
|
self.assertEqual(id(proxy), result[0])
|
|
|
|
def test_classmethod(self):
|
|
class Class(object):
|
|
@classmethod
|
|
def function(cls, a, b):
|
|
self.assertEqual(cls, Class)
|
|
return a, b
|
|
|
|
result = []
|
|
|
|
def callback(proxy):
|
|
result.append(id(proxy))
|
|
|
|
proxy = wrapt.WeakFunctionProxy(Class.function, callback)
|
|
|
|
self.assertEqual(proxy(1, 2), (1, 2))
|
|
|
|
Class = None
|
|
gc.collect()
|
|
|
|
self.assertEqual(len(result), 1)
|
|
self.assertEqual(id(proxy), result[0])
|
|
|
|
def test_staticmethod(self):
|
|
class Class(object):
|
|
@staticmethod
|
|
def function(a, b):
|
|
return a, b
|
|
|
|
result = []
|
|
|
|
def callback(proxy):
|
|
result.append(id(proxy))
|
|
|
|
proxy = wrapt.WeakFunctionProxy(Class.function, callback)
|
|
|
|
self.assertEqual(proxy(1, 2), (1, 2))
|
|
|
|
Class = None
|
|
gc.collect()
|
|
|
|
self.assertEqual(len(result), 1)
|
|
self.assertEqual(id(proxy), result[0])
|
|
|
|
def test_decorator_method(self):
|
|
@wrapt.decorator
|
|
def bark(wrapped, instance, args, kwargs):
|
|
return 'bark'
|
|
|
|
class Animal(object):
|
|
@bark
|
|
def squeal(self):
|
|
return 'squeal'
|
|
|
|
animal = Animal()
|
|
|
|
self.assertEqual(animal.squeal(), 'bark')
|
|
|
|
method = wrapt.WeakFunctionProxy(animal.squeal)
|
|
|
|
self.assertEqual(method(), 'bark')
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|