#[path = "test_cases.rs"] mod test_cases; use test_cases::*; #[test] fn propagate() -> anyhow::Result<()> { let test_cases: TestCases = toml::from_str(include_str!("test_cases.toml")).unwrap(); for test_case in test_cases.list.iter() { #[cfg(feature = "alloc")] let element = sgp4::Elements::from_tle(None, test_case.line1.as_bytes(), test_case.line2.as_bytes()) .map_err(|error| anyhow::anyhow!("{error}"))?; #[cfg(not(feature = "alloc"))] let element = sgp4::Elements::from_tle(test_case.line1.as_bytes(), test_case.line2.as_bytes()) .map_err(|error| anyhow::anyhow!("{error}"))?; let constants = sgp4::Constants::from_elements_afspc_compatibility_mode(&element) .map_err(|error| anyhow::anyhow!("{error}"))?; for state in &test_case.states { match state { State::Ok { time, position, velocity, .. } => { let prediction = constants .propagate_afspc_compatibility_mode(sgp4::MinutesSinceEpoch(*time)) .map_err(|error| anyhow::anyhow!("{error}"))?; for index in 0..3 { assert!((position[index] - prediction.position[index]).abs() < 1.0e-6); assert!((velocity[index] - prediction.velocity[index]).abs() < 1.0e-9); } } State::Err { time, error } => { let prediction = constants .propagate_afspc_compatibility_mode(sgp4::MinutesSinceEpoch(*time)); if let Err(prediction_error) = prediction { match prediction_error { sgp4::Error::OutOfRangePerturbedEccentricity { eccentricity: _, t } => { if error != "diverging perturbed eccentricity" { panic!( "bad error type (expected {}, got {:?})", error, prediction_error ); } else { assert_eq!(*time, t); } } sgp4::Error::NegativeSemiLatusRectum { t } => { if error != "negative semi-latus rectum" { panic!( "bad error type (expected {}, got {:?})", error, prediction_error ); } else { assert_eq!(*time, t); } } _ => panic!( "bad error type (expected {}, got {:?})", error, prediction_error ), } } else { panic!("propagation should have returned an error"); } } } } } Ok(()) }