#include "test_harness.h" #include using json = nlohmann::json; TEST(linear_basic) { LinearModel m(json{{"k", 2.0f}}, 0.0f); CHECK_FLOAT_EQ(m.evaluate(0), 0.0f, 0.001f); CHECK_FLOAT_EQ(m.evaluate(1), 2.0f, 0.001f); CHECK_FLOAT_EQ(m.evaluate(5), 10.0f, 0.001f); } TEST(linear_default_k_is_zero) { LinearModel m(json::object(), 50.0f); CHECK_FLOAT_EQ(m.evaluate(0), 50.0f, 0.001f); CHECK_FLOAT_EQ(m.evaluate(100), 50.0f, 0.001f); } TEST(linear_negative_k) { LinearModel m(json{{"k", -1.0f}}, 10.0f); CHECK_FLOAT_EQ(m.evaluate(0), 10.0f, 0.001f); CHECK_FLOAT_EQ(m.evaluate(3), 7.0f, 0.001f); } TEST(linear_with_period) { // period_ms=100 → 5 ticks per period LinearModel m(json{{"k", 1.0f}, {"period_ms", 100}}, 0.0f); CHECK_FLOAT_EQ(m.evaluate(0), 0.0f, 0.001f); CHECK_FLOAT_EQ(m.evaluate(4), 4.0f, 0.001f); CHECK_FLOAT_EQ(m.evaluate(5), 0.0f, 0.001f); // wraps CHECK_FLOAT_EQ(m.evaluate(7), 2.0f, 0.001f); // 7%5=2 } TEST(linear_no_period) { LinearModel m(json{{"k", 0.5f}}, 100.0f); CHECK_FLOAT_EQ(m.evaluate(10), 105.0f, 0.001f); CHECK_FLOAT_EQ(m.evaluate(1000), 600.0f, 0.001f); } TEST(linear_large_values) { LinearModel m(json{{"k", 0.001f}}, 0.0f); CHECK_FLOAT_EQ(m.evaluate(100000), 100.0f, 0.01f); }