"""
open/DurusWorks/durus/test/utest_persistent_dict.py

"""
from durus.connection import Connection
from durus.persistent_dict import PersistentDict
from durus.storage import MemoryStorage
from sancho.utest import UTest, raises

class PersistentDictTest (UTest):

    def no_arbitrary_attributes(self):
        pd = PersistentDict()
        raises(AttributeError, setattr, pd, 'bogus', 1)

    def nonzero(self):
        pd = PersistentDict()
        assert not pd
        pd['1'] = 1
        assert pd

    def setdefault(self):
        pd = PersistentDict()
        assert pd.setdefault('1', []) == []
        assert pd['1'] == []
        pd.setdefault('1', 1).append(1)
        assert pd['1'] == [1]
        pd.setdefault('1', [])
        assert pd['1'] == [1]
        pd.setdefault('1', 1).append(2)
        assert pd['1'] == [1, 2]

    def iter(self):
        pd = PersistentDict()
        assert list(pd) == []
        pd[1] = 2
        assert list(pd) == [1]

    def insert_again(self):
        pd = PersistentDict()
        pd[1] = 2
        pd[1] = 3
        assert pd[1] == 3
        assert list(pd) == [1], list(pd)

    def get(self):
        pd = PersistentDict((x, True) for x in range(10))
        assert pd.get(2) == True
        assert pd.get(-1) == None
        assert pd.get(-1, 5) == 5

    def contains(self):
        pd = PersistentDict((x, True) for x in range(10))
        assert 2 in pd
        assert -1 not in pd

    def has_key(self):
        pd = PersistentDict((x, True) for x in range(10))
        assert pd.has_key(2)
        assert not pd.has_key(-1)

    def clear(self):
        pd = PersistentDict((x, True) for x in range(10))
        assert pd.has_key(2)
        pd.clear()
        assert not pd.has_key(2)
        assert list(pd.keys()) == []

    def update(self):
        pd = PersistentDict()
        pd.update()
        raises(TypeError, pd.update, {}, {})
        assert not list(pd.items())
        pd.update(a=1)
        assert list(pd.items()) == [('a', 1)]
        pd = PersistentDict()
        pd.update(dict(b=2), a=1)
        assert len(list(pd.items())) == 2
        assert pd['b'] == 2
        assert pd['a'] == 1
        pd = PersistentDict()
        pd.update([('b', 2)], a=1)
        assert len(pd.items()) == 2
        assert pd['b'] == 2
        assert pd['a'] == 1
        pd2 = PersistentDict((x, True) for x in range(10))
        pd.update(pd2)
        class keyed(object):
            data = dict(a=3)
            keys = data.keys
            __setitem__ = data.__setitem__
            __getitem__ = data.__getitem__
        pd.update(keyed())
        assert pd['a'] == 3

    def cmp(self):
        pd = PersistentDict((x, True) for x in range(10))
        pd2 = PersistentDict((x, True) for x in range(10))
        assert pd == pd2
        assert dict(pd) == dict(pd2)

    def delete(self):
        connection = Connection(MemoryStorage())
        pd = PersistentDict((x, True) for x in range(10))
        connection.root['x'] = pd
        connection.commit()
        del pd[1]
        assert pd._p_is_unsaved()

    def copy(self):
        connection = Connection(MemoryStorage())
        pd = PersistentDict((x, True) for x in range(10))
        pd2 = pd.copy()
        assert pd == pd2
        pd[1] = 34
        assert pd != pd2

    def iter(self):
        pd = PersistentDict((x, True) for x in range(10))
        assert list(pd.iteritems()) == list(zip(pd.iterkeys(), pd.itervalues()))
        assert list(pd.items()) == list(zip(pd.keys(), pd.values()))

    def pops(self):
        pd = PersistentDict((x, True) for x in range(10))
        pd.pop(3)
        assert 3 not in pd
        assert type(pd.popitem()) is tuple

    def fromkeys(self):
        x = PersistentDict.fromkeys(dict(a=2), value=4)
        assert isinstance(x, PersistentDict)
        assert dict(x) == dict(a=4)


if __name__ == '__main__':
    PersistentDictTest()
