#include #include "../src/physics.h" #include "../src/bodies.h" #include "../src/config_loader.h" #include "../src/test_utilities.h" #include TEST_CASE("Orbital period - Earth (RK4)", "[period][rk4]") { const double TIME_STEP = 60.0; const double EXPECTED_PERIOD_DAYS = 365.0; const double SECONDS_PER_DAY = 86400.0; const double MAX_SIMULATION_DAYS = 400.0; SimulationState* sim = create_simulation(10, TIME_STEP); REQUIRE(load_system_config(sim, "tests/configs/earth_circular.toml")); OrbitTracker* tracker = create_orbit_tracker(1); double max_time = MAX_SIMULATION_DAYS * SECONDS_PER_DAY; while (sim->time < max_time && !tracker->orbit_completed) { update_simulation(sim); update_orbit_tracker(tracker, &sim->bodies[1], &sim->bodies[0], sim->time); } REQUIRE(tracker->orbit_completed); double measured_period_days = tracker->time_at_completion / SECONDS_PER_DAY; double period_error_days = fabs(measured_period_days - EXPECTED_PERIOD_DAYS); INFO("Expected period: " << EXPECTED_PERIOD_DAYS << " days"); INFO("Measured period: " << measured_period_days << " days"); INFO("Error: " << period_error_days << " days"); REQUIRE(period_error_days < 5.0); destroy_orbit_tracker(tracker); destroy_simulation(sim); } TEST_CASE("Orbital period - Mars (RK4)", "[period][rk4]") { const double TIME_STEP = 60.0; const double EXPECTED_PERIOD_DAYS = 687.0; const double SECONDS_PER_DAY = 86400.0; const double MAX_SIMULATION_DAYS = 750.0; SimulationState* sim = create_simulation(10, TIME_STEP); REQUIRE(load_system_config(sim, "tests/configs/mars_circular.toml")); OrbitTracker* tracker = create_orbit_tracker(1); double max_time = MAX_SIMULATION_DAYS * SECONDS_PER_DAY; while (sim->time < max_time && !tracker->orbit_completed) { update_simulation(sim); update_orbit_tracker(tracker, &sim->bodies[1], &sim->bodies[0], sim->time); } REQUIRE(tracker->orbit_completed); double measured_period_days = tracker->time_at_completion / SECONDS_PER_DAY; double period_error_days = fabs(measured_period_days - EXPECTED_PERIOD_DAYS); INFO("Expected period: " << EXPECTED_PERIOD_DAYS << " days"); INFO("Measured period: " << measured_period_days << " days"); INFO("Error: " << period_error_days << " days"); REQUIRE(period_error_days < 25.0); destroy_orbit_tracker(tracker); destroy_simulation(sim); }