From 4d9781a6fb26c46e7a5774a00a1e768765884881 Mon Sep 17 00:00:00 2001 From: Yann Locatelli Date: Thu, 21 Dec 2023 13:09:21 +0100 Subject: [PATCH] :fire: (RC): Remove UT based on StateMachine --- libs/RobotKit/CMakeLists.txt | 8 - ...troller_test_stateAutonomousActivities.cpp | 287 ----------- .../RobotController_test_stateCharging.cpp | 482 ------------------ ...RobotController_test_stateDisconnected.cpp | 2 - ...tController_test_stateEmergencyStopped.cpp | 252 --------- ...RobotController_test_stateFileExchange.cpp | 282 ---------- .../tests/RobotController_test_stateIdle.cpp | 202 -------- .../tests/RobotController_test_stateSetup.cpp | 25 - .../RobotController_test_stateSleeping.cpp | 199 -------- .../RobotController_test_stateWorking.cpp | 184 ------- 10 files changed, 1923 deletions(-) delete mode 100644 libs/RobotKit/tests/RobotController_test_stateAutonomousActivities.cpp delete mode 100644 libs/RobotKit/tests/RobotController_test_stateCharging.cpp delete mode 100644 libs/RobotKit/tests/RobotController_test_stateEmergencyStopped.cpp delete mode 100644 libs/RobotKit/tests/RobotController_test_stateFileExchange.cpp delete mode 100644 libs/RobotKit/tests/RobotController_test_stateIdle.cpp delete mode 100644 libs/RobotKit/tests/RobotController_test_stateSetup.cpp delete mode 100644 libs/RobotKit/tests/RobotController_test_stateSleeping.cpp delete mode 100644 libs/RobotKit/tests/RobotController_test_stateWorking.cpp diff --git a/libs/RobotKit/CMakeLists.txt b/libs/RobotKit/CMakeLists.txt index 007a52b1f9..bfc5f892df 100644 --- a/libs/RobotKit/CMakeLists.txt +++ b/libs/RobotKit/CMakeLists.txt @@ -42,16 +42,8 @@ if(${CMAKE_PROJECT_NAME} STREQUAL "LekaOSUnitTests") leka_unit_tests_sources( tests/RobotController_test_initializeComponents.cpp tests/RobotController_test_registerEvents.cpp - tests/RobotController_test_stateSetup.cpp - tests/RobotController_test_stateIdle.cpp - tests/RobotController_test_stateSleeping.cpp - tests/RobotController_test_stateCharging.cpp tests/RobotController_test_stateConnected.cpp tests/RobotController_test_stateDisconnected.cpp - tests/RobotController_test_stateWorking.cpp - tests/RobotController_test_stateEmergencyStopped.cpp - tests/RobotController_test_stateAutonomousActivities.cpp - tests/RobotController_test_stateFileExchange.cpp ) endif() endif() diff --git a/libs/RobotKit/tests/RobotController_test_stateAutonomousActivities.cpp b/libs/RobotKit/tests/RobotController_test_stateAutonomousActivities.cpp deleted file mode 100644 index 8911b0a5b3..0000000000 --- a/libs/RobotKit/tests/RobotController_test_stateAutonomousActivities.cpp +++ /dev/null @@ -1,287 +0,0 @@ -// Leka - LekaOS -// Copyright 2022 APF France handicap -// SPDX-License-Identifier: Apache-2.0 - -#include "./RobotController_test.h" - -TEST_F(RobotControllerTest, stateAutonomousActivityConnectedEventCommandReceived) -{ - rc.state_machine.set_current_states(lksm::state::autonomous_activities, lksm::state::connected); - - Sequence on_autonomous_activity_exit_sequence; - EXPECT_CALL(timeout_autonomous_activities, stop).InSequence(on_autonomous_activity_exit_sequence); - EXPECT_CALL(mock_videokit, stopVideo).InSequence(on_autonomous_activity_exit_sequence); - EXPECT_CALL(mock_motor_left, stop).InSequence(on_autonomous_activity_exit_sequence); - EXPECT_CALL(mock_motor_right, stop).InSequence(on_autonomous_activity_exit_sequence); - - Sequence on_working_entry_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(on_working_entry_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(on_working_entry_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(on_working_entry_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(on_working_entry_sequence); - - rc.state_machine.process_event(lksm::event::command_received {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::working, lksm::state::connected)); -} - -TEST_F(RobotControllerTest, stateAutonomousActivityDisconnectedEventCommandReceived) -{ - rc.state_machine.set_current_states(lksm::state::autonomous_activities, lksm::state::disconnected); - - rc.state_machine.process_event(lksm::event::command_received {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::autonomous_activities, lksm::state::disconnected)); -} - -TEST_F(RobotControllerTest, stateAutonomousActivityEventBleConnection) -{ - rc.state_machine.set_current_states(lksm::state::autonomous_activities, lksm::state::disconnected); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(false)); - - EXPECT_CALL(timeout_autonomous_activities, stop); - expectedCallsStopActuators(); - Sequence on_ble_connection_sequence; - EXPECT_CALL(mock_ledkit, start(isSameAnimation(&led::animation::ble_connection))) - .Times(1) - .InSequence(on_ble_connection_sequence); - EXPECT_CALL(mock_videokit, playVideoOnce).Times(1).InSequence(on_ble_connection_sequence); - - Sequence on_working_entry_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(on_working_entry_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(on_working_entry_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(on_working_entry_sequence); - EXPECT_CALL(mock_lcd, turnOn).Times(2).InSequence(on_working_entry_sequence); - - rc.state_machine.process_event(lksm::event::ble_connection {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::working, lksm::state::connected)); -} - -TEST_F(RobotControllerTest, stateAutonomousActivityEventChargeDidStartGuardIsChargingTrue) -{ - rc.state_machine.set_current_states(lksm::state::autonomous_activities); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(true)); - - Sequence on_autonomous_activity_exit_sequence; - EXPECT_CALL(timeout_autonomous_activities, stop).InSequence(on_autonomous_activity_exit_sequence); - EXPECT_CALL(mock_videokit, stopVideo).InSequence(on_autonomous_activity_exit_sequence); - EXPECT_CALL(mock_motor_left, stop).InSequence(on_autonomous_activity_exit_sequence); - EXPECT_CALL(mock_motor_right, stop).InSequence(on_autonomous_activity_exit_sequence); - - Sequence start_deep_sleep_timeout_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(start_deep_sleep_timeout_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(start_deep_sleep_timeout_sequence); - - Sequence start_charging_behavior_sequence; - EXPECT_CALL(battery, level).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_ledkit, start).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, onTimeout).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, start).InSequence(start_charging_behavior_sequence); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AtLeast(1)); - - on_charge_did_start(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} - -TEST_F(RobotControllerTest, stateAutonomousActivityEventChargeDidStartGuardIsChargingFalse) -{ - rc.state_machine.set_current_states(lksm::state::autonomous_activities); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(false)); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)); - - on_charge_did_start(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::autonomous_activities)); -} - -TEST_F(RobotControllerTest, stateAutonomousActivityStartActivity) -{ - rc.state_machine.set_current_states(lksm::state::autonomous_activities); - - auto set_activitykit_is_playing = [this] { - const std::unordered_map activities {{MagicCard::number_10, &display_tag}}; - activitykit.registerActivities(activities); - EXPECT_CALL(mock_videokit, displayImage).Times(1); - activitykit.start(MagicCard::number_10); - }; - set_activitykit_is_playing(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::autonomous_activities)); -} - -TEST_F(RobotControllerTest, stateAutonomousActivityStartActivityActivityAlreadyStarted) -{ - rc.state_machine.set_current_states(lksm::state::autonomous_activities); - - auto set_activitykit_is_playing = [this] { - const std::unordered_map activities {{MagicCard::number_10, &display_tag}}; - activitykit.registerActivities(activities); - EXPECT_CALL(mock_videokit, displayImage).Times(1); - activitykit.start(MagicCard::number_10); - }; - set_activitykit_is_playing(); - - expectedCallsResetAutonomousActivitiesTimeout(); - EXPECT_CALL(mock_videokit, displayImage).Times(0); - - rc.onMagicCardAvailable(MagicCard::number_10); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::autonomous_activities)); -} - -TEST_F(RobotControllerTest, stateAutonomousActivityActivityStartedBackToMenuDelayNotOver) -{ - rc.state_machine.set_current_states(lksm::state::autonomous_activities); - - auto maximal_delay_before_over = 1s; - - auto set_activitykit_is_playing = [this] { - const std::unordered_map activities {{MagicCard::number_10, &display_tag}}; - activitykit.registerActivities(activities); - EXPECT_CALL(mock_videokit, displayImage).Times(1); - activitykit.start(MagicCard::number_10); - }; - set_activitykit_is_playing(); - - expectedCallsResetAutonomousActivitiesTimeout(); - EXPECT_CALL(mock_videokit, displayImage).Times(0); - - spy_kernel_addElapsedTimeToTickCount(maximal_delay_before_over); - rc.onMagicCardAvailable(MagicCard::dice_roll); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::autonomous_activities)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, stateAutonomousActivityActivityStartedBackToMenu) -{ - auto minimal_delay_over = 1001ms; - - rc.state_machine.set_current_states(lksm::state::autonomous_activities); - - auto set_activitykit_is_playing = [this] { - const std::unordered_map activities {{MagicCard::number_10, &display_tag}}; - activitykit.registerActivities(activities); - EXPECT_CALL(mock_videokit, displayImage).Times(1); - activitykit.start(MagicCard::number_10); - }; - set_activitykit_is_playing(); - - EXPECT_CALL(timeout_autonomous_activities, stop); - EXPECT_CALL(mock_videokit, stopVideo); - expectedCallsStopMotors(); - - expectedCallsResetAutonomousActivitiesTimeout(); - EXPECT_CALL(mock_videokit, displayImage).Times(1); - - spy_kernel_addElapsedTimeToTickCount(minimal_delay_over); - rc.onMagicCardAvailable(MagicCard::dice_roll); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::autonomous_activities)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, stateAutonomousActivityDiceRollDetectedDelayNotOver) -{ - rc.state_machine.set_current_states(lksm::state::autonomous_activities); - - auto maximal_delay_before_over = 2s; - - EXPECT_CALL(mock_videokit, stopVideo).Times(0); - EXPECT_CALL(mock_motor_left, stop).Times(0); - EXPECT_CALL(mock_motor_right, stop).Times(0); - EXPECT_CALL(mock_videokit, displayImage).Times(0); - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(maximal_delay_before_over); - rc.onMagicCardAvailable(MagicCard::dice_roll); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::autonomous_activities)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, stateAutonomousActivityDiceRollDetectedDelayOverEventAutonomousActivityExitedDisconnected) -{ - rc.state_machine.set_current_states(lksm::state::autonomous_activities, lksm::state::disconnected); - - auto minimal_delay_over = 2001ms; - - EXPECT_CALL(timeout_autonomous_activities, stop).Times(AtLeast(1)); - EXPECT_CALL(mock_videokit, stopVideo).Times(AtLeast(1)); - EXPECT_CALL(mock_motor_left, stop).Times(AtLeast(1)); - EXPECT_CALL(mock_motor_right, stop).Times(AtLeast(1)); - - Sequence on_idle_entry_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(on_idle_entry_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(on_idle_entry_sequence); - EXPECT_CALL(mock_videokit, playVideoOnRepeat).InSequence(on_idle_entry_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(on_idle_entry_sequence); - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(minimal_delay_over); - rc.onMagicCardAvailable(MagicCard::dice_roll); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::idle)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, stateAutonomousActivityDiceRollDetectedDelayOverEventAutonomousActivityExitedConnected) -{ - rc.state_machine.set_current_states(lksm::state::autonomous_activities, lksm::state::connected); - - auto minimal_delay_over = 2001ms; - - EXPECT_CALL(timeout_autonomous_activities, stop).Times(AtLeast(1)); - EXPECT_CALL(mock_videokit, stopVideo).Times(AtLeast(1)); - EXPECT_CALL(mock_motor_left, stop).Times(AtLeast(1)); - EXPECT_CALL(mock_motor_right, stop).Times(AtLeast(1)); - - Sequence on_working_entry_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(on_working_entry_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(on_working_entry_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(on_working_entry_sequence); - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(minimal_delay_over); - rc.onMagicCardAvailable(MagicCard::dice_roll); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::working)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, stateAutonomousActivityDisconnectedEventAutonomousActivityExitedFromTimeout) -{ - expectedCallsResetAutonomousActivitiesTimeout(); - rc.resetAutonomousActivitiesTimeout(); // To register callback in on_autonomous_activities_timeout - - rc.state_machine.set_current_states(lksm::state::autonomous_activities, lksm::state::disconnected); - - EXPECT_CALL(timeout_autonomous_activities, stop).Times(AtLeast(1)); - EXPECT_CALL(mock_videokit, stopVideo).Times(AtLeast(1)); - EXPECT_CALL(mock_motor_left, stop).Times(AtLeast(1)); - EXPECT_CALL(mock_motor_right, stop).Times(AtLeast(1)); - - Sequence on_idle_entry_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(on_idle_entry_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(on_idle_entry_sequence); - EXPECT_CALL(mock_videokit, playVideoOnRepeat).InSequence(on_idle_entry_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(on_idle_entry_sequence); - - on_autonomous_activities_timeout(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::idle)); -} diff --git a/libs/RobotKit/tests/RobotController_test_stateCharging.cpp b/libs/RobotKit/tests/RobotController_test_stateCharging.cpp deleted file mode 100644 index 7683debc89..0000000000 --- a/libs/RobotKit/tests/RobotController_test_stateCharging.cpp +++ /dev/null @@ -1,482 +0,0 @@ -// Leka - LekaOS -// Copyright 2022 APF France handicap -// SPDX-License-Identifier: Apache-2.0 - -#include "./RobotController_test.h" - -TEST_F(RobotControllerTest, onChargingStartTimeout) -{ - EXPECT_CALL(battery, level); - EXPECT_CALL(mock_videokit, displayImage); - EXPECT_CALL(mock_ledkit, start); - EXPECT_CALL(mock_lcd, turnOn).Times(AnyNumber()); - EXPECT_CALL(timeout_state_internal, onTimeout) - .WillOnce(GetCallback(&on_charging_start_timeout)); - EXPECT_CALL(timeout_state_internal, start).Times(AnyNumber()); - rc.startChargingBehavior(); - - EXPECT_CALL(mock_lcd, turnOff); - on_charging_start_timeout(); -} - -TEST_F(RobotControllerTest, stateChargingEventChargeDidStopGuardIsChargingTrue) -{ - rc.state_machine.set_current_states(lksm::state::charging); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(true)); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AtLeast(1)); - - on_charge_did_stop(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} - -TEST_F(RobotControllerTest, stateChargingConnectedEventChargeDidStopGuardIsChargingFalse) -{ - rc.state_machine.set_current_states(lksm::state::charging, lksm::state::connected); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(false)); - - Sequence on_charging_exit_sequence; - EXPECT_CALL(timeout_state_transition, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(timeout_state_internal, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(mock_ledkit, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(mock_videokit, stopVideo).Times(1).InSequence(on_charging_exit_sequence); - expectedCallsStopMotors(); - - Sequence on_working_entry_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(on_working_entry_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(on_working_entry_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(on_working_entry_sequence); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AtLeast(1)); - - on_charge_did_stop(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::working)); -} - -TEST_F(RobotControllerTest, stateChargingDisconnectedEventChargeDidStopGuardIsChargingFalse) -{ - rc.state_machine.set_current_states(lksm::state::charging, lksm::state::disconnected); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(false)); - - Sequence on_charging_exit_sequence; - EXPECT_CALL(timeout_state_transition, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(timeout_state_internal, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(mock_ledkit, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(mock_videokit, stopVideo).Times(1).InSequence(on_charging_exit_sequence); - expectedCallsStopMotors(); - - Sequence on_idle_entry_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(on_idle_entry_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(on_idle_entry_sequence); - EXPECT_CALL(mock_videokit, playVideoOnRepeat).InSequence(on_idle_entry_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(on_idle_entry_sequence); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)); - - on_charge_did_stop(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::idle)); -} - -TEST_F(RobotControllerTest, stateChargingDisconnectedEventBleConnection) -{ - rc.state_machine.set_current_states(lksm::state::charging, lksm::state::disconnected); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(true)); - - Sequence on_charging_exit_sequence; - EXPECT_CALL(timeout_state_transition, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(timeout_state_internal, stop).Times(1).InSequence(on_charging_exit_sequence); - - expectedCallsStopActuators(); - Sequence on_ble_connection_sequence; - EXPECT_CALL(mock_ledkit, start(isSameAnimation(&led::animation::ble_connection))) - .Times(1) - .InSequence(on_ble_connection_sequence); - EXPECT_CALL(mock_videokit, playVideoOnce).Times(0).InSequence(on_ble_connection_sequence); - EXPECT_CALL(mock_lcd, turnOn).Times(0).InSequence(on_ble_connection_sequence); - EXPECT_CALL(mock_ledkit, start(isSameAnimation(&led::animation::blink_on_charge))) - .Times(1) - .InSequence(on_ble_connection_sequence); - - Sequence start_deep_sleep_timeout_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(start_deep_sleep_timeout_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(start_deep_sleep_timeout_sequence); - - Sequence on_charging_entry_sequence; - EXPECT_CALL(battery, level).InSequence(on_charging_entry_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(on_charging_entry_sequence); - EXPECT_CALL(mock_ledkit, start).InSequence(on_charging_entry_sequence); - EXPECT_CALL(mock_lcd, turnOn).Times(AnyNumber()).InSequence(on_charging_entry_sequence); - EXPECT_CALL(timeout_state_internal, onTimeout) - .WillOnce(GetCallback(&on_charging_start_timeout)); - EXPECT_CALL(timeout_state_internal, start).Times(AnyNumber()).InSequence(on_charging_entry_sequence); - - rc.state_machine.process_event(lksm::event::ble_connection {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging, lksm::state::connected)); -} - -TEST_F(RobotControllerTest, stateChargingEventFileExchangeRequestedGuardIsReadyToFileExchangeTrue) -{ - rc.state_machine.set_current_states(lksm::state::charging); - - auto returned_is_charging = true; - auto returned_level = uint8_t {100}; - - // TODO (@yann): Trigger file_exchange_start_requested in StateMachine from BLE and do not use process_event - - Sequence is_ready_to_file_exchange_sequence; - EXPECT_CALL(battery, isCharging) - .InSequence(is_ready_to_file_exchange_sequence) - .WillRepeatedly(Return(returned_is_charging)); - EXPECT_CALL(battery, level).InSequence(is_ready_to_file_exchange_sequence).WillRepeatedly(Return(returned_level)); - - Sequence on_charging_exit_sequence; - EXPECT_CALL(timeout_state_transition, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(timeout_state_internal, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(mock_ledkit, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(mock_videokit, stopVideo).Times(1).InSequence(on_charging_exit_sequence); - expectedCallsStopMotors(); - - Sequence start_file_exchange; - EXPECT_CALL(mock_videokit, displayImage).InSequence(start_file_exchange); - EXPECT_CALL(battery, isCharging).InSequence(start_file_exchange).WillRepeatedly(Return(returned_is_charging)); - EXPECT_CALL(mock_ledkit, start).Times(1).InSequence(start_file_exchange); - EXPECT_CALL(mock_lcd, turnOn).InSequence(start_file_exchange); - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AnyNumber()).InSequence(start_file_exchange); - - rc.state_machine.process_event(lksm::event::file_exchange_start_requested {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::file_exchange)); -} - -TEST_F(RobotControllerTest, - stateChargingEventFileExchangeRequestedGuardIsReadyToFileExchangeTrueChargeStopDuringTransition) -{ - rc.state_machine.set_current_states(lksm::state::charging); - - auto returned_is_charging = true; - auto returned_level = uint8_t {100}; - - // TODO (@yann): Trigger file_exchange_start_requested in StateMachine from BLE and do not use process_event - - Sequence is_ready_to_file_exchange_sequence; - EXPECT_CALL(battery, isCharging) - .InSequence(is_ready_to_file_exchange_sequence) - .WillRepeatedly(Return(returned_is_charging)); - EXPECT_CALL(battery, level).InSequence(is_ready_to_file_exchange_sequence).WillRepeatedly(Return(returned_level)); - - Sequence on_charging_exit_sequence; - EXPECT_CALL(timeout_state_transition, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(timeout_state_internal, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(mock_ledkit, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(mock_videokit, stopVideo).Times(1).InSequence(on_charging_exit_sequence); - expectedCallsStopMotors(); - - returned_is_charging = false; - - Sequence start_file_exchange; - EXPECT_CALL(mock_videokit, displayImage).InSequence(start_file_exchange); - EXPECT_CALL(battery, isCharging).InSequence(start_file_exchange).WillRepeatedly(Return(returned_is_charging)); - EXPECT_CALL(mock_ledkit, start).Times(0).InSequence(start_file_exchange); - EXPECT_CALL(mock_lcd, turnOn).InSequence(start_file_exchange); - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AnyNumber()).InSequence(start_file_exchange); - - rc.state_machine.process_event(lksm::event::file_exchange_start_requested {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::file_exchange)); -} - -TEST_F(RobotControllerTest, stateChargingEventFileExchangeRequestedGuardIsReadyToFileExchangeFalseNotCharging) -{ - rc.state_machine.set_current_states(lksm::state::charging); - - auto returned_is_charging = false; - auto returned_level = uint8_t {100}; - - // TODO (@yann): Trigger file_exchange_start_requested in StateMachine from BLE and do not use process_event - - Sequence is_ready_to_file_exchange_sequence; - EXPECT_CALL(battery, isCharging) - .InSequence(is_ready_to_file_exchange_sequence) - .WillRepeatedly(Return(returned_is_charging)); - EXPECT_CALL(battery, level).InSequence(is_ready_to_file_exchange_sequence).WillRepeatedly(Return(returned_level)); - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).InSequence(is_ready_to_file_exchange_sequence); - - Sequence stop_charging_behavior; - EXPECT_CALL(timeout_state_internal, stop).Times(0).InSequence(stop_charging_behavior); - - rc.state_machine.process_event(lksm::event::file_exchange_start_requested {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} - -TEST_F(RobotControllerTest, - stateChargingEventFileExchangeRequestedGuardIsReadyToFileExchangeFalseBelowMinimalBatteryLevel) -{ - rc.state_machine.set_current_states(lksm::state::charging); - - auto returned_is_charging = true; - auto returned_level = uint8_t {0}; - - // TODO (@yann): Trigger file_exchange_start_requested in StateMachine from BLE and do not use process_event - - Sequence is_ready_to_file_exchange_sequence; - EXPECT_CALL(battery, isCharging) - .InSequence(is_ready_to_file_exchange_sequence) - .WillRepeatedly(Return(returned_is_charging)); - EXPECT_CALL(battery, level).InSequence(is_ready_to_file_exchange_sequence).WillRepeatedly(Return(returned_level)); - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).InSequence(is_ready_to_file_exchange_sequence); - - Sequence stop_charging_behavior; - EXPECT_CALL(timeout_state_internal, stop).Times(0).InSequence(stop_charging_behavior); - - rc.state_machine.process_event(lksm::event::file_exchange_start_requested {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} - -TEST_F(RobotControllerTest, stateChargingEventUpdateRequestedGuardIsReadyToUpdateFalseNotCharging) -{ - rc.state_machine.set_current_states(lksm::state::charging); - - uint8_t returned_level {100}; - - // TODO (@yann): Trigger update_requested in StateMachine from BLE and remove isReadyToUpdate call - EXPECT_CALL(battery, isCharging).WillOnce(Return(false)); - EXPECT_CALL(battery, level).Times(AnyNumber()).WillRepeatedly(Return(returned_level)); - EXPECT_CALL(firmware_update, isVersionAvailable).Times(AnyNumber()).WillRepeatedly(Return(true)); - - EXPECT_CALL(firmware_update, loadFirmware).Times(0); - rc.isReadyToUpdate(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} - -TEST_F(RobotControllerTest, stateChargingEventUpdateRequestedGuardIsReadyToUpdateFalseBelowMinimalBatteryLevel) -{ - rc.state_machine.set_current_states(lksm::state::charging); - - uint8_t returned_level {0}; - - // TODO (@yann): Trigger update_requested in StateMachine from BLE and remove isReadyToUpdate call - EXPECT_CALL(battery, isCharging).Times(AnyNumber()).WillRepeatedly(Return(true)); - EXPECT_CALL(battery, level).WillOnce(Return(returned_level)); - EXPECT_CALL(firmware_update, isVersionAvailable).Times(AnyNumber()).WillRepeatedly(Return(true)); - - EXPECT_CALL(firmware_update, loadFirmware).Times(0); - rc.isReadyToUpdate(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} - -TEST_F(RobotControllerTest, stateChargingEventUpdateRequestedGuardIsReadyToUpdateFalseVersionDoesNotExists) -{ - rc.state_machine.set_current_states(lksm::state::charging); - - uint8_t returned_level {100}; - - // TODO (@yann): Trigger update_requested in StateMachine from BLE and remove isReadyToUpdate call - EXPECT_CALL(battery, isCharging).Times(AnyNumber()).WillRepeatedly(Return(true)); - EXPECT_CALL(battery, level).Times(AnyNumber()).WillRepeatedly(Return(returned_level)); - EXPECT_CALL(firmware_update, isVersionAvailable).Times(AnyNumber()).WillRepeatedly(Return(false)); - - EXPECT_CALL(firmware_update, loadFirmware).Times(0); - rc.isReadyToUpdate(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} - -TEST_F(RobotControllerTest, stateChargingEventUpdateRequestedGuardIsReadyToUpdateTrueLoadUpdateSuccess) -{ - rc.state_machine.set_current_states(lksm::state::charging); - - uint8_t returned_level {100}; - - MockFunction mock_on_update_loaded_callback; - rc.registerOnUpdateLoadedCallback(mock_on_update_loaded_callback.AsStdFunction()); - - // TODO (@yann): Trigger update_requested in StateMachine from BLE and remove isReadyToUpdate and applyUpdate calls - - EXPECT_CALL(battery, isCharging).WillOnce(Return(true)); - EXPECT_CALL(battery, level).WillOnce(Return(returned_level)); - EXPECT_CALL(firmware_update, isVersionAvailable).WillOnce(Return(true)); - - EXPECT_CALL(firmware_update, loadFirmware).WillOnce(Return(true)); - EXPECT_CALL(mock_on_update_loaded_callback, Call).Times(1); - rc.isReadyToUpdate(); - rc.applyUpdate(); - - // EXPECT_TRUE(rc.state_machine.is(lksm::state::updating)); -} - -TEST_F(RobotControllerTest, - stateChargingEventUpdateRequestedGuardIsReadyToUpdateTrueLoadUpdateSuccessOnUpdateLoadedCallbackFail) -{ - rc.state_machine.set_current_states(lksm::state::charging); - - uint8_t returned_level {100}; - - rc.registerOnUpdateLoadedCallback(nullptr); - - // TODO (@yann): Trigger update_requested in StateMachine from BLE and remove isReadyToUpdate and applyUpdate calls - - EXPECT_CALL(battery, isCharging).WillOnce(Return(true)); - EXPECT_CALL(battery, level).WillOnce(Return(returned_level)); - EXPECT_CALL(firmware_update, isVersionAvailable).WillOnce(Return(true)); - - EXPECT_CALL(firmware_update, loadFirmware).WillOnce(Return(true)); - rc.isReadyToUpdate(); - rc.applyUpdate(); - - // EXPECT_TRUE(rc.state_machine.is(lksm::state::updating)); -} - -TEST_F(RobotControllerTest, stateChargingEventUpdateRequestedGuardIsReadyToUpdateTrueLoadUpdateFail) -{ - rc.state_machine.set_current_states(lksm::state::charging); - - uint8_t returned_level {100}; - - MockFunction mock_on_update_loaded_callback; - rc.registerOnUpdateLoadedCallback(mock_on_update_loaded_callback.AsStdFunction()); - - // TODO (@yann): Trigger update_requested in StateMachine from BLE and remove isReadyToUpdate and applyUpdate calls - - EXPECT_CALL(battery, isCharging).WillOnce(Return(true)); - EXPECT_CALL(battery, level).WillOnce(Return(returned_level)); - EXPECT_CALL(firmware_update, isVersionAvailable).WillOnce(Return(true)); - - EXPECT_CALL(firmware_update, loadFirmware).WillOnce(Return(false)); - EXPECT_CALL(mock_on_update_loaded_callback, Call).Times(0); - rc.isReadyToUpdate(); - rc.applyUpdate(); - - // EXPECT_TRUE(rc.state_machine.is(lksm::state::updating)); -} - -TEST_F(RobotControllerTest, stateChargingEventEmergencyStopDelayNotOver) -{ - rc.state_machine.set_current_states(lksm::state::charging); - - auto maximal_delay_before_over = 9s; - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(maximal_delay_before_over); - rc.onMagicCardAvailable(MagicCard::emergency_stop); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} - -TEST_F(RobotControllerTest, stateChargingEventEmergencyStopDelayOver) -{ - rc.state_machine.set_current_states(lksm::state::charging); - - auto delay_over = 11s; - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(true)); - - Sequence on_charging_exit_sequence; - EXPECT_CALL(timeout_state_transition, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(timeout_state_internal, stop).Times(1).InSequence(on_charging_exit_sequence); - - expectedCallsStopActuators(); - EXPECT_CALL(mock_lcd, turnOff); - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(delay_over); - rc.onMagicCardAvailable(MagicCard::emergency_stop); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::emergency_stopped)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, stateChargingDiceRollDetectedDelayNotOver) -{ - rc.state_machine.set_current_states(lksm::state::charging); - - auto maximal_delay_before_over = 1s; - - EXPECT_CALL(battery, level).Times(0); - EXPECT_CALL(mock_videokit, displayImage).Times(0); - EXPECT_CALL(mock_ledkit, start).Times(0); - EXPECT_CALL(mock_lcd, turnOn).Times(0); - EXPECT_CALL(timeout_state_internal, start).Times(0); - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(maximal_delay_before_over); - rc.onMagicCardAvailable(MagicCard::dice_roll); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, stateChargingDiceRollDetectedDelayOverEventAutonomousActivityRequested) -{ - rc.state_machine.set_current_states(lksm::state::charging); - - auto minimal_delay_over = 1001ms; - - Sequence on_charging_exit_sequence; - EXPECT_CALL(timeout_state_transition, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(timeout_state_internal, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(mock_ledkit, stop).Times(1).InSequence(on_charging_exit_sequence); - EXPECT_CALL(mock_videokit, stopVideo).Times(1).InSequence(on_charging_exit_sequence); - expectedCallsStopMotors(); - - Sequence start_deep_sleep_timeout_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(start_deep_sleep_timeout_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(start_deep_sleep_timeout_sequence); - - EXPECT_CALL(battery, level); - EXPECT_CALL(mock_videokit, displayImage).Times(1); - EXPECT_CALL(mock_ledkit, start); - EXPECT_CALL(mock_lcd, turnOn).Times(AnyNumber()); - EXPECT_CALL(timeout_state_internal, onTimeout) - .WillOnce(GetCallback(&on_charging_start_timeout)); - EXPECT_CALL(timeout_state_internal, start).Times(AnyNumber()); - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(minimal_delay_over); - rc.onMagicCardAvailable(MagicCard::dice_roll); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} - -// TEST_F(RobotControllerTest, stateChargingEventTimeout) -// { -// Sequence get_on_deep_sleep_timeout_callback; -// EXPECT_CALL(timeout_state_transition, onTimeout) -// .InSequence(get_on_deep_sleep_timeout_callback) -// .WillOnce(GetCallback(&on_deep_sleep_timeout)); -// EXPECT_CALL(timeout_state_transition, start).InSequence(get_on_deep_sleep_timeout_callback); -// rc.startDeepSleepTimeout(); - -// rc.state_machine.set_current_states(lksm::state::charging); - -// Sequence on_charging_exit_sequence; -// EXPECT_CALL(timeout_state_transition, stop).InSequence(on_charging_exit_sequence); -// EXPECT_CALL(timeout_state_internal, stop).InSequence(on_charging_exit_sequence); -// EXPECT_CALL(mock_ledkit, stop).InSequence(on_charging_exit_sequence); -// EXPECT_CALL(mock_videokit, stopVideo).InSequence(on_charging_exit_sequence); -// expectedCallsStopMotors(); - -// on_deep_sleep_timeout(); - -// EXPECT_TRUE(rc.state_machine.is(lksm::state::deep_sleeping)); -// } diff --git a/libs/RobotKit/tests/RobotController_test_stateDisconnected.cpp b/libs/RobotKit/tests/RobotController_test_stateDisconnected.cpp index 6982e38f35..fa7728576d 100644 --- a/libs/RobotKit/tests/RobotController_test_stateDisconnected.cpp +++ b/libs/RobotKit/tests/RobotController_test_stateDisconnected.cpp @@ -12,7 +12,6 @@ TEST_F(RobotControllerTest, startDisconnectionBehaviorCharging) EXPECT_CALL(mock_ledkit, start(isSameAnimation(&led::animation::blink_on_charge))).Times(1); rc.startDisconnectionBehavior(); - EXPECT_FALSE(rc.isBleConnected()); } TEST_F(RobotControllerTest, startDisconnectionBehaviorNotCharging) @@ -23,5 +22,4 @@ TEST_F(RobotControllerTest, startDisconnectionBehaviorNotCharging) EXPECT_CALL(mock_ledkit, start(isSameAnimation(&led::animation::blink_on_charge))).Times(0); rc.startDisconnectionBehavior(); - EXPECT_FALSE(rc.isBleConnected()); } diff --git a/libs/RobotKit/tests/RobotController_test_stateEmergencyStopped.cpp b/libs/RobotKit/tests/RobotController_test_stateEmergencyStopped.cpp deleted file mode 100644 index 5fbb893f3f..0000000000 --- a/libs/RobotKit/tests/RobotController_test_stateEmergencyStopped.cpp +++ /dev/null @@ -1,252 +0,0 @@ -// Leka - LekaOS -// Copyright 2022 APF France handicap -// SPDX-License-Identifier: Apache-2.0 - -#include "./RobotController_test.h" - -TEST_F(RobotControllerTest, stateEmergencyStoppedConnectedEventCommandReceivedIsChargingFalse) -{ - rc.state_machine.set_current_states(lksm::state::emergency_stopped, lksm::state::connected); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(false)); - - Sequence on_working_entry_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(on_working_entry_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(on_working_entry_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(on_working_entry_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(on_working_entry_sequence); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)); - - rc.state_machine.process_event(lksm::event::command_received {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::working, lksm::state::connected)); -} - -TEST_F(RobotControllerTest, stateEmergencyStoppedDisconnectedEventCommandReceivedIsChargingFalse) -{ - rc.state_machine.set_current_states(lksm::state::emergency_stopped, lksm::state::disconnected); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(false)); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AnyNumber()); - - rc.state_machine.process_event(lksm::event::command_received {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::emergency_stopped, lksm::state::disconnected)); -} - -TEST_F(RobotControllerTest, stateEmergencyStoppedEventBleConnectionGuardIsNotCharging) -{ - rc.state_machine.set_current_states(lksm::state::emergency_stopped, lksm::state::disconnected); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(false)); - - expectedCallsStopActuators(); - Sequence on_ble_connection_sequence; - EXPECT_CALL(mock_ledkit, start(isSameAnimation(&led::animation::ble_connection))) - .Times(1) - .InSequence(on_ble_connection_sequence); - EXPECT_CALL(mock_videokit, playVideoOnce).Times(1).InSequence(on_ble_connection_sequence); - - Sequence on_working_entry_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(on_working_entry_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(on_working_entry_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(on_working_entry_sequence); - EXPECT_CALL(mock_lcd, turnOn).Times(2).InSequence(on_working_entry_sequence); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AtLeast(1)); - - rc.state_machine.process_event(lksm::event::ble_connection {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::working, lksm::state::connected)); -} - -TEST_F(RobotControllerTest, stateEmergencyStoppedEventChargeDidStartGuardIsChargingTrue) -{ - rc.state_machine.set_current_states(lksm::state::emergency_stopped); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(true)); - - Sequence start_deep_sleep_timeout_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(start_deep_sleep_timeout_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(start_deep_sleep_timeout_sequence); - - Sequence start_charging_behavior_sequence; - EXPECT_CALL(battery, level).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_ledkit, start).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, onTimeout).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, start).InSequence(start_charging_behavior_sequence); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AtLeast(1)); - - on_charge_did_start(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} - -TEST_F(RobotControllerTest, stateEmergencyStoppedEventChargeDidStartGuardIsChargingFalse) -{ - rc.state_machine.set_current_states(lksm::state::emergency_stopped); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(false)); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)); - - on_charge_did_start(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::emergency_stopped)); -} - -TEST_F(RobotControllerTest, stateEmergencyStoppedConnectedEventCommandReceivedGuardIsChargingTrue) -{ - rc.state_machine.set_current_states(lksm::state::emergency_stopped, lksm::state::connected); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(true)); - - Sequence start_deep_sleep_timeout_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(start_deep_sleep_timeout_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(start_deep_sleep_timeout_sequence); - - Sequence start_charging_behavior_sequence; - EXPECT_CALL(battery, level).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_ledkit, start).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, onTimeout).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, start).InSequence(start_charging_behavior_sequence); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AtLeast(1)); - - rc.state_machine.process_event(lksm::event::command_received {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging, lksm::state::connected)); -} - -TEST_F(RobotControllerTest, stateEmergencyStoppedDisonnectedEventCommandReceivedGuardIsChargingTrue) -{ - rc.state_machine.set_current_states(lksm::state::emergency_stopped, lksm::state::disconnected); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(true)); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AtLeast(1)); - - rc.state_machine.process_event(lksm::event::command_received {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::emergency_stopped, lksm::state::disconnected)); -} - -TEST_F(RobotControllerTest, stateEmergencyStoppedEventBleConnectionGuardIsCharging) -{ - rc.state_machine.set_current_states(lksm::state::emergency_stopped, lksm::state::disconnected); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(true)); - - expectedCallsStopActuators(); - Sequence on_ble_connection_sequence; - EXPECT_CALL(mock_ledkit, start(isSameAnimation(&led::animation::ble_connection))) - .Times(1) - .InSequence(on_ble_connection_sequence); - EXPECT_CALL(mock_videokit, playVideoOnce).Times(0).InSequence(on_ble_connection_sequence); - EXPECT_CALL(mock_lcd, turnOn).Times(0).InSequence(on_ble_connection_sequence); - EXPECT_CALL(mock_ledkit, start(isSameAnimation(&led::animation::blink_on_charge))) - .Times(1) - .InSequence(on_ble_connection_sequence); - - Sequence start_deep_sleep_timeout_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(start_deep_sleep_timeout_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(start_deep_sleep_timeout_sequence); - - Sequence start_charging_behavior_sequence; - EXPECT_CALL(battery, level).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_ledkit, start).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, onTimeout).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, start).InSequence(start_charging_behavior_sequence); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AtLeast(1)); - - rc.state_machine.process_event(lksm::event::ble_connection {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, stateEmergencyStoppedDiceRollDetectedDelayNotOver) -{ - rc.state_machine.set_current_states(lksm::state::emergency_stopped); - - auto maximal_delay_before_over = 1s; - - expectedCallsResetAutonomousActivitiesTimeout(); - EXPECT_CALL(mock_videokit, displayImage).Times(0); - - spy_kernel_addElapsedTimeToTickCount(maximal_delay_before_over); - rc.onMagicCardAvailable(MagicCard::dice_roll); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::emergency_stopped)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, - stateEmergencyStoppedDiceRollDetectedDelayOverEventAutonomousActivityRequestedGuardIsChargingFalse) -{ - rc.state_machine.set_current_states(lksm::state::emergency_stopped); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(false)); - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AtLeast(1)); - - auto minimal_delay_over = 1001ms; - - expectedCallsResetAutonomousActivitiesTimeout(); - EXPECT_CALL(mock_videokit, displayImage).Times(1); - - spy_kernel_addElapsedTimeToTickCount(minimal_delay_over); - rc.onMagicCardAvailable(MagicCard::dice_roll); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::autonomous_activities)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, - stateEmergencyStoppedDiceRollDetectedDelayOverEventAutonomousActivityRequestedGuardIsChargingTrue) -{ - rc.state_machine.set_current_states(lksm::state::emergency_stopped); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(true)); - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AtLeast(1)); - - auto minimal_delay_over = 1001ms; - - Sequence start_deep_sleep_timeout_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(start_deep_sleep_timeout_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(start_deep_sleep_timeout_sequence); - - Sequence start_charging_behavior_sequence; - EXPECT_CALL(battery, level).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_ledkit, start).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, onTimeout).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, start).InSequence(start_charging_behavior_sequence); - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(minimal_delay_over); - rc.onMagicCardAvailable(MagicCard::dice_roll); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} diff --git a/libs/RobotKit/tests/RobotController_test_stateFileExchange.cpp b/libs/RobotKit/tests/RobotController_test_stateFileExchange.cpp deleted file mode 100644 index 5c1aa79ada..0000000000 --- a/libs/RobotKit/tests/RobotController_test_stateFileExchange.cpp +++ /dev/null @@ -1,282 +0,0 @@ -// Leka - LekaOS -// Copyright 2022 APF France handicap -// SPDX-License-Identifier: Apache-2.0 - -#include "./RobotController_test.h" - -TEST_F(RobotControllerTest, stateFileExchangeEventFileExchangeStopRequestedGuardIsCharging) -{ - rc.state_machine.set_current_states(lksm::state::file_exchange); - - auto returned_is_charging = true; - - // TODO (@yann): Trigger file_exchange_stop_requested in StateMachine from BLE and do not use process_event - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(returned_is_charging)); - - Sequence on_file_exchange_end; - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AnyNumber()).InSequence(on_file_exchange_end); - - Sequence start_deep_sleep_timeout_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(start_deep_sleep_timeout_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(start_deep_sleep_timeout_sequence); - - Sequence start_charging_behavior_sequence; - EXPECT_CALL(battery, level).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_ledkit, start).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, onTimeout).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, start).InSequence(start_charging_behavior_sequence); - - rc.state_machine.process_event(lksm::event::file_exchange_stop_requested {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} - -TEST_F(RobotControllerTest, stateFileExchangeEventFileExchangeStopRequestedGuardIsNotCharging) -{ - rc.state_machine.set_current_states(lksm::state::file_exchange); - - auto returned_is_charging = false; - - // TODO (@yann): Trigger file_exchange_stop_requested in StateMachine from BLE and do not use process_event - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(returned_is_charging)); - - Sequence on_file_exchange_end; - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AnyNumber()).InSequence(on_file_exchange_end); - - Sequence on_working_entry_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(on_working_entry_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(on_working_entry_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(on_working_entry_sequence); - - rc.state_machine.process_event(lksm::event::file_exchange_stop_requested {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::working)); -} - -TEST_F(RobotControllerTest, stateFileExchangeEventDisconnectionGuardIsCharging) -{ - rc.state_machine.set_current_states(lksm::state::file_exchange, lksm::state::connected); - - auto returned_is_charging = true; - - // TODO (@yann): Trigger ble_disonnection in StateMachine from BLE and do not use process_event - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(returned_is_charging)); - - Sequence on_file_exchange_end; - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AnyNumber()).InSequence(on_file_exchange_end); - - Sequence start_disconnection_behavior; - expectedCallsStopActuators(); - EXPECT_CALL(mock_ledkit, start).InSequence(start_disconnection_behavior); - - Sequence start_deep_sleep_timeout_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(start_deep_sleep_timeout_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(start_deep_sleep_timeout_sequence); - - Sequence start_charging_behavior_sequence; - EXPECT_CALL(battery, level).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_ledkit, start).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, onTimeout).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, start).InSequence(start_charging_behavior_sequence); - - rc.state_machine.process_event(lksm::event::ble_disconnection {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging, lksm::state::disconnected)); -} - -TEST_F(RobotControllerTest, stateFileExchangeEventDisconnectionGuardIsNotCharging) -{ - rc.state_machine.set_current_states(lksm::state::file_exchange, lksm::state::connected); - - auto returned_is_charging = false; - - // TODO (@yann): Trigger ble_disonnection in StateMachine from BLE and do not use process_event - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(returned_is_charging)); - - Sequence on_file_exchange_end; - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AnyNumber()).InSequence(on_file_exchange_end); - - Sequence start_disconnection_behavior; - expectedCallsStopActuators(); - EXPECT_CALL(mock_ledkit, start).Times(0).InSequence(start_disconnection_behavior); - - Sequence on_idle_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(on_idle_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(on_idle_sequence); - EXPECT_CALL(mock_videokit, playVideoOnRepeat).InSequence(on_idle_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(on_idle_sequence); - - rc.state_machine.process_event(lksm::event::ble_disconnection {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::idle, lksm::state::disconnected)); -} - -TEST_F(RobotControllerTest, stateFileExchangeEventEmergencyStopDelayNotOver) -{ - rc.state_machine.set_current_states(lksm::state::file_exchange); - - auto maximal_delay_before_over = 9s; - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(maximal_delay_before_over); - rc.onMagicCardAvailable(MagicCard::emergency_stop); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::file_exchange)); -} - -TEST_F(RobotControllerTest, stateFileExchangeEventEmergencyStopDelayOver) -{ - rc.state_machine.set_current_states(lksm::state::file_exchange); - - auto delay_over = 11s; - - Sequence on_file_exchange_end; - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AnyNumber()).InSequence(on_file_exchange_end); - - EXPECT_CALL(mock_motor_left, stop).Times(2); - EXPECT_CALL(mock_motor_right, stop).Times(2); - EXPECT_CALL(mock_belt, hide).Times(1); - EXPECT_CALL(mock_ears, hide).Times(1); - EXPECT_CALL(mock_lcd, turnOff).Times(1); - EXPECT_CALL(mock_videokit, stopVideo).Times(2); - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(delay_over); - rc.onMagicCardAvailable(MagicCard::emergency_stop); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::emergency_stopped)); -} - -TEST_F(RobotControllerTest, stateFileExchangeEventUpdateRequestedGuardIsReadyToUpdateTrue) -{ - rc.state_machine.set_current_states(lksm::state::file_exchange); - - auto returned_is_charging = true; - auto returned_level = uint8_t {100}; - - MockFunction mock_on_update_loaded_callback; - rc.registerOnUpdateLoadedCallback(mock_on_update_loaded_callback.AsStdFunction()); - - Sequence on_file_exchange_end; - // TODO (@yann): Trigger file_exchange_start_requested in StateMachine from BLE and do not use process_event - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AnyNumber()).InSequence(on_file_exchange_end); - - Sequence is_ready_to_update_sequence; - EXPECT_CALL(battery, isCharging) - .InSequence(is_ready_to_update_sequence) - .WillRepeatedly(Return(returned_is_charging)); - EXPECT_CALL(battery, level).InSequence(is_ready_to_update_sequence).WillRepeatedly(Return(returned_level)); - EXPECT_CALL(firmware_update, isVersionAvailable).WillOnce(Return(true)); - - EXPECT_CALL(firmware_update, loadFirmware).WillOnce(Return(true)); - EXPECT_CALL(mock_on_update_loaded_callback, Call); - - rc.state_machine.process_event(lksm::event::update_requested {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::updating)); -} - -TEST_F(RobotControllerTest, stateFileExchangeEventUpdateRequestedGuardIsReadyToUpdateFalseIsNotCharging) -{ - rc.state_machine.set_current_states(lksm::state::file_exchange); - - auto returned_is_charging = false; - auto returned_level = uint8_t {100}; - auto returned_is_version_available = true; - - MockFunction mock_on_update_loaded_callback; - rc.registerOnUpdateLoadedCallback(mock_on_update_loaded_callback.AsStdFunction()); - - Sequence on_file_exchange_end; - // TODO (@yann): Trigger file_exchange_start_requested in StateMachine from BLE and do not use process_event - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AnyNumber()).InSequence(on_file_exchange_end); - - Sequence is_ready_to_update_sequence; - EXPECT_CALL(battery, isCharging) - .InSequence(is_ready_to_update_sequence) - .WillRepeatedly(Return(returned_is_charging)); - EXPECT_CALL(battery, level).Times(0).InSequence(is_ready_to_update_sequence); - EXPECT_CALL(firmware_update, isVersionAvailable).WillOnce(Return(returned_is_version_available)); - - EXPECT_CALL(firmware_update, loadFirmware).Times(0); - EXPECT_CALL(mock_on_update_loaded_callback, Call).Times(0); - - rc.state_machine.process_event(lksm::event::update_requested {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::file_exchange)); -} - -TEST_F(RobotControllerTest, stateFileExchangeEventUpdateRequestedGuardIsReadyToUpdateFalseBelowMinimalBatteryLevel) -{ - rc.state_machine.set_current_states(lksm::state::file_exchange); - - auto returned_is_charging = true; - auto returned_level = uint8_t {0}; - auto returned_is_version_available = true; - - MockFunction mock_on_update_loaded_callback; - rc.registerOnUpdateLoadedCallback(mock_on_update_loaded_callback.AsStdFunction()); - - Sequence on_file_exchange_end; - // TODO (@yann): Trigger file_exchange_start_requested in StateMachine from BLE and do not use process_event - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AnyNumber()).InSequence(on_file_exchange_end); - - Sequence is_ready_to_update_sequence; - EXPECT_CALL(battery, isCharging) - .InSequence(is_ready_to_update_sequence) - .WillRepeatedly(Return(returned_is_charging)); - EXPECT_CALL(battery, level).InSequence(is_ready_to_update_sequence).WillRepeatedly(Return(returned_level)); - EXPECT_CALL(firmware_update, isVersionAvailable).WillOnce(Return(returned_is_version_available)); - - EXPECT_CALL(firmware_update, loadFirmware).Times(0); - EXPECT_CALL(mock_on_update_loaded_callback, Call).Times(0); - - rc.state_machine.process_event(lksm::event::update_requested {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::file_exchange)); -} - -TEST_F(RobotControllerTest, stateFileExchangeEventUpdateRequestedGuardIsReadyToUpdateFalseVersionDoesNotExists) -{ - rc.state_machine.set_current_states(lksm::state::file_exchange); - - auto returned_is_charging = true; - auto returned_level = uint8_t {100}; - auto returned_is_version_available = false; - - MockFunction mock_on_update_loaded_callback; - rc.registerOnUpdateLoadedCallback(mock_on_update_loaded_callback.AsStdFunction()); - - Sequence on_file_exchange_end; - // TODO (@yann): Trigger file_exchange_start_requested in StateMachine from BLE and do not use process_event - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AnyNumber()).InSequence(on_file_exchange_end); - - Sequence is_ready_to_update_sequence; - EXPECT_CALL(battery, isCharging) - .InSequence(is_ready_to_update_sequence) - .WillRepeatedly(Return(returned_is_charging)); - EXPECT_CALL(battery, level).InSequence(is_ready_to_update_sequence).WillRepeatedly(Return(returned_level)); - EXPECT_CALL(firmware_update, isVersionAvailable).WillOnce(Return(returned_is_version_available)); - - EXPECT_CALL(firmware_update, loadFirmware).Times(0); - EXPECT_CALL(mock_on_update_loaded_callback, Call).Times(0); - - rc.state_machine.process_event(lksm::event::update_requested {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::file_exchange)); -} diff --git a/libs/RobotKit/tests/RobotController_test_stateIdle.cpp b/libs/RobotKit/tests/RobotController_test_stateIdle.cpp deleted file mode 100644 index 666e67ce3e..0000000000 --- a/libs/RobotKit/tests/RobotController_test_stateIdle.cpp +++ /dev/null @@ -1,202 +0,0 @@ -// Leka - LekaOS -// Copyright 2022 APF France handicap -// SPDX-License-Identifier: Apache-2.0 - -#include "./RobotController_test.h" - -TEST_F(RobotControllerTest, stateIdleEventTimeout) -{ - rc.state_machine.set_current_states(lksm::state::idle); - - Sequence on_exit_idle_sequence; - EXPECT_CALL(timeout_state_transition, stop).InSequence(on_exit_idle_sequence); - EXPECT_CALL(mock_videokit, stopVideo).InSequence(on_exit_idle_sequence); - expectedCallsStopMotors(); - - Sequence start_deep_sleep_timeout_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(start_deep_sleep_timeout_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(start_deep_sleep_timeout_sequence); - - Sequence on_sleeping_sequence; - EXPECT_CALL(mock_ledkit, start(isSameAnimation(&led::animation::sleeping))).InSequence(on_sleeping_sequence); - EXPECT_CALL(mock_videokit, playVideoOnce).InSequence(on_sleeping_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(on_sleeping_sequence); - EXPECT_CALL(timeout_state_internal, onTimeout) - .InSequence(on_sleeping_sequence) - .WillOnce(GetCallback(&on_sleeping_start_timeout)); - EXPECT_CALL(timeout_state_internal, start).InSequence(on_sleeping_sequence); - - on_sleep_timeout(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::sleeping)); - - EXPECT_CALL(mock_lcd, turnOff); - on_sleeping_start_timeout(); -} - -TEST_F(RobotControllerTest, stateIdleEventBleConnection) -{ - rc.state_machine.set_current_states(lksm::state::idle); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(false)); - - Sequence on_exit_idle_sequence; - EXPECT_CALL(timeout_state_transition, stop).InSequence(on_exit_idle_sequence); - - expectedCallsStopActuators(); - Sequence on_ble_connection_sequence; - EXPECT_CALL(mock_ledkit, start(isSameAnimation(&led::animation::ble_connection))) - .Times(1) - .InSequence(on_ble_connection_sequence); - EXPECT_CALL(mock_videokit, playVideoOnce).Times(1).InSequence(on_ble_connection_sequence); - EXPECT_CALL(mock_lcd, turnOn).Times(1).InSequence(on_ble_connection_sequence); - - Sequence on_working_entry_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(on_working_entry_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(on_working_entry_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(on_working_entry_sequence); - - rc.state_machine.process_event(lksm::event::ble_connection {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::working)); -} - -TEST_F(RobotControllerTest, stateIdleEventCommandReceived) -{ - rc.state_machine.set_current_states(lksm::state::idle, lksm::state::connected); - - Sequence on_exit_idle_sequence; - EXPECT_CALL(timeout_state_transition, stop).InSequence(on_exit_idle_sequence); - EXPECT_CALL(mock_videokit, stopVideo).InSequence(on_exit_idle_sequence); - expectedCallsStopMotors(); - - Sequence on_working_entry_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(on_working_entry_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(on_working_entry_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(on_working_entry_sequence); - - rc.state_machine.process_event(lksm::event::command_received {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::working, lksm::state::connected)); -} - -TEST_F(RobotControllerTest, stateIdleEventChargeDidStartGuardIsChargingTrue) -{ - rc.state_machine.set_current_states(lksm::state::idle); - - EXPECT_CALL(battery, isCharging).WillOnce(Return(true)); - - Sequence on_exit_idle_sequence; - EXPECT_CALL(timeout_state_transition, stop).InSequence(on_exit_idle_sequence); - EXPECT_CALL(mock_videokit, stopVideo).InSequence(on_exit_idle_sequence); - expectedCallsStopMotors(); - - Sequence start_deep_sleep_timeout_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(start_deep_sleep_timeout_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(start_deep_sleep_timeout_sequence); - - Sequence start_charging_behavior_sequence; - EXPECT_CALL(battery, level).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_ledkit, start).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, onTimeout).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, start).InSequence(start_charging_behavior_sequence); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)); - - on_charge_did_start(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} - -TEST_F(RobotControllerTest, stateIdleEventChargeDidStartGuardIsChargingFalse) -{ - rc.state_machine.set_current_states(lksm::state::idle); - - EXPECT_CALL(battery, isCharging).WillOnce(Return(false)); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)); - - on_charge_did_start(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::idle)); -} - -TEST_F(RobotControllerTest, stateIdleEventEmergencyStopDelayNotOver) -{ - rc.state_machine.set_current_states(lksm::state::idle); - - auto maximal_delay_before_over = 9s; - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(maximal_delay_before_over); - rc.onMagicCardAvailable(MagicCard::emergency_stop); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::idle)); -} - -TEST_F(RobotControllerTest, stateIdleEventEmergencyStopDelayOver) -{ - rc.state_machine.set_current_states(lksm::state::idle); - - auto delay_over = 11s; - - Sequence on_exit_idle_sequence; - EXPECT_CALL(timeout_state_transition, stop).InSequence(on_exit_idle_sequence); - - EXPECT_CALL(mock_motor_left, stop).Times(AtLeast(1)); - EXPECT_CALL(mock_motor_right, stop).Times(AtLeast(1)); - EXPECT_CALL(mock_belt, hide).Times(1); - EXPECT_CALL(mock_ears, hide).Times(1); - EXPECT_CALL(mock_lcd, turnOff).Times(1); - EXPECT_CALL(mock_videokit, stopVideo).Times(AtLeast(1)); - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(delay_over); - rc.onMagicCardAvailable(MagicCard::emergency_stop); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::emergency_stopped)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, stateIdleDiceRollDetectedDelayNotOver) -{ - rc.state_machine.set_current_states(lksm::state::idle); - - auto maximal_delay_before_over = 1s; - - EXPECT_CALL(mock_videokit, displayImage).Times(0); - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(maximal_delay_before_over); - rc.onMagicCardAvailable(MagicCard::dice_roll); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::idle)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, stateIdleDiceRollDetectedDelayOverEventAutonomousActivityRequested) -{ - rc.state_machine.set_current_states(lksm::state::idle); - - auto minimal_delay_over = 1001ms; - - Sequence on_exit_idle_sequence; - EXPECT_CALL(timeout_state_transition, stop).InSequence(on_exit_idle_sequence); - EXPECT_CALL(mock_videokit, stopVideo).InSequence(on_exit_idle_sequence); - expectedCallsStopMotors(); - - expectedCallsResetAutonomousActivitiesTimeout(); - EXPECT_CALL(mock_videokit, displayImage).Times(1); - - spy_kernel_addElapsedTimeToTickCount(minimal_delay_over); - rc.onMagicCardAvailable(MagicCard::dice_roll); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::autonomous_activities)); -} diff --git a/libs/RobotKit/tests/RobotController_test_stateSetup.cpp b/libs/RobotKit/tests/RobotController_test_stateSetup.cpp deleted file mode 100644 index 4f11751b93..0000000000 --- a/libs/RobotKit/tests/RobotController_test_stateSetup.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// Leka - LekaOS -// Copyright 2022 APF France handicap -// SPDX-License-Identifier: Apache-2.0 - -#include "./RobotController_test.h" - -TEST_F(RobotControllerTest, stateSetupEventSetupCompleteGuardIsChargingFalse) -{ - rc.state_machine.set_current_states(lksm::state::setup); - - spy_isCharging_return_value = false; - expectedCallsRegisterEvents(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::idle)); -} - -TEST_F(RobotControllerTest, stateSetupEventSetupCompleteGuardIsChargingTrue) -{ - rc.state_machine.set_current_states(lksm::state::setup); - - spy_isCharging_return_value = true; - expectedCallsRegisterEvents(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} diff --git a/libs/RobotKit/tests/RobotController_test_stateSleeping.cpp b/libs/RobotKit/tests/RobotController_test_stateSleeping.cpp deleted file mode 100644 index d0942b04a9..0000000000 --- a/libs/RobotKit/tests/RobotController_test_stateSleeping.cpp +++ /dev/null @@ -1,199 +0,0 @@ -// Leka - LekaOS -// Copyright 2022 APF France handicap -// SPDX-License-Identifier: Apache-2.0 - -#include "./RobotController_test.h" - -TEST_F(RobotControllerTest, stateSleepingEventCommandReceived) -{ - rc.state_machine.set_current_states(lksm::state::sleeping, lksm::state::connected); - - Sequence on_exit_sleeping_sequence; - EXPECT_CALL(timeout_state_transition, stop).InSequence(on_exit_sleeping_sequence); - EXPECT_CALL(timeout_state_internal, stop).InSequence(on_exit_sleeping_sequence); - EXPECT_CALL(mock_videokit, stopVideo).InSequence(on_exit_sleeping_sequence); - expectedCallsStopMotors(); - - Sequence on_working_entry_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(on_working_entry_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(on_working_entry_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(on_working_entry_sequence); - - rc.state_machine.process_event(lksm::event::command_received {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::working, lksm::state::connected)); -} - -TEST_F(RobotControllerTest, stateSleepingEventBleConnection) -{ - rc.state_machine.set_current_states(lksm::state::sleeping); - - EXPECT_CALL(battery, isCharging).WillRepeatedly(Return(false)); - - Sequence on_exit_sleeping_sequence; - EXPECT_CALL(timeout_state_transition, stop).InSequence(on_exit_sleeping_sequence); - EXPECT_CALL(timeout_state_internal, stop).InSequence(on_exit_sleeping_sequence); - - expectedCallsStopActuators(); - Sequence on_ble_connection_sequence; - EXPECT_CALL(mock_ledkit, start(isSameAnimation(&led::animation::ble_connection))) - .Times(1) - .InSequence(on_ble_connection_sequence); - EXPECT_CALL(mock_videokit, playVideoOnce).Times(1).InSequence(on_ble_connection_sequence); - EXPECT_CALL(mock_lcd, turnOn).Times(1).InSequence(on_ble_connection_sequence); - - Sequence on_working_entry_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(on_working_entry_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(on_working_entry_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(on_working_entry_sequence); - - rc.state_machine.process_event(lksm::event::ble_connection {}); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::working)); -} - -TEST_F(RobotControllerTest, stateSleepingEventChargeDidStartGuardIsChargingTrue) -{ - rc.state_machine.set_current_states(lksm::state::sleeping); - - EXPECT_CALL(battery, isCharging).WillOnce(Return(true)); - - Sequence on_exit_sleeping_sequence; - EXPECT_CALL(timeout_state_transition, stop).InSequence(on_exit_sleeping_sequence); - EXPECT_CALL(timeout_state_internal, stop).InSequence(on_exit_sleeping_sequence); - EXPECT_CALL(mock_videokit, stopVideo).InSequence(on_exit_sleeping_sequence); - expectedCallsStopMotors(); - - Sequence start_deep_sleep_timeout_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(start_deep_sleep_timeout_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(start_deep_sleep_timeout_sequence); - - Sequence start_charging_behavior_sequence; - EXPECT_CALL(battery, level).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_ledkit, start).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, onTimeout).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, start).InSequence(start_charging_behavior_sequence); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)); - - on_charge_did_start(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} - -TEST_F(RobotControllerTest, stateSleepingEventChargeDidStartGuardIsChargingFalse) -{ - rc.state_machine.set_current_states(lksm::state::sleeping); - - EXPECT_CALL(battery, isCharging).WillOnce(Return(false)); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)); - - on_charge_did_start(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::sleeping)); -} - -TEST_F(RobotControllerTest, stateSleepingEventEmergencyStopDelayNotOver) -{ - rc.state_machine.set_current_states(lksm::state::sleeping); - - auto maximal_delay_before_over = 9s; - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(maximal_delay_before_over); - rc.onMagicCardAvailable(MagicCard::emergency_stop); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::sleeping)); -} - -TEST_F(RobotControllerTest, stateSleepingEventEmergencyStopDelayOver) -{ - rc.state_machine.set_current_states(lksm::state::sleeping); - - auto delay_over = 11s; - - Sequence on_exit_sleeping_sequence; - EXPECT_CALL(timeout_state_transition, stop).InSequence(on_exit_sleeping_sequence); - EXPECT_CALL(timeout_state_internal, stop).InSequence(on_exit_sleeping_sequence); - - EXPECT_CALL(mock_motor_left, stop).Times(AtLeast(1)); - EXPECT_CALL(mock_motor_right, stop).Times(AtLeast(1)); - EXPECT_CALL(mock_belt, hide).Times(1); - EXPECT_CALL(mock_ears, hide).Times(1); - EXPECT_CALL(mock_lcd, turnOff).Times(1); - EXPECT_CALL(mock_videokit, stopVideo).Times(AtLeast(1)); - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(delay_over); - rc.onMagicCardAvailable(MagicCard::emergency_stop); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::emergency_stopped)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, stateSleepingDiceRollDetectedDelayNotOver) -{ - rc.state_machine.set_current_states(lksm::state::sleeping); - - auto maximal_delay_before_over = 1s; - - EXPECT_CALL(mock_videokit, displayImage).Times(0); - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(maximal_delay_before_over); - rc.onMagicCardAvailable(MagicCard::dice_roll); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::sleeping)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, stateSleepingDiceRollDetectedDelayOverEventAutonomousActivitiesRequested) -{ - rc.state_machine.set_current_states(lksm::state::sleeping); - - auto minimal_delay_over = 1001ms; - - Sequence on_exit_sleeping_sequence; - EXPECT_CALL(timeout_state_transition, stop).InSequence(on_exit_sleeping_sequence); - EXPECT_CALL(timeout_state_internal, stop).InSequence(on_exit_sleeping_sequence); - EXPECT_CALL(mock_videokit, stopVideo).InSequence(on_exit_sleeping_sequence); - expectedCallsStopMotors(); - - expectedCallsResetAutonomousActivitiesTimeout(); - EXPECT_CALL(mock_videokit, displayImage).Times(1); - - spy_kernel_addElapsedTimeToTickCount(minimal_delay_over); - rc.onMagicCardAvailable(MagicCard::dice_roll); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::autonomous_activities)); -} - -// TEST_F(RobotControllerTest, stateSleepingEventTimeout) -// { -// Sequence get_on_deep_sleep_timeout_callback; -// EXPECT_CALL(timeout_state_transition, onTimeout) -// .InSequence(get_on_deep_sleep_timeout_callback) -// .WillOnce(GetCallback(&on_deep_sleep_timeout)); -// EXPECT_CALL(timeout_state_transition, start).InSequence(get_on_deep_sleep_timeout_callback); -// rc.startDeepSleepTimeout(); - -// rc.state_machine.set_current_states(lksm::state::sleeping); - -// Sequence on_exit_sleeping_sequence; -// EXPECT_CALL(timeout_state_transition, stop).InSequence(on_exit_sleeping_sequence); -// EXPECT_CALL(timeout_state_internal, stop).InSequence(on_exit_sleeping_sequence); -// EXPECT_CALL(mock_videokit, stopVideo).InSequence(on_exit_sleeping_sequence); -// expectedCallsStopMotors(); - -// on_deep_sleep_timeout(); - -// EXPECT_TRUE(rc.state_machine.is(lksm::state::deep_sleeping)); -// } diff --git a/libs/RobotKit/tests/RobotController_test_stateWorking.cpp b/libs/RobotKit/tests/RobotController_test_stateWorking.cpp deleted file mode 100644 index 50dc44b0ad..0000000000 --- a/libs/RobotKit/tests/RobotController_test_stateWorking.cpp +++ /dev/null @@ -1,184 +0,0 @@ -// Leka - LekaOS -// Copyright 2022 APF France handicap -// SPDX-License-Identifier: Apache-2.0 - -#include "./RobotController_test.h" - -TEST_F(RobotControllerTest, stateWorkingEventTimeout) -{ - Sequence get_on_idle_timeout_callback; - EXPECT_CALL(timeout_state_transition, onTimeout) - .InSequence(get_on_idle_timeout_callback) - .WillOnce(GetCallback(&on_idle_timeout)); - EXPECT_CALL(timeout_state_transition, start).InSequence(get_on_idle_timeout_callback); - rc.startIdleTimeout(); - - rc.state_machine.set_current_states(lksm::state::working); - - Sequence on_exit_working_sequence; - EXPECT_CALL(timeout_state_transition, stop).InSequence(on_exit_working_sequence); - - Sequence on_idle_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(on_idle_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(on_idle_sequence); - EXPECT_CALL(mock_videokit, playVideoOnRepeat).InSequence(on_idle_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(on_idle_sequence); - - on_idle_timeout(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::idle)); -} - -TEST_F(RobotControllerTest, stateWorkingEventChargeDidStartGuardIsChargingTrue) -{ - rc.state_machine.set_current_states(lksm::state::working); - - EXPECT_CALL(battery, isCharging).WillOnce(Return(true)); - - Sequence on_exit_working_sequence; - EXPECT_CALL(timeout_state_transition, stop).InSequence(on_exit_working_sequence); - - Sequence start_deep_sleep_timeout_sequence; - EXPECT_CALL(timeout_state_transition, onTimeout).InSequence(start_deep_sleep_timeout_sequence); - EXPECT_CALL(timeout_state_transition, start).InSequence(start_deep_sleep_timeout_sequence); - - Sequence start_charging_behavior_sequence; - EXPECT_CALL(battery, level).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_videokit, displayImage).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_ledkit, start).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(mock_lcd, turnOn).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, onTimeout).InSequence(start_charging_behavior_sequence); - EXPECT_CALL(timeout_state_internal, start).InSequence(start_charging_behavior_sequence); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)); - - on_charge_did_start(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::charging)); -} - -TEST_F(RobotControllerTest, stateWorkingEventChargeDidStartGuardIsChargingFalse) -{ - rc.state_machine.set_current_states(lksm::state::working); - - EXPECT_CALL(battery, isCharging).WillOnce(Return(false)); - - // TODO: Specify which BLE service and what is expected if necessary - EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)); - - on_charge_did_start(); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::working)); -} - -TEST_F(RobotControllerTest, stateWorkingEventEmergencyStopDelayNotOver) -{ - rc.state_machine.set_current_states(lksm::state::working); - - auto maximal_delay_before_over = 10s; - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(maximal_delay_before_over); - rc.onMagicCardAvailable(MagicCard::emergency_stop); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::working)); -} - -TEST_F(RobotControllerTest, stateWorkingEventEmergencyStopDelayOver) -{ - rc.state_machine.set_current_states(lksm::state::working); - - auto delay_over = 11s; - - Sequence on_exit_working_sequence; - EXPECT_CALL(timeout_state_transition, stop).InSequence(on_exit_working_sequence); - - EXPECT_CALL(mock_motor_left, stop).Times(2); - EXPECT_CALL(mock_motor_right, stop).Times(2); - EXPECT_CALL(mock_belt, hide).Times(1); - EXPECT_CALL(mock_ears, hide).Times(1); - EXPECT_CALL(mock_lcd, turnOff).Times(1); - EXPECT_CALL(mock_videokit, stopVideo).Times(2); - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(delay_over); - rc.onMagicCardAvailable(MagicCard::emergency_stop); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::emergency_stopped)); -} - -TEST_F(RobotControllerTest, stateWorkingDiceRollDetectedDelayNotOver) -{ - rc.state_machine.set_current_states(lksm::state::working); - - auto maximal_delay_before_over = 1s; - - EXPECT_CALL(mock_videokit, displayImage).Times(0); - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(maximal_delay_before_over); - rc.onMagicCardAvailable(MagicCard::dice_roll); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::working)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, stateWorkingDiceRollDetectedDelayOverEventAutonomousActivityRequested) -{ - rc.state_machine.set_current_states(lksm::state::working); - - auto minimal_delay_over = 1001ms; - - Sequence on_exit_working_sequence; - EXPECT_CALL(timeout_state_transition, stop).InSequence(on_exit_working_sequence); - - expectedCallsResetAutonomousActivitiesTimeout(); - EXPECT_CALL(mock_videokit, displayImage).Times(1); - - spy_kernel_addElapsedTimeToTickCount(minimal_delay_over); - rc.onMagicCardAvailable(MagicCard::dice_roll); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::autonomous_activities)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, stateWorkingImpossibleSituationActivityStarted) -{ - rc.state_machine.set_current_states(lksm::state::working); - - auto maximal_delay_before_over = 1s; - - auto set_activitykit_is_playing = [this] { - const std::unordered_map activities {{MagicCard::number_10, &display_tag}}; - activitykit.registerActivities(activities); - EXPECT_CALL(mock_videokit, displayImage).Times(1); - activitykit.start(MagicCard::number_10); - }; - set_activitykit_is_playing(); - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(maximal_delay_before_over); - rc.onMagicCardAvailable(MagicCard::number_0); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::working)); -} - -// ! TODO: Refactor with composite SM & CoreTimer mock -TEST_F(RobotControllerTest, stateWorkingActivityStartedNotPlaying) -{ - rc.state_machine.set_current_states(lksm::state::working); - - auto maximal_delay_before_over = 1s; - - expectedCallsResetAutonomousActivitiesTimeout(); - - spy_kernel_addElapsedTimeToTickCount(maximal_delay_before_over); - rc.onMagicCardAvailable(MagicCard::number_0); - - EXPECT_TRUE(rc.state_machine.is(lksm::state::working)); -}