77 lines
2.2 KiB
C++
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);
|
|
}
|