from __future__ import annotations import unittest from pathlib import Path from PythonModels.reporting.amesim_results import load_test_mql_amesim_results from PythonModels.reporting.test_mql_observations import build_test_mql_observation_catalog from PythonModels.reporting.test_mql_output_schema import build_test_mql_output_schema REPO_ROOT = Path(__file__).resolve().parents[1] TEST_MQL_AME = REPO_ROOT / "AmesimModels" / "test_mql.ame" class TestMqlOutputSchemaTests(unittest.TestCase): @classmethod def setUpClass(cls) -> None: cls.amesim_results = load_test_mql_amesim_results(TEST_MQL_AME) cls.observation_catalog = build_test_mql_observation_catalog(cls.amesim_results) cls.schema = build_test_mql_output_schema( cls.amesim_results, observation_catalog=cls.observation_catalog, ) def test_schema_contains_observed_output_data_paths(self) -> None: self.assertEqual(self.schema.signal_count, 858) self.assertEqual(self.schema.data_paths(), self.observation_catalog.data_paths()) self.assertEqual(len(set(self.schema.data_paths())), self.schema.signal_count) def test_counts_by_domain_owner_kind_and_submodel(self) -> None: self.assertEqual( self.schema.counts_by_domain(), {"chambers": 100, "lines": 388, "mechanical": 266, "orifices": 104}, ) self.assertEqual( self.schema.counts_by_owner_kind(), {"component": 470, "connection": 388}, ) self.assertEqual(self.schema.counts_by_submodel()["PNCH012"], 80) self.assertEqual(self.schema.counts_by_submodel()["PNCH023"], 20) self.assertEqual(self.schema.counts_by_submodel()["PNL0001"], 180) self.assertEqual(self.schema.counts_by_submodel()["MECMAS21"], 110) self.assertEqual(self.schema.counts_by_submodel()["LMECHN1"], 34) def test_counts_by_units_preserve_amesim_units(self) -> None: counts = self.schema.counts_by_units() self.assertEqual(counts["m/s"], 108) self.assertEqual(counts[None], 98) self.assertEqual(counts["N"], 92) self.assertEqual(counts["J/s"], 84) self.assertEqual(counts["g/s"], 84) self.assertEqual(counts["Pa"], 84) self.assertEqual(counts["K"], 84) self.assertEqual(counts["cm**3"], 16) self.assertEqual(counts["L/min"], 8) def test_typical_signal_metadata_is_available_by_data_path(self) -> None: chamber = self.schema.by_data_path("press@pn_general_chamber") line = self.schema.by_data_path("dm1@pneumatic_69") mechanical = self.schema.by_data_path("tforce@dynamic_mechanical_node_alternative_2") self.assertEqual(chamber.domain, "chambers") self.assertEqual(chamber.owner_alias, "pn_general_chamber") self.assertEqual(chamber.owner_kind, "component") self.assertEqual(chamber.submodel, "PNCH023") self.assertEqual(chamber.signal_name, "press") self.assertEqual(chamber.units, "Pa") self.assertTrue(chamber.saved) self.assertEqual(line.domain, "lines") self.assertEqual(line.owner_kind, "connection") self.assertEqual(line.submodel, "PNL0001") self.assertEqual(line.units, "g/s") self.assertEqual(mechanical.domain, "mechanical") self.assertEqual(mechanical.submodel, "LMECHN1") self.assertEqual(mechanical.units, "N") def test_data_paths_can_be_selected_by_domain(self) -> None: self.assertEqual(len(self.schema.data_paths_by_domain("chambers")), 100) self.assertEqual(len(self.schema.data_paths_by_domain("orifices")), 104) self.assertEqual(len(self.schema.data_paths_by_domain("lines")), 388) self.assertEqual(len(self.schema.data_paths_by_domain("mechanical")), 266) self.assertEqual(self.schema.data_paths_by_domain("missing"), ()) def test_unknown_data_path_raises_key_error(self) -> None: with self.assertRaises(KeyError): self.schema.by_data_path("not_a_signal@not_an_owner") if __name__ == "__main__": unittest.main()