cannot set properties if those properties are in requirement
[tiramisu.git] / test / test_slots.py
1 # coding: utf-8
2 import autopath
3 from py.test import raises
4
5 from tiramisu.config import Config, SubConfig
6 from tiramisu.option import ChoiceOption, BoolOption, IntOption, FloatOption, \
7     StrOption, SymLinkOption, UnicodeOption, IPOption, OptionDescription, \
8     PortOption, NetworkOption, NetmaskOption, DomainnameOption
9
10
11 def test_slots_option():
12     c = ChoiceOption('a', '', ('a',))
13     raises(AttributeError, "c.x = 1")
14     c = BoolOption('a', '')
15     raises(AttributeError, "c.x = 1")
16     c = IntOption('a', '')
17     raises(AttributeError, "c.x = 1")
18     c = FloatOption('a', '')
19     raises(AttributeError, "c.x = 1")
20     c = StrOption('a', '')
21     raises(AttributeError, "c.x = 1")
22     c = SymLinkOption('b', c)
23     raises(AttributeError, "c.x = 1")
24     c = UnicodeOption('a', '')
25     raises(AttributeError, "c.x = 1")
26     c = IPOption('a', '')
27     raises(AttributeError, "c.x = 1")
28     c = OptionDescription('a', '', [])
29     raises(AttributeError, "c.x = 1")
30     c = PortOption('a', '')
31     raises(AttributeError, "c.x = 1")
32     c = NetworkOption('a', '')
33     raises(AttributeError, "c.x = 1")
34     c = NetmaskOption('a', '')
35     raises(AttributeError, "c.x = 1")
36     c = DomainnameOption('a', '')
37     raises(AttributeError, "c.x = 1")
38
39
40 def test_slots_option_readonly():
41     a = ChoiceOption('a', '', ('a',))
42     b = BoolOption('b', '')
43     c = IntOption('c', '')
44     d = FloatOption('d', '')
45     e = StrOption('e', '')
46     g = UnicodeOption('g', '')
47     h = IPOption('h', '')
48     i = PortOption('i', '')
49     j = NetworkOption('j', '')
50     k = NetmaskOption('k', '')
51     l = DomainnameOption('l', '')
52     m = OptionDescription('m', '', [a, b, c, d, e, g, h, i, j, k, l])
53     a._requires = 'a'
54     b._requires = 'b'
55     c._requires = 'c'
56     d._requires = 'd'
57     e._requires = 'e'
58     g._requires = 'g'
59     h._requires = 'h'
60     i._requires = 'i'
61     j._requires = 'j'
62     k._requires = 'k'
63     l._requires = 'l'
64     m._requires = 'm'
65     Config(m)
66     raises(AttributeError, "a._requires = 'a'")
67     raises(AttributeError, "b._requires = 'b'")
68     raises(AttributeError, "c._requires = 'c'")
69     raises(AttributeError, "d._requires = 'd'")
70     raises(AttributeError, "e._requires = 'e'")
71     raises(AttributeError, "g._requires = 'g'")
72     raises(AttributeError, "h._requires = 'h'")
73     raises(AttributeError, "i._requires = 'i'")
74     raises(AttributeError, "j._requires = 'j'")
75     raises(AttributeError, "k._requires = 'k'")
76     raises(AttributeError, "l._requires = 'l'")
77     raises(AttributeError, "m._requires = 'm'")
78
79
80 def test_slots_option_readonly_name():
81     a = ChoiceOption('a', '', ('a',))
82     b = BoolOption('b', '')
83     c = IntOption('c', '')
84     d = FloatOption('d', '')
85     e = StrOption('e', '')
86     f = SymLinkOption('f', c)
87     g = UnicodeOption('g', '')
88     h = IPOption('h', '')
89     i = PortOption('i', '')
90     j = NetworkOption('j', '')
91     k = NetmaskOption('k', '')
92     l = DomainnameOption('l', '')
93     m = OptionDescription('m', '', [a, b, c, d, e, f, g, h, i, j, k, l])
94     raises(AttributeError, "a._name = 'a'")
95     raises(AttributeError, "b._name = 'b'")
96     raises(AttributeError, "c._name = 'c'")
97     raises(AttributeError, "d._name = 'd'")
98     raises(AttributeError, "e._name = 'e'")
99     raises(AttributeError, "f._name = 'f'")
100     raises(AttributeError, "g._name = 'g'")
101     raises(AttributeError, "h._name = 'h'")
102     raises(AttributeError, "i._name = 'i'")
103     raises(AttributeError, "j._name = 'j'")
104     raises(AttributeError, "k._name = 'k'")
105     raises(AttributeError, "l._name = 'l'")
106     raises(AttributeError, "m._name = 'm'")
107
108
109 def test_slots_description():
110     # __slots__ for OptionDescription should be complete for __getattr__
111     slots = set()
112     for subclass in OptionDescription.__mro__:
113         if subclass is not object:
114             slots.update(subclass.__slots__)
115     assert slots == set(OptionDescription.__slots__)
116
117
118 def test_slots_config():
119     od1 = OptionDescription('a', '', [])
120     od2 = OptionDescription('a', '', [od1])
121     c = Config(od2)
122     raises(AttributeError, "c.x = 1")
123     raises(AttributeError, "c.cfgimpl_x = 1")
124     sc = c.a
125     assert isinstance(sc, SubConfig)
126     raises(AttributeError, "sc.x = 1")
127     raises(AttributeError, "sc.cfgimpl_x = 1")
128
129
130 def test_slots_setting():
131     od1 = OptionDescription('a', '', [])
132     od2 = OptionDescription('a', '', [od1])
133     c = Config(od2)
134     s = c.cfgimpl_get_settings()
135     raises(AttributeError, "s.x = 1")
136
137
138 def test_slots_value():
139     od1 = OptionDescription('a', '', [])
140     od2 = OptionDescription('a', '', [od1])
141     c = Config(od2)
142     v = c.cfgimpl_get_values()
143     raises(AttributeError, "v.x = 1")