def test_deeper_Switch(): root = Switch(None, [ Group('a', [ Options('p', [ Value('x', int, 42), Value('y', str, 'hello'), ]), ], True), Group('b', [ Options('q', [ Value('x', int, 6), Value('y', str, 'bye'), ]), ]), ]) root.validate() assert list(map(str, root.walk())) == [ "(<Switch None>,)", "(<Switch None>, <Group 'a'>)", "(<Switch None>, <Group 'a'>, <Options 'p'>, <Value 'x'>)", "(<Switch None>, <Group 'a'>, <Options 'p'>, <Value 'y'>)", "(<Switch None>, <Group 'b'>)", "(<Switch None>, <Group 'b'>, <Options 'q'>, <Value 'x'>)", "(<Switch None>, <Group 'b'>, <Options 'q'>, <Value 'y'>)", ]
def test_make_tree(): root = Group(None, [ Value("a1ob", bool, default=False, doc="a1ob doc"), Switch("a2e", [ Switch('b1ef', doc="b1ef doc", nodes=[ Value("c1of", bool), Value("c2of", bool), Group("c3gf", nodes=[ Value("d1o", doc="d1o doc"), Value("d2o"), ]), ]), Group( 'b2gf', nodes=[ Switch(None, [ Group("d3gf", nodes=[ Value("e1oi", int, default=50), ]), Value("d4of", bool), ]), Value("c4od", float, default=1e-8), Value("c5oi", int, default=100), Value("c6o"), ]), ]), Group("a3g", [ Value("b3oi", int, default=30), Value("b4od", float, default=1e-6), ]) ]) root.validate() assert list(map(Value.name_from_path, root.walk())) == [ '', 'a1ob', 'a2e.b1ef', 'a2e.b1ef.c1of', 'a2e.b1ef.c2of', 'a2e.b1ef.c3gf', 'a2e.b1ef.c3gf.d1o', 'a2e.b1ef.c3gf.d2o', 'a2e.b2gf', 'a2e.b2gf.d3gf', 'a2e.b2gf.d3gf.e1oi', 'a2e.b2gf.d4of', 'a2e.b2gf.c4od', 'a2e.b2gf.c5oi', 'a2e.b2gf.c6o', 'a3g.b3oi', 'a3g.b4od', ] return root
def test_invalid_Switch_multiple_activated(): root = Switch(None, [ Group('a', [ Value('x', int, 42), Value('y', str, 'hello'), ], True), Group('b', [ Value('x', int, 6), Value('y', str, 'bye'), ], False), ]) root.validate()
def test_invalid_duplicate_2(): root = Switch(None, [ Group('a', [ Value('x', int, 42), Value('y', str, 'hello'), ], True), Group('a', [ Value('x', int, 6), Value('y', str, 'bye'), ]), ]) with pytest.raises(ValueError): root.validate()
def test_multiple_default_under_exclusif(): root = Switch(None, [ Value('x', int, 42), Value('y', bool, True) ]) with pytest.raises(ValueError): ConfigSimple(root)
def test_empty_conf_default_under_exclusive(): conf = ConfigSimple( Switch(None, [ Group('a', default=True, nodes=[ Value('x', int, 42), ]), Group('b', nodes=[ Value('x', int, 12), ]), ]) ) assert conf.to_dict() == {'a.x': 42}
def test_empty_conf_exclusive(): conf = ConfigSimple( Switch(None, [ Group('a', nodes=[ Value('x', int, 42), ]), Group('b', nodes=[ Value('x', int, 12), ]), ]) ) assert conf.to_dict() == {}
def test_default_group_under_exclusif(): root = Switch(None, [ Group('a', default=True, nodes=[ Value('x', int, 42), Value('y', bool, True) ]), Group('b', nodes=[ Value('x', int, 42), Value('y', bool, True) ]), ]) conf = ConfigSimple(root) assert conf['a'] assert conf['a.x'] == 42 assert conf['a.y'] assert not conf['b'] with pytest.raises(KeyError): conf['b.x'] with pytest.raises(KeyError): conf['b.y'] assert conf.to_dict() == {'a.x': 42, 'a.y': True} conf['b'] = True assert conf['b'] assert conf['b.x'] == 42 assert conf['b.y'] assert not conf['a'] with pytest.raises(KeyError): conf['a.x'] with pytest.raises(KeyError): conf['a.y'] assert conf.to_dict() == {'b.x': 42, 'b.y': True} conf['b'] = False assert not conf['a'] with pytest.raises(KeyError): conf['a.x'] with pytest.raises(KeyError): conf['a.y'] assert not conf['b'] with pytest.raises(KeyError): conf['b.x'] with pytest.raises(KeyError): conf['b.y'] assert conf.to_dict() == {}
def test_default_under_exclusif(): root = Switch(None, [ Value('x', int, 42), Value('y', bool) ]) conf = ConfigSimple(root) assert conf['x'] == 42 with pytest.raises(KeyError): conf['y'] conf['y'] = True assert conf['y'] with pytest.raises(KeyError): conf['x']
def test_simple(): from inept import ConfigSimple, Value, Options, Switch carte_tree = Options(None, [ Value('cafe', bool, False), Value('boisson', str), Switch(None, [ MenuPasCher.root.rename("menu_base"), MenuComplet.root.rename("menu_complet"), ]) ]) order = ConfigSimple(carte_tree) assert order.all_keys() == [ 'cafe', 'boisson', 'menu_base', 'menu_base.plat', 'menu_base.entree', 'menu_base.dessert', 'menu_complet', 'menu_complet.plat', 'menu_complet.entree', 'menu_complet.dessert', ]