2
from twisted.trial.unittest import TestCase
4
from epsilon.remember import remembered
5
from epsilon.structlike import record
7
class Rememberee(record("rememberer whichValue")):
9
A sample value that holds on to its L{Rememberer}.
13
class Rememberer(object):
15
Sample application code which uses epsilon.remember.
17
@ivar invocations: The number of times that it is invoked.
29
return Rememberee(self, 1)
37
self.otherInvocations += 1
38
return Rememberee(self, 2)
41
class RememberedTests(TestCase):
43
The "remembered" decorator allows you to lazily create an attribute and
49
Create a L{Rememberer} for use with the tests.
51
self.rememberer = Rememberer()
54
def test_selfArgument(self):
56
The "self" argument to the decorated creation function will be the
57
instance the property is accessed upon.
59
value = self.rememberer.value1
60
self.assertIdentical(value.rememberer, self.rememberer)
63
def test_onlyOneInvocation(self):
65
The callable wrapped by C{@remembered} will only be invoked once,
66
regardless of how many times the attribute is accessed.
68
self.assertEquals(self.rememberer.invocations, 0)
69
firstTime = self.rememberer.value1
70
self.assertEquals(self.rememberer.invocations, 1)
71
secondTime = self.rememberer.value1
72
self.assertEquals(self.rememberer.invocations, 1)
73
self.assertIdentical(firstTime, secondTime)
76
def test_twoValues(self):
78
If the L{@remembered} decorator is used more than once, each one will
79
be an attribute with its own identity.
81
self.assertEquals(self.rememberer.invocations, 0)
82
self.assertEquals(self.rememberer.otherInvocations, 0)
83
firstValue1 = self.rememberer.value1
84
self.assertEquals(self.rememberer.invocations, 1)
85
self.assertEquals(self.rememberer.otherInvocations, 0)
86
firstValue2 = self.rememberer.value2
87
self.assertEquals(self.rememberer.otherInvocations, 1)
88
self.assertNotIdentical(firstValue1, firstValue2)
89
secondValue2 = self.rememberer.value2
90
self.assertIdentical(firstValue2, secondValue2)