use crate::common;
const TLE: [&str; 2] = [
"1 43908U 18111AJ 20146.60805006 .00000806 00000-0 34965-4 0 9999",
"2 43908 97.2676 47.2136 0020001 220.6050 139.3698 15.24999521 78544",
];
const GEOPHS: [f64; 8] = [
1.082616e-3,
-2.53881e-6,
-1.65597e-6,
7.43669161e-2,
120.0,
78.0,
6378.135,
1.0,
];
#[test]
#[serial]
fn getelm() {
common::load();
let (epoch, elements) = spice::getelm(1957, &TLE);
common::assert_ok("getelm");
let expected = spice::str2et("2020-146 // 14:35:35.525 UTC");
assert_relative_eq!(epoch, expected, epsilon = 1.0);
assert_relative_eq!(elements[9], epoch, epsilon = 1e-9);
assert_relative_eq!(elements[5], 0.0020001, epsilon = 1e-9);
assert_relative_eq!(elements[3].to_degrees(), 97.2676, epsilon = 1e-6);
assert_eq!(elements.len(), spice::raw::TLE_NELTS);
common::unload();
}
#[test]
#[serial]
fn evsgp4() {
common::load();
let (epoch, elements) = spice::getelm(1957, &TLE);
let state = spice::evsgp4(epoch, GEOPHS, elements);
common::assert_ok("evsgp4");
let radius = spice::vnorm([state[0], state[1], state[2]]);
let speed = spice::vnorm([state[3], state[4], state[5]]);
assert!(
(6600.0..7200.0).contains(&radius),
"unexpected radius {radius} km"
);
assert_relative_eq!(
speed,
(spice::bodvrd("EARTH", "GM", 1)[0] / radius).sqrt(),
epsilon = 0.2
);
let period = std::f64::consts::TAU / (elements[8] / 60.0);
let opposite = spice::evsgp4(epoch + period / 2.0, GEOPHS, elements);
let separation = spice::vsep(
[state[0], state[1], state[2]],
[opposite[0], opposite[1], opposite[2]],
);
assert_relative_eq!(separation, std::f64::consts::PI, epsilon = 0.05);
assert_eq!(GEOPHS.len(), spice::raw::TLE_NGEOPHS);
common::unload();
}