def test_reset_removed_button_and_analog_handlers_and_clears_stored_data(
            self):
        mock = Mock()
        rc = RemoteController()
        rc.tick(RemoteControllerCommand(buttons=[False] * 32, analog=[]))

        rc.on_analog_values([2, 4], mock)
        rc.on_analog_values([3], mock)

        rc.on_button_pressed(5, mock)

        rc.tick(
            RemoteControllerCommand(
                buttons=[True] * 32,
                analog=[255, 254, 253, 123, 43, 65, 45, 42]))

        self.assertEqual(3, mock.call_count)
        self.assertEqual(254, rc.analog_value(1))
        self.assertTrue(rc.is_button_pressed(1))

        mock.reset_mock()

        rc.reset()

        self.assertEqual(0, rc.analog_value(1))
        self.assertFalse(rc.is_button_pressed(1))

        rc.tick(
            RemoteControllerCommand(
                buttons=[True] * 32,
                analog=[255, 254, 253, 123, 43, 65, 45, 42]))

        self.assertEqual(0, mock.call_count)
    def test_remote_controller_buttons_need_initial_zero_state(self):
        mock = Mock()
        rc = RemoteController()

        rc.on_button_pressed(5, mock)

        rc.tick(RemoteControllerCommand(buttons=[True] * 32, analog=[]))

        self.assertEqual(0, mock.call_count)
        self.assertFalse(rc.is_button_pressed(1))

        rc.tick(RemoteControllerCommand(buttons=[False] * 32, analog=[]))
        rc.tick(RemoteControllerCommand(buttons=[True] * 32, analog=[]))

        self.assertEqual(1, mock.call_count)
        self.assertTrue(rc.is_button_pressed(1))

        rc.tick(RemoteControllerCommand(buttons=[False] * 32, analog=[]))
        mock.reset_mock()
        rc.reset()

        rc.tick(RemoteControllerCommand(buttons=[True] * 32, analog=[]))
        rc.tick(RemoteControllerCommand(buttons=[True] * 32, analog=[]))

        self.assertEqual(0, mock.call_count)
        self.assertFalse(rc.is_button_pressed(1))
    def test_last_button_pressed_state_can_be_read(self):
        rc = RemoteController()
        rc.tick(RemoteControllerCommand(buttons=[False] * 32, analog=[0] * 10))

        for i in range(32):
            buttons = [False] * 32
            # ith button is pressed
            buttons[i] = True

            rc.tick(RemoteControllerCommand(buttons=buttons, analog=[0] * 10))

            for j in range(32):
                self.assertEqual(buttons[i], rc.is_button_pressed(i))