1#include "sch/tests/test_internal.h"
2
3TEST_GROUP_DECLARE(climb, .intensity_desc = {
4 .curve = SCALE_PIECEWISE_LOG,
5 .unit = "steps",
6 });
7
8TEST_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