def setup(self, local_world_map_service_mock, movement_executor_mock, microcontroller_driver_mock):
     self._microcontroller_driver_mock_instance = microcontroller_driver_mock.return_value
     self._local_world_map_service_mock_instance = local_world_map_service_mock.return_value
     self._local_world_map_service_mock_instance.wait_for_detection.return_value.treasures = [
         Treasure(self.SAMPLE_TREASURE_LOCATION)
     ]
     self._local_world_map_service_mock_instance.wait_for_detection.return_value.gripper = Gripper(
         self.SAMPLE_GRIPPER_LOCATION
     )
     self._movement_executor_mock_instance = movement_executor_mock.return_value
     self._treasure_handling_service = TreasureHandlingService(
         self._microcontroller_driver_mock_instance,
         self._local_world_map_service_mock_instance,
         self._movement_executor_mock_instance,
     )
class TestTreasureHandlingService(object):

    SAMPLE_TREASURE_LOCATION = Vector2(5, 0)
    SAMPLE_GRIPPER_LOCATION = Vector2(0, 0)

    @mock.patch("drivers.microcontroller_driver.MicrocontrollerDriver.MicrocontrollerDriver", autospec=False)
    @mock.patch("services.motion.MovementExecutor.MovementExecutor", autospec=False)
    @mock.patch("services.virtual_mapping.LocalWorldMapService.LocalWorldMapService", autospec=False)
    def setup(self, local_world_map_service_mock, movement_executor_mock, microcontroller_driver_mock):
        self._microcontroller_driver_mock_instance = microcontroller_driver_mock.return_value
        self._local_world_map_service_mock_instance = local_world_map_service_mock.return_value
        self._local_world_map_service_mock_instance.wait_for_detection.return_value.treasures = [
            Treasure(self.SAMPLE_TREASURE_LOCATION)
        ]
        self._local_world_map_service_mock_instance.wait_for_detection.return_value.gripper = Gripper(
            self.SAMPLE_GRIPPER_LOCATION
        )
        self._movement_executor_mock_instance = movement_executor_mock.return_value
        self._treasure_handling_service = TreasureHandlingService(
            self._microcontroller_driver_mock_instance,
            self._local_world_map_service_mock_instance,
            self._movement_executor_mock_instance,
        )

    def test_when_dropping_gripper_then_gripper_is_dropped(self):
        self._treasure_handling_service.treasure_drop()
        self._microcontroller_driver_mock_instance.treasure_drop.assert_called_with()

    def test_when_resetting_gripper_then_gripper_is_reset(self):
        self._treasure_handling_service.reset_gripper()
        self._microcontroller_driver_mock_instance.treasure_reset.assert_called_with()

    def test_when_picking_up_treasure_then_treasure_is_picked_up(self):
        self._treasure_handling_service.treasure_pickup(auto_align=False, verify_result=False)
        self._microcontroller_driver_mock_instance.treasure_pickup.assert_called_with()

    def test_given_successful_treasure_pickup_when_picking_up_treasure_with_verification_enabled_then_treasure_is_picked_up_once(
        self
    ):
        self._local_world_map_service_mock_instance.wait_for_detection.return_value = True
        self._treasure_handling_service.treasure_pickup(auto_align=False, verify_result=True)
        self._microcontroller_driver_mock_instance.treasure_pickup.assert_called_once_with()

    def test_given_unsuccessful_treasure_pickup_when_picking_up_treasure_with_verification_enabled_then_treasure_is_picked_up_twice(
        self
    ):
        self._local_world_map_service_mock_instance.wait_for_detection.side_effect = [TimeoutError, True]
        self._treasure_handling_service.treasure_pickup(auto_align=False, verify_result=True)
        self._microcontroller_driver_mock_instance.assert_has_calls(
            self._microcontroller_driver_mock_instance.treasure_pickup,
            self._microcontroller_driver_mock_instance.treasure_pickup,
        )

    def test_given_successful_treasure_detection_when_picking_up_treasure_with_auto_align_enabled_then_alignment_is_made(
        self
    ):
        self._treasure_handling_service.treasure_pickup(auto_align=True, verify_result=False)
        assert_true(self._movement_executor_mock_instance.move_to.call_count == 3)