21
21
from datetime import datetime, date, time, timedelta
22
22
from decimal import Decimal
23
23
import cPickle as pickle
31
25
from storm.exceptions import NoneError
32
26
from storm.variables import *
97
91
variable.set(marker, from_db=True)
98
92
self.assertEquals(variable.sets, [(marker, False), (marker, True)])
100
def test_set_leak(self):
101
"""When a variable is checkpointed, the value must not leak."""
102
variable = Variable()
104
m_ref = weakref.ref(m)
106
variable.checkpoint()
107
variable.set(LazyValue())
110
self.assertIdentical(m_ref(), None)
112
94
def test_get(self):
113
95
variable = CustomVariable()
114
96
variable.set(marker)
120
102
self.assertEquals(variable.get(to_db=True), ("g", ("s", marker)))
121
103
self.assertEquals(variable.gets, [(("s", marker), True)])
106
self.assertEquals(CustomVariable(marker), CustomVariable(marker))
107
self.assertNotEquals(CustomVariable(marker), CustomVariable(object()))
123
109
def test_is_defined(self):
124
110
variable = CustomVariable()
125
111
self.assertFalse(variable.is_defined())
212
198
def changed(owner, variable, old_value, new_value, fromdb):
213
199
changed_values.append((owner, variable,
214
200
old_value, new_value, fromdb))
216
202
event.hook("changed", changed)
218
204
variable = CustomVariable(event=event)
274
260
variable = CustomVariable()
275
261
variable.set(marker)
276
262
variable_copy = variable.copy()
277
variable_copy.gets = []
278
263
self.assertTrue(variable is not variable_copy)
279
self.assertVariablesEqual([variable], [variable_copy])
264
self.assertTrue(variable == variable_copy)
267
# They must hash the same to be used as cache keys.
268
obj1 = CustomVariable(marker)
269
obj2 = CustomVariable(marker)
270
self.assertEquals(hash(obj1), hash(obj2))
281
272
def test_lazy_value_setting(self):
282
273
variable = CustomVariable()
319
310
def changed(owner, variable, old_value, new_value, fromdb):
320
311
changed_values.append((owner, variable,
321
312
old_value, new_value, fromdb))
323
314
event.hook("changed", changed)
325
316
variable = CustomVariable(event=event)
660
651
self.assertEquals(variable.get(), delta)
662
653
self.assertRaises(TypeError, variable.set, marker)
664
655
def test_get_set_from_database(self):
665
656
delta_str = "42 days 12:34:56.78"
666
657
delta_uni = unicode(delta_str)
781
772
self.fail("ValueError not raised")
784
class UUIDVariableTest(TestHelper):
786
def is_supported(self):
787
return uuid is not None
789
def test_get_set(self):
790
value = uuid.UUID("{0609f76b-878f-4546-baf5-c1b135e8de72}")
792
variable = UUIDVariable()
795
self.assertEquals(variable.get(), value)
797
variable.get(to_db=True), "0609f76b-878f-4546-baf5-c1b135e8de72")
799
self.assertRaises(TypeError, variable.set, marker)
800
self.assertRaises(TypeError, variable.set,
801
"0609f76b-878f-4546-baf5-c1b135e8de72")
802
self.assertRaises(TypeError, variable.set,
803
u"0609f76b-878f-4546-baf5-c1b135e8de72")
805
def test_get_set_from_database(self):
806
value = uuid.UUID("{0609f76b-878f-4546-baf5-c1b135e8de72}")
808
variable = UUIDVariable()
810
# Strings and UUID objects are accepted from the database.
811
variable.set(value, from_db=True)
812
self.assertEquals(variable.get(), value)
813
variable.set("0609f76b-878f-4546-baf5-c1b135e8de72", from_db=True)
814
self.assertEquals(variable.get(), value)
815
variable.set(u"0609f76b-878f-4546-baf5-c1b135e8de72", from_db=True)
816
self.assertEquals(variable.get(), value)
818
# Some other representations for UUID values.
819
variable.set("{0609f76b-878f-4546-baf5-c1b135e8de72}", from_db=True)
820
self.assertEquals(variable.get(), value)
821
variable.set("0609f76b878f4546baf5c1b135e8de72", from_db=True)
822
self.assertEquals(variable.get(), value)
825
775
class PickleVariableTest(TestHelper):
827
777
def test_get_set(self):
839
789
self.assertEquals(variable.get(to_db=True), d_dump)
841
791
self.assertEquals(variable.get_state(), (Undef, d_dump))
843
793
variable.set(marker)
844
794
variable.set_state((Undef, d_dump))
845
795
self.assertEquals(variable.get(), d)
856
806
def changed(owner, variable, old_value, new_value, fromdb):
857
807
changes.append((variable, old_value, new_value, fromdb))
859
event.emit("start-tracking-changes", event)
860
809
event.hook("changed", changed)
862
811
variable.checkpoint()
887
836
class ListVariableTest(TestHelper):
889
838
def test_get_set(self):
890
# Enumeration variables are used as items so that database
891
# side and python side values can be distinguished.
892
get_map = {1: "a", 2: "b", 3: "c"}
893
set_map = {"a": 1, "b": 2, "c": 3}
894
item_factory = VariableFactory(
895
EnumVariable, get_map=get_map, set_map=set_map)
898
840
l_dump = pickle.dumps(l, -1)
899
l_vars = [item_factory(value=x) for x in l]
901
variable = ListVariable(item_factory)
842
variable = ListVariable(IntVariable)
904
845
self.assertEquals(variable.get(), l)
905
self.assertVariablesEqual(variable.get(to_db=True), l_vars)
846
self.assertEquals(variable.get(to_db=True),
847
[IntVariable(1), IntVariable(2)])
907
variable.set([1, 2], from_db=True)
849
variable.set([1.1, 2.2], from_db=True)
908
850
self.assertEquals(variable.get(), l)
909
self.assertVariablesEqual(variable.get(to_db=True), l_vars)
851
self.assertEquals(variable.get(to_db=True),
852
[IntVariable(1), IntVariable(2)])
911
854
self.assertEquals(variable.get_state(), (Undef, l_dump))
914
857
variable.set_state((Undef, l_dump))
915
858
self.assertEquals(variable.get(), l)
917
variable.get().append("c")
918
self.assertEquals(variable.get(), ["a", "b", "c"])
860
variable.get().append(3)
861
self.assertEquals(variable.get(), [1, 2, 3])
920
863
def test_list_events(self):
921
864
event = EventSystem(marker)
927
870
def changed(owner, variable, old_value, new_value, fromdb):
928
871
changes.append((variable, old_value, new_value, fromdb))
930
event.emit("start-tracking-changes", event)
931
873
event.hook("changed", changed)
933
875
variable.checkpoint()