def test_smart_items(self):
        d = SmartDict()

        d['foo'] = {'a': 'world', 'b': 'hello'}
        d['a'] = [{'b': 1}, {'b': 2}, {'b': 3}]
        d['c.d'] = [{'e': 4}, {'f': 5}]

        self.assertTrue(d.items(), [('a', [{'b': 1}, {'b': 2}, {'b': 3}]),
                                    ('c', {'d': [{'e': 4}, {'f': 5}]}),
                                    ('foo', {'a': 'world', 'b': 'hello'})])
    def test_smart_itervalues(self):
        d = SmartDict()

        d['foo'] = {'a': 'world', 'b': 'hello'}
        d['c.d'] = [{'e': 4}, {'f': 5}]
        d['a'] = [{'b': 1}, {'b': 2}, {'b': 3}]

        iterator = d.itervalues()

        self.assertEqual(iterator.next(), [{'b': 1}, {'b': 2}, {'b': 3}])
        self.assertEqual(iterator.next(), {'d': [{'e': 4}, {'f': 5}]})
        self.assertEqual(iterator.next(), {'a': 'world', 'b': 'hello'})

        self.assertRaises(StopIteration, iterator.next)
    def test_smart_update(self):
        d = SmartDict()
        d2 = SmartDict()

        d['foo'] = {'a': 'world', 'b': 'hello'}
        d['c.d'] = [{'e': 4}, {'f': 5}]
        d['a'] = [{'b': 1}, {'b': 2}, {'b': 3}]

        d2['qwerty'] = {'t': 'u', 'i': 'o'}
        d2['qwe.rty'] = [{'n': 34}, {'x': 3}]

        d.update(d2)

        d3 = SmartDict({'a': [{'b': 1}, {'b': 2}, {'b': 3}],
                        'c': {'d': [{'e': 4}, {'f': 5}]},
                        'foo': {'a': 'world', 'b': 'hello'},
                        'qwe': {'rty': [{'n': 34}, {'x': 3}]},
                        'qwerty': {'i': 'o', 't': 'u'}})

        self.assertTrue(d == d3)
    def test_smart_dict(self):
        d = SmartDict()

        d['foo'] = {'a': 'world', 'b': 'hello'}
        d['a'] = [{'b': 1}, {'b': 2}, {'b': 3}]
        self.assertEqual(d.keys(), ['a', 'foo'])
        self.assertTrue('foo.a' in d)
        del d['foo']
        self.assertEqual(d.keys(), ['a'])
        self.assertEqual(d['a'], [{'b': 1}, {'b': 2}, {'b': 3}])
        self.assertEqual(d['a[0]'], {'b': 1})
        self.assertEqual(d['a.b'], [1, 2, 3])
        self.assertEqual(d['a[1:]'], [{'b': 2}, {'b': 3}])

        d.set('a', {'b': 4}, extend=True)
        self.assertEqual(d['a'], [{'b': 1}, {'b': 2}, {'b': 3}, {'b': 4}])
        d.set('a', [{'b': 1}, {'b': 2}, {'b': 3}], extend=False)
        self.assertEqual(d['a'], [{'b': 1}, {'b': 2}, {'b': 3}])

        self.assertEqual(d.get('does not exists'), None)

        d = SmartDict()
        d.set('a.b.c[n]', 'foo', True)
        self.assertEqual(d['a.b.c'], ['foo'])
        d.set('a.b.c[n]', 'bar', True)
        self.assertEqual(d['a.b.c'], ['foo', 'bar'])
        d.set('a.b.c', ['foo'], False)
        self.assertEqual(d['a.b.c'], ['foo'])