#############################################################################
# Copyright (c) 2002-2021 MBARI
# Monterey Bay Aquarium Research Institute, all rights reserved.
#############################################################################
import unittest

from LCM.HandlerBase import LcmHandlerBase
from LCM.TethysLcmTypes.LrauvLcmMessage import LrauvLcmMessage
from test.TestUtils import *


class HandlerBaseTestCase(unittest.TestCase):

    def test_decode(self):
        from LCM.HandlerBase import LcmHandlerBase
        handle_base = LcmHandlerBase()
        msg = gen_dummy_msg()
        enc_msg = msg.encode()

        dec_msg = handle_base.decode(enc_msg)

        self.assertEqual(dec_msg.seqNo, msg.seqNo)
        self.assertEqual(dec_msg.epochMillisec, msg.epochMillisec)
        self.assertEqual(dec_msg.nByteArrays, msg.nByteArrays)
        self.assertEqual(dec_msg.nIntArrays, msg.nIntArrays)
        self.assertEqual(dec_msg.nFloatArrays, msg.nFloatArrays)
        self.assertEqual(dec_msg.nDoubleArrays, msg.nDoubleArrays)
        self.assertEqual(dec_msg.nStringArrays, msg.nStringArrays)

    def test_get_timestamp_sec(self):
        handle_base = LcmHandlerBase()
        msg = gen_dummy_msg()
        enc_msg = msg.encode()

        dec_msg = handle_base.decode(enc_msg)
        self.assertEqual(handle_base.get_timestamp_sec(dec_msg), msg.epochMillisec / 1000)

    def test_get_item_names(self):
        handle_base = LcmHandlerBase()
        msg = gen_dummy_msg()
        enc_msg = msg.encode()

        dec_msg = handle_base.decode(enc_msg)
        msg_names = handle_base.get_item_names(dec_msg)

        for name in names:
            self.assertEqual(name in msg_names, True)

    def test_get_item_names_empty(self):
        handle_base = LcmHandlerBase()
        msg = LrauvLcmMessage()

        msg_names = handle_base.get_item_names(msg)
        for name in names:
            self.assertEqual(name in msg_names, False)

    def test_get_variable(self):
        handle_base = LcmHandlerBase()
        msg = gen_dummy_msg()
        enc_msg = msg.encode()

        dec_msg = handle_base.decode(enc_msg)

        for name in names:
            array = handle_base.get_variable(name, dec_msg)
            self.assertEqual(array.name, name)

    def test_get_variable_empty(self):
        handle_base = LcmHandlerBase()
        msg = LrauvLcmMessage()

        for name in names:
            array = handle_base.get_variable(name, msg)
            self.assertEqual(array, False)

    def test_get_byte(self):
        handle_base = LcmHandlerBase()
        msg = gen_dummy_msg()
        enc_msg = msg.encode()

        dec_msg = handle_base.decode(enc_msg)

        name = 'byte'
        array = handle_base.get_byte_array(name, dec_msg)
        self.assertEqual(array.name, name)

        name = 'foo'
        array = handle_base.get_string_array(name, dec_msg)
        self.assertEqual(array, False)

    def test_get_double(self):
        handle_base = LcmHandlerBase()
        msg = gen_dummy_msg()
        enc_msg = msg.encode()

        dec_msg = handle_base.decode(enc_msg)

        name = 'double'
        array = handle_base.get_double_array(name, dec_msg)
        self.assertEqual(array.name, name)

        name = 'foo'
        array = handle_base.get_double_array(name, dec_msg)
        self.assertEqual(array, False)

    def test_get_int(self):
        handle_base = LcmHandlerBase()
        msg = gen_dummy_msg()
        enc_msg = msg.encode()

        dec_msg = handle_base.decode(enc_msg)

        name = 'int'
        array = handle_base.get_int_array(name, dec_msg)
        self.assertEqual(array.name, name)

        name = 'foo'
        array = handle_base.get_int_array(name, dec_msg)
        self.assertEqual(array, False)


if __name__ == '__main__':
    unittest.main()
