Skip to content

Commit 9d2c6df

Browse files
committed
feat: add lox-test-utils crate and refine EOP parser interface
1 parent 7290cc0 commit 9d2c6df

File tree

18 files changed

+112
-93
lines changed

18 files changed

+112
-93
lines changed

Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ lox-io = { path = "crates/lox-io", version = "0.1.0-alpha.8" }
2020
lox-math = { path = "crates/lox-math", version = "0.1.0-alpha.8" }
2121
lox-orbits = { path = "crates/lox-orbits", version = "0.1.0-alpha.20" }
2222
lox-space = { path = "crates/lox-space", version = "0.1.0-alpha.27" }
23+
lox-test-utils = { path = "crates/lox-test-utils", version = "0.1.0-alpha.0"}
2324
lox-time = { path = "crates/lox-time", version = "0.1.0-alpha.10" }
2425
lox-units = { path = "crates/lox-units", version = "0.1.0-alpha.0" }
2526

crates/lox-earth/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@ serde.workspace = true
2323
thiserror.workspace = true
2424

2525
[dev-dependencies]
26+
lox-test-utils.workspace = true
2627
float_eq.workspace = true
2728
rstest.workspace = true

crates/lox-earth/src/iers.rs

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,7 @@ impl From<csv::Error> for EopParserError {
7676

7777
#[derive(Default)]
7878
pub struct EopParser {
79-
iau1980: Option<PathBuf>,
80-
iau2000: Option<PathBuf>,
79+
paths: (Option<PathBuf>, Option<PathBuf>),
8180
lsp: Option<Box<dyn LeapSecondsProvider>>,
8281
}
8382

@@ -86,28 +85,28 @@ impl EopParser {
8685
Self::default()
8786
}
8887

89-
pub fn with_iau1980(&mut self, path: impl AsRef<Path>) -> &mut Self {
90-
self.iau1980 = Some(path.as_ref().to_owned());
88+
pub fn from_path(&mut self, path: impl AsRef<Path>) -> &mut Self {
89+
self.paths = (Some(path.as_ref().to_owned()), None);
9190
self
9291
}
9392

94-
pub fn with_iau2000(&mut self, path: impl AsRef<Path>) -> &mut Self {
95-
self.iau2000 = Some(path.as_ref().to_owned());
93+
pub fn from_paths(&mut self, path1: impl AsRef<Path>, path2: impl AsRef<Path>) -> &mut Self {
94+
self.paths = (
95+
Some(path1.as_ref().to_owned()),
96+
Some(path2.as_ref().to_owned()),
97+
);
9698
self
9799
}
98100

99-
pub fn with_leap_seconds_provider(&mut self, lsp: Box<dyn LeapSecondsProvider>) -> &mut Self {
101+
pub fn leap_seconds_provider(&mut self, lsp: Box<dyn LeapSecondsProvider>) -> &mut Self {
100102
self.lsp = Some(lsp);
101103
self
102104
}
103105

104106
pub fn parse(&self) -> Result<EopProvider, EopParserError> {
105-
let n = if let Some(iau1980) = self.iau1980.as_ref() {
107+
let n = if let Some(iau1980) = self.paths.0.as_ref() {
106108
let mut reader = ReaderBuilder::new().delimiter(b';').from_path(iau1980)?;
107109
reader.records().count()
108-
} else if let Some(iau2000) = self.iau2000.as_ref() {
109-
let mut reader = ReaderBuilder::new().delimiter(b';').from_path(iau2000)?;
110-
reader.records().count()
111110
} else {
112111
return Err(EopParserError::NoFiles);
113112
};
@@ -123,10 +122,10 @@ impl EopParser {
123122

124123
let mut rdr1 = ReaderBuilder::new()
125124
.delimiter(b';')
126-
.from_path(self.iau1980.as_ref().or(self.iau2000.as_ref()).unwrap())?;
125+
.from_path(self.paths.0.as_ref().unwrap())?;
127126
let mut rdr2 = ReaderBuilder::new()
128127
.delimiter(b';')
129-
.from_path(self.iau2000.as_ref().or(self.iau1980.as_ref()).unwrap())?;
128+
.from_path(self.paths.1.as_ref().or(self.paths.0.as_ref()).unwrap())?;
130129
let mut raw1 = ByteRecord::new();
131130
let mut raw2 = ByteRecord::new();
132131
let headers = rdr1.byte_headers()?.clone();
@@ -315,3 +314,39 @@ impl EopProvider {
315314
Ok(-TimeDelta::try_from_decimal_seconds(val).unwrap())
316315
}
317316
}
317+
318+
#[cfg(test)]
319+
mod tests {
320+
use lox_test_utils::data_dir;
321+
use lox_time::{Time, time_scales::Tai};
322+
323+
use super::*;
324+
325+
#[test]
326+
#[should_panic(expected = "NoFiles")]
327+
fn test_eop_parser_no_files() {
328+
EopParser::new().parse().unwrap();
329+
}
330+
331+
#[test]
332+
#[should_panic(expected = "MissingIau2000")]
333+
fn test_eop_provider_missing_iau2000() {
334+
let t: Time<Tai> = Time::default();
335+
let eop = EopParser::new()
336+
.from_path(data_dir().join("finals.all.csv"))
337+
.parse()
338+
.unwrap();
339+
eop.nutation_precession_iau2000(t).unwrap();
340+
}
341+
342+
#[test]
343+
#[should_panic(expected = "MissingIau1980")]
344+
fn test_eop_provider_missing_iau1980() {
345+
let t: Time<Tai> = Time::default();
346+
let eop = EopParser::new()
347+
.from_path(data_dir().join("finals2000A.all.csv"))
348+
.parse()
349+
.unwrap();
350+
eop.nutation_precession_iau1980(t).unwrap();
351+
}
352+
}

crates/lox-earth/src/ut1.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,13 @@ mod tests {
182182
use float_eq::assert_float_eq;
183183
use lox_math::assert_close;
184184
use lox_math::is_close::IsClose;
185+
use lox_test_utils::data_dir;
185186
use lox_time::Time;
186187
use lox_time::deltas::ToDelta;
187188
use lox_time::subsecond::Subsecond;
188189
use lox_time::time;
189190
use lox_time::time_scales::Ut1;
191+
use lox_time::utc::leap_seconds::BuiltinLeapSeconds;
190192
use lox_time::utc::transformations::ToUtc;
191193
use lox_time::{DynTime, calendar_dates::Date, time_of_day::TimeOfDay};
192194
use rstest::{fixture, rstest};
@@ -389,14 +391,11 @@ mod tests {
389391
static PROVIDER: OnceLock<EopProvider> = OnceLock::new();
390392
PROVIDER.get_or_init(|| {
391393
EopParser::new()
392-
.with_iau1980(format!(
393-
"{}/../../data/finals.all.csv",
394-
env!("CARGO_MANIFEST_DIR")
395-
))
396-
.with_iau2000(format!(
397-
"{}/../../data/finals2000A.all.csv",
398-
env!("CARGO_MANIFEST_DIR")
399-
))
394+
.from_paths(
395+
data_dir().join("finals.all.csv"),
396+
data_dir().join("finals2000A.all.csv"),
397+
)
398+
.leap_seconds_provider(Box::new(BuiltinLeapSeconds))
400399
.parse()
401400
.unwrap()
402401
})

crates/lox-orbits/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,5 @@ sgp4.workspace = true
2828
thiserror.workspace = true
2929

3030
[dev-dependencies]
31+
lox-test-utils.workspace = true
3132
rstest.workspace = true

crates/lox-orbits/src/analysis.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -483,11 +483,11 @@ mod tests {
483483
use lox_ephem::spk::parser::{Spk, parse_daf_spk};
484484
use lox_math::assert_close;
485485
use lox_math::is_close::IsClose;
486+
use lox_test_utils::data_dir;
486487
use lox_time::Time;
487488
use lox_time::time_scales::Tai;
488489
use lox_time::utc::Utc;
489490
use std::iter::zip;
490-
use std::path::PathBuf;
491491
use std::sync::OnceLock;
492492

493493
use super::*;
@@ -703,8 +703,4 @@ mod tests {
703703
static EPHEMERIS: OnceLock<Spk> = OnceLock::new();
704704
EPHEMERIS.get_or_init(|| parse_daf_spk(&contents).unwrap())
705705
}
706-
707-
pub fn data_dir() -> PathBuf {
708-
PathBuf::from(format!("{}/../../data", env!("CARGO_MANIFEST_DIR")))
709-
}
710706
}

crates/lox-orbits/src/states.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -403,14 +403,15 @@ impl DynState {
403403

404404
#[cfg(test)]
405405
mod tests {
406-
use std::{path::PathBuf, sync::OnceLock};
406+
use std::sync::OnceLock;
407407

408408
use float_eq::assert_float_eq;
409409

410410
use lox_bodies::{Earth, Jupiter, Venus};
411411
use lox_ephem::spk::parser::{Spk, parse_daf_spk};
412412
use lox_math::assert_close;
413413
use lox_math::is_close::IsClose;
414+
use lox_test_utils::data_dir;
414415
use lox_time::{Time, offsets::DefaultOffsetProvider, time, time_scales::Tdb, utc::Utc};
415416

416417
use super::*;
@@ -489,10 +490,6 @@ mod tests {
489490
assert_float_eq!(ground.altitude(), alt_exp, rel <= 1e-4);
490491
}
491492

492-
pub fn data_dir() -> PathBuf {
493-
PathBuf::from(format!("{}/../../data", env!("CARGO_MANIFEST_DIR")))
494-
}
495-
496493
#[test]
497494
fn test_state_to_origin() {
498495
let r_venus = DVec3::new(

crates/lox-space/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ rayon = { workspace = true, optional = true }
3030
sgp4 = { workspace = true, optional = true }
3131

3232
[dev-dependencies]
33+
lox-test-utils.workspace = true
3334
float_eq.workspace = true
3435
pyo3 = { workspace = true, features = ["auto-initialize"] }
3536
rstest.workspace = true

crates/lox-space/lox_space.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ class UTC:
343343
) -> Time: ...
344344

345345
class EOPProvider:
346-
def __new__(cls, iau1980: os.PathLike | None = None, iau2000: os.PathLike | None = None): ...
346+
def __new__(cls, *args: os.PathLike): ...
347347

348348
class Series:
349349
def __new__(

0 commit comments

Comments
 (0)