def test_result_shadows_descriptor(self): # The result of the function call should be stored in # the object __dict__, shadowing the descriptor. called = [] class Foo(object): @lazy def foo(self): called.append('foo') return 1 f = Foo() self.assertTrue(isinstance(Foo.foo, lazy)) self.assertTrue(f.foo is f.foo) self.assertTrue(f.foo is f.__dict__['foo']) # ! self.assertEqual(len(called), 1) self.assertEqual(f.foo, 1) self.assertEqual(f.foo, 1) self.assertEqual(len(called), 1) lazy.invalidate(f, 'foo') self.assertEqual(f.foo, 1) self.assertEqual(len(called), 2) self.assertEqual(f.foo, 1) self.assertEqual(f.foo, 1) self.assertEqual(len(called), 2)
def test_invalidate_uncalled_attribute(self): # It should be possible to invalidate an empty attribute # cache without causing harm. called = [] class Foo(object): @lazy def foo(self): called.append('foo') return 1 f = Foo() self.assertEqual(len(called), 0) lazy.invalidate(f, 'foo') # Nothing happens
def test_invalidate_subclass_attribute(self): # Whereas lazy.invalidate CAN invalidate a subclass (cached) attribute. called = [] class Bar(object): @cached def bar(self): called.append('bar') return 1 b = Bar() self.assertEqual(b.bar, 1) self.assertEqual(len(called), 1) lazy.invalidate(b, 'bar') self.assertEqual(b.bar, 1) self.assertEqual(len(called), 2)
def test_invalidate_reserved_attribute(self): # It should be possible to invalidate a reserved lazy attribute. called = [] class Foo(object): @lazy def __foo__(self): called.append('foo') return 1 f = Foo() self.assertEqual(f.__foo__, 1) self.assertEqual(len(called), 1) lazy.invalidate(f, '__foo__') self.assertEqual(f.__foo__, 1) self.assertEqual(len(called), 2)
def test_invalidate_attribute(self): # It should be possible to invalidate a lazy attribute. called = [] class Foo(object): @lazy def foo(self): called.append('foo') return 1 f = Foo() self.assertEqual(f.foo, 1) self.assertEqual(len(called), 1) lazy.invalidate(f, 'foo') self.assertEqual(f.foo, 1) self.assertEqual(len(called), 2)
def test_invalidate_private_attribute(self): # It should be possible to invalidate a private lazy attribute. called = [] class Foo(object): @lazy def __foo(self): called.append('foo') return 1 def get_foo(self): return self.__foo f = Foo() self.assertEqual(f.get_foo(), 1) self.assertEqual(len(called), 1) lazy.invalidate(f, '__foo') self.assertEqual(f.get_foo(), 1) self.assertEqual(len(called), 2)
def test_invalidate_attribute_twice(self): # It should be possible to invalidate a lazy attribute # twice without causing harm. called = [] class Foo(object): @lazy def foo(self): called.append('foo') return 1 f = Foo() self.assertEqual(f.foo, 1) self.assertEqual(len(called), 1) lazy.invalidate(f, 'foo') lazy.invalidate(f, 'foo') # Nothing happens self.assertEqual(f.foo, 1) self.assertEqual(len(called), 2)