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