import unittest
from PyRep.pyrep.errors import PyRepError
from PyRep.tests.core import TestCore
from PyRep.pyrep.misc.distance import Distance
from PyRep.pyrep.misc.signals import IntegerSignal, FloatSignal
from PyRep.pyrep.misc.signals import DoubleSignal, StringSignal


# TODO: These tests will be re-enabled once bug has been fixed in CoppeliaSim.
class TestMisc(TestCore):
    pass

    # def test_get_distance(self):
        # Distance('dist_cubes')

    # def test_read_distance(self):
        # d = Distance('dist_cubes')
        # dist = d.read()
        # self.assertAlmostEqual(dist, 0.1, places=3)

    # def test_read_distance_not_measurable(self):
        # d = Distance('dist_cubes_fail')
        # with self.assertRaises(PyRepError):
        #     d.read()


class TestSignal(TestCore):

    SIGNALS = [
        (IntegerSignal, 99),
        (FloatSignal, 55.3),
        (DoubleSignal, 22.2),
        (StringSignal, 'hello')
    ]

    def test_set_get_clear_signals(self):
        for signal_class, test_value in TestSignal.SIGNALS:
            with self.subTest(signal=str(signal_class)):
                sig = signal_class('my_signal')
                sig.set(test_value)
                ret_value = sig.get()
                if isinstance(test_value, float):
                    self.assertAlmostEqual(ret_value, test_value, places=3)
                else:
                    self.assertEqual(ret_value, test_value)
                clears = sig.clear()
                self.assertEqual(clears, 1)

    def test_get_signal_fails_when_empty(self):
        for signal_class, test_value in TestSignal.SIGNALS:
            with self.subTest(signal=str(signal_class)):
                sig = signal_class('my_signal')
                with self.assertRaises(PyRepError):
                    sig.get()


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