# coding: utf-8 import autopath from py.test import raises from tiramisu.config import Config, SubConfig from tiramisu.option import ChoiceOption, BoolOption, IntOption, FloatOption,\ StrOption, SymLinkOption, UnicodeOption, IPOption, OptionDescription, \ PortOption, NetworkOption, NetmaskOption, DomainnameOption, EmailOption, \ URLOption, FilenameOption def test_slots_option(): c = ChoiceOption('a', '', ('a',)) raises(AttributeError, "c.x = 1") c = BoolOption('a', '') raises(AttributeError, "c.x = 1") c = IntOption('a', '') raises(AttributeError, "c.x = 1") c = FloatOption('a', '') raises(AttributeError, "c.x = 1") c = StrOption('a', '') raises(AttributeError, "c.x = 1") c = SymLinkOption('b', c) raises(AttributeError, "c.x = 1") c = UnicodeOption('a', '') raises(AttributeError, "c.x = 1") c = IPOption('a', '') raises(AttributeError, "c.x = 1") c = OptionDescription('a', '', []) raises(AttributeError, "c.x = 1") c = PortOption('a', '') raises(AttributeError, "c.x = 1") c = NetworkOption('a', '') raises(AttributeError, "c.x = 1") c = NetmaskOption('a', '') raises(AttributeError, "c.x = 1") c = DomainnameOption('a', '') raises(AttributeError, "c.x = 1") c = EmailOption('a', '') raises(AttributeError, "c.x = 1") c = URLOption('a', '') raises(AttributeError, "c.x = 1") c = FilenameOption('a', '') raises(AttributeError, "c.x = 1") def test_slots_option_readonly(): a = ChoiceOption('a', '', ('a',)) b = BoolOption('b', '') c = IntOption('c', '') d = FloatOption('d', '') e = StrOption('e', '') g = UnicodeOption('g', '') h = IPOption('h', '') i = PortOption('i', '') j = NetworkOption('j', '') k = NetmaskOption('k', '') l = DomainnameOption('l', '') o = EmailOption('o', '') p = URLOption('p', '') q = FilenameOption('q', '') m = OptionDescription('m', '', [a, b, c, d, e, g, h, i, j, k, l, o, p, q]) a._requires = 'a' b._requires = 'b' c._requires = 'c' d._requires = 'd' e._requires = 'e' g._requires = 'g' h._requires = 'h' i._requires = 'i' j._requires = 'j' k._requires = 'k' l._requires = 'l' m._requires = 'm' o._requires = 'o' p._requires = 'p' q._requires = 'q' Config(m) raises(AttributeError, "a._requires = 'a'") raises(AttributeError, "b._requires = 'b'") raises(AttributeError, "c._requires = 'c'") raises(AttributeError, "d._requires = 'd'") raises(AttributeError, "e._requires = 'e'") raises(AttributeError, "g._requires = 'g'") raises(AttributeError, "h._requires = 'h'") raises(AttributeError, "i._requires = 'i'") raises(AttributeError, "j._requires = 'j'") raises(AttributeError, "k._requires = 'k'") raises(AttributeError, "l._requires = 'l'") raises(AttributeError, "m._requires = 'm'") raises(AttributeError, "o._requires = 'o'") raises(AttributeError, "p._requires = 'p'") raises(AttributeError, "q._requires = 'q'") def test_slots_option_readonly_name(): a = ChoiceOption('a', '', ('a',)) b = BoolOption('b', '') c = IntOption('c', '') d = FloatOption('d', '') e = StrOption('e', '') f = SymLinkOption('f', c) g = UnicodeOption('g', '') h = IPOption('h', '') i = PortOption('i', '') j = NetworkOption('j', '') k = NetmaskOption('k', '') l = DomainnameOption('l', '') o = DomainnameOption('o', '') p = DomainnameOption('p', '') q = DomainnameOption('q', '') m = OptionDescription('m', '', [a, b, c, d, e, f, g, h, i, j, k, l, o, p, q]) raises(AttributeError, "a._name = 'a'") raises(AttributeError, "b._name = 'b'") raises(AttributeError, "c._name = 'c'") raises(AttributeError, "d._name = 'd'") raises(AttributeError, "e._name = 'e'") raises(AttributeError, "f._name = 'f'") raises(AttributeError, "g._name = 'g'") raises(AttributeError, "h._name = 'h'") raises(AttributeError, "i._name = 'i'") raises(AttributeError, "j._name = 'j'") raises(AttributeError, "k._name = 'k'") raises(AttributeError, "l._name = 'l'") raises(AttributeError, "m._name = 'm'") raises(AttributeError, "o._name = 'o'") raises(AttributeError, "p._name = 'p'") raises(AttributeError, "q._name = 'q'") def test_slots_description(): # __slots__ for OptionDescription should be complete for __getattr__ slots = set() for subclass in OptionDescription.__mro__: if subclass is not object: slots.update(subclass.__slots__) assert slots == set(OptionDescription.__slots__) def test_slots_config(): od1 = OptionDescription('a', '', []) od2 = OptionDescription('a', '', [od1]) c = Config(od2) raises(AttributeError, "c.x = 1") raises(AttributeError, "c.cfgimpl_x = 1") sc = c.a assert isinstance(sc, SubConfig) raises(AttributeError, "sc.x = 1") raises(AttributeError, "sc.cfgimpl_x = 1") def test_slots_setting(): od1 = OptionDescription('a', '', []) od2 = OptionDescription('a', '', [od1]) c = Config(od2) s = c.cfgimpl_get_settings() raises(AttributeError, "s.x = 1") def test_slots_value(): od1 = OptionDescription('a', '', []) od2 = OptionDescription('a', '', [od1]) c = Config(od2) v = c.cfgimpl_get_values() raises(AttributeError, "v.x = 1")