#include "test_harness.h" #include #include #include #include using json = nlohmann::json; // --- BoolToggleModel --- TEST(toggle_default_period) { // default period_ms=2000 → 100 ticks per period, first 50 true BoolToggleModel m(json::object(), 0.0f); CHECK_EQ(m.evaluateBool(0), true); CHECK_EQ(m.evaluateBool(49), true); CHECK_EQ(m.evaluateBool(50), false); CHECK_EQ(m.evaluateBool(99), false); CHECK_EQ(m.evaluateBool(100), true); // new period } TEST(toggle_custom_period) { // period_ms=40 → 2 ticks per period, first 1 true BoolToggleModel m(json{{"period_ms", 40}}, 0.0f); CHECK_EQ(m.evaluateBool(0), true); CHECK_EQ(m.evaluateBool(1), false); CHECK_EQ(m.evaluateBool(2), true); } TEST(toggle_large_t) { BoolToggleModel m(json {{"period_ms", 2000}}, 0.0f); // After 5000 periods, behavior should hold size_t base = 5000 * 100; CHECK_EQ(m.evaluateBool(base), true); CHECK_EQ(m.evaluateBool(base + 50), false); } // --- BoolRandomModel --- TEST(random_always_true) { BoolRandomModel m(json{{"prob_true", 1.0f}}, 0.0f); for (int i = 0; i < 100; i++) { CHECK_EQ(m.evaluateBool(i), true); } } TEST(random_always_false) { BoolRandomModel m(json{{"prob_true", 0.0f}}, 0.0f); for (int i = 0; i < 100; i++) { CHECK_EQ(m.evaluateBool(i), false); } } TEST(random_default_prob_is_half) { BoolRandomModel m(json::object(), 0.0f); int trues = 0; for (int i = 0; i < 10000; i++) { if (m.evaluateBool(i)) trues++; } // With 10000 samples, true rate should be in [0.35, 0.65] CHECK(trues > 3500); CHECK(trues < 6500); } // --- NotModel --- TEST(not_inverts) { auto inner = std::make_unique(json::object(), 0.0f); NotModel m(std::move(inner)); CHECK_EQ(m.evaluateBool(0), false); // toggle is true at t=0 CHECK_EQ(m.evaluateBool(50), true); // toggle is false at t=50 } TEST(not_evaluate_returns_zero) { auto inner = std::make_unique(json::object(), 5.0f); NotModel m(std::move(inner)); CHECK_FLOAT_EQ(m.evaluate(0), 0.0f, 0.001f); }