#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License
#

import unittest
from qpid_dispatch.management.entity import EntityBase, camelcase

class EntityTest(unittest.TestCase):

    def test_camelcase(self):
        self.assertEqual('', camelcase(''))
        self.assertEqual('foo', camelcase('foo'))
        self.assertEqual('Foo', camelcase('foo', capital=True))
        self.assertEqual('fooBar', camelcase('foo bar'))
        self.assertEqual('fooBar', camelcase('foo.bar'))
        self.assertEqual('fooBar', camelcase('foo-bar'))
        self.assertEqual('fooBar', camelcase('foo_bar'))
        self.assertEqual('fooBarBaz', camelcase('foo_bar.baz'))
        self.assertEqual('FooBarBaz', camelcase('foo_bar.baz', capital=True))
        self.assertEqual('fooBar', camelcase('fooBar'))
        self.assertEqual('FooBar', camelcase('fooBar', capital=True))

    def test_entity(self):
        e = EntityBase({'foo-bar': 'baz'}, type='container', name='x')
        self.assertEqual(e.attributes, {'type': 'container', 'name':'x', 'foo-bar': 'baz'})
        self.assertEqual(e.name, 'x')
        self.assertEqual(e['name'], 'x')

        e.name = 'y'
        self.assertEqual(e.name, 'y')
        self.assertEqual(e['name'], 'y')
        self.assertEqual(e.attributes['name'], 'y')

        e.xx = 'xx'
        self.assertEqual(e.xx, 'xx')
        self.assertEqual(e['xx'], 'xx')
        self.assertEqual(e.attributes['xx'], 'xx')


if __name__ == '__main__':
    unittest.main()
