add warning ability
[tiramisu.git] / test / test_option_validator.py
1 import autopath
2 from py.test import raises
3
4 from tiramisu.config import Config
5 from tiramisu.option import StrOption, OptionDescription
6
7
8 def return_true(value, param=None):
9     if value == 'val' and param in [None, 'yes']:
10         return True
11
12
13 def return_false(value, param=None):
14     if value == 'val' and param in [None, 'yes']:
15         raise ValueError('error')
16
17
18 def return_val(value, param=None):
19     return 'val'
20
21
22 def return_if_val(value):
23     if value != 'val':
24         raise ValueError('error')
25
26
27 def test_validator():
28     opt1 = StrOption('opt1', '', validator=return_true, default='val')
29     raises(ValueError, "StrOption('opt2', '', validator=return_false, default='val')")
30     opt2 = StrOption('opt2', '', validator=return_false)
31     root = OptionDescription('root', '', [opt1, opt2])
32     cfg = Config(root)
33     assert cfg.opt1 == 'val'
34     raises(ValueError, "cfg.opt2 = 'val'")
35
36
37 def test_validator_params():
38     opt1 = StrOption('opt1', '', validator=return_true, validator_params={'': ('yes',)}, default='val')
39     raises(ValueError, "StrOption('opt2', '', validator=return_false, validator_params={'': ('yes',)}, default='val')")
40     opt2 = StrOption('opt2', '', validator=return_false, validator_params={'': ('yes',)})
41     root = OptionDescription('root', '', [opt1, opt2])
42     cfg = Config(root)
43     assert cfg.opt1 == 'val'
44     raises(ValueError, "cfg.opt2 = 'val'")
45
46
47 def test_validator_params_key():
48     opt1 = StrOption('opt1', '', validator=return_true, validator_params={'param': ('yes',)}, default='val')
49     raises(TypeError, "StrOption('opt2', '', validator=return_true, validator_params={'param_unknown': ('yes',)}, default='val')")
50     root = OptionDescription('root', '', [opt1])
51     cfg = Config(root)
52     assert cfg.opt1 == 'val'
53
54
55 def test_validator_params_option():
56     opt0 = StrOption('opt0', '', default='val')
57     raises(ValueError, "opt1 = StrOption('opt1', '', validator=return_true, validator_params={'': ((opt0, False),)}, default='val')")
58
59
60 def test_validator_multi():
61     opt1 = StrOption('opt1', '', validator=return_if_val, multi=True)
62     root = OptionDescription('root', '', [opt1])
63     cfg = Config(root)
64     assert cfg.opt1 == []
65     cfg.opt1.append('val')
66     assert cfg.opt1 == ['val']
67     raises(ValueError, "cfg.opt1.append('val1')")
68     raises(ValueError, "cfg.opt1 = ['val', 'val1']")
69
70
71 def test_validator_warning():
72     opt1 = StrOption('opt1', '', validator=return_true, default='val', only_warning=True)
73     opt2 = StrOption('opt2', '', validator=return_false, only_warning=True)
74     opt3 = StrOption('opt3', '', validator=return_if_val, multi=True, only_warning=True)
75     root = OptionDescription('root', '', [opt1, opt2, opt3])
76     cfg = Config(root)
77     assert cfg.opt1 == 'val'
78     cfg.opt1 = 'val'
79     assert cfg.cfgimpl_get_values().has_warning() is False
80     cfg.opt2 = 'val'
81     assert cfg.cfgimpl_get_values().has_warning() is True
82     assert cfg.cfgimpl_get_values().get_last_warning() == 'invalid value val for option opt2: error'
83     assert cfg.cfgimpl_get_values().has_warning() is False
84     cfg.opt3.append('val')
85     assert cfg.cfgimpl_get_values().has_warning() is False
86     cfg.opt3.append('val1')
87     assert cfg.cfgimpl_get_values().has_warning() is True
88     assert cfg.cfgimpl_get_values().get_last_warning() == 'invalid value val1 for option opt3: error'
89     assert cfg.cfgimpl_get_values().has_warning() is False
90     raises(ValueError, "cfg.opt2 = 1")