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)