def setUp(self):
     red_pin = 1
     green_pin = 2
     blue_pin = 3
     self.led = Led(red_pin, green_pin, blue_pin)
     self.led.gpio.reset_mock()
class TestLed(unittest.TestCase):

    def setUp(self):
        red_pin = 1
        green_pin = 2
        blue_pin = 3
        self.led = Led(red_pin, green_pin, blue_pin)
        self.led.gpio.reset_mock()

    def test_on(self):
        self.led.on()
        self.assertEqual(self.led.red.ChangeDutyCycle.call_count, 3)
        self.assertTrue(self.led.red.called_with(self.led.reverse(self.led.color[0])))
        self.assertTrue(self.led.green.called_with(self.led.reverse(self.led.color[1])))
        self.assertTrue(self.led.blue.called_with(self.led.reverse(self.led.color[2])))

    def test_set_color(self):
        color = (1, 2, 3)
        self.led.set_color(color)
        self.assertEqual(self.led.color, color)

    def test_off(self):
        self.led.off()
        self.assertEqual(self.led.red.ChangeDutyCycle.call_count, 3)
        self.assertTrue(self.led.red.called_with(self.led.reverse(0)))

    def test_reverse(self):
        self.assertEqual(self.led.reverse(0), 255)

    def test_init(self):
        red_pin = 1
        green_pin = 2
        blue_pin = 3
        led = Led(red_pin, green_pin, blue_pin)
        self.assertEqual(led.__gpio_module__, led.gpio)

        self.assertEqual(led.red_pin, red_pin)
        self.assertEqual(led.green_pin, green_pin)
        self.assertEqual(led.blue_pin, blue_pin)

        self.assertEqual(led.gpio.setup.call_count, 3)
        self.assertEqual(led.gpio.PWM.call_count, 3)

        self.assertTrue(led.red.start.called)
        self.assertTrue(led.green.start.called)
        self.assertTrue(led.blue.start.called)

    def test_prepare_data(self):
        data = ((255, 100), (0, 0), (127, 50))
        for i, j in data:
            self.assertEqual(self.led.prepare_data(i), j)

    def test_val_to_gpio(self):
        color = (127, 127, 127)
        self.led.set_color(color)
        self.led.on()
        self.led.red.ChangeDutyCycle.assert_called_with(50)


    def test_stop_on_del(self):
        red = self.led.red
        del(self.led)
        self.assertEqual(red.stop.call_count, 3)