from multiprocessing import Process
import unittest
import os
import pty
from ui.driver.driver_pi import Pi
import ui.driver.comms_codes as comms


class TestDriverPi(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        master, slave = pty.openpty()
        s_name = os.ttyname(slave)
        cls._master = master
        cls._driver = Process(target=Pi, args=(s_name,))
        cls._driver.start()

    def get_message(self, msglen=1):
        message = os.read(self._master, msglen)
        return message

    def send_message(self, msg):
        os.write(self._master, msg)

    def test_rxtx_data(self):
        # receive the get chars message
        FRAME_BOUNDARY = 0x7E

        self.assertEqual(self.get_message(5), bytes([
            FRAME_BOUNDARY,
            comms.CMD_GET_CHARS,
            0x78, 0xF0,  # CRC LSB, MSB
            FRAME_BOUNDARY
        ]))

        # send chars (can pretend to be any size we like)
        # [data bytearray], cmd
        self.send_message(bytes([
            FRAME_BOUNDARY,
            comms.CMD_GET_CHARS,
            24, 0,       # num cols LSB, MSB
            0x9D, 0x9D,  # CRC LSB, MSB
            FRAME_BOUNDARY
        ]))

        # receive the get rows message
        self.assertEqual(self.get_message(5), bytes([
            FRAME_BOUNDARY,
            comms.CMD_GET_ROWS,
            0xF1, 0xE1,  # CRC LSB, MSB
            FRAME_BOUNDARY
        ]))

        # send rows
        self.send_message(bytes([
            FRAME_BOUNDARY,
            comms.CMD_GET_ROWS,
            4, 0,        # num rows LSB, MSB
            0x70, 0xFB,  # CRC LSB, MSB
            FRAME_BOUNDARY
        ]))

    @classmethod
    def tearDownClass(cls):
        cls._driver.join()
