~free.ekanayaka/storm/any-expr

« back to all changes in this revision

Viewing changes to tests/variables.py

  • Committer: Thomas Hervé
  • Date: 2008-09-02 11:45:25 UTC
  • mfrom: (262.1.3 262607-join-none)
  • Revision ID: thomas@canonical.com-20080902114525-82j6grtlc71vwb8b
Merge 262607-join-none [f=262607] [r=niemeyer,jamesh]

Make LEFT JOIN works with empty objects in the joined tables and constraints
on the keys (like allow_none=False).

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
from datetime import datetime, date, time, timedelta
22
22
from decimal import Decimal
23
23
import cPickle as pickle
24
 
import gc
25
 
import weakref
26
 
try:
27
 
    import uuid
28
 
except ImportError:
29
 
    uuid = None
30
24
 
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)])
99
93
 
100
 
    def test_set_leak(self):
101
 
        """When a variable is checkpointed, the value must not leak."""
102
 
        variable = Variable()
103
 
        m = Marker()
104
 
        m_ref = weakref.ref(m)
105
 
        variable.set(m)
106
 
        variable.checkpoint()
107
 
        variable.set(LazyValue())
108
 
        del m
109
 
        gc.collect()
110
 
        self.assertIdentical(m_ref(), None)
111
 
 
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)])
122
104
 
 
105
    def test_eq(self):
 
106
        self.assertEquals(CustomVariable(marker), CustomVariable(marker))
 
107
        self.assertNotEquals(CustomVariable(marker), CustomVariable(object()))
 
108
 
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))
215
 
 
 
201
        
216
202
        event.hook("changed", changed)
217
203
 
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)
 
265
 
 
266
    def test_hash(self):
 
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))
280
271
 
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))
322
 
 
 
313
        
323
314
        event.hook("changed", changed)
324
315
 
325
316
        variable = CustomVariable(event=event)
660
651
        self.assertEquals(variable.get(), delta)
661
652
 
662
653
        self.assertRaises(TypeError, variable.set, marker)
663
 
 
 
654
    
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")
782
773
 
783
774
 
784
 
class UUIDVariableTest(TestHelper):
785
 
 
786
 
    def is_supported(self):
787
 
        return uuid is not None
788
 
 
789
 
    def test_get_set(self):
790
 
        value = uuid.UUID("{0609f76b-878f-4546-baf5-c1b135e8de72}")
791
 
 
792
 
        variable = UUIDVariable()
793
 
 
794
 
        variable.set(value)
795
 
        self.assertEquals(variable.get(), value)
796
 
        self.assertEquals(
797
 
            variable.get(to_db=True), "0609f76b-878f-4546-baf5-c1b135e8de72")
798
 
 
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")
804
 
 
805
 
    def test_get_set_from_database(self):
806
 
        value = uuid.UUID("{0609f76b-878f-4546-baf5-c1b135e8de72}")
807
 
 
808
 
        variable = UUIDVariable()
809
 
 
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)
817
 
 
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)
823
 
 
824
 
 
825
775
class PickleVariableTest(TestHelper):
826
776
 
827
777
    def test_get_set(self):
839
789
        self.assertEquals(variable.get(to_db=True), d_dump)
840
790
 
841
791
        self.assertEquals(variable.get_state(), (Undef, d_dump))
842
 
 
 
792
        
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))
858
808
 
859
 
        event.emit("start-tracking-changes", event)
860
809
        event.hook("changed", changed)
861
810
 
862
811
        variable.checkpoint()
887
836
class ListVariableTest(TestHelper):
888
837
 
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)
896
 
 
897
 
        l = ["a", "b"]
 
839
        l = [1, 2]
898
840
        l_dump = pickle.dumps(l, -1)
899
 
        l_vars = [item_factory(value=x) for x in l]
900
841
 
901
 
        variable = ListVariable(item_factory)
 
842
        variable = ListVariable(IntVariable)
902
843
 
903
844
        variable.set(l)
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)])
906
848
 
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)])
910
853
 
911
854
        self.assertEquals(variable.get_state(), (Undef, l_dump))
912
855
 
914
857
        variable.set_state((Undef, l_dump))
915
858
        self.assertEquals(variable.get(), l)
916
859
 
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])
919
862
 
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))
929
872
 
930
 
        event.emit("start-tracking-changes", event)
931
873
        event.hook("changed", changed)
932
874
 
933
875
        variable.checkpoint()