python 3.5 support
[tiramisu.git] / test / test_dereference.py
1 # coding: utf-8
2 from .autopath import do_autopath
3 do_autopath()
4
5 from tiramisu.config import Config, GroupConfig, MetaConfig
6 from tiramisu.option import BoolOption, IntOption, StrOption, OptionDescription, submulti
7 import weakref
8
9
10 IS_DEREFABLE = True
11
12
13 def test_deref_storage():
14     b = BoolOption('b', '')
15     o = OptionDescription('od', '', [b])
16     c = Config(o)
17     w = weakref.ref(c.cfgimpl_get_values()._p_)
18     del(c)
19     assert w() is None
20
21
22 def test_deref_value():
23     b = BoolOption('b', '')
24     o = OptionDescription('od', '', [b])
25     c = Config(o)
26     w = weakref.ref(c.cfgimpl_get_values())
27     del(c)
28     assert w() is None
29
30
31 def test_deref_setting():
32     b = BoolOption('b', '')
33     o = OptionDescription('od', '', [b])
34     c = Config(o)
35     w = weakref.ref(c.cfgimpl_get_settings())
36     del(c)
37     assert w() is None
38
39
40 def test_deref_config():
41     b = BoolOption('b', '')
42     o = OptionDescription('od', '', [b])
43     c = Config(o)
44     w = weakref.ref(c)
45     del(c)
46     assert w() is None
47
48
49 def test_deref_option():
50     global IS_DEREFABLE
51     b = BoolOption('b', '')
52     o = OptionDescription('od', '', [b])
53     w = weakref.ref(b)
54     del(b)
55     try:
56         assert w() is not None
57     except AssertionError:
58         IS_DEREFABLE = False
59         return
60     del(o)
61     assert w() is None
62
63
64 def test_deref_optiondescription():
65     if not IS_DEREFABLE:
66         return
67     b = BoolOption('b', '')
68     o = OptionDescription('od', '', [b])
69     w = weakref.ref(o)
70     del(b)
71     assert w() is not None
72     del(o)
73     assert w() is None
74
75
76 def test_deref_option_cache():
77     if not IS_DEREFABLE:
78         return
79     b = BoolOption('b', '')
80     o = OptionDescription('od', '', [b])
81     o.impl_build_cache_option()
82     w = weakref.ref(b)
83     del(b)
84     assert w() is not None
85     del(o)
86     assert w() is None
87
88
89 def test_deref_optiondescription_cache():
90     if not IS_DEREFABLE:
91         return
92     b = BoolOption('b', '')
93     o = OptionDescription('od', '', [b])
94     o.impl_build_cache_option()
95     w = weakref.ref(o)
96     del(b)
97     assert w() is not None
98     del(o)
99     assert w() is None
100
101
102 def test_deref_option_config():
103     if not IS_DEREFABLE:
104         return
105     b = BoolOption('b', '')
106     o = OptionDescription('od', '', [b])
107     c = Config(o)
108     w = weakref.ref(b)
109     del(b)
110     assert w() is not None
111     del(o)
112     assert w() is not None
113     del(c)
114     assert w() is None
115
116
117 def test_deref_optiondescription_config():
118     if not IS_DEREFABLE:
119         return
120     b = BoolOption('b', '')
121     o = OptionDescription('od', '', [b])
122     c = Config(o)
123     w = weakref.ref(o)
124     del(b)
125     assert w() is not None
126     del(o)
127     assert w() is not None
128     del(c)
129     assert w() is None
130
131
132 def test_deref_groupconfig():
133     if not IS_DEREFABLE:
134         return
135     i1 = IntOption('i1', '')
136     od1 = OptionDescription('od1', '', [i1])
137     od2 = OptionDescription('od2', '', [od1])
138     conf1 = Config(od2, 'conf1')
139     conf2 = Config(od2, 'conf2')
140     meta = GroupConfig([conf1, conf2])
141     w = weakref.ref(conf1)
142     del(conf1)
143     assert w() is not None
144     del(meta)
145     assert w() is None
146
147
148 def test_deref_metaconfig():
149     if not IS_DEREFABLE:
150         return
151     i1 = IntOption('i1', '')
152     od1 = OptionDescription('od1', '', [i1])
153     od2 = OptionDescription('od2', '', [od1])
154     conf1 = Config(od2, 'conf1')
155     conf2 = Config(od2, 'conf2')
156     meta = MetaConfig([conf1, conf2])
157     w = weakref.ref(conf1)
158     del(conf1)
159     assert w() is not None
160     del(meta)
161     assert w() is None
162
163
164 def test_deref_submulti():
165     if not IS_DEREFABLE:
166         return
167     multi = StrOption('multi', '', multi=submulti)
168     od = OptionDescription('od', '', [multi])
169     cfg = Config(od)
170     cfg.cfgimpl_get_settings().remove('cache')
171     w = weakref.ref(cfg.multi)
172     assert w() is None
173     cfg.multi.append([])
174     w = weakref.ref(cfg.multi)
175     assert w() is None
176     m = cfg.multi
177     w = weakref.ref(m)
178     z = weakref.ref(w()[0])
179     del(m)
180     assert w() is None
181     assert z() is None