from unittest import TestCase, main
from msgpack import packs, unpacks

class TestFormat(TestCase):
    def __check(self, obj, expected_packed):
        packed = packs(obj)
        self.assertEqual(packed, expected_packed)
        unpacked = unpacks(packed)
        self.assertEqual(unpacked, obj)

    def testSimpleValues(self):
        self.__check(None, '\xc0')
        self.__check(True, '\xc3')
        self.__check(False, '\xc2')
        self.__check(
                [None, False, True],
                '\x93\xc0\xc2\xc3'
                )

    def testFixnum(self):
        self.__check(
                [[0,64,127], [-32,-16,-1]],
                "\x92\x93\x00\x40\x7f\x93\xe0\xf0\xff"
                )
    
    def testFixArray(self):
        self.__check(
                [[],[[None]]],
                "\x92\x90\x91\x91\xc0"
                )

    def testFixRaw(self):
        self.__check(
                ["", "a", "bc", "def"],
                "\x94\xa0\xa1a\xa2bc\xa3def"
                )
        pass

    def testFixMap(self):
        self.__check(
                {False: {None: None}, True:{None:{}}},
                "\x82\xc2\x81\xc0\xc0\xc3\x81\xc0\x80"
                )
        pass


class TestUnpack(TestCase):
    def __check(self, packed, obj):
        self.assertEqual(unpacks(packed), obj)

    def testuint(self):
        self.__check(
                 "\x99\xcc\x00\xcc\x80\xcc\xff\xcd\x00\x00\xcd\x80\x00"
                 "\xcd\xff\xff\xce\x00\x00\x00\x00\xce\x80\x00\x00\x00"
                 "\xce\xff\xff\xff\xff",
                 [0, 128, 255, 0, 32768, 65535, 0,
                     2147483648, 4294967295],
                 )




if __name__ == '__main__':
    main()