configurationengine/source/cone/confml/tests/unittest_model.py
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
child 5 d2c80f5cab53
equal deleted inserted replaced
2:87cfa131b535 3:e7e0ae78773e
    13 #
    13 #
    14 # Description: 
    14 # Description: 
    15 #
    15 #
    16 
    16 
    17 import unittest
    17 import unittest
    18 import string
       
    19 import sys
    18 import sys
    20 import __init__
       
    21 
       
    22 from cone.public import api, exceptions
    19 from cone.public import api, exceptions
    23 from cone.confml import model
    20 from cone.confml import model
    24 
    21 
    25 
    22 
    26 class TestConfmlMeta(unittest.TestCase):
    23 class TestConfmlMeta(unittest.TestCase):
    27     def test_create_meta(self):
    24     def test_create_meta(self):
    28         metaelem = model.ConfmlMeta()
    25         metaelem = model.ConfmlMeta()
    29         self.assertTrue(metaelem)
    26         self.assertEquals(str(metaelem),"ConfmlMeta object\n")
    30 
    27 
    31     def test_create_with_data(self):
    28     def test_create_with_data(self):
    32         prop1 = model.ConfmlMetaProperty("foo", 123)
    29         prop1 = model.ConfmlMetaProperty("foo", 123)
    33         prop2 = model.ConfmlMetaProperty("bar", 312)
    30         prop2 = model.ConfmlMetaProperty("bar", 312)
    34         prop3 = model.ConfmlMetaProperty("test", 'testing string')
    31         prop3 = model.ConfmlMetaProperty("test", 'testing string')
    35         prop4 = model.ConfmlMetaProperty("testName", 'testing string2', \
    32         prop4 = model.ConfmlMetaProperty("testName", 'testing string2', \
    36                                          "http://www.nokia.com/xml/cpf-id/1", \
    33                                          "http://www.nokia.com/xml/cpf-id/1", \
    37                                          attrs={"name":"name1", "value": "value1"})            
    34                                          attrs={"name":"name1", "value": "value1"})            
    38         metaelem = model.ConfmlMeta([prop1, prop2, prop3, prop4])
    35         metaelem = model.ConfmlMeta([prop1, prop2, prop3, prop4])
    39         self.assertEquals(metaelem[0].tag, "foo")
    36         self.assertEquals(metaelem[0].tag, "foo")
       
    37         self.assertEquals(metaelem[0].attrs, {})
    40         self.assertEquals(metaelem[0].value, 123)
    38         self.assertEquals(metaelem[0].value, 123)
    41         self.assertEquals(metaelem[1].tag, "bar")
    39         self.assertEquals(metaelem[1].tag, "bar")
    42         self.assertEquals(metaelem[1].value, 312)
    40         self.assertEquals(metaelem[1].value, 312)
    43         self.assertEquals(metaelem[2].tag, "test")
    41         self.assertEquals(metaelem[2].tag, "test")
    44         self.assertEquals(metaelem[2].value, "testing string")
    42         self.assertEquals(metaelem[2].value, "testing string")
    52         self.assertEquals(metaelem[0].tag, 'test')
    50         self.assertEquals(metaelem[0].tag, 'test')
    53         self.assertEquals(metaelem[0].value, 123)
    51         self.assertEquals(metaelem[0].value, 123)
    54         self.assertEquals(metaelem[0].ns, "abc")
    52         self.assertEquals(metaelem[0].ns, "abc")
    55         self.assertEquals(metaelem[0].attrs, {"foo":"bar", "abc":1})
    53         self.assertEquals(metaelem[0].attrs, {"foo":"bar", "abc":1})
    56 
    54 
       
    55     def test_update_data(self):
       
    56         metaelem = model.ConfmlMeta()
       
    57         metaelem.append(model.ConfmlMetaProperty('test', 123, "abc", attrs = {"foo":"bar", "abc":1}))
       
    58         metaelem.set_property_by_tag('foo', 3)
       
    59         metaelem.set_property_by_tag('bar', None, 'http://me.com', {'name':'me', 'value':1})
       
    60         self.assertEquals(metaelem[0].tag, 'test')
       
    61         self.assertEquals(metaelem[0].value, 123)
       
    62         self.assertEquals(metaelem[0].ns, "abc")
       
    63         self.assertEquals(metaelem[0].attrs, {"foo":"bar", "abc":1})
       
    64         self.assertEquals(metaelem[1].tag, 'foo')
       
    65         self.assertEquals(metaelem[1].value, 3)
       
    66         self.assertEquals(metaelem[2].tag, "bar")
       
    67         self.assertEquals(metaelem[2].attrs, {'name':'me', 'value':1})
       
    68 
       
    69         metaelem1 = model.ConfmlMeta()
       
    70         metaelem.set_property_by_tag('foo', 2)
       
    71         metaelem.set_property_by_tag('bar', None, 'http://me.com', {'name':'me', 'value':2})
       
    72         metaelem.update(metaelem1)
       
    73         self.assertEquals(len(metaelem), 3)
       
    74         self.assertEquals(metaelem[0].tag, 'test')
       
    75         self.assertEquals(metaelem[0].value, 123)
       
    76         self.assertEquals(metaelem[0].ns, "abc")
       
    77         self.assertEquals(metaelem[0].attrs, {"foo":"bar", "abc":1})
       
    78         self.assertEquals(metaelem[1].tag, 'foo')
       
    79         self.assertEquals(metaelem[1].value, 2)
       
    80         self.assertEquals(metaelem[2].tag, "bar")
       
    81         self.assertEquals(metaelem[2].attrs, {'name':'me', 'value':2})
       
    82         
       
    83         
    57     def test_find_data(self):
    84     def test_find_data(self):
    58         metaelem = model.ConfmlMeta()
    85         metaelem = model.ConfmlMeta()
    59         metaelem.append(model.ConfmlMetaProperty('test', 123, "abc",\
    86         metaelem.append(model.ConfmlMetaProperty('test', 123, "abc",\
    60                                                   attrs = {"foo":"bar", "abc":1}))
    87                                                   attrs = {"foo":"bar", "abc":1}))
    61         metaelem.append(model.ConfmlMetaProperty('abc', "efg", None,\
    88         metaelem.append(model.ConfmlMetaProperty('abc', "efg", None,\
    62                                                   attrs = {"foo2":"bar2", "abc2":2}))
    89                                                   attrs = {"foo2":"bar2", "abc2":2}))
       
    90         metaelem.append(model.ConfmlMetaProperty('test', None, "demons",\
       
    91                                                   attrs = {"name":"bar1", "value":"foo1"}))
       
    92         metaelem.append(model.ConfmlMetaProperty('test', None, "demons",\
       
    93                                                   attrs = {"name":"bar2", "value":"foo2"}))
    63         self.assertEquals(metaelem.find_by_tag("test"), 0)
    94         self.assertEquals(metaelem.find_by_tag("test"), 0)
    64         self.assertEquals(metaelem.get_property_by_tag("test").tag, 'test')
    95         self.assertEquals(metaelem.get_property_by_tag("test").tag, 'test')
    65         self.assertEquals(metaelem.get_property_by_tag("test").value, 123)
    96         self.assertEquals(metaelem.get_property_by_tag("test").value, 123)
       
    97         self.assertEquals(metaelem.get_property_by_tag("test", {'name' : 'bar1'}).tag, 'test')
       
    98         self.assertEquals(metaelem.get_property_by_tag("test", {'name' : 'bar1'}).attrs['value'], 'foo1')
    66         self.assertEquals(metaelem.get("test"), 123)
    99         self.assertEquals(metaelem.get("test"), 123)
    67         self.assertEquals(metaelem.get("test", 'ddd'), 123)
   100         self.assertEquals(metaelem.get("test", 'ddd'), 123)
    68         # test get_value with not found elem
   101         # test get_value with not found elem
    69         self.assertEquals(metaelem.get("notthere"), None)
   102         self.assertEquals(metaelem.get("notthere"), None)
    70         self.assertEquals(metaelem.get("notthere", 'fooman'), 'fooman')
   103         self.assertEquals(metaelem.get("notthere", 'fooman'), 'fooman')
    77         prop3 = model.ConfmlMetaProperty("test", 'testing string')        
   110         prop3 = model.ConfmlMetaProperty("test", 'testing string')        
    78         metaelem1 = model.ConfmlMeta([prop1, prop2, prop3])        
   111         metaelem1 = model.ConfmlMeta([prop1, prop2, prop3])        
    79         metaelem2 = metaelem1.clone()
   112         metaelem2 = metaelem1.clone()
    80         self.assertEquals(metaelem1, metaelem2)
   113         self.assertEquals(metaelem1, metaelem2)
    81 
   114 
    82 
   115     def test_meta_set_property_by_tag(self):
       
   116         meta = model.ConfmlMeta()
       
   117         meta.set_property_by_tag('test', 'fooval')
       
   118         self.assertEquals(meta.get('test'), 'fooval')
       
   119         self.assertEquals(meta.get_property_by_tag('test').attrs, {})
       
   120         meta.set_property_by_tag('test', 'newval')
       
   121         self.assertEquals(meta.get_property_by_tag('test').attrs, {})
       
   122         self.assertEquals(meta.get('test'), 'newval')
       
   123         meta.add('test', 'twoval')
       
   124         self.assertEquals(meta.get_property_by_tag('test').attrs, {})
       
   125         self.assertEquals(meta.get('test'), 'newval')
       
   126         meta.set_property_by_tag('test', 'trheval')
       
   127         self.assertEquals(meta.get('test'), 'trheval')
       
   128         
    83 class TestConfmlDescription(unittest.TestCase):
   129 class TestConfmlDescription(unittest.TestCase):
    84     def test_create_desc(self):
   130     def test_create_desc(self):
    85         descelem1 = model.ConfmlDescription("testing")
   131         descelem1 = model.ConfmlDescription("testing")
    86         descelem2 = model.ConfmlDescription()
   132         descelem2 = model.ConfmlDescription()
    87         descelem3 = model.ConfmlDescription()
   133         descelem3 = model.ConfmlDescription()
   139         self.assertEquals(elem.desc, None)
   185         self.assertEquals(elem.desc, None)
   140         self.assertEquals(elem.readOnly, None)
   186         self.assertEquals(elem.readOnly, None)
   141         self.assertEquals(elem.constraint, None)
   187         self.assertEquals(elem.constraint, None)
   142         self.assertEquals(elem.required, None)
   188         self.assertEquals(elem.required, None)
   143         self.assertEquals(elem.relevant, None)
   189         self.assertEquals(elem.relevant, None)
       
   190         self.assertEquals(elem.id, None)
       
   191 
       
   192     def test_setting_id(self):
       
   193         elem = model.ConfmlSetting('foo', id="test id")
       
   194         self.assertEquals(elem.id,'test id')
       
   195         elem.id = "new id"
       
   196         self.assertEquals(elem.id,'new id')
       
   197         del elem.id
       
   198         self.assertEquals(elem.id,None)
   144 
   199 
   145     def test_getters(self):
   200     def test_getters(self):
   146         elem = model.ConfmlSetting('foo')
   201         elem = model.ConfmlSetting('foo', name="foo")
   147         self.assertTrue(elem.get_ref(),'foo')
   202         self.assertEquals(elem.get_ref(),'foo')
   148         self.assertEquals(elem.get_type(),None)
   203         self.assertEquals(elem.get_type(),None)
   149         self.assertTrue(elem.get_name(),'foo')
   204         self.assertEquals(elem.get_name(),'foo')
   150 
   205 
   151     def test_set_type(self):
   206     def test_set_type(self):
   152         elem = model.ConfmlSetting('foo')
   207         elem = model.ConfmlSetting('foo', name="bar")
   153         elem.type = 'string'
   208         elem.type = 'string'
   154         self.assertTrue(elem.ref,'foo')
   209         self.assertEquals(elem.ref,'foo')
   155         self.assertTrue(elem.type,'string')
   210         self.assertEquals(elem.type,'string')
   156         self.assertTrue(elem.name,'foo')
   211         self.assertEquals(elem.name, "bar")
   157 
   212 
   158     def test_setting_with_options(self):
   213     def test_setting_with_options(self):
   159         elem = model.ConfmlSetting('foo',type='selection')
   214         elem = model.ConfmlSetting('foo',type='selection')
   160         elem.create_option('foo','1')
   215         elem.create_option('foo','1')
   161         elem.create_option('bar','bar')
   216         elem.create_option('bar','bar')
   163         self.assertTrue('1' in elem.get_valueset()) 
   218         self.assertTrue('1' in elem.get_valueset()) 
   164         self.assertEquals(elem.options['1'].name, 'foo')
   219         self.assertEquals(elem.options['1'].name, 'foo')
   165         self.assertEquals(elem.options['1'].value, '1')
   220         self.assertEquals(elem.options['1'].value, '1')
   166         self.assertEquals(elem.options['bar'].name, 'bar')
   221         self.assertEquals(elem.options['bar'].name, 'bar')
   167 
   222 
       
   223     def test_create_options(self):
       
   224         elem = model.ConfmlSetting('foo',type='property', name='foo')
       
   225         self.assertEquals(elem.name, 'foo')
       
   226         self.assertEquals(elem.type, 'property')
       
   227 
   168     def test_setting_create_with_nonetype(self):
   228     def test_setting_create_with_nonetype(self):
   169         elem = model.ConfmlSetting('foo',type=None)
   229         elem = model.ConfmlSetting('foo',type=None)
   170         self.assertEqual(elem.type,None) 
   230         self.assertEqual(elem.type,None) 
   171 
   231 
   172     def test_setting_with_properties(self):
   232     def test_setting_with_properties(self):
   173         elem = model.ConfmlSetting('foo')
   233         elem = model.ConfmlSetting('foo')
   174         elem.add_property(name='foo',value='bar/foo')
   234         elem.create_property(name='foo',value='bar/foo')
   175         elem.add_property(name='bar',value='only/bar')
   235         elem.create_property(name='bar',value='only/bar')
   176         elem.add_property(name='testing',value='1', unit='mB')
   236         elem.create_property(name='testing',value='1', unit='mB')
   177         self.assertEquals(elem.list_properties(), ['foo','bar','testing'])
   237         self.assertEquals(elem.list_properties(), ['foo','bar','testing'])
   178         self.assertEquals(elem.get_property('foo').value, 'bar/foo')
   238         self.assertEquals(elem.get_property('foo').value, 'bar/foo')
   179         elem.remove_property('foo')
   239         elem.remove_property('foo')
   180         try:
   240         try:
   181             elem.remove_property('bss')
   241             elem.remove_property('bss')
   188         self.assertEquals(elem.list_properties(), [])
   248         self.assertEquals(elem.list_properties(), [])
   189         
   249         
   190 
   250 
   191     def test_setting_with_properties_property(self):
   251     def test_setting_with_properties_property(self):
   192         elem = model.ConfmlSetting('foo')
   252         elem = model.ConfmlSetting('foo')
   193         elem.add_property(name='foo',value='bar/foo')
   253         elem.create_property(name='foo',value='bar/foo')
   194         elem.add_property(name='bar',value='only/bar')
   254         elem.create_property(name='bar',value='only/bar')
   195         elem.add_property(name='testing',value='1', unit='mB')
   255         elem.create_property(name='testing',value='1', unit='mB')
   196         self.assertEquals(elem.properties['foo'].value,'bar/foo')
   256         self.assertEquals(elem.property_foo.value,'bar/foo')
   197         self.assertEquals(elem.properties['bar'].value,'only/bar')
   257         self.assertEquals(elem.property_bar.value,'only/bar')
   198 
   258 
   199     def test_setting_with_readOnly_value(self):
   259     def test_setting_with_readOnly_value(self):
   200         elem = model.ConfmlSetting('foo', readOnly=True)
   260         elem = model.ConfmlSetting('foo', readOnly=True)
   201         self.assertEquals(elem.readOnly,True)
   261         self.assertEquals(elem.readOnly,True)
   202         elem.readOnly = False
   262         elem.readOnly = False
   233         elem = model.ConfmlSetting('foo', minLength=10)
   293         elem = model.ConfmlSetting('foo', minLength=10)
   234         self.assertEquals(elem.minLength,10)
   294         self.assertEquals(elem.minLength,10)
   235         elem.minLength = 20
   295         elem.minLength = 20
   236         self.assertEquals(elem.minLength,20)
   296         self.assertEquals(elem.minLength,20)
   237         self.assertTrue(elem._has(model.ConfmlMinLength.refname))
   297         self.assertTrue(elem._has(model.ConfmlMinLength.refname))
       
   298     
       
   299     def test_setting_with_length(self):
       
   300         elem = model.ConfmlSetting('foo', length=10)
       
   301         self.assertEquals(elem.length,10)
       
   302         elem.length = 20
       
   303         self.assertEquals(elem.length,20)
       
   304         self.assertTrue(elem._has(model.ConfmlLength.refname))
       
   305         self.assertEquals(elem._get(model.ConfmlLength.refname).value, 20)
   238 
   306 
   239     def test_setting_rfs_casting(self):
   307     def test_setting_rfs_casting(self):
   240         elem = model.ConfmlSetting('foo', minLength=10)
   308         elem = model.ConfmlSetting('foo', minLength=10)
   241         self.assertEquals(elem.get_rfs_cast('true'),True)
   309         self.assertEquals(elem.get_rfs_cast('true'),True)
   242         self.assertEquals(elem.get_rfs_cast('false'),False)
   310         self.assertEquals(elem.get_rfs_cast('false'),False)
   243         self.assertEquals(elem.set_rfs_cast(True),'true')
   311         self.assertEquals(elem.set_rfs_cast(True),'true')
   244         self.assertEquals(elem.set_rfs_cast(False),'false')
   312         self.assertEquals(elem.set_rfs_cast(False),'false')
   245         self.assertEquals(elem.set_rfs_cast(1),'true')
   313         self.assertEquals(elem.set_rfs_cast(1),'true')
       
   314     
       
   315     def test_get_rfs_with_no_value(self):
       
   316         conf = api.Configuration("test.confml")
       
   317         conf.add_feature(model.ConfmlSetting("foo"))
       
   318         
       
   319         # Test that initially the RFS value is None
       
   320         fea = conf.get_default_view().get_feature('foo')
       
   321         self.assertEquals(fea.get_value(attr='rfs'), None)
       
   322         self.assertEquals(fea.get_original_value(attr='rfs'), None)
       
   323     
       
   324     def test_get_rfs_true(self):
       
   325         conf = api.Configuration("test.confml")
       
   326         conf.add_feature(model.ConfmlSetting("foo"))
       
   327         conf.add_data(api.Data(ref='foo', attr='rfs', value='true'))
       
   328         
       
   329         fea = conf.get_default_view().get_feature('foo')
       
   330         self.assertEquals(fea.get_value(attr='rfs'), True)
       
   331         self.assertEquals(fea.get_original_value(attr='rfs'), 'true')
       
   332     
       
   333     def test_get_rfs_false(self):
       
   334         conf = api.Configuration("test.confml")
       
   335         conf.add_feature(model.ConfmlSetting("foo"))
       
   336         conf.add_data(api.Data(ref='foo', attr='rfs', value='false'))
       
   337         
       
   338         fea = conf.get_default_view().get_feature('foo')
       
   339         self.assertEquals(fea.get_value(attr='rfs'), False)
       
   340         self.assertEquals(fea.get_original_value(attr='rfs'), 'false')
       
   341     
       
   342     def test_set_rfs(self):
       
   343         conf = api.Configuration("test.confml")
       
   344         conf.add_feature(model.ConfmlSetting("foo"))
       
   345         
       
   346         def check_data_elements(expected):
       
   347             actual = []
       
   348             for d in conf._traverse(type=api.Data):
       
   349                 actual.append((d.fqr, d.attr, d.value))
       
   350             self.assertEquals(actual, expected)
       
   351         
       
   352         fea = conf.get_default_view().get_feature('foo')
       
   353         
       
   354         fea.set_value(True, attr='rfs')
       
   355         self.assertEquals(fea.get_value(attr='rfs'), True)
       
   356         self.assertEquals(fea.get_original_value(attr='rfs'), 'true')
       
   357         check_data_elements([('foo', 'rfs', 'true')])
       
   358         
       
   359         fea.set_value(False, attr='rfs')
       
   360         self.assertEquals(fea.get_value(attr='rfs'), False)
       
   361         self.assertEquals(fea.get_original_value(attr='rfs'), 'false')
       
   362         check_data_elements([('foo', 'rfs', 'false')])
   246 
   363 
   247 class TestConfmlSelectionSetting(unittest.TestCase):
   364 class TestConfmlSelectionSetting(unittest.TestCase):
   248     def test_create_selection_setting(self):
   365     def test_create_selection_setting(self):
   249         elem = model.ConfmlSelectionSetting('foo')
   366         elem = model.ConfmlSelectionSetting('foo', desc="Test desc", name="Foo fea")
   250         self.assertTrue(elem)
   367         self.assertTrue(elem)
   251         self.assertEquals(elem.type, 'selection')
   368         self.assertEquals(elem.type, 'selection')
   252         self.assertEquals(elem.desc, None)
   369         self.assertEquals(elem.name, 'Foo fea')
       
   370         self.assertEquals(elem.desc, "Test desc")
   253         self.assertEquals(elem.readOnly, None)
   371         self.assertEquals(elem.readOnly, None)
   254         self.assertEquals(elem.constraint, None)
   372         self.assertEquals(elem.constraint, None)
   255         self.assertEquals(elem.required, None)
   373         self.assertEquals(elem.required, None)
   256         self.assertEquals(elem.relevant, None)
   374         self.assertEquals(elem.relevant, None)
   257     
   375     
   263         elem.create_option('baz', '3')
   381         elem.create_option('baz', '3')
   264         self.assertEquals(elem.get_valueset(), api.ValueSet(['1', '2', '3']))
   382         self.assertEquals(elem.get_valueset(), api.ValueSet(['1', '2', '3']))
   265 
   383 
   266 class TestConfmlMultiSelectionSetting(unittest.TestCase):
   384 class TestConfmlMultiSelectionSetting(unittest.TestCase):
   267     def test_create_multiselection_setting(self):
   385     def test_create_multiselection_setting(self):
   268         elem = model.ConfmlMultiSelectionSetting('mset1')
   386         elem = model.ConfmlMultiSelectionSetting('mset1', name="Setting 1", desc="de")
   269         self.assertTrue(elem)
   387         self.assertTrue(elem)
   270         self.assertEquals(elem.type, 'multiSelection')
   388         self.assertEquals(elem.type, 'multiSelection')
   271         self.assertEquals(elem.desc, None)
   389         self.assertEquals(elem.name, "Setting 1")
       
   390         self.assertEquals(elem.desc, "de")
   272         self.assertEquals(elem.readOnly, None)
   391         self.assertEquals(elem.readOnly, None)
   273         self.assertEquals(elem.constraint, None)
   392         self.assertEquals(elem.constraint, None)
   274         self.assertEquals(elem.required, None)
   393         self.assertEquals(elem.required, None)
   275         self.assertEquals(elem.relevant, None)
   394         self.assertEquals(elem.relevant, None)
   276     
   395     
   284 
   403 
   285     def test_setting_value_to_multiselection(self):
   404     def test_setting_value_to_multiselection(self):
   286         conf = model.ConfmlConfiguration('test.confml')
   405         conf = model.ConfmlConfiguration('test.confml')
   287         elem = model.ConfmlMultiSelectionSetting('mset2', type='multiSelection')
   406         elem = model.ConfmlMultiSelectionSetting('mset2', type='multiSelection')
   288         conf.add_feature(elem)
   407         conf.add_feature(elem)
   289         elem.value = "\"sel1\" \"sel2\""
   408         elem.value = ["sel1", "sel2"]
   290         self.assertEquals(elem.type, 'multiSelection')
   409         self.assertEquals(elem.type, 'multiSelection')
   291         self.assertEquals(elem.get_data_cast("\"sel1\" \"sel2\""), ["sel1", "sel2"])
   410         self.assertEquals(elem.get_value(), ("sel1", "sel2"))
   292         self.assertEquals(elem.get_value(), ["sel1", "sel2"])
       
   293 
       
   294     def test_set_data_cast(self):
       
   295         elem = model.ConfmlMultiSelectionSetting('mset3', type='multiSelection')
       
   296         self.assertEquals(elem.set_data_cast('"sel1" "sel2 with some spaces"'), '"sel1" "sel2 with some spaces"')
       
   297         self.assertEquals(elem.set_data_cast(["sel1", "sel2 with some spaces"]), '"sel1" "sel2 with some spaces"')
       
   298         self.assertEquals(elem.set_data_cast(["1", "1"]), '"1" "1"')
       
   299         self.assertEquals(elem.set_data_cast([1, 2, 3]), '"1" "2" "3"')
       
   300 
       
   301 
       
   302     def test_get_data_cast(self):
       
   303         elem = model.ConfmlMultiSelectionSetting('mset3', type='multiSelection')
       
   304         self.assertEquals(elem.get_data_cast('"sel1" "sel2 with some spaces"'), ["sel1", "sel2 with some spaces"])
       
   305         self.assertEquals(elem.get_data_cast('"sel1" "sel2 space" "foo bar"'), ["sel1", "sel2 space", "foo bar"])
       
   306 
   411 
   307     def test_setting_value_to_multiselection2(self):
   412     def test_setting_value_to_multiselection2(self):
   308         conf = model.ConfmlConfiguration('test.confml')
   413         conf = model.ConfmlConfiguration('test.confml')
   309         elem = model.ConfmlMultiSelectionSetting('mset3', type='multiSelection')
   414         elem = model.ConfmlMultiSelectionSetting('mset3', type='multiSelection')
   310         conf.add_feature(elem)
   415         conf.add_feature(elem)
   311         elem.value = '"sel1" "sel2 with some spaces"'
   416         elem.value = ["sel1", "sel2 with some spaces"]
   312         self.assertEquals(elem.type, 'multiSelection')
   417         self.assertEquals(elem.type, 'multiSelection')
   313         self.assertEquals(elem.get_value(), ["sel1", "sel2 with some spaces"])
   418         self.assertEquals(elem.get_value(), ("sel1", "sel2 with some spaces"))
   314         elem.value = ["sel1", "sel2 with some spaces"]
   419         elem.value = ["sel1", "sel2 with some spaces"]
   315         self.assertEquals(elem.get_value(), ["sel1", "sel2 with some spaces"])
   420         self.assertEquals(elem.get_value(), ("sel1", "sel2 with some spaces"))
   316         
   421         
   317     def test_setting_not_list_value_to_multiselection(self):
   422     def test_setting_not_list_value_to_multiselection(self):
   318         conf = model.ConfmlConfiguration('test.confml')
   423         conf = model.ConfmlConfiguration('test.confml')
   319         elem = model.ConfmlMultiSelectionSetting('mset4', type='multiSelection')
   424         elem = model.ConfmlMultiSelectionSetting('mset4', type='multiSelection')
   320         conf.add_feature(elem)
   425         conf.add_feature(elem)
   323     def test_setting_list_value_to_multiselection(self):
   428     def test_setting_list_value_to_multiselection(self):
   324         conf = model.ConfmlConfiguration('test.confml')
   429         conf = model.ConfmlConfiguration('test.confml')
   325         elem = model.ConfmlMultiSelectionSetting('mset5', type='multiSelection')
   430         elem = model.ConfmlMultiSelectionSetting('mset5', type='multiSelection')
   326         conf.add_feature(elem)
   431         conf.add_feature(elem)
   327         elem.set_value(["li1", "li2"])
   432         elem.set_value(["li1", "li2"])
   328         self.assertEquals(elem.get_value(), ["li1", "li2"])
   433         self.assertEquals(elem.get_value(), ("li1", "li2"))
   329         self.assertEquals(elem.get_data().get_value(), '"li1" "li2"')
   434         self.assertEquals(elem.get_datas()[0].get_value(), 'li1')
       
   435         self.assertEquals(elem.get_datas()[1].get_value(), 'li2')
       
   436     
       
   437     def test_get_value_from_old_style_data(self):
       
   438         def check(data_value, expected):
       
   439             config = api.Configuration('foo.confml')
       
   440             fea = model.ConfmlMultiSelectionSetting('multisel', type='multiSelection')
       
   441             config.add_feature(fea)
       
   442             config.add_data(api.Data(ref='multisel', value=data_value))
       
   443             
       
   444             dview = config.get_default_view()
       
   445             foofea = dview.get_feature('multisel')
       
   446             self.assertEquals(foofea.value, expected)
       
   447 
       
   448         check('x', ('x',))
       
   449         check('"x"', ('x',))
       
   450         check('"x" "y"', ('x', 'y'))
       
   451         check('"x" "y" "" "z"', ('x', 'y', '', 'z'))
       
   452     
       
   453     def test_get_value_with_new_style_data(self):
       
   454         def check(data_object_values, expected_value, empty_option=False):
       
   455             config = api.Configuration('foo.confml')
       
   456             fea = model.ConfmlMultiSelectionSetting('multisel', type='multiSelection')
       
   457             if empty_option:
       
   458                 fea.add_option(api.Option('Empty option', ''))
       
   459             config.add_feature(fea)
       
   460             for dv in data_object_values:
       
   461                 config.add_data(api.Data(ref='multisel', value=dv), policy=api.container.APPEND)
       
   462             
       
   463             dview = config.get_default_view()
       
   464             foofea = dview.get_feature('multisel')
       
   465             self.assertEquals(foofea.value, expected_value)
       
   466         
       
   467         check([], ())
       
   468         check(['x'], ('x',))
       
   469         check(['x', 'y'], ('x', 'y'))
       
   470         check(['y', 'x', 'y',], ('y', 'x'))
       
   471         check(['"foo"', '"bar"'], ('"foo"', '"bar"'))
       
   472         check(['foo bar'], ('foo bar',))
       
   473         check(['foo bar', 'foo baz'], ('foo bar', 'foo baz'))
       
   474         check(['foo "bar"'], ('foo "bar"',))
       
   475         
       
   476         # Element with no data is interpreted as meaning the option ''
       
   477         # if it is allowed, otherwise it is ignored
       
   478         check([None], (), empty_option=False)
       
   479         check([None], ('',), empty_option=True)
       
   480     
       
   481     def test_get_value_from_data_with_empty_attribute(self):
       
   482         config = api.Configuration('foo.confml')
       
   483         fea = model.ConfmlMultiSelectionSetting('multisel', type='multiSelection')
       
   484         config.add_feature(fea)
       
   485         config.add_data(api.Data(ref='multisel', empty=True))
       
   486         
       
   487         dview = config.get_default_view()
       
   488         foofea = dview.get_feature('multisel')
       
   489         self.assertEquals(foofea.value, ())
       
   490         
       
   491         
       
   492     def test_set_value(self):
       
   493         def check(value, expected_data_object_values):
       
   494             config = api.Configuration('foo.confml')
       
   495             fea = model.ConfmlMultiSelectionSetting('multisel', type='multiSelection')
       
   496             config.add_feature(fea)
       
   497             
       
   498             dview = config.get_default_view()
       
   499             foofea = dview.get_feature('multisel')
       
   500             self.assertEquals(foofea.value, ())
       
   501             
       
   502             foofea.value = value
       
   503             # Check that the value is visible directly after setting
       
   504             # (the 'or' is because setting to None actually set the value
       
   505             # to an empty tuple)
       
   506             self.assertEquals(foofea.value, value or ())
       
   507             
       
   508             # Check that the data elements have been set as expected
       
   509             actual = []
       
   510             for d in config._traverse(type=api.Data):
       
   511                 actual.append((d.fqr, d.value, d.empty))
       
   512             expected = []
       
   513             for val, empty in expected_data_object_values:
       
   514                 expected.append(('multisel', val, empty))
       
   515             self.assertEquals(actual, expected)
       
   516 
       
   517         # Setting empty should create a single data object with empty=True
       
   518         check((), [(None, True)])
       
   519         check([], [(None, True)])
       
   520         check(None, [(None, True)])
       
   521         
       
   522         check(('x',), [('x', False)])
       
   523         check(('x', 'y'), [('x', False), ('y', False)])
       
   524         check(('"foo"', '"bar"'), [('"foo"', False), ('"bar"', False)])
       
   525         check(('foo bar',), [('foo bar', False)])
       
   526         check(('foo bar', 'foo baz'), [('foo bar', False), ('foo baz', False)])
       
   527         check(('foo "bar"',), [('foo "bar"', False)])
       
   528     
       
   529     def test_old_style_data_pattern(self):
       
   530         def check(value, expected):
       
   531             m = model.ConfmlMultiSelectionSetting.OLD_STYLE_DATA_PATTERN.match(value)
       
   532             self.assertEquals(m is not None, expected)
       
   533         
       
   534         check('', False)
       
   535         check('""', True)
       
   536         check('foo', False)
       
   537         check('foo bar', False)
       
   538         check('"foo bar"', True)
       
   539         check('"foo bar " " foo baz" "  yeah  " ""', True)
       
   540         check('"foo"', True)
       
   541         check('"foo" "bar"', True)
       
   542         check('"foo" "bar" "baz"', True)
       
   543         check('"a" "b" "c" "d" "e" "f" "g" "h"', True)
       
   544         check('a b c d e f g h', False)
       
   545         check('"a b c d e f g h"', True)
   330 
   546 
   331 class TestConfmlIntSetting(unittest.TestCase):
   547 class TestConfmlIntSetting(unittest.TestCase):
   332     def test_create_setting(self):
   548     def test_create_setting(self):
   333         elem = model.ConfmlIntSetting('test')
   549         elem = model.ConfmlIntSetting('test')
   334         self.assertTrue(elem)
   550         self.assertTrue(elem)
   336         self.assertEquals(elem.desc, None)
   552         self.assertEquals(elem.desc, None)
   337         self.assertEquals(elem.readOnly, None)
   553         self.assertEquals(elem.readOnly, None)
   338         self.assertEquals(elem.constraint, None)
   554         self.assertEquals(elem.constraint, None)
   339         self.assertEquals(elem.required, None)
   555         self.assertEquals(elem.required, None)
   340         self.assertEquals(elem.relevant, None)
   556         self.assertEquals(elem.relevant, None)
       
   557         self.assertEquals(elem.get_valueset().fromvalue, 0)
       
   558         self.assertEquals(elem.get_valueset().tovalue, sys.maxint)
   341 
   559 
   342     def test_setting_value_to_int(self):
   560     def test_setting_value_to_int(self):
   343         conf = model.ConfmlConfiguration('test.confml')
   561         conf = model.ConfmlConfiguration('test.confml')
   344         elem = model.ConfmlIntSetting('foo', type='int')
   562         elem = model.ConfmlIntSetting('foo', type='int')
   345         conf.add_feature(elem)
   563         conf.add_feature(elem)
   362         elem.value = 0xA
   580         elem.value = 0xA
   363         self.assertEquals(elem.value, 10)
   581         self.assertEquals(elem.value, 10)
   364         del elem.value
   582         del elem.value
   365         self.assertEquals(elem.value, None)
   583         self.assertEquals(elem.value, None)
   366 
   584 
   367     def test_setting_value_to_int(self):
   585     def test_setting_value_to_int_with_aritmethic_operations(self):
   368         conf = model.ConfmlConfiguration('test.confml')
   586         conf = model.ConfmlConfiguration('test.confml')
   369         elem1 = model.ConfmlIntSetting('foo')
   587         elem1 = model.ConfmlIntSetting('foo')
   370         elem2 = model.ConfmlIntSetting('bar')
   588         elem2 = model.ConfmlIntSetting('bar')
   371         conf.add_feature(elem1)
   589         conf.add_feature(elem1)
   372         conf.add_feature(elem2)
   590         conf.add_feature(elem2)
   375         test = elem1.value + elem2.value
   593         test = elem1.value + elem2.value
   376         self.assertEquals(test,3)
   594         self.assertEquals(test,3)
   377         elem1.value = elem1.value + elem2.value + 5
   595         elem1.value = elem1.value + elem2.value + 5
   378         self.assertEquals(elem1.value,8)
   596         self.assertEquals(elem1.value,8)
   379 
   597 
       
   598 class TestConfmlHexBinarySetting(unittest.TestCase):
       
   599     def test_hexbinary_default_value_set(self):
       
   600         setting = model.ConfmlHexBinarySetting('test')
       
   601         vset = setting.get_valueset()
       
   602         self.assertTrue('' in vset)
       
   603         self.assertTrue('0123456789ABCDEF' in vset)
       
   604         self.assertTrue('00112233445566778899AABBCCDDEEFF' in vset)
       
   605         
       
   606         self.assertFalse('foobar' in vset)
       
   607         self.assertFalse('1' in vset)
       
   608         self.assertFalse('F' in vset)
       
   609         self.assertFalse('1G' in vset)
       
   610         self.assertFalse('0123456789abcdef' in vset)
       
   611         self.assertFalse('00112233445566778899aabbccddeeff' in vset)
       
   612         
       
   613         self.assertTrue('foobar' not in vset)
       
   614 
       
   615     def test_hexbinary_get_value_none(self):
       
   616         conf = model.ConfmlConfiguration('test.confml')
       
   617         setting = model.ConfmlHexBinarySetting('foo')
       
   618         conf.add_feature(setting)
       
   619         self.assertEquals(setting.value, None)
       
   620     
       
   621     def test_hexbinary_get_value_empty(self):
       
   622         conf = model.ConfmlConfiguration('test.confml')
       
   623         setting = model.ConfmlHexBinarySetting('foo')
       
   624         conf.add_feature(setting)
       
   625         conf.add_data(api.Data(ref='foo', value=None))
       
   626         self.assertEquals(setting.value, '')
       
   627     
       
   628     def test_hexbinary_get_value(self):
       
   629         conf = model.ConfmlConfiguration('test.confml')
       
   630         setting = model.ConfmlHexBinarySetting('foo')
       
   631         conf.add_feature(setting)
       
   632         conf.add_data(api.Data(ref='foo', value='0123456789ABCDEF'))
       
   633         self.assertEquals(setting.value, '\x01\x23\x45\x67\x89\xab\xcd\xef')
       
   634         self.assertEquals(setting.get_original_value(), '0123456789ABCDEF')
       
   635     
       
   636     def test_hexbinary_set_value(self):
       
   637         conf = model.ConfmlConfiguration('test.confml')
       
   638         setting = model.ConfmlHexBinarySetting('foo')
       
   639         conf.add_feature(setting)
       
   640         
       
   641         setting.value = '\x01\xab'
       
   642         self.assertEquals(setting.value, '\x01\xab')
       
   643         
       
   644         data_list = conf.get_all_datas()
       
   645         self.assertEquals(len(data_list), 1)
       
   646         d = data_list[0]
       
   647         self.assertEquals(d.attr, 'data')
       
   648         self.assertEquals(d.fqr, 'foo')
       
   649         self.assertEquals(d.value, '01AB')
       
   650         self.assertEquals(d.empty, False)
       
   651     
       
   652     def test_hexbinary_get_data_cast(self):
       
   653         setting = model.ConfmlHexBinarySetting('foo')
       
   654         
       
   655         self.assertEquals(setting.get_data_cast(''), '')
       
   656         self.assertEquals(setting.get_data_cast(None), '')
       
   657         self.assertEquals(setting.get_data_cast('0123456789ABCDEF'), '\x01\x23\x45\x67\x89\xab\xcd\xef')
       
   658         
       
   659         self.assertRaises(ValueError, setting.get_data_cast, 'X')
       
   660         self.assertRaises(ValueError, setting.get_data_cast, '1')
       
   661         self.assertRaises(ValueError, setting.get_data_cast, 'XX')
       
   662     
       
   663     def test_hexbinary_set_data_cast(self):
       
   664         setting = model.ConfmlHexBinarySetting('foo')
       
   665         
       
   666         self.assertEquals(setting.set_data_cast(''), '')
       
   667         self.assertEquals(setting.set_data_cast('\x01'), '01')
       
   668         self.assertEquals(setting.set_data_cast('x'), '78')
       
   669         self.assertEquals(setting.set_data_cast('\x01\x23\x45\x67\x89\xab\xcd\xef'), '0123456789ABCDEF')
       
   670         
   380 class TestConfmlBooleanSetting(unittest.TestCase):
   671 class TestConfmlBooleanSetting(unittest.TestCase):
   381     def test_create_setting(self):
   672     def test_create_setting(self):
   382         elem = model.ConfmlBooleanSetting('test')
   673         elem = model.ConfmlBooleanSetting('test')
   383         self.assertTrue(elem)
   674         self.assertTrue(elem)
   384         self.assertEquals(elem.type, 'boolean')
   675         self.assertEquals(elem.type, 'boolean')
   436         del elem.value
   727         del elem.value
   437         self.assertEquals(elem.value, None)
   728         self.assertEquals(elem.value, None)
   438 
   729 
   439 class TestConfmlSequenceSetting(unittest.TestCase):
   730 class TestConfmlSequenceSetting(unittest.TestCase):
   440     def test_create_setting(self):
   731     def test_create_setting(self):
   441         elem = model.ConfmlSequenceSetting('test')
   732         elem = model.ConfmlSequenceSetting('test', name="testing fea", desc="Test desc")
   442         self.assertTrue(elem)
   733         self.assertTrue(elem)
   443         self.assertEquals(elem.desc, None)
   734         self.assertEquals(elem.name, "testing fea")
       
   735         self.assertEquals(elem.desc, "Test desc")
       
   736         subfea = elem.create_feature("subfea")
       
   737         self.assertEquals(subfea.is_sequence(), True)
       
   738         subfea.is_sequence = lambda : False
       
   739         self.assertEquals(subfea.is_sequence(), False)
       
   740         
       
   741     def test_create_sequence_setting_with_mapping(self):
       
   742         elem = model.ConfmlSequenceSetting('test', name="testing fea", desc="Test desc", mapKey="setting", mapValue="setval")
       
   743         self.assertTrue(elem)
       
   744         self.assertEquals(elem.name, "testing fea")
       
   745         self.assertEquals(elem.desc, "Test desc")
       
   746         self.assertEquals(elem.mapKey, "setting")
       
   747         self.assertEquals(elem.mapValue, "setval")
   444 
   748 
   445     def test_setting_with_properties_property(self):
   749     def test_setting_with_properties_property(self):
   446         elem = model.ConfmlSequenceSetting('foo')
   750         elem = model.ConfmlSequenceSetting('foo')
   447         elem.add_property(name='foo',value='bar/foo')
   751         elem.create_property(name='foo',value='bar/foo')
   448         elem.add_property(name='bar',value='only/bar')
   752         elem.create_property(name='bar',value='only/bar')
   449         elem.add_property(name='testing',value='1', unit='mB')
   753         elem.create_property(name='testing',value='1', unit='mB')
   450         self.assertEquals(elem.properties['foo'].value,'bar/foo')
   754         self.assertEquals(elem.property_foo.value,'bar/foo')
   451         self.assertEquals(elem.properties['bar'].value,'only/bar')
   755         self.assertEquals(elem.property_bar.value,'only/bar')
   452 
   756 
   453     def test_setting_with_min_occurs(self):
   757     def test_setting_with_min_occurs(self):
   454         elem = model.ConfmlSequenceSetting('foo', minOccurs=1)
   758         elem = model.ConfmlSequenceSetting('foo', minOccurs=1)
   455         self.assertEquals(elem.minOccurs,1)
   759         self.assertEquals(elem.minOccurs,1)
   456         elem.minOccurs = 2
   760         elem.minOccurs = 2
   460         elem = model.ConfmlSequenceSetting('foo', maxOccurs=10)
   764         elem = model.ConfmlSequenceSetting('foo', maxOccurs=10)
   461         self.assertEquals(elem.maxOccurs,10)
   765         self.assertEquals(elem.maxOccurs,10)
   462         elem.maxOccurs = 20
   766         elem.maxOccurs = 20
   463         self.assertEquals(elem.maxOccurs,20)
   767         self.assertEquals(elem.maxOccurs,20)
   464 
   768 
   465     def test_create_feature_seq_with_int_bool_settings_access_feature_value_with_property(self):
   769     def test_create_feature_seq_with_values(self):
       
   770         import logging
       
   771         logger = logging.getLogger('cone')
       
   772         logger.setLevel(logging.DEBUG)
       
   773         ch = logging.StreamHandler()
       
   774         ch.setLevel(logging.DEBUG)
       
   775         logger.addHandler(ch)
       
   776         
   466         config = api.Configuration('foo.confml')
   777         config = api.Configuration('foo.confml')
   467         fea= model.ConfmlSequenceSetting("foo")
   778         fea= model.ConfmlSequenceSetting("foo", displayName='TestDisplayName')
   468         fea.add_feature(model.ConfmlIntSetting('child1'))
   779         fea.add_feature(model.ConfmlIntSetting('child1'))
   469         fea.add_feature(model.ConfmlBooleanSetting('child2'))
   780         fea.add_feature(model.ConfmlBooleanSetting('child2'))
   470         fea.add_feature(model.ConfmlSetting('child3'))
   781         fea.add_feature(model.ConfmlSetting('child3'))
   471         config.add_feature(fea)
   782         config.add_feature(fea)
   472         dview = config.get_default_view()
   783         dview = config.get_default_view()
   473         foofea = dview.get_feature('foo')
   784         foofea = dview.get_feature('foo')
   474         # Test adding a data row with array
   785         # Test adding a data row with array
   475         foofea.set_value([['1','2','3'],
   786         foofea.set_value([[1,True,'foo'],
   476                          ['4','5','6'],
   787                          [2,False,'bar'],
   477                          ['7','8','9']
   788                          [3,True,'sumthin']
   478                          ])
   789                          ])
   479         self.assertEquals(foofea.value, [['1','2','3'],
   790         
   480                                          ['4','5','6'],
   791         self.assertEquals(foofea.displayName, 'TestDisplayName')
   481                                          ['7','8','9']
   792         self.assertEquals(foofea.data[0][0].get_original_value(), '1')
       
   793         self.assertEquals(foofea.data[0].get_original_value(), ['1', 'true', 'foo'])
       
   794         
       
   795         self.assertEquals(foofea.value, [[1,True,'foo'],
       
   796                                         [2,False,'bar'],
       
   797                                         [3,True,'sumthin']
   482                                         ])
   798                                         ])
   483 
   799 
   484         foofea.value = [['1','2','3'],
   800         self.assertEquals(foofea.get_original_value(), [['1','true','foo'],
   485                          ['7','8','9']
   801                                                         ['2','false','bar'],
       
   802                                                         ['3','true','sumthin']
       
   803                                                         ])
       
   804         self.assertEquals(foofea.data[0].get_original_value(), ['1','true','foo'])
       
   805         self.assertEquals(foofea.data[1].get_original_value(), ['2','false','bar'])
       
   806         self.assertEquals(foofea.data[2].get_original_value(), ['3', 'true', 'sumthin'])
       
   807         self.assertEquals(foofea.child1.get_original_value(), ['1', '2', '3'])
       
   808         self.assertEquals(foofea.child2.get_original_value(), ['true', 'false', 'true'])
       
   809         self.assertEquals(foofea.child3.get_original_value(), ['foo', 'bar', 'sumthin'])
       
   810 
       
   811         foofea.value = [[1,True,'foo'],
       
   812                         [2,False,'bar']
   486                         ]
   813                         ]
   487         
   814         
   488         self.assertEquals(foofea.data[0].value,['1','2','3'])
   815         self.assertEquals(foofea.data[0].value,[1,True,'foo'])
   489         self.assertEquals(foofea.data[1].value,['7','8','9'])
   816         self.assertEquals(foofea.data[1].value,[2,False,'bar'])
   490         self.assertEquals(foofea.data[1][1].value,'8')
   817         self.assertEquals(foofea.data[1][1].value,False)
   491         self.assertEquals(foofea.get_value(), [['1','2','3'],
   818         self.assertEquals(foofea.get_value(), [[1,True,'foo'],
   492                                                ['7','8','9']
   819                                                [2,False,'bar']
   493                                                ])
   820                                                ])
   494         self.assertEquals(foofea.child1.value,['1','7'])
   821         self.assertEquals(foofea.child1.value,[1,2])
       
   822     
       
   823     def test_sequence_with_mapped_data(self):
       
   824         config = api.Configuration('foo.confml')
       
   825         
       
   826         fea = model.ConfmlSequenceSetting("SourceSequence", mapKey='KeySubSetting', mapValue="ValueSubSetting")
       
   827         fea.add_feature(model.ConfmlIntSetting("KeySubSetting"))
       
   828         fea.add_feature(model.ConfmlStringSetting("ValueSubSetting"))
       
   829         config.add_feature(fea)
       
   830         
       
   831         fea = model.ConfmlSelectionSetting('TargetSetting')
       
   832         config.add_feature(fea)
       
   833         
       
   834         data = api.Data(ref='SourceSequence')
       
   835         data.add(api.Data(ref='KeySubSetting', value='1'))
       
   836         data.add(api.Data(ref='ValueSubSetting', value='Value 1'))
       
   837         config.add_data(data)
       
   838         
       
   839         data = api.Data(ref='TargetSetting', map="SourceSequence[@key='1']")
       
   840         config.add_data(data)
       
   841         
       
   842         fea = config.get_default_view().get_feature('TargetSetting')
       
   843         self.assertEquals(fea.get_value(), 'Value 1')
       
   844     
       
   845     def test_sequence_with_mapped_data_in_sequence(self):
       
   846         config = api.Configuration('foo.confml')
       
   847         
       
   848         fea = model.ConfmlSequenceSetting("SourceSequence", mapKey='KeySubSetting', mapValue="ValueSubSetting")
       
   849         fea.add_feature(model.ConfmlIntSetting("KeySubSetting"))
       
   850         fea.add_feature(model.ConfmlStringSetting("ValueSubSetting"))
       
   851         config.add_feature(fea)
       
   852         
       
   853         fea = model.ConfmlSequenceSetting('TargetSequence')
       
   854         fea.add_feature(model.ConfmlSelectionSetting("Setting"))
       
   855         config.add_feature(fea)
       
   856         
       
   857         data = api.Data(ref='SourceSequence')
       
   858         data.add(api.Data(ref='KeySubSetting', value='1'))
       
   859         data.add(api.Data(ref='ValueSubSetting', value='Value 1'))
       
   860         config.add_data(data)
       
   861        
       
   862         data = api.Data(ref='TargetSequence')
       
   863         data.add(api.Data(ref='Setting', map="SourceSequence[@key='1']"))
       
   864         config.add_data(data)
       
   865         
       
   866         fea = config.get_default_view().get_feature('TargetSequence')
       
   867         self.assertEquals(fea.get_value(), [['Value 1']])
       
   868     
       
   869     def test_sequence_with_multiselection_set_value(self):
       
   870         config = api.Configuration('foo.confml')
       
   871         
       
   872         fea = model.ConfmlSequenceSetting("fooseq")
       
   873         fea.add_feature(model.ConfmlMultiSelectionSetting("msel"))
       
   874         config.add_feature(fea)
       
   875         
       
   876         dview = config.get_default_view()
       
   877         fea = dview.get_feature(fea.fqr)
       
   878         self.assertEquals(fea.value, [])
       
   879         
       
   880         def check_data_elements(expected_data_object_values):
       
   881             actual = []
       
   882             for d in config._traverse(type=api.Data):
       
   883                 actual.append((d.fqr, d.value, d.empty))
       
   884             expected = []
       
   885             for fqr, val, empty in expected_data_object_values:
       
   886                 expected.append((fqr, val, empty))
       
   887             self.assertEquals(actual, expected)
       
   888         
       
   889         fea.value = []
       
   890         self.assertEquals(fea.value, [])
       
   891         check_data_elements(
       
   892             [('fooseq', None, False),])
       
   893         
       
   894         fea.value = [[()]]
       
   895         self.assertEquals(fea.value, [[()]])
       
   896         check_data_elements(
       
   897             [('fooseq', None, False),
       
   898              ('fooseq.msel', None, True),])
       
   899         
       
   900         fea.value = [[('x',)]]
       
   901         self.assertEquals(fea.value, [[('x',)]])
       
   902         check_data_elements(
       
   903             [('fooseq', None, False),
       
   904              ('fooseq.msel', 'x', False),])
       
   905         
       
   906         fea.value = [[('x',)], [('y',)]]
       
   907         self.assertEquals(fea.value, [[('x',)], [('y',)]])
       
   908         check_data_elements(
       
   909             [('fooseq', None, False),
       
   910              ('fooseq.msel', 'x', False),
       
   911              ('fooseq', None, False),
       
   912              ('fooseq.msel', 'y', False),])
       
   913         
       
   914         fea.value = [[('x', 'y')],
       
   915                      [('a', 'b', 'c')],
       
   916                      [()],
       
   917                      [('d', 'e', 'f')]]
       
   918         self.assertEquals(fea.value, [[('x', 'y')],
       
   919                                       [('a', 'b', 'c')],
       
   920                                       [()],
       
   921                                       [('d', 'e', 'f')]])
       
   922         check_data_elements(
       
   923             [('fooseq', None, False),
       
   924              ('fooseq.msel', 'x', False),
       
   925              ('fooseq.msel', 'y', False),
       
   926              ('fooseq', None, False),
       
   927              ('fooseq.msel', 'a', False),
       
   928              ('fooseq.msel', 'b', False),
       
   929              ('fooseq.msel', 'c', False),
       
   930              ('fooseq', None, False),
       
   931              ('fooseq.msel', None, True),
       
   932              ('fooseq', None, False),
       
   933              ('fooseq.msel', 'd', False),
       
   934              ('fooseq.msel', 'e', False),
       
   935              ('fooseq.msel', 'f', False),])
       
   936     
       
   937     def test_sequence_with_multiselection_get_value(self):
       
   938         config = api.Configuration('foo.confml')
       
   939         fea = model.ConfmlSequenceSetting("fooseq")
       
   940         fea.add_feature(model.ConfmlMultiSelectionSetting("msel"))
       
   941         config.add_feature(fea)
       
   942         
       
   943         seqdata1 = api.Data(ref='fooseq')
       
   944         seqdata1._add([api.Data(ref='msel', value='x'),
       
   945                        api.Data(ref='msel', value='y')])
       
   946         seqdata2 = api.Data(ref='fooseq')
       
   947         seqdata2._add([api.Data(ref='msel', empty=True)])
       
   948         seqdata3 = api.Data(ref='fooseq')
       
   949         seqdata3._add([api.Data(ref='msel', value='a'),
       
   950                        api.Data(ref='msel', value='b'),
       
   951                        api.Data(ref='msel', value='c')])
       
   952         config.add_data([seqdata1, seqdata2, seqdata3])
       
   953         
       
   954         dview = config.get_default_view()
       
   955         fea = dview.get_feature(fea.fqr)
       
   956         self.assertEquals(fea.value, [[('x', 'y')], [()], [('a', 'b', 'c')]])
       
   957     
       
   958     def test_simple_name_id_mapping(self):
       
   959         config = api.Configuration('foo.confml')
       
   960         seq = model.ConfmlSequenceSetting('seq', mapKey='strsub', mapValue='strsub')
       
   961         seq.add_feature(model.ConfmlStringSetting('strsub'))
       
   962         seq.add_feature(model.ConfmlIntSetting('intsub'))
       
   963         seq.add_feature(model.ConfmlRealSetting('realsub'))
       
   964         seq.add_feature(model.ConfmlBooleanSetting('boolsub'))
       
   965         config.add_feature(seq)
       
   966         config.add_feature(api.Feature('target'))
       
   967         
       
   968         config.add_data(api.Data(fqr='seq.strsub', value='foo'))
       
   969         config.add_data(api.Data(fqr='seq.intsub', value='123'))
       
   970         config.add_data(api.Data(fqr='seq.realsub', value='1.5'))
       
   971         config.add_data(api.Data(fqr='seq.boolsub', value='true'))
       
   972         config.add_data(api.Data(fqr='target', map="seq[@key='foo']"))
       
   973         
       
   974         fea = config.get_default_view().get_feature('target')
       
   975         self.assertEquals(fea.value, 'foo')
       
   976         self.assertEquals(fea.get_original_value(), 'foo')
       
   977         
       
   978         seq.mapValue = 'intsub'
       
   979         self.assertEquals(fea.value, 123)
       
   980         self.assertEquals(fea.get_original_value(), '123')
       
   981         
       
   982         seq.mapValue = 'realsub'
       
   983         self.assertEquals(fea.value, 1.5)
       
   984         self.assertEquals(fea.get_original_value(), '1.5')
       
   985         
       
   986         seq.mapValue = 'boolsub'
       
   987         self.assertEquals(fea.value, True)
       
   988         self.assertEquals(fea.get_original_value(), 'true')
       
   989     
       
   990     def test_simple_name_id_mapping_with_multiselection(self):
       
   991         config = api.Configuration('foo.confml')
       
   992         seq = model.ConfmlSequenceSetting('seq', mapKey='strsub', mapValue='intsub')
       
   993         seq.add_feature(model.ConfmlStringSetting('strsub'))
       
   994         seq.add_feature(model.ConfmlIntSetting('intsub'))
       
   995         config.add_feature(seq)
       
   996         config.add_feature(model.ConfmlMultiSelectionSetting('target'))
       
   997         
       
   998         d = api.Data(fqr='seq')
       
   999         d.add(api.Data(ref='strsub', value='foo'))
       
  1000         d.add(api.Data(ref='intsub', value='123'))
       
  1001         config.add_data(d, api.container.APPEND)
       
  1002         
       
  1003         d = api.Data(fqr='seq')
       
  1004         d.add(api.Data(ref='strsub', value='bar'))
       
  1005         d.add(api.Data(ref='intsub', value='321'))
       
  1006         config.add_data(d, api.container.APPEND)
       
  1007         
       
  1008         d = api.Data(fqr='seq')
       
  1009         d.add(api.Data(ref='strsub', value='baz'))
       
  1010         d.add(api.Data(ref='intsub', value='456'))
       
  1011         config.add_data(d, api.container.APPEND)
       
  1012         
       
  1013         config.add_data([api.Data(fqr='target', map="seq[@key='bar']"),
       
  1014                          api.Data(ref='target', map="seq[@key='baz']"),
       
  1015                          api.Data(ref='target', map="seq[@key='foo']")])
       
  1016         
       
  1017         fea = config.get_default_view().get_feature('target')
       
  1018         self.assertEquals(fea.value, (321, 456, 123))
       
  1019         self.assertEquals(fea.get_original_value(), ('321', '456', '123'))
       
  1020     
       
  1021     def test_simple_name_id_mapping_with_file_and_folder_setting(self):
       
  1022         def _run_test(subsetting_class):
       
  1023             config = api.Configuration('foo.confml')
       
  1024             seq = model.ConfmlSequenceSetting('seq')
       
  1025             seq.add_feature(subsetting_class('filefoldersub'))
       
  1026             config.add_feature(seq)
       
  1027             config.add_feature(model.ConfmlSelectionSetting('target'))
       
  1028             
       
  1029             def _add_seq_data(local_path, target_path):
       
  1030                 d = api.Data(fqr='seq')
       
  1031                 subd = api.Data(ref='filefoldersub')
       
  1032                 subd.add(api.Data(ref='localPath', value=local_path))
       
  1033                 subd.add(api.Data(ref='targetPath', value=target_path))
       
  1034                 d.add(subd)
       
  1035                 config.add_data(d, api.container.APPEND)
       
  1036             _add_seq_data('local/path/1', 'target/path/1')
       
  1037             _add_seq_data('local/path/2', 'target/path/2')
       
  1038             _add_seq_data('local/path/3', 'target/path/3')
       
  1039             target_data = api.Data(fqr='target')
       
  1040             config.add_data(target_data)
       
  1041 
       
  1042             fea = config.get_default_view().get_feature('target')
       
  1043     
       
  1044             seq.mapKey = 'filefoldersub'
       
  1045             seq.mapValue = 'filefoldersub'
       
  1046             target_data.map = "seq[@key='local/path/1']"
       
  1047             self.assertEquals(fea.value, 'local/path/1')
       
  1048             
       
  1049             seq.mapKey = 'filefoldersub/localPath'
       
  1050             seq.mapValue = 'filefoldersub/localPath'
       
  1051             target_data.map = "seq[@key='local/path/1']"
       
  1052             self.assertEquals(fea.value, 'local/path/1')
       
  1053             
       
  1054             seq.mapKey = 'filefoldersub/targetPath'
       
  1055             seq.mapValue = 'filefoldersub/targetPath'
       
  1056             target_data.map = "seq[@key='target/path/2']"
       
  1057             self.assertEquals(fea.value, 'target/path/2')
       
  1058             
       
  1059             seq.mapKey = 'filefoldersub/localPath'
       
  1060             seq.mapValue = 'filefoldersub/targetPath'
       
  1061             target_data.map = "seq[@key='local/path/3']"
       
  1062             self.assertEquals(fea.value, 'target/path/3')
       
  1063         
       
  1064         _run_test(subsetting_class=model.ConfmlFileSetting)
       
  1065         _run_test(subsetting_class=model.ConfmlFolderSetting)
       
  1066     
       
  1067     def test_simple_name_id_mapping_override_map_value_in_option(self):
       
  1068         config = api.Configuration('foo.confml')
       
  1069         fea = model.ConfmlFeature('fea')
       
  1070         config.add_feature(fea)
       
  1071         seq = model.ConfmlSequenceSetting('seq', mapKey='strsub', mapValue='strsub')
       
  1072         seq.add_feature(model.ConfmlStringSetting('strsub'))
       
  1073         seq.add_feature(model.ConfmlIntSetting('intsub'))
       
  1074         fea.add_feature(seq)
       
  1075         target = api.Feature('target')
       
  1076         target.add_option(api.Option(None, None, map='fea/seq', map_value='intsub'))
       
  1077         fea.add_feature(target)
       
  1078         
       
  1079         config.add_data(api.Data(fqr='fea.seq.strsub', value='foo'))
       
  1080         config.add_data(api.Data(fqr='fea.seq.intsub', value='123'))
       
  1081         config.add_data(api.Data(fqr='fea.target', map="fea/seq[@key='foo']"))
       
  1082         
       
  1083         fea = config.get_default_view().get_feature('fea.target')
       
  1084         self.assertEquals(fea.value, 123)
       
  1085         self.assertEquals(fea.get_original_value(), '123')
       
  1086     
       
  1087     def _assert_raises(self, exception_class, func, *args, **kwargs):
       
  1088         try:
       
  1089             func(*args, **kwargs)
       
  1090             self.fail("No exception raised")
       
  1091         except exception_class, e:
       
  1092             return e
       
  1093     
       
  1094     def test_name_id_mapping_errors(self):
       
  1095         config = api.Configuration('foo.confml')
       
  1096         seq = model.ConfmlSequenceSetting('seq')
       
  1097         seq.add_feature(model.ConfmlStringSetting('strsub'))
       
  1098         seq.add_feature(model.ConfmlIntSetting('intsub'))
       
  1099         config.add_feature(seq)
       
  1100         
       
  1101         config.add_feature(model.ConfmlIntSetting('foosetting'), 'foofea')
       
  1102         
       
  1103         target = api.Feature('target')
       
  1104         target_option = api.Option(None, None, map='seq')
       
  1105         target.add_option(target_option)
       
  1106         config.add_feature(target)
       
  1107         
       
  1108         config.add_data(api.Data(fqr='seq.strsub', value='foo'))
       
  1109         config.add_data(api.Data(fqr='seq.intsub', value='123'))
       
  1110         target_data = api.Data(fqr='target', map="seq[@key='123']")
       
  1111         config.add_data(target_data)
       
  1112         
       
  1113         fea = config.get_default_view().get_feature('target')
       
  1114         
       
  1115         e = self._assert_raises(exceptions.NameIdMappingError, fea.get_value)
       
  1116         self.assertEquals(str(e), "Source sequence 'seq' must have both mapKey and mapValue specified")
       
  1117         
       
  1118         seq.mapKey = 'strsub'
       
  1119         e = self._assert_raises(exceptions.NameIdMappingError, fea.get_value)
       
  1120         self.assertEquals(str(e), "Source sequence 'seq' must have both mapKey and mapValue specified")
       
  1121         
       
  1122         seq.mapKey = None
       
  1123         seq.mapValue = 'strsub'
       
  1124         e = self._assert_raises(exceptions.NameIdMappingError, fea.get_value)
       
  1125         self.assertEquals(str(e), "Source sequence 'seq' must have both mapKey and mapValue specified")
       
  1126         
       
  1127         seq.mapKey = 'intsub'
       
  1128         seq.mapValue = 'strsub'
       
  1129         
       
  1130         target_data.map = "foobar"
       
  1131         e = self._assert_raises(exceptions.NameIdMappingError, fea.get_value)
       
  1132         self.assertEquals(str(e), "Malformed mapping expression: foobar")
       
  1133         
       
  1134         target_data.map = "foo/bar[key='321']"
       
  1135         e = self._assert_raises(exceptions.NameIdMappingError, fea.get_value)
       
  1136         self.assertEquals(str(e), "Malformed mapping expression: foo/bar[key='321']")
       
  1137         
       
  1138         target_data.map = "foo/bar[@key='321'"
       
  1139         e = self._assert_raises(exceptions.NameIdMappingError, fea.get_value)
       
  1140         self.assertEquals(str(e), "Malformed mapping expression: foo/bar[@key='321'")
       
  1141         
       
  1142         target_data.map = "foo/nonexistent[@key='321']"
       
  1143         e = self._assert_raises(exceptions.NameIdMappingError, fea.get_value)
       
  1144         self.assertEquals(str(e), "Mapping source sequence 'foo.nonexistent' does not exist")
       
  1145         
       
  1146         target_data.map = "foofea/foosetting[@key='321']"
       
  1147         e = self._assert_raises(exceptions.NameIdMappingError, fea.get_value)
       
  1148         self.assertEquals(str(e), "Mapping source setting 'foofea.foosetting' is not a sequence setting")
       
  1149         
       
  1150         target_data.map = "seq[@key='321']"
       
  1151         e = self._assert_raises(exceptions.NameIdMappingError, fea.get_value)
       
  1152         self.assertEquals(str(e), "No item-setting in source sequence 'seq' matches key '321'")
       
  1153         
       
  1154         seq.mapKey = 'foo'
       
  1155         target_data.map = "seq[@key='321']"
       
  1156         e = self._assert_raises(exceptions.NameIdMappingError, fea.get_value)
       
  1157         self.assertEquals(str(e), "Invalid mapKey in source sequence 'seq': no sub-setting with ref 'foo'")
       
  1158         
       
  1159         seq.mapKey = 'intsub'
       
  1160         seq.mapValue = 'foo'
       
  1161         target_data.map = "seq[@key='321']"
       
  1162         e = self._assert_raises(exceptions.NameIdMappingError, fea.get_value)
       
  1163         self.assertEquals(str(e), "Invalid mapValue in source sequence 'seq': no sub-setting with ref 'foo'")
       
  1164         
       
  1165         seq.mapValue = 'strsub'
       
  1166         target_data.map = "seq[@key='123']"
       
  1167         target_option.map_value = 'foobar'
       
  1168         e = self._assert_raises(exceptions.NameIdMappingError, fea.get_value)
       
  1169         self.assertEquals(str(e), "Invalid mapValue override in option: sub-setting 'foobar' does not exist under source sequence 'seq'")
       
  1170         
       
  1171         # Test successful mapping for good measure
       
  1172         seq.mapKey = 'intsub'
       
  1173         seq.mapValue = 'strsub'
       
  1174         target_data.map = "seq[@key='123']"
       
  1175         target_option.map_value = 'intsub'
       
  1176         self.assertEquals(fea.get_value(), 123)
       
  1177         self.assertEquals(fea.get_original_value(), '123')
   495 
  1178 
   496 class TestConfmlFile(unittest.TestCase):
  1179 class TestConfmlFile(unittest.TestCase):
   497     def test_create_localpath_elem(self):
  1180     def test_create_localpath_elem(self):
   498         elem = model.ConfmlLocalPath()
  1181         elem = model.ConfmlLocalPath()
   499         self.assertTrue(elem)
  1182         self.assertTrue(elem)
   509         self.assertTrue(elem)
  1192         self.assertTrue(elem)
   510         self.assertEquals(elem.get_ref(),'test')
  1193         self.assertEquals(elem.get_ref(),'test')
   511         self.assertEquals(elem.list_features(), ['localPath','targetPath'])
  1194         self.assertEquals(elem.list_features(), ['localPath','targetPath'])
   512         self.assertEquals(elem.get_feature('localPath').fqr, 'test.localPath')
  1195         self.assertEquals(elem.get_feature('localPath').fqr, 'test.localPath')
   513         self.assertEquals(elem.get_feature('targetPath').fqr, 'test.targetPath')
  1196         self.assertEquals(elem.get_feature('targetPath').fqr, 'test.targetPath')
       
  1197         self.assertEquals(elem.get_feature('localPath').name, 'localPath')
       
  1198         self.assertEquals(elem.get_feature('targetPath').name, 'targetPath')
   514 
  1199 
   515     def test_create_file_elem_and_set_value(self):
  1200     def test_create_file_elem_and_set_value(self):
   516         config = api.Configuration('test.confml')
  1201         config = api.Configuration('test.confml')
   517         elem = model.ConfmlFileSetting('test', localpath='test.txt')
  1202         elem = model.ConfmlFileSetting('test', localpath='test.txt')
   518         config.add_feature(elem)
  1203         config.add_feature(elem)
   527     def test_clone_file_elem(self):
  1212     def test_clone_file_elem(self):
   528         elem1 = model.ConfmlFileSetting('test')
  1213         elem1 = model.ConfmlFileSetting('test')
   529         elem2 = elem1._clone(recursion=True)
  1214         elem2 = elem1._clone(recursion=True)
   530         
  1215         
   531 
  1216 
       
  1217     def test_create_file_elem_to_a_sequence(self):
       
  1218         config = model.ConfmlConfiguration('foo.confml')
       
  1219         seq = model.ConfmlSequenceSetting('foo')
       
  1220         elem = model.ConfmlFileSetting('test')
       
  1221         seq.add_feature(elem)
       
  1222         config.add_feature(seq)
       
  1223         seq.value = [[['local file', 'targetfile']],
       
  1224                      [['local file2', 'targetfile2']]]
       
  1225         
       
  1226         self.assertEquals(seq.test.localPath.get_value(), ['local file',
       
  1227                                                            'local file2'])
       
  1228         
       
  1229     def test_create_folder_elem_to_a_sequence(self):
       
  1230         config = model.ConfmlConfiguration('foo.confml')
       
  1231         seq = model.ConfmlSequenceSetting('foo')
       
  1232         elem = model.ConfmlFolderSetting('test')
       
  1233         seq.add_feature(elem)
       
  1234         config.add_feature(seq)
       
  1235         seq.value = [[['local file', 'targetfile']],
       
  1236                      [['local file2', 'targetfile2']]]
       
  1237         
       
  1238         self.assertEquals(seq.test.localPath.get_value(), ['local file',
       
  1239                                                            'local file2'])
       
  1240 
       
  1241         
   532 class TestConfmlIcon(unittest.TestCase):
  1242 class TestConfmlIcon(unittest.TestCase):
   533     def test_create_icon(self):
  1243     def test_create_icon(self):
   534         icon = model.ConfmlIcon("test/foo/bar.jpg")
  1244         icon = model.ConfmlIcon("test/foo/bar.jpg")
   535         self.assertEquals(icon.href, "test/foo/bar.jpg")
  1245         self.assertEquals(icon.href, "test/foo/bar.jpg")
   536         icon.href = 'new/icon.jpg'
  1246         icon.href = 'new/icon.jpg'
   543 
  1253 
   544 
  1254 
   545 class TestLengths(unittest.TestCase):
  1255 class TestLengths(unittest.TestCase):
   546     def test_create_maxLength(self):
  1256     def test_create_maxLength(self):
   547         max = model.ConfmlMaxLength('100')
  1257         max = model.ConfmlMaxLength('100')
   548         self.assertEquals(max.value, '100')
  1258         self.assertEquals(max.value, 100)
   549 
  1259         max.value = 10
       
  1260         self.assertEquals(max.value, 10)
       
  1261         max.value = '1000'
       
  1262         self.assertEquals(max.value, 1000)
       
  1263         
   550     def test_create_minLength(self):
  1264     def test_create_minLength(self):
   551         min = model.ConfmlMinLength('100')
  1265         min = model.ConfmlMinLength('100')
   552         self.assertEquals(min.value, '100')
  1266         self.assertEquals(min.value, 100)
       
  1267         min.value = 10
       
  1268         self.assertEquals(min.value, 10)
       
  1269         min.value = '1000'
       
  1270         self.assertEquals(min.value, 1000)
       
  1271 
       
  1272     def test_create_length(self):
       
  1273         len = model.ConfmlLength('100')
       
  1274         self.assertEquals(len.value, 100)
       
  1275         len.value = 10
       
  1276         self.assertEquals(len.value, 10)
       
  1277         len.value = '1000'
       
  1278         self.assertEquals(len.value, 1000)
   553 
  1279 
   554 class TestConfmlFacets(unittest.TestCase):
  1280 class TestConfmlFacets(unittest.TestCase):
       
  1281     def test_numeric_base_classs(self):
       
  1282         numeric = model.ConfmlNumericValue()
       
  1283         numeric.value = 3
       
  1284         self.assertEquals(numeric.value, 3)
       
  1285         numeric.value = 0.3
       
  1286         self.assertEquals(numeric.value, 0.3)
       
  1287         numeric.value = '22'
       
  1288         self.assertEquals(numeric.value, 22)
       
  1289         numeric.value = '0.1'
       
  1290         self.assertEquals(numeric.value, 0.1)
       
  1291         try:
       
  1292             numeric.value = 'foo'
       
  1293             self.fail("setting string to float property succeeded!")
       
  1294         except ValueError:
       
  1295             pass
       
  1296 
   555     def test_create_inclusive(self):
  1297     def test_create_inclusive(self):
   556         min = model.ConfmlMinInclusive('-10')
  1298         min = model.ConfmlMinInclusive('-10')
   557         max = model.ConfmlMaxInclusive('10')
  1299         max = model.ConfmlMaxInclusive('10')
   558         self.assertEquals(min.value, '-10')
  1300         self.assertEquals(min.value, -10)
   559         self.assertEquals(max.value, '10')
  1301         self.assertEquals(max.value, 10)
       
  1302         min.value = 10
       
  1303         self.assertEquals(min.value, 10)
       
  1304         min.value = '1000'
       
  1305         self.assertEquals(min.value, 1000)
       
  1306         max.value = 10
       
  1307         self.assertEquals(max.value, 10)
       
  1308         max.value = '1000'
       
  1309         self.assertEquals(max.value, 1000)
   560 
  1310 
   561     def test_create_exclusive(self):
  1311     def test_create_exclusive(self):
   562         min = model.ConfmlMinExclusive('0')
  1312         min = model.ConfmlMinExclusive('0')
   563         max = model.ConfmlMaxExclusive("9")
  1313         max = model.ConfmlMaxExclusive("9")
   564         self.assertEquals(min.value, '0')
  1314         self.assertEquals(min.value, 0)
   565         self.assertEquals(max.value, '9')
  1315         self.assertEquals(max.value, 9)
       
  1316         max.value = 10
       
  1317         self.assertEquals(max.value, 10)
       
  1318         max.value = '1000'
       
  1319         self.assertEquals(max.value, 1000)
       
  1320         min.value = 10
       
  1321         self.assertEquals(min.value, 10)
       
  1322         min.value = '1000'
       
  1323         self.assertEquals(min.value, 1000)
   566 
  1324 
   567     def test_create_pattern(self):
  1325     def test_create_pattern(self):
   568         pattern = model.ConfmlPattern("[a-zA-Z]")
  1326         pattern = model.ConfmlPattern("[a-zA-Z]")
   569         self.assertEquals(pattern.value, "[a-zA-Z]")
  1327         self.assertEquals(pattern.value, "[a-zA-Z]")
   570 
  1328 
   571     def test_create_totalDigits(self):
  1329     def test_create_totalDigits(self):
   572         digits = model.ConfmlTotalDigits("3")
  1330         digits = model.ConfmlTotalDigits("3")
   573         self.assertEquals(digits.value, '3')
  1331         self.assertEquals(digits.value, 3)
       
  1332         digits.value = 10
       
  1333         self.assertEquals(digits.value, 10)
       
  1334         digits.value = '1000'
       
  1335         self.assertEquals(digits.value, 1000)
   574 
  1336 
   575 class TestConfmlConfiguration(unittest.TestCase):
  1337 class TestConfmlConfiguration(unittest.TestCase):
   576     def test_create_configuration(self):
  1338     def test_create_configuration(self):
   577         config = model.ConfmlConfiguration("test/foo/bar.jpg")
  1339         config = model.ConfmlConfiguration("test/foo/bar.jpg")
   578         self.assertEquals(config.meta, None)
  1340         self.assertEquals(config.meta, None)
   579         self.assertEquals(config.desc, None)
  1341         self.assertEquals(config.desc, None)
   580         self.assertEquals(config.name, 'test__foo__bar_jpg')
  1342         self.assertEquals(config.name, 'test__foo__bar_jpg')
   581         self.assertEquals(config.ref, 'test__foo__bar_jpg')
  1343         self.assertEquals(config.ref, 'test__foo__bar_jpg')
   582         self.assertEquals(config.path, 'test/foo/bar.jpg')
  1344         self.assertEquals(config.path, 'test/foo/bar.jpg')
   583 
  1345 
   584 #    def test_configuration_access_meta(self):
  1346     def test_create_configuration_and_features(self):
   585 #        config = model.ConfmlConfiguration("test/foo/bar.jpg", meta={'test':'foo','bar':' hd dd'})
  1347         conf = model.ConfmlConfiguration("simple.confml")
   586 #        self.assertEquals(config.meta.dict, {'test':'foo','bar':' hd dd'})
  1348         fea = conf.create_feature("test")
   587 #        self.assertEquals(config.meta['test'],'foo')
  1349         self.assertTrue(isinstance(fea, model.ConfmlFeature))
   588 #        config.meta = {'test':'123'}
  1350         self.assertEquals(conf.get_feature('test'), fea)
   589 #        self.assertEquals(config.meta['test'],'123')
  1351         fea = conf.create_feature("test1", name="test name")
   590 #        del config.meta
  1352         self.assertEquals(conf.get_feature('test1').name, 'test name')
   591 #        self.assertEquals(config.meta, None)
  1353         subfea = fea.create_feature("subfea", name="subfea name")
       
  1354         self.assertTrue(isinstance(subfea, model.ConfmlSetting))
       
  1355         self.assertEquals(conf.list_all_features(), ['test','test1','test1.subfea'])
       
  1356 
       
  1357     def test_configuration_get_default_view(self):
       
  1358         config = model.ConfmlConfiguration("test/foo/bar.jpg")
       
  1359         config.add_feature(model.ConfmlFeature("test"))
       
  1360         view = config.create_view("testview")
       
  1361         group = view.create_group("group1")
       
  1362         group.create_featurelink("test")
       
  1363         self.assertEquals(config.list_all_features(), ['test'])
   592         
  1364         
   593     def test_configuration_access_desc(self):
  1365     def test_configuration_access_desc(self):
   594         config = model.ConfmlConfiguration("test/foo/bar.jpg", desc="testing description")
  1366         config = model.ConfmlConfiguration("test/foo/bar.jpg", desc="testing description")
   595         self.assertEquals(config.desc, "testing description")
  1367         self.assertEquals(config.desc, "testing description")
   596         config.desc = 'new desc'
  1368         config.desc = 'new desc'
   597         self.assertEquals(config.desc, "new desc")
  1369         self.assertEquals(config.desc, "new desc")
   598         del config.desc
  1370         del config.desc
   599         self.assertEquals(config.desc, None)
  1371         self.assertEquals(config.desc, None)
   600 
  1372 
   601 class TestConfmlProperty(unittest.TestCase):
  1373     def test_use_create_configuration(self):
   602     def test_create_property(self):
  1374         config = model.ConfmlConfiguration("test/foo/bar.jpg")
   603         property = model.ConfmlProperty(name='test',value='foo', unit='kB')
  1375         subconfig = config.create_configuration("sub/jee.confml")
   604         self.assertEquals(property.name, 'test')
  1376         self.assertEquals(subconfig.get_full_path(),'test/foo/sub/jee.confml')
   605         self.assertEquals(property.value, 'foo')
  1377         self.assertTrue(isinstance(subconfig,model.ConfmlConfiguration))
   606         self.assertEquals(property.unit, 'kB')
  1378 
   607         property.name = 'testnew'
  1379         
   608         property.value = 'foo faa'
  1380 class TestConfmlView(unittest.TestCase):
   609         self.assertEquals(property.name, 'testnew')
  1381     def test_create_view(self):
   610         self.assertEquals(property.value, 'foo faa')
  1382         view = model.ConfmlView("test", id="test")
   611         
  1383         self.assertTrue(view)
       
  1384         self.assertEquals(view.get_ref(),'test')
       
  1385         self.assertEquals(view.id,"test")
       
  1386 
       
  1387     def test_create_view_with_create_view(self):
       
  1388         config = model.ConfmlConfiguration("test")
       
  1389         view = config.create_view("test")
       
  1390         group = view.create_group("group1")
       
  1391         fl = group.create_featurelink("intset1")
       
  1392         self.assertTrue(isinstance(view, model.ConfmlView))
       
  1393         self.assertTrue(isinstance(group, model.ConfmlGroup))
       
  1394         self.assertTrue(isinstance(fl, model.ConfmlFeatureLink))
       
  1395 
       
  1396     def test_create_confml_featurelink(self):
       
  1397         fealink = model.ConfmlFeatureLink("test")
       
  1398         self.assertTrue(fealink)
       
  1399         self.assertEquals(fealink.get_ref(),'link_test')
       
  1400 
       
  1401     def test_create_confml_featurelink_with_overrides(self):
       
  1402         fealink = model.ConfmlFeatureLink("test")
       
  1403         fealink.desc = "test desc"
       
  1404         self.assertEquals(fealink.desc,'test desc')
       
  1405         self.assertEquals(fealink._has('_desc'),True)
       
  1406         self.assertEquals(fealink.get_attributes(),{'properties': {},'options': {}, 'desc' : 'test desc'})
       
  1407 
       
  1408     def test_create_confml_featurelink_with_option_overrides(self):
       
  1409         fealink = model.ConfmlFeatureLink("test")
       
  1410         fealink.add(api.Option('opt2', '2'))
       
  1411         self.assertEquals(fealink.options['2'].name,'opt2')
       
  1412 
       
  1413     def test_create_view_with_groups(self):
       
  1414         view = model.ConfmlView("test")
       
  1415         view.create_group("group1")
       
  1416         view.create_group("group2")
       
  1417         self.assertEquals(view.list_groups(),['group1','group2'])
       
  1418 
       
  1419     def test_create_configuration_with_featurelinks(self):
       
  1420         config = model.ConfmlConfiguration("test")
       
  1421         config.add_feature(model.ConfmlFeature("fea1", name="Feature 1"))
       
  1422         intset1 = model.ConfmlIntSetting("intset1", name="Setting 1")
       
  1423         intset1.desc = "int setting desc"
       
  1424         config.add_feature(intset1, "fea1")
       
  1425 
       
  1426         view = config.create_view("test")
       
  1427         group = view.create_group("group1")
       
  1428         fl = group.create_featurelink("intset1")
       
  1429         self.assertTrue(isinstance(fl, model.ConfmlFeatureLink))
       
  1430         self.assertTrue(len(config.get_default_view().get_features('**')), 2)
       
  1431         
       
  1432         
       
  1433     def test_create_configuration_with_view_and_featurelink_overrides(self):
       
  1434         config = model.ConfmlConfiguration("test")
       
  1435         config.add_feature(model.ConfmlFeature("fea1", name="Feature 1"))
       
  1436         intset1 = model.ConfmlIntSetting("intset1", name="Setting 1")
       
  1437         intset1.desc = "int setting desc"
       
  1438         config.add_feature(intset1, "fea1")
       
  1439         
       
  1440         view = config.create_view("test")
       
  1441         view.create_group("group1")
       
  1442         fl = model.ConfmlFeatureLink("fea1.intset1", name="override name")
       
  1443         fl.desc = "override desc"
       
  1444         fl.minLength = 2
       
  1445         fl.maxLength = 10
       
  1446         fl.minOccurs = 2
       
  1447         fl.maxOccurs = 10
       
  1448         
       
  1449         fl.pattern = '^.*@.*$'
       
  1450         fl.totalDigits = 10
       
  1451         fl.minInclusive = 0
       
  1452         fl.maxInclusive = 10
       
  1453         fl.minExclusive = 0
       
  1454         fl.maxExclusive = 10
       
  1455         
       
  1456         fl.add(api.Option('opt1', '1'))
       
  1457         
       
  1458         view.get_group('group1').add(fl)
       
  1459         view.populate()
       
  1460         self.assertEquals(view.list_all_features(),['group1.proxy_fea1_intset1'])
       
  1461         self.assertEquals(view.get_feature('group1.proxy_fea1_intset1').desc, "override desc")
       
  1462         self.assertEquals(view.get_feature('group1.proxy_fea1_intset1').name, "override name")
       
  1463         self.assertEquals(view.get_feature('group1.proxy_fea1_intset1').minLength, 2)
       
  1464         self.assertEquals(view.get_feature('group1.proxy_fea1_intset1').maxLength, 10)
       
  1465         self.assertEquals(view.get_feature('group1.proxy_fea1_intset1').minOccurs, 2)
       
  1466         self.assertEquals(view.get_feature('group1.proxy_fea1_intset1').maxOccurs, 10)
       
  1467         self.assertEquals(view.get_feature('group1.proxy_fea1_intset1').pattern, '^.*@.*$')
       
  1468         self.assertEquals(view.get_feature('group1.proxy_fea1_intset1').totalDigits, 10)
       
  1469         self.assertEquals(view.get_feature('group1.proxy_fea1_intset1').minInclusive, 0)
       
  1470         self.assertEquals(view.get_feature('group1.proxy_fea1_intset1').maxInclusive, 10)
       
  1471         self.assertEquals(view.get_feature('group1.proxy_fea1_intset1').minExclusive, 0)
       
  1472         self.assertEquals(view.get_feature('group1.proxy_fea1_intset1').maxExclusive, 10)
       
  1473         self.assertEquals(view.get_feature('group1.proxy_fea1_intset1').options['1'].name,'opt1')
       
  1474         
       
  1475 if __name__ == '__main__':
       
  1476     unittest.main()