import time
import unittest
import builtins
from steamvr import SensorcheckThread, ImuThread, SensorcheckResult, ImuResult
from steamvr.unbuffered.lighthouse import LighthouseProcess, LhProcess, static_vars
from unittest.mock import Mock

def on_sensorcheck_cb(result: SensorcheckResult):
    print(result.timestamp, result.seen_sensor_count())
def on_imu_cb(result: ImuResult):
    print(result.host_timestamp, result.accel)


class TestLighthouseUnbuffered(unittest.TestCase):


    def test_run_stop(self):
        process = LighthouseProcess(LhProcess.SENSORCHECK)
        process.run()
        process.stop()

    def test_sensorcheck_connected(self):
        cb = Mock()
        t = SensorcheckThread(cb, lambda x: print("Device Connected", x),
              lambda: print("Device Disconnected"),
              lambda e: print(e))
        t.start()
        time.sleep(5)
        cb.assert_called()
        t.process.stop()

    def test_Imu_connected(self):
        cb = Mock()
        t = ImuThread(cb, lambda e: print(e))
        t.start()
        time.sleep(5)
        t.process.stop()

    def test_disconnect(self):
        SensorcheckThread(on_sensorcheck_cb, lambda: print("Device Disconnected"),
            lambda: print("Device Connected"),
            lambda e: print(e)).start()

    def test_both(self):
        cb = Mock()
        t = SensorcheckThread(cb, lambda x: print("Device Connected", x),
                          lambda: print("Device Disconnected"),
                          lambda e: print(e)).start()
        imu_cb = Mock()
        ImuThread(on_imu_cb, lambda e: print(e)).start()
        time.sleep(5)
        cb.assert_called()
        imu_cb.assert_called()

