| 1 | #include "sch/tests/test_internal.h" |
| 2 | |
| 3 | TEST_GROUP_DECLARE(climb, .intensity_desc = { |
| 4 | .curve = SCALE_PIECEWISE_LOG, |
| 5 | .unit = "steps" , |
| 6 | }); |
| 7 | |
| 8 | TEST_DECLARE_UNIT(climb, pressure_cubic_curve, TEST_INTENSITY(20, 100, 1000)) { |
| 9 | /* Pressure p = 0 -> boost target = 0 */ |
| 10 | TEST_ASSERT_EQ_S(TEST_CALL(climb_pressure_to_boost_target)(0), 0); |
| 11 | |
| 12 | size_t steps = ctx->intensity_val ? ctx->intensity_val : 100; |
| 13 | |
| 14 | /* monotonicity: target(p_{i+1}) >= target(p_i) */ |
| 15 | int32_t prev_target = 0; |
| 16 | for (size_t i = 0; i <= steps; i++) { |
| 17 | climb_pressure_t p = fx_div(a: fx_from_int(x: i), b: fx_from_int(x: steps)); |
| 18 | int32_t target = TEST_CALL(climb_pressure_to_boost_target)(p); |
| 19 | TEST_ASSERT_GE_S(target, prev_target); |
| 20 | TEST_ASSERT_LE_S(target, CLIMB_BOOST_LEVEL_MAX); |
| 21 | prev_target = target; |
| 22 | } |
| 23 | |
| 24 | /* Max pressure saturates at CLIMB_BOOST_LEVEL_MAX (20) */ |
| 25 | TEST_ASSERT_EQ_S( |
| 26 | TEST_CALL(climb_pressure_to_boost_target)(CLIMB_PRESSURE_MAX), |
| 27 | CLIMB_BOOST_LEVEL_MAX); |
| 28 | |
| 29 | return TEST_SUCCESS; |
| 30 | } |
| 31 | |