"""
$URL: svn+ssh://svn.mems-exchange.org/repos/trunk/durus/test/utest_serialize.py $
$Id: utest_serialize.py 29013 2006-10-31 12:13:32Z dbinger $
"""
from durus.connection import ROOT_OID
from durus.persistent import Persistent, ConnectionBase
from durus.serialize import ObjectWriter, ObjectReader, pack_record
from durus.serialize import unpack_record, split_oids
from sancho.utest import UTest, raises


class Test (UTest):

    def check_object_writer(self):
        class FakeConnection(ConnectionBase):
            def new_oid(self):
                return ROOT_OID
            def note_access(self, obj):
                pass
        connection = FakeConnection()
        self.s=s=ObjectWriter(connection)
        x = Persistent()
        assert x._p_connection == None
        x._p_oid = ROOT_OID
        x._p_connection = connection
        assert s._persistent_id(x) == (ROOT_OID, Persistent)
        x._p_connection = FakeConnection()
        # connection of x no longer matches connection of s.
        raises(ValueError, s._persistent_id, x)
        x.a = Persistent()
        assert s.get_state(x), (
            '\x80\x02cdurus.persistent\nPersistent\nq\x01.\x80\x02}q\x02U'
            '\x01aU\x08\x00\x00\x00\x00\x00\x00\x00\x00q\x03h\x01\x86Qs.',
            '\x00\x00\x00\x00\x00\x00\x00\x00')
        assert list(s.gen_new_objects(x)) == [x, x.a]
        # gen_new_objects() can only be called once.
        raises(RuntimeError, s.gen_new_objects, 3)
        s.close()

    def check_object_reader(self):
        class FakeConnection:
            pass
        self.r = r = ObjectReader(FakeConnection())
        root = '\x80\x02cdurus.persistent_dict\nPersistentDict\nq\x01.\x80\x02}q\x02U\x04dataq\x03}q\x04s.\x00\x00\x00\x00'
        assert r.get_ghost(root)._p_is_ghost()

    def check_record_pack_unpack(self):
        oid = '0'*8
        data = 'sample'
        reflist = ['1'*8, '2'*8]
        refs = ''.join(reflist)
        result=unpack_record(pack_record(oid, data, refs))
        assert result[0] == oid
        assert result[1] == data
        assert split_oids(result[2]) == reflist
        assert split_oids('') == []

if __name__ == "__main__":
    Test()
