def setUp(self):
        self.enable_pin = 1
        self.input1_pin = 2
        self.input2_pin = 3

        Motor.__gpio_module__.reset_mock()
        self.motor = Motor(self.enable_pin, self.input1_pin, self.input2_pin)
 def test_colud_calibrate_backward(self):
     self.motor = Motor(None, None, None, correction=0.5)
     self.motor.backward(100)
     self.motor.enable.ChangeDutyCycle.assert_called_with(50)
class TestMotor(unittest.TestCase):

    """Tests for class Motor."""

    def setUp(self):
        self.enable_pin = 1
        self.input1_pin = 2
        self.input2_pin = 3

        Motor.__gpio_module__.reset_mock()
        self.motor = Motor(self.enable_pin, self.input1_pin, self.input2_pin)

    def test_init(self):
        self.assertEqual(self.motor.__gpio_module__, self.motor.gpio)
        self.assertEqual(self.motor.enable_pin, self.enable_pin)
        self.assertEqual(self.motor.input1_pin, self.input1_pin)
        self.assertEqual(self.motor.input2_pin, self.input2_pin)

        self.assertEqual(self.motor.gpio.setup.call_count, 3)
        self.assertTrue(self.motor.gpio.PWM.called)
        self.assertTrue(self.motor.enable.start.called)

    def test_forward(self):
        self.motor.forward(100)
        self.motor.gpio.output.assert_any_call(self.input1_pin, 1)
        self.motor.gpio.output.assert_any_call(self.input2_pin, 0)
        self.assertTrue(self.motor.enable.ChangeDutyCycle.called)

    def test_forward_without_speed(self):
        with self.assertRaises(TypeError):
            self.motor.forward()

    def test_forward_max_speed(self):
        self.motor.forward(100)
        self.motor.enable.ChangeDutyCycle.assert_called_with(100)

    def test_forward_min_speed(self):
        self.motor.forward(0)
        self.motor.enable.ChangeDutyCycle.assert_called_with(0)

    def test_forward_speed_out_of_bounds(self):
        speeds = (-1, 200, 101)
        for speed in speeds:
            with self.assertRaises(TypeError):
                self.motor.forward(speed)

    def test_backward(self):
        self.motor.backward(100)
        self.motor.gpio.output.assert_any_call(self.input1_pin, 0)
        self.motor.gpio.output.assert_any_call(self.input2_pin, 1)
        self.assertTrue(self.motor.enable.ChangeDutyCycle.called)

    def test_backward_without_speed(self):
        with self.assertRaises(TypeError):
            self.motor.backward()

    def test_backward_max_speed(self):
        self.motor.backward(100)
        self.motor.enable.ChangeDutyCycle.assert_called_with(100)

    def test_backward_min_speed(self):
        self.motor.backward(0)
        self.motor.enable.ChangeDutyCycle.assert_called_with(0)

    def test_backward_speed_out_of_bounds(self):
        speeds = (-1, 200, 101)
        for speed in speeds:
            with self.assertRaises(TypeError):
                self.motor.backward(speed)

    def test_stop(self):
        self.motor.stop()
        self.motor.enable.ChangeDutyCycle.assert_called_with(0)

    def test_colud_calibrate_forward(self):
        self.motor = Motor(None, None, None, correction=0.5)
        self.motor.forward(100)
        self.motor.enable.ChangeDutyCycle.assert_called_with(50)

    def test_colud_calibrate_backward(self):
        self.motor = Motor(None, None, None, correction=0.5)
        self.motor.backward(100)
        self.motor.enable.ChangeDutyCycle.assert_called_with(50)