add option name's validation and rename Option method with objimpl_
[tiramisu.git] / test / test_option_setting.py
index f7a8903..9ee9b02 100644 (file)
@@ -2,15 +2,18 @@
 import autopath
 from py.test import raises
 
-from tiramisu.config import *
-from tiramisu.option import *
-from tiramisu.error import *
+from tiramisu.setting import owners
+from tiramisu.config import Config
+from tiramisu.option import ChoiceOption, BoolOption, IntOption, FloatOption, \
+    StrOption, OptionDescription
+from tiramisu.error import PropertiesOptionError
+
 
 def make_description():
-    gcoption = ChoiceOption('name', 'GC name', ['ref', 'framework'], 'ref')
+    gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref')
     gcdummy = BoolOption('dummy', 'dummy', default=False)
     objspaceoption = ChoiceOption('objspace', 'Object space',
-                                ['std', 'thunk'], 'std')
+                                  ('std', 'thunk'), 'std')
     booloption = BoolOption('bool', 'Test boolean option', default=True)
     intoption = IntOption('int', 'Test int option', default=0)
     floatoption = FloatOption('float', 'Test float option', default=2.3)
@@ -21,10 +24,12 @@ def make_description():
                                       default=False)
     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
     descr = OptionDescription('tiramisu', '', [gcgroup, booloption, objspaceoption,
-                                           wantref_option, stroption,
-                                           wantframework_option,
-                                           intoption, boolop])
+                                               wantref_option, stroption,
+                                               wantframework_option,
+                                               intoption, boolop])
     return descr
+
+
 #____________________________________________________________
 # change with __setattr__
 def test_attribute_access():
@@ -36,13 +41,13 @@ def test_attribute_access():
     config.string = "foo"
     assert config.string == "foo"
 
+
 def test_setitem():
     s = StrOption("string", "", default=["string", "sdfsdf"], default_multi="prout", multi=True)
     descr = OptionDescription("options", "", [s])
     config = Config(descr)
-    print config.string[1]
     config.string[1] = "titi"
-    print config.string[1]
+
 
 def test_reset():
     "if value is None, resets to default owner"
@@ -51,50 +56,56 @@ def test_reset():
     config = Config(descr)
     config.string = "foo"
     assert config.string == "foo"
-    assert config._cfgimpl_value_owners['string'] == 'user'
-    config.unwrap_from_path("string").reset(config)
+    assert config.cfgimpl_get_values().getowner(s) == owners.user
+    del(config.string)
     assert config.string == 'string'
-    assert config._cfgimpl_value_owners['string'] == 'default'
+    assert config.cfgimpl_get_values().getowner(s) == owners.default
+
 
 def test_reset_with_multi():
-    s = StrOption("string", "", default=["string"], default_multi="string" , multi=True)
+    s = StrOption("string", "", default=["string"], default_multi="string", multi=True)
     descr = OptionDescription("options", "", [s])
     config = Config(descr)
 #    config.string = []
-    config.unwrap_from_path("string").reset(config)
+    del(config.string)
     assert config.string == ["string"]
-    assert config._cfgimpl_value_owners['string'] == 'default'
+    assert config.cfgimpl_get_values().getowner(s) == 'default'
     config.string = ["eggs", "spam", "foo"]
-    assert config._cfgimpl_value_owners['string'] == 'user'
+    assert config.cfgimpl_get_values().getowner(s) == 'user'
     config.string = []
-    config.unwrap_from_path("string").reset(config)
+    del(config.string)
 #    assert config.string == ["string"]
-    assert config._cfgimpl_value_owners['string'] == 'default'
-    raises(ConfigError, "config.string = None")
+    assert config.cfgimpl_get_values().getowner(s) == 'default'
+    raises(ValueError, "config.string = None")
+
 
 def test_default_with_multi():
     "default with multi is a list"
-    s = StrOption("string", "", default=[], default_multi="string" , multi=True)
+    s = StrOption("string", "", default=[], default_multi="string", multi=True)
     descr = OptionDescription("options", "", [s])
     config = Config(descr)
     assert config.string == []
-    s = StrOption("string", "", default=None, default_multi="string" , multi=True)
+    s = StrOption("string", "", default=None, default_multi="string", multi=True)
     descr = OptionDescription("options", "", [s])
     config = Config(descr)
     assert config.string == []
 
+
 def test_idontexist():
     descr = make_description()
     cfg = Config(descr)
     raises(AttributeError, "cfg.idontexist")
+
+
 # ____________________________________________________________
 def test_attribute_access_with_multi():
-    s = StrOption("string", "", default=["string"], default_multi= "string" , multi=True)
+    s = StrOption("string", "", default=["string"], default_multi="string", multi=True)
     descr = OptionDescription("options", "", [s])
     config = Config(descr)
     config.string = ["foo", "bar"]
     assert config.string == ["foo", "bar"]
 
+
 def test_item_access_with_multi():
     s = StrOption("string", "", default=["string"], multi=True)
     descr = OptionDescription("options", "", [s])
@@ -107,14 +118,15 @@ def test_item_access_with_multi():
 #    assert config.string[0] == 'changetest'
 #    assert config.string[
 
+
 def test_access_with_multi_default():
     s = StrOption("string", "", default=["string"], multi=True)
     descr = OptionDescription("options", "", [s])
     config = Config(descr)
-    assert config._cfgimpl_value_owners["string"] == 'default'
+    assert config._cfgimpl_values.getowner(s) == 'default'
     config.string = ["foo", "bar"]
     assert config.string == ["foo", "bar"]
-    assert config._cfgimpl_value_owners["string"] == 'user'
+    assert config._cfgimpl_values.getowner(s) == 'user'
 
 #def test_attribute_access_with_multi2():
 #    s = StrOption("string", "", default="string", multi=True)
@@ -123,59 +135,67 @@ def test_access_with_multi_default():
 #    config.string = ["foo", "bar"]
 #    assert config.string == ["foo", "bar"]
 
+
 def test_multi_with_requires():
     s = StrOption("string", "", default=["string"], default_multi="string", multi=True)
     intoption = IntOption('int', 'Test int option', default=0)
-    stroption = StrOption('str', 'Test string option', default=["abc"], default_multi = "abc",
-                          requires=[('int', 1, 'hide')], multi=True)
+    stroption = StrOption('str', 'Test string option', default=["abc"], default_multi="abc",
+                          requires=[('int', 1, 'hidden')], multi=True)
     descr = OptionDescription("options", "", [s, intoption, stroption])
     config = Config(descr)
-    assert stroption._is_hidden() == False
+    setting = config.cfgimpl_get_settings()
+    setting.read_write()
+    assert not 'hidden' in setting[stroption]
     config.int = 1
     raises(PropertiesOptionError, "config.str = ['a', 'b']")
-    assert stroption._is_hidden()
+    assert 'hidden' in setting[stroption]
+
 
 def test__requires_with_inverted():
     s = StrOption("string", "", default=["string"], multi=True)
     intoption = IntOption('int', 'Test int option', default=0)
-    stroption = StrOption('str', 'Test string option', default=["abc"], default_multi = "abc",
+    stroption = StrOption('str', 'Test string option', default=["abc"], default_multi="abc",
                           requires=[('int', 1, 'hide', 'inverted')], multi=True)
     descr = OptionDescription("options", "", [s, intoption, stroption])
     config = Config(descr)
-    assert stroption._is_hidden() == False
+    setting = config.cfgimpl_get_settings()
+    assert not 'hidden' in setting[stroption]
     config.int = 1
-    assert stroption._is_hidden() == False
+    assert not 'hidden' in setting[stroption]
+
 
 def test_multi_with_requires_in_another_group():
     s = StrOption("string", "", default=["string"], multi=True)
     intoption = IntOption('int', 'Test int option', default=0)
     descr = OptionDescription("options", "", [intoption])
     stroption = StrOption('str', 'Test string option', default=["abc"],
-                          requires=[('int', 1, 'hide')], multi=True)
+                          requires=[('int', 1, 'hidden')], multi=True)
     descr = OptionDescription("opt", "", [stroption])
     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
     config = Config(descr2)
-    assert stroption._is_hidden() == False
+    setting = config.cfgimpl_get_settings()
+    setting.read_write()
+    assert not 'hidden' in setting[stroption]
     config.int = 1
     raises(PropertiesOptionError,  "config.opt.str = ['a', 'b']")
-    assert stroption._is_hidden()
+    assert 'hidden' in setting[stroption]
+
 
 def test_apply_requires_from_config():
     s = StrOption("string", "", default=["string"], multi=True)
     intoption = IntOption('int', 'Test int option', default=0)
     descr = OptionDescription("options", "", [intoption])
     stroption = StrOption('str', 'Test string option', default=["abc"],
-                          requires=[('int', 1, 'hide')], multi=True)
+                          requires=[('int', 1, 'hidden')], multi=True)
     descr = OptionDescription("opt", "", [stroption])
     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
     config = Config(descr2)
-    assert stroption._is_hidden() == False
+    setting = config.cfgimpl_get_settings()
+    setting.read_write()
+    assert not 'hidden' in setting[stroption]
     config.int = 1
-    try:
-        config.opt.str
-    except:
-        pass
-    assert stroption._is_hidden()
+    raises(PropertiesOptionError, 'config.opt.str')
+    assert 'hidden' in setting[stroption]
 
 
 def test_apply_requires_with_disabled():
@@ -183,179 +203,191 @@ def test_apply_requires_with_disabled():
     intoption = IntOption('int', 'Test int option', default=0)
     descr = OptionDescription("options", "", [intoption])
     stroption = StrOption('str', 'Test string option', default=["abc"],
-                          requires=[('int', 1, 'disable')], multi=True)
+                          requires=[('int', 1, 'disabled')], multi=True)
     descr = OptionDescription("opt", "", [stroption])
     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
     config = Config(descr2)
-    assert stroption._is_disabled() == False
+    setting = config.cfgimpl_get_settings()
+    setting.read_write()
+    assert not 'disabled' in setting[stroption]
     config.int = 1
-    try:
-        config.opt.str
-    except:
-        pass
-    assert stroption._is_disabled()
+    raises(PropertiesOptionError, 'config.opt.str')
+    assert 'disabled' in setting[stroption]
+
 
 def test_multi_with_requires_with_disabled_in_another_group():
     s = StrOption("string", "", default=["string"], multi=True)
     intoption = IntOption('int', 'Test int option', default=0)
     descr = OptionDescription("options", "", [intoption])
     stroption = StrOption('str', 'Test string option', default=["abc"],
-                          requires=[('int', 1, 'disable')], multi=True)
+                          requires=[('int', 1, 'disabled')], multi=True)
     descr = OptionDescription("opt", "", [stroption])
     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
     config = Config(descr2)
-    assert stroption._is_disabled() == False
+    setting = config.cfgimpl_get_settings()
+    setting.read_write()
+    assert not 'disabled' in setting[stroption]
     config.int = 1
     raises(PropertiesOptionError,  "config.opt.str = ['a', 'b']")
-    assert stroption._is_disabled()
+    assert 'disabled' in setting[stroption]
+
 
 def test_multi_with_requires_that_is_multi():
     s = StrOption("string", "", default=["string"], multi=True)
     intoption = IntOption('int', 'Test int option', default=[0], multi=True)
     stroption = StrOption('str', 'Test string option', default=["abc"],
-                          requires=[('int', [1, 1], 'hide')], multi=True)
+                          requires=[('int', [1, 1], 'hidden')], multi=True)
     descr = OptionDescription("options", "", [s, intoption, stroption])
     config = Config(descr)
-    assert stroption._is_hidden() == False
+    setting = config.cfgimpl_get_settings()
+    setting.read_write()
+    assert not 'hidden' in setting[stroption]
     config.int = [1, 1]
     raises(PropertiesOptionError, "config.str = ['a', 'b']")
-    assert stroption._is_hidden()
+    assert 'hidden' in setting[stroption]
+
 
 def test_multi_with_bool():
     s = BoolOption("bool", "", default=[False], multi=True)
     descr = OptionDescription("options", "", [s])
     config = Config(descr)
-    assert descr.bool.multi == True
+    assert descr.bool.objimpl_is_multi() is True
     config.bool = [True, False]
-    assert config._cfgimpl_values['bool'] == [True, False]
+    assert config.cfgimpl_get_values()[s] == [True, False]
     assert config.bool == [True, False]
 
+
 def test_multi_with_bool_two():
     s = BoolOption("bool", "", default=[False], multi=True)
     descr = OptionDescription("options", "", [s])
     config = Config(descr)
-    assert descr.bool.multi == True
-    raises(ConfigError, "config.bool = True")
+    assert descr.bool.objimpl_is_multi() is True
+    raises(ValueError, "config.bool = True")
+
 
 def test_choice_access_with_multi():
-    ch = ChoiceOption("t1", "", ["a", "b"], default=["a"], multi=True)
+    ch = ChoiceOption("t1", "", ("a", "b"), default=["a"], multi=True)
     descr = OptionDescription("options", "", [ch])
     config = Config(descr)
     config.t1 = ["a", "b", "a", "b"]
     assert config.t1 == ["a", "b", "a", "b"]
 # ____________________________________________________________
 
-def test_setoption_from_option():
-    "a setoption directly from the option is **not** a good practice"
-    booloption = BoolOption('bool', 'Test boolean option', default=True)
-    descr = OptionDescription('descr', '', [booloption])
-    cfg = Config(descr)
-    booloption.setoption(cfg, False, 'owner')
-    assert cfg.bool == False
+#def test_setoption_from_option():
+#    "a setoption directly from the option is **not** a good practice"
+#    booloption = BoolOption('bool', 'Test boolean option', default=True)
+#    descr = OptionDescription('descr', '', [booloption])
+#    cfg = Config(descr)
+#    booloption.setoption(cfg, False)
+#    assert cfg.bool == False
+
+
 #____________________________________________________________
-def test_dwim_set():
-    descr = OptionDescription("opt", "", [
-        OptionDescription("sub", "", [
-            BoolOption("b1", ""),
-            ChoiceOption("c1", "", ['a', 'b', 'c'], 'a'),
-            BoolOption("d1", ""),
-        ]),
-        BoolOption("b2", ""),
-        BoolOption("d1", ""),
-    ])
-    c = Config(descr)
-    c.set(b1=False, c1='b')
-    assert not c.sub.b1
-    assert c.sub.c1 == 'b'
-    # new config, because you cannot change values once they are set
-    c = Config(descr)
-    c.set(b2=False, **{'sub.c1': 'c'})
-    assert not c.b2
-    assert c.sub.c1 == 'c'
-    raises(AmbigousOptionError, "c.set(d1=True)")
-    raises(NoMatchingOptionFound, "c.set(unknown='foo')")
-
-def test_more_set():
-    descr = OptionDescription("opt", "", [
-        OptionDescription("s1", "", [
-            BoolOption("a", "", default=False)]),
-        IntOption("int", "", default=42)])
-    d = {'s1.a': True, 'int': 23}
-    config = Config(descr)
-    config.set(**d)
-    assert config.s1.a
-    assert config.int == 23
-
-def test_set_with_hidden_option():
-    boolopt = BoolOption("a", "", default=False)
-    boolopt.hide()
-    descr = OptionDescription("opt", "", [
-        OptionDescription("s1", "", [boolopt]),
-        IntOption("int", "", default=42)])
-    d = {'s1.a': True, 'int': 23}
-    config = Config(descr)
-    raises(PropertiesOptionError, "config.set(**d)")
-
-def test_set_with_unknown_option():
-    boolopt = BoolOption("b", "", default=False)
-    descr = OptionDescription("opt", "", [
-        OptionDescription("s1", "", [boolopt]),
-        IntOption("int", "", default=42)])
-    d = {'s1.a': True, 'int': 23}
-    config = Config(descr)
-    raises(NoMatchingOptionFound, "config.set(**d)")
+#def test_dwim_set():
+#    descr = OptionDescription("opt", "", [
+#        OptionDescription("sub", "", [
+#            BoolOption("b1", ""),
+#            ChoiceOption("c1", "", ('a', 'b', 'c'), 'a'),
+#            BoolOption("d1", ""),
+#        ]),
+#        BoolOption("b2", ""),
+#        BoolOption("d1", ""),
+#    ])
+#    c = Config(descr)
+#    c.set(b1=False, c1='b')
+#    assert not c.sub.b1
+#    assert c.sub.c1 == 'b'
+#    # new config, because you cannot change values once they are set
+#    c = Config(descr)
+#    c.set(b2=False, **{'sub.c1': 'c'})
+#    assert not c.b2
+#    assert c.sub.c1 == 'c'
+#    raises(ConflictOptionError, "c.set(d1=True)")
+#    raises(AttributeError, "c.set(unknown='foo')")
+
+
+#def test_more_set():
+#    descr = OptionDescription("opt", "", [
+#        OptionDescription("s1", "", [
+#            BoolOption("a", "", default=False)]),
+#        IntOption("int", "", default=42)])
+#    d = {'s1.a': True, 'int': 23}
+#    config = Config(descr)
+#    config.set(**d)
+#    assert config.s1.a
+#    assert config.int == 23
 
 
-def test_set_symlink_option():
-    boolopt = BoolOption("b", "", default=False)
-    linkopt = SymLinkOption("c", "s1.b")
-    descr = OptionDescription("opt", "",
-                              [linkopt, OptionDescription("s1", "", [boolopt])])
-    config = Config(descr)
-    setattr(config, "s1.b", True)
-    setattr(config, "s1.b", False)
-    assert config.s1.b == False
-    assert config.c == False
-    config.c = True
-    assert config.s1.b == True
-    assert config.c == True
-    config.c = False
-    assert config.s1.b == False
-    assert config.c == False
+#def test_set_with_hidden_option():
+#    boolopt = BoolOption("a", "", default=False, properties=(('hidden'),))
+#    descr = OptionDescription("opt", "", [
+#        OptionDescription("s1", "", [boolopt]),
+#        IntOption("int", "", default=42)])
+#    d = {'s1.a': True, 'int': 23}
+#    config = Config(descr)
+#    setting = config.cfgimpl_get_settings()
+#    setting.read_write()
+#    raises(PropertiesOptionError, "config.set(**d)")
+#
+#
+#def test_set_with_unknown_option():
+#    boolopt = BoolOption("b", "", default=False)
+#    descr = OptionDescription("opt", "", [
+#        OptionDescription("s1", "", [boolopt]),
+#        IntOption("int", "", default=42)])
+#    d = {'s1.a': True, 'int': 23}
+#    config = Config(descr)
+#    raises(AttributeError, "config.set(**d)")
+#
+#
+#def test_set_symlink_option():
+#    boolopt = BoolOption("b", "", default=False)
+#    linkopt = SymLinkOption("c", "s1.b", opt=boolopt)
+#    descr = OptionDescription("opt", "",
+#                              [linkopt, OptionDescription("s1", "", [boolopt])])
+#    config = Config(descr)
+#    setattr(config, "s1.b", True)
+#    setattr(config, "s1.b", False)
+#    assert config.s1.b is False
+#    assert config.c is False
+#    config.c = True
+#    assert config.s1.b is True
+#    assert config.c is True
+#    config.c = False
+#    assert config.s1.b is False
+#    assert config.c is False
+#
+##____________________________________________________________
+#def test_config_impl_values():
+#    descr = make_description()
+#    config = Config(descr)
+#    config.bool = False
+##    gcdummy.setoption(config, True, "user")
+##    config.setoption("gc.dummy", True, "user")
+#    #config.gc.dummy = True
+##    config.setoption("bool", False, "user")
+#    config.set(dummy=False)
+#    assert config.gc._cfgimpl_context._cfgimpl_values.values == {'dummy': False, 'float': 2.3, 'name': 'ref'}
+#    ## acces to the option object
+##    config.gc._cfgimpl_descr.dummy.setoption(config, True, "user")
+#    assert config.gc.dummy == False
+##    config.set(dummy=True)
+##    assert config.gc.dummy == True
 
 #____________________________________________________________
-def test_config_impl_values():
-    descr = make_description()
-    config = Config(descr)
-    config.bool = False
-#    gcdummy.setoption(config, True, "user")
-#    config.setoption("gc.dummy", True, "user")
-    #config.gc.dummy = True
-#    config.setoption("bool", False, "user")
-    config.set(dummy=False)
-    assert config.gc._cfgimpl_values == {'dummy': False, 'float': 2.3, 'name': 'ref'}
-    ## acces to the option object
-#    config.gc._cfgimpl_descr.dummy.setoption(config, True, "user")
-    assert config.gc.dummy == False
-#    config.set(dummy=True)
-#    assert config.gc.dummy == True
+#def test_accepts_multiple_changes_from_option():
+#    s = StrOption("string", "", default="string")
+#    descr = OptionDescription("options", "", [s])
+#    config = Config(descr)
+#    config.string = "egg"
+#    assert s.getdefault() == "string"
+#    assert config.string == "egg"
+#    s.setoption(config, 'blah')
+#    assert s.getdefault() == "string"
+#    assert config.string == "blah"
+#    s.setoption(config, 'bol')
+#    assert config.string == 'bol'
 
-#____________________________________________________________
-def test_accepts_multiple_changes_from_option():
-    s = StrOption("string", "", default="string")
-    descr = OptionDescription("options", "", [s])
-    config = Config(descr)
-    config.string = "egg"
-    assert s.getdefault() == "string"
-    assert config.string == "egg"
-    s.setoption(config, 'blah', "default")
-    assert s.getdefault() == "string"
-    assert config.string == "blah"
-    s.setoption(config, 'bol', "user")
-    assert config.string == 'bol'
-#    config.override({'string': "blurp"})
-#    assert config.string == 'blurp'
-#    assert s.getdefault() == 'blurp'
 
 def test_allow_multiple_changes_from_config():
     """
@@ -367,47 +399,34 @@ def test_allow_multiple_changes_from_config():
     suboption = OptionDescription("bip", "", [s2])
     descr = OptionDescription("options", "", [s, suboption])
     config = Config(descr)
-    config.setoption("string", 'blah', "user")
-    config.setoption("string", "oh", "user")
+    config.string = "oh"
     assert config.string == "oh"
-    config.set(string2= 'blah')
-    assert config.bip.string2 == 'blah'
-# ____________________________________________________________
+    config.string = "blah"
+    assert config.string == "blah"
+#    config.set(string2='blah')
+#    assert config.bip.string2 == 'blah'
 
-#def test_overrides_are_defaults():
-#    descr = OptionDescription("test", "", [
-#        BoolOption("b1", "", default=False),
-#        BoolOption("b2", "", default=False),
-#        ])
-#    # overrides here
-#    config = Config(descr)
-#    config.b2 = True
-#    assert config.b2
-#    # test with a require
-#    config.b1 = True
-#    assert config.b2
-
- # ____________________________________________________________
- # accessing a value by the get method
+
+# ____________________________________________________________
+# accessing a value by the get method
 def test_access_by_get():
     descr = make_description()
     cfg = Config(descr)
-    raises(NotFoundError, "cfg.get('idontexist')" )
-    assert cfg.get('wantref') == False
-    assert cfg.gc.dummy == False
-    assert cfg.get('dummy') == False
+    raises(AttributeError, "cfg.find(byname='idontexist')")
+    assert cfg.find_first(byname='wantref', type_='value') is False
+    assert cfg.gc.dummy is False
+    assert cfg.find_first(byname='dummy', type_='value') is False
+
 
 def test_access_by_get_whith_hide():
-    b1 = BoolOption("b1", "")
-    b1.hide()
-    descr = OptionDescription("opt", "", [
-    OptionDescription("sub", "", [
-        b1,
-        ChoiceOption("c1", "", ['a', 'b', 'c'], 'a'),
-        BoolOption("d1", ""),
-    ]),
-    BoolOption("b2", ""),
-    BoolOption("d1", ""),
-    ])
+    b1 = BoolOption("b1", "", properties=(('hidden'),))
+    descr = OptionDescription("opt", "",
+                              [OptionDescription("sub", "",
+                                                 [b1, ChoiceOption("c1", "", ('a', 'b', 'c'), 'a'),
+                                                  BoolOption("d1", "")]),
+                               BoolOption("b2", ""),
+                               BoolOption("d1", "")])
     c = Config(descr)
-    raises(PropertiesOptionError, "c.get('b1')")
+    setting = c.cfgimpl_get_settings()
+    setting.read_write()
+    raises(AttributeError, "c.find(byname='b1')")