5.7 KiB
Config Validation Refactoring Plan
Overview
Refactor config validation logic to separate it from parsing logic in config_loader.cpp, creating a dedicated config_validator module.
Phase 1: Create Config Validator Module
Goal: Separate validation logic from parsing logic
Tasks:
-
Create
src/config_validator.hwith function declarations:bool validate_initial_positions(SimulationState* sim)- move from simulationbool validate_mass_ratios(SimulationState* sim)- newbool validate_soi_overlap(SimulationState* sim)- newbool validate_nested_orbits(SimulationState* sim)- newbool run_all_config_validations(SimulationState* sim)- wrapper
-
Create
src/config_validator.cppwith implementations:- Move
validate_initial_positions()fromsimulation.cpp - Implement
validate_mass_ratios()- check parent mass / child mass >= MIN_MASS_RATIO (1000) - Implement
validate_soi_overlap()- for bodies sharing same parent, check ifdistance < (soi_a + soi_b), ERROR if true - Implement
validate_nested_orbits()- for chains like Sun→Earth→Moon, ensure child's orbital radius is < (fraction) of parent's SOI - Implement
run_all_config_validations()- calls all validators and returns false if any fail
- Move
Design Decisions:
- SOI overlap: ERROR (reject configs with overlapping SOIs)
- Mass ratio threshold: MACRO/DEFINE for easy adjustment (default 1000)
- Nested orbit check: Use SOI (not Hill sphere), check
child_semi_major_axis < (0.5 * parent_soi_radius)
Phase 2: Update Existing Modules
Tasks:
-
Update
src/config_loader.h:- Add
#include "config_validator.h"
- Add
-
Update
src/config_loader.cpp:- Replace call to
validate_initial_positions(sim)(line 281) withrun_all_config_validations(sim) - Move inline validation blocks into separate functions in
config_validator.cpp:validate_parent_index_ordering()validate_orbital_elements()
- Keep parsing functions (
parse_toml_body,parse_toml_spacecraft, etc.) focused on TOML parsing only
- Replace call to
-
Update
src/simulation.h:- Remove declaration of
validate_initial_positions()
- Remove declaration of
-
Update
src/simulation.cpp:- Remove implementation of
validate_initial_positions()(lines 181-219)
- Remove implementation of
Phase 3: Update Tests
Tasks:
-
Update
tests/test_invalid_parent_assignment.cpp:-
Test 1 ("Earth should not become child of spacecraft"): DELETE
- Spacecraft are now in separate array
- Cannot become parent to bodies
-
Test 2 ("Massive bodies never become children of small bodies"): UPDATE
- Create new test config with small comet orbiting Earth/Mars
- Test should now call
load_system_config()which will runvalidate_mass_ratios() - Config should fail if mass ratio < 1000
-
Test 3 ("Detect placeholder config values"): DELETE
- This checked distance validation which is now in
validate_initial_positions() - Validation happens at load time, not needed as separate test
- This checked distance validation which is now in
-
Test 4 ("Mutual SOI"): UPDATE to expect load failure
- Keep
mutual_soi_close.tomlas-is (invalid config) - Test should expect
load_system_config()to fail - Verify error message about SOI overlap
- Keep
-
-
Update
tests/configs/:- Create new config for Test 2 (small comet around Earth/Mars with mass ratio < 1000)
- Keep
mutual_soi_close.tomlas-is (invalid for Test 4)
Phase 4: Update Build System
Tasks:
- Update
Makefile:- Add
config_validator.oto build target - Update dependencies for
orbit_simandorbit_test
- Add
File Changes Summary
New Files:
src/config_validator.hsrc/config_validator.cpp
Modified Files:
src/config_loader.hsrc/config_loader.cppsrc/simulation.hsrc/simulation.cppMakefiletests/test_invalid_parent_assignment.cpp
New Test Configs:
tests/configs/small_comet_bad_mass_ratio.toml(invalid config for Test 2)
Existing Test Configs (keep as-is):
tests/configs/mutual_soi_close.toml(invalid config for Test 4)
Implementation Order
- Create config_validator module (Phase 1)
- Update simulation and config_loader (Phase 2)
- Update build system (Phase 4 - test compile)
- Update tests and configs (Phase 3)
- Run full test suite to verify changes
Validation Logic Details
validate_mass_ratios(SimulationState* sim)
- For all bodies with parent_index >= 0:
- Calculate ratio = parent_mass / child_mass
- If ratio < MIN_MASS_RATIO (1000), print error and return false
- Skip check for spacecraft (they have their own validation)
validate_soi_overlap(SimulationState* sim)
- For all pairs of bodies sharing the same parent:
- Calculate distance between their orbital positions
- Calculate sum of their SOI radii
- If distance < (soi_a + soi_b), print error and return false
validate_nested_orbits(SimulationState* sim)
- For all bodies with parent that is not root (parent_index != 0):
- Calculate child's orbital radius (semi_major_axis)
- Get parent's SOI radius
- If child_semi_major_axis > (0.5 * parent_soi_radius), print error and return false
- Ensures child is well within parent's gravitational dominance region
run_all_config_validations(SimulationState* sim)
- Calls all validators in sequence:
- validate_parent_index_ordering()
- validate_orbital_elements()
- validate_mass_ratios()
- validate_soi_overlap()
- validate_nested_orbits()
- validate_initial_positions()
- Returns false if any validator fails
- Stops on first failure for efficiency
Constants and Thresholds
#define MIN_MASS_RATIO 1000.0
#define NESTED_ORBIT_FRACTION 0.5 // Child orbit must be < 50% of parent SOI