#include "test_harness.h" #include #include using json = nlohmann::json; TEST(sine_at_zero) { SineModel m(json::object(), 0.0f); CHECK_FLOAT_EQ(m.evaluate(0), 0.0f, 0.001f); } TEST(sine_basic) { // A=1, omega=π/2, phi=0 → sin(π/2 * t) float omega = M_PI / 2.0f; SineModel m(json{{"A", 1.0f}, {"omega", omega}}, 0.0f); CHECK_FLOAT_EQ(m.evaluate(0), 0.0f, 0.001f); // sin(0)=0 CHECK_FLOAT_EQ(m.evaluate(1), 1.0f, 0.001f); // sin(π/2)=1 CHECK_FLOAT_EQ(m.evaluate(2), 0.0f, 0.01f); // sin(π)=0 CHECK_FLOAT_EQ(m.evaluate(3), -1.0f, 0.001f); // sin(3π/2)=-1 } TEST(sine_with_offset) { float omega = M_PI / 2.0f; SineModel m(json{{"A", 1.0f}, {"omega", omega}}, 100.0f); CHECK_FLOAT_EQ(m.evaluate(1), 101.0f, 0.001f); // sin(π/2)=1 + 100 CHECK_FLOAT_EQ(m.evaluate(3), 99.0f, 0.001f); // sin(3π/2)=-1 + 100 } TEST(sine_zero_amplitude) { SineModel m(json{{"A", 0.0f}, {"omega", 1.0f}}, 5.0f); CHECK_FLOAT_EQ(m.evaluate(0), 5.0f, 0.001f); CHECK_FLOAT_EQ(m.evaluate(100), 5.0f, 0.001f); } TEST(sine_with_phase) { // phi=π/2 → sin(ωt + π/2) = cos(ωt). At t=0: cos(0)=1 float phi = M_PI / 2.0f; SineModel m(json{{"A", 1.0f}, {"omega", 0.0f}, {"phi", phi}}, 0.0f); CHECK_FLOAT_EQ(m.evaluate(0), 1.0f, 0.001f); } TEST(sine_negative_amplitude) { float omega = M_PI / 2.0f; SineModel m(json{{"A", -2.0f}, {"omega", omega}}, 0.0f); CHECK_FLOAT_EQ(m.evaluate(1), -2.0f, 0.001f); }