import unittest
from minijson import dumps, loads, dumps_object, loads_object, EncodingError, DecodingError


class TestMiniJSON(unittest.TestCase):
    def test_exceptions(self):
        a = {}
        for i in range(65535):
            a[i] = i*2
        self.assertRaises(EncodingError, lambda: dumps(a))
        a = []
        for i in range(65535):
            a.append(i)
        self.assertRaises(EncodingError, lambda: dumps(a))

    def test_dumps(self):
        v = {"name": "land", "operator_id": "dupa", "parameters":
            {"lat": 45.22999954223633, "lon": 54.79999923706055, "alt": 234}}
        b = dumps(v)
        print(f'Serialized {b}')
        c = loads(b)
        print(f'Recovered {c}')
        self.assertEqual(v, c)

    def test_loads_exception(self):
        b = b'\x1A'
        self.assertRaises(DecodingError, lambda: loads(b))

    def test_loads(self):
        a = loads(b'\x0B\x03\x04name\x84land\x0Boperator_id\x84dupa\x0Aparameters\x0B\x03\x03lat\x09B4\xeb\x85\x03lon\x09B[33\x03alt\x09Cj\x00\x00')
        self.assertEqual(a, {"name": "land", "operator_id": "dupa", "parameters":
            {"lat": 45.22999954223633, "lon": 54.79999923706055, "alt": 234}})

    def test_dumps_loads_object(self):
        class Test:
            def __init__(self, a):
                self.a = a

        a = Test(2)
        b = dumps_object(a)
        c = loads_object(b, Test)
        self.assertEqual(a.a, c.a)
        self.assertIsInstance(c, Test)