@@ -8,29 +8,6 @@ extern "C" {
8
8
#include < Application/mode_handler.h>
9
9
}
10
10
11
- TEST (TEST_NAME, all_ok) {
12
- auto imuHandle = mock::imu.getHandle ();
13
- auto flightcomputerHandle = mock::flightcomputer.getHandle ();
14
- auto remoteHandle = mock::remote.getHandle ();
15
- auto errorHandlerHandle = mock::error_handler.getHandle ();
16
-
17
- imuHandle.overrideFunc <imu_data_available>([]() { return true ; });
18
- imuHandle.overrideFunc <imu_get_latest_data>([]() { return imu_data_t {.imu_ok = true }; });
19
- remoteHandle.overrideFunc <remote_data_available>([]() { return true ; });
20
- remoteHandle.overrideFunc <remote_get_data>(
21
- []() { return remote_data_t {.is_armed = true , .override_active = false , .remote_ok = true }; });
22
- flightcomputerHandle.overrideFunc <flightcomputer_setpoint_available>([]() { return true ; });
23
- flightcomputerHandle.overrideFunc <flightcomputer_get_setpoint>([]() { return flightcomputer_setpoint_t {}; });
24
-
25
- mode_handler_init ();
26
-
27
- imu_data_t imuData;
28
- remote_data_t remoteData;
29
- flightcomputer_setpoint_t flightcomputerSetpoint;
30
-
31
- EXPECT_EQ (mode_handler_handle (&imuData, &remoteData, &flightcomputerSetpoint), MODE_FLIGHTCOMPUTER);
32
- }
33
-
34
11
TEST (TEST_NAME, imu_initial_timeout) {
35
12
auto imuHandle = mock::imu.getHandle ();
36
13
auto flightcomputerHandle = mock::flightcomputer.getHandle ();
@@ -380,3 +357,87 @@ TEST(TEST_NAME, fcp_timeout) {
380
357
EXPECT_FALSE (errorHandlerHandle.functionGotCalled <error_handler_handle_warning>(MODE_HANDLER,
381
358
MODE_HANDLER_ERROR_NO_FCP_DATA));
382
359
}
360
+
361
+ TEST (TEST_NAME, modeselection) {
362
+ auto imuHandle = mock::imu.getHandle ();
363
+ auto flightcomputerHandle = mock::flightcomputer.getHandle ();
364
+ auto remoteHandle = mock::remote.getHandle ();
365
+ auto errorHandlerHandle = mock::error_handler.getHandle ();
366
+
367
+ imuHandle.overrideFunc <imu_data_available>([]() { return true ; });
368
+ remoteHandle.overrideFunc <remote_data_available>([]() { return true ; });
369
+ flightcomputerHandle.overrideFunc <flightcomputer_get_setpoint>([]() { return flightcomputer_setpoint_t {}; });
370
+
371
+ struct availability_values {
372
+ bool imu, remote, fcp, override , arm;
373
+ };
374
+
375
+ const std::vector<std::pair<availability_values, mode_handler_mode_t >> decisionTable{
376
+ {{false , false , false , false , false }, MODE_FAILSAVE},
377
+ {{false , false , false , false , true }, MODE_FAILSAVE},
378
+ {{false , false , false , true , false }, MODE_FAILSAVE},
379
+ {{false , false , false , true , true }, MODE_FAILSAVE},
380
+ {{false , false , true , false , false }, MODE_FAILSAVE},
381
+ {{false , false , true , false , true }, MODE_FAILSAVE},
382
+ {{false , false , true , true , false }, MODE_FAILSAVE},
383
+ {{false , false , true , true , true }, MODE_FAILSAVE},
384
+ {{false , true , false , false , false }, MODE_REMOTE},
385
+ {{false , true , false , false , true }, MODE_REMOTE},
386
+ {{false , true , false , true , false }, MODE_REMOTE},
387
+ {{false , true , false , true , true }, MODE_REMOTE},
388
+ {{false , true , true , false , false }, MODE_REMOTE},
389
+ {{false , true , true , false , true }, MODE_REMOTE},
390
+ {{false , true , true , true , false }, MODE_REMOTE},
391
+ {{false , true , true , true , true }, MODE_REMOTE},
392
+ {{true , false , false , false , false }, MODE_STABILISED_FAILSAVE},
393
+ {{true , false , false , false , true }, MODE_STABILISED_FAILSAVE},
394
+ {{true , false , false , true , false }, MODE_STABILISED_FAILSAVE},
395
+ {{true , false , false , true , true }, MODE_STABILISED_FAILSAVE},
396
+ {{true , false , true , false , false }, MODE_STABILISED_FAILSAVE},
397
+ {{true , false , true , false , true }, MODE_STABILISED_FAILSAVE},
398
+ {{true , false , true , true , false }, MODE_STABILISED_FAILSAVE},
399
+ {{true , false , true , true , true }, MODE_STABILISED_FAILSAVE},
400
+ {{true , true , false , false , false }, MODE_REMOTE},
401
+ {{true , true , false , false , true }, MODE_REMOTE},
402
+ {{true , true , false , true , false }, MODE_REMOTE},
403
+ {{true , true , false , true , true }, MODE_REMOTE},
404
+ {{true , true , true , false , false }, MODE_STABILISED_FAILSAVE},
405
+ {{true , true , true , false , true }, MODE_FLIGHTCOMPUTER},
406
+ {{true , true , true , true , false }, MODE_REMOTE},
407
+ {{true , true , true , true , true }, MODE_REMOTE},
408
+ };
409
+
410
+ for (auto [availability_value, expected_mode] : decisionTable) {
411
+ mode_handler_init ();
412
+ imuHandle.overrideFunc <imu_get_latest_data>(
413
+ [availability_value]() { return imu_data_t {.imu_ok = availability_value.imu }; });
414
+ remoteHandle.overrideFunc <remote_get_data>([availability_value]() {
415
+ return remote_data_t {.is_armed = availability_value.arm ,
416
+ .override_active = availability_value.override ,
417
+ .remote_ok = availability_value.remote };
418
+ });
419
+ flightcomputerHandle.overrideFunc <flightcomputer_setpoint_available>(
420
+ [availability_value]() { return availability_value.fcp ; });
421
+
422
+ imu_data_t imuData;
423
+ remote_data_t remoteData;
424
+ flightcomputer_setpoint_t flightcomputerSetpoint;
425
+ EXPECT_EQ (mode_handler_handle (&imuData, &remoteData, &flightcomputerSetpoint), expected_mode);
426
+ if (!availability_value.remote ) {
427
+ EXPECT_TRUE (errorHandlerHandle.functionGotCalled <error_handler_handle_warning>(
428
+ MODE_HANDLER, MODE_HANDLER_ERROR_NO_REMOTE_DATA));
429
+ }
430
+ if (!availability_value.imu ) {
431
+ EXPECT_TRUE (errorHandlerHandle.functionGotCalled <error_handler_handle_warning>(
432
+ MODE_HANDLER, MODE_HANDLER_ERROR_NO_IMU_DATA));
433
+ }
434
+ if (!availability_value.fcp ) {
435
+ EXPECT_TRUE (errorHandlerHandle.functionGotCalled <error_handler_handle_warning>(
436
+ MODE_HANDLER, MODE_HANDLER_ERROR_NO_FCP_DATA));
437
+ }
438
+ }
439
+ }
440
+
441
+ TEST (TEST_NAME, fill_out_vars) {
442
+ EXPECT_FALSE (true );
443
+ }
0 commit comments