eis/TestProject/RNG/test/test_bool_models.cc

77 lines
2.2 KiB
C++

#include "test_harness.h"
#include <TestProject/RNG/model/BoolToggleModel.h>
#include <TestProject/RNG/model/BoolRandomModel.h>
#include <TestProject/RNG/model/NotModel.h>
#include <TestProject/RNG/model/ConstantModel.h>
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<BoolToggleModel>(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<ConstantModel>(json::object(), 5.0f);
NotModel m(std::move(inner));
CHECK_FLOAT_EQ(m.evaluate(0), 0.0f, 0.001f);
}