class JsonPresenterTest(unittest.TestCase):

    def setUp(self):
        self.jp = JsonPresenter()

    def test_timeStamp_deserialize(self):
        d = self.jp.deserialize(
            '{"type": "Return", "id": 0, "value": {"timeStamp": {"secondsPastEpoch": 43, "nanoseconds": 200000000, "userTag": 0}}}')
        self.assertEqual(d["type"], "Return")
        self.assertEqual(d["id"], 0)
        self.assertEqual(d["value"], OrderedDict(timeStamp=43.2))

    def test_camelCase_check(self):
        self.jp.log_warning = MagicMock()
        d = OrderedDict()
        d.update(isCamelCase=1)
        d.update(UpperCase=0)
        d.update(Underscores_upper=0)
        d.update(underscores_lower=0)
        d.update(camel123=1)
        d.update(get2HTTPResponseCode=1)
        self.jp.serialize(d)
        expected = ["Key {} isn't camelCase".format(
            key) for key, value in d.items() if value == 0]
        for i, err in enumerate(expected):
            self.assertEqual(err, self.jp.log_warning.call_args_list[i][0][0])
        self.assertEqual(len(expected), self.jp.log_warning.call_count)

    def test_timeStamp_serialize(self):
        d = OrderedDict()
        d.update(type="Return")
        d.update(id=0)
        d.update(value=dict(timeStamp=43.2))
        s = self.jp.serialize(d)
        expected = '{"type": "Return", "id": 0, "value": {"timeStamp": {"secondsPastEpoch": 43, "nanoseconds": 200000000, "userTag": 0}}}'
        self.assertEqual(s, expected)

    def test_vtype_serialize(self):
        d = OrderedDict()
        d.update(type="Return")
        d.update(id=0)
        d.update(value=VDouble)
        s = self.jp.serialize(d)
        expected = '{"type": "Return", "id": 0, "value": {"name": "VDouble", "version": "2"}}'
        self.assertEqual(s, expected)

    def test_vtype_deserialize(self):
        d = self.jp.deserialize(
            '{"type": "Return", "id": 0, "value": {"name": "VDouble", "version": "2"}}')
        self.assertEqual(d["type"], "Return")
        self.assertEqual(d["id"], 0)
        self.assertEqual(d["value"], VDouble)
 def setUp(self):
     self.jp = JsonPresenter()