From 580f177d0b2a3be7a79e0b42b063334c33a6210d Mon Sep 17 00:00:00 2001 From: SmartMonkey Date: Thu, 15 Jan 2026 12:08:15 +0100 Subject: [PATCH 1/3] UO: Add test to validate ontology integration Adds a proof-of-concept test to demonstrate that the application can successfully load and interpret the UO. --- resources/uo/uo.json.gz | Bin 0 -> 23803 bytes src/common.rs | 10 +++++ src/term_id.rs | 7 +++- tests/test_common.rs | 10 ++++- tests/test_io.rs | 79 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 resources/uo/uo.json.gz diff --git a/resources/uo/uo.json.gz b/resources/uo/uo.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..72c32337f448e75524a6eabaec285d414a124e4f GIT binary patch literal 23803 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 for KnownPrefix { @@ -351,6 +352,7 @@ impl PartialEq for KnownPrefix { KnownPrefix::CHEBI => other == "CHEBI", KnownPrefix::NCIT => other == "NCIT", KnownPrefix::PMID => other == "PMID", + KnownPrefix::UO => other == "UO", } } } @@ -369,6 +371,7 @@ impl Display for KnownPrefix { KnownPrefix::CHEBI => f.write_str("CHEBI"), KnownPrefix::NCIT => f.write_str("NCIT"), KnownPrefix::PMID => f.write_str("PMID"), + KnownPrefix::UO => f.write_str("UO"), } } } @@ -401,7 +404,9 @@ impl TryFrom<&str> for KnownPrefix { Ok(KnownPrefix::NCIT) } else if value.starts_with("PMID") { Ok(KnownPrefix::PMID) - } else { + } else if value.starts_with("UO") { + Ok(KnownPrefix::UO) + }else { Err(()) } } diff --git a/tests/test_common.rs b/tests/test_common.rs index e04177d..c8bbf51 100644 --- a/tests/test_common.rs +++ b/tests/test_common.rs @@ -1,4 +1,4 @@ -use ontolius::common::{hpo, go, maxo}; +use ontolius::common::{hpo, go, maxo, uo}; #[test] fn hpo_commons_are_accessible() { @@ -17,4 +17,10 @@ fn go_commons_are_accessible() { #[test] fn maxo_commons_are_accessible() { assert_eq!(maxo::MEDICAL_ACTION, ("MAXO", "0000001")) -} \ No newline at end of file +} + +#[test] +fn uo_commons_are_accessible() { + assert_eq!(uo::UNIT, ("UO", "0000000")) +} + diff --git a/tests/test_io.rs b/tests/test_io.rs index 0084ecd..85e8683 100644 --- a/tests/test_io.rs +++ b/tests/test_io.rs @@ -358,3 +358,82 @@ mod medical_action_ontology { _ = maxo.version(); } } + + +/// Unit of Measurement Ontology (UO) tests. +mod unit_measurement_ontology { + + use std::fs::File; + use std::io::BufReader; + use std::sync::OnceLock; + + use flate2::bufread::GzDecoder; + use ontolius::common::uo::UNIT; + use ontolius::io::OntologyLoaderBuilder; + use ontolius::ontology::csr::MinimalCsrOntology; + use ontolius::ontology::{HierarchyWalks, MetadataAware, OntologyTerms}; + use ontolius::term::MinimalTerm; + use ontolius::TermId; + + const UO_PATH: &str = "resources/uo/uo.json.gz"; + + fn uo() -> &'static MinimalCsrOntology { + static ONTOLOGY: OnceLock = OnceLock::new(); + ONTOLOGY.get_or_init(|| { + let reader = GzDecoder::new(BufReader::new( + File::open(UO_PATH).expect("Obographs JSON file should exist"), + )); + let loader = OntologyLoaderBuilder::new().obographs_parser().build(); + loader.load_from_read(reader).expect("Obographs JSON should be well formatted") + }) + } + + macro_rules! test_ancestors { + ($($ontology: expr, $curie: expr, $expected: expr)*) => { + $( + let query: TermId = $curie.parse().unwrap(); + + let mut names: Vec<_> = $ontology + .iter_ancestor_ids(&query) + .map(|tid| $ontology.term_by_id(tid).map(MinimalTerm::name).unwrap()) + .collect(); + names.sort(); + assert_eq!( + names, + $expected, + ); + )* + }; + } + + #[test] + fn iter_ancestor_ids() { + let uo = uo(); + + test_ancestors!( + uo, + "UO:0010002", // millisiemens + &["conduction unit", "electrical conduction unit", "siemens based unit", "unit"] + ); + test_ancestors!( + uo, + "UO:0000010", // second + &["base unit", "second based unit", "time unit", "unit"] + ); + } + + #[test] + fn we_get_expected_descendant_counts_for_uo_root() { + let uo = uo(); + + let ma_count = uo.iter_descendant_ids(&UNIT).count(); + assert_eq!(ma_count, 549); + } + + #[test] + fn version_parsing() { + let uo = uo(); + + assert_eq!(uo.version(), "2026-01-09") ; + } +} \ No newline at end of file From 645964c4e525e9ed08488406549ef5e739d3c087 Mon Sep 17 00:00:00 2001 From: Daniel Danis Date: Fri, 16 Jan 2026 09:23:29 +0100 Subject: [PATCH 2/3] Minor tweaks --- src/term_id.rs | 2 +- tests/test_io.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/term_id.rs b/src/term_id.rs index b85cb60..a9efa40 100644 --- a/src/term_id.rs +++ b/src/term_id.rs @@ -459,7 +459,7 @@ pub(crate) enum KnownPrefix { CHEBI, NCIT, PMID, - UO + UO, } impl PartialEq for KnownPrefix { diff --git a/tests/test_io.rs b/tests/test_io.rs index 9b97564..985f853 100644 --- a/tests/test_io.rs +++ b/tests/test_io.rs @@ -432,8 +432,8 @@ mod unit_measurement_ontology { fn we_get_expected_descendant_counts_for_uo_root() { let uo = uo(); - let ma_count = uo.iter_descendant_ids(&UNIT).count(); - assert_eq!(ma_count, 549); + let descendant_count = uo.iter_descendant_ids(&UNIT).count(); + assert_eq!(descendant_count, 549); } #[test] From f507c3572cecba7f45c958320767c9d89a3d2672 Mon Sep 17 00:00:00 2001 From: Daniel Danis Date: Fri, 16 Jan 2026 10:34:25 +0100 Subject: [PATCH 3/3] Advertise support for the `UO` in README. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 394a4f4..2209b5d 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,7 @@ At this time, support for the following ontologies is tested: * Human Phenotype Ontology (HPO) * Gene Ontology (GO) * Medical Action Ontology (MAxO) +* Units of Measurement Ontology (UO) Other ontologies are very likely to work too. In case of any problems, please let us know on our [Issue tracker](https://github.com/P2GX/ontolius/issues).