Files
SystemSimulationApp/tests/test_component_metadata.py

136 lines
5.4 KiB
Python

from __future__ import annotations
import unittest
from app.simulation.components.experimental.flow.orifice import Orifice
from app.simulation.components.experimental.flow.resistive_pipe import ResistivePipe
from app.simulation.components.experimental.junctions.tee import Tee
from app.simulation.components.experimental.storage.cylinder import Cylinder
from app.simulation.components.experimental.storage.tank import Tank
from app.simulation.core.medium import IdealGasMedium
from app.simulation.core.ports import PortVariableDefinition
from app.simulation.registry import COMPONENT_MODEL_REGISTRY
class ComponentMetadataTests(unittest.TestCase):
def setUp(self) -> None:
self.medium = IdealGasMedium()
def component_instances(self):
return (
Cylinder("cylinder_1", self.medium),
Tank("tank_1", self.medium),
ResistivePipe("pipe_1", self.medium),
Orifice("orifice_1"),
Tee("tee_1"),
)
def test_every_component_declares_a_complete_model_contract(self) -> None:
for component in self.component_instances():
with self.subTest(component=component.name):
for attribute in (
"MODEL_TYPE",
"MODEL_VERSION",
"PORTS",
"PARAMETERS",
"RESULT_VARIABLES",
):
self.assertIn(attribute, type(component).__dict__)
self.assertTrue(component.MODEL_TYPE)
self.assertTrue(component.MODEL_VERSION)
self.assertEqual(component.model_type, component.MODEL_TYPE)
self.assertEqual(component.port_definitions, component.PORTS)
self.assertEqual(
set(component.parameter_values),
{definition.name for definition in component.PARAMETERS},
)
self.assertTrue(
all(definition.label for definition in component.PARAMETERS)
)
self.assertTrue(
all(definition.quantity for definition in component.PARAMETERS)
)
def test_registry_reuses_component_parameter_and_port_declarations(self) -> None:
registered_classes = {
"cylinder": Cylinder,
"tank": Tank,
"pipe": ResistivePipe,
"orifice": Orifice,
"tee": Tee,
}
for model_type, component_class in registered_classes.items():
with self.subTest(model_type=model_type):
spec = COMPONENT_MODEL_REGISTRY[model_type]
self.assertEqual(spec.model_type, component_class.MODEL_TYPE)
self.assertEqual(
spec.model_version,
component_class.MODEL_VERSION,
)
self.assertEqual(spec.ports, component_class.PORTS)
self.assertEqual(spec.parameters, component_class.PARAMETERS)
self.assertIs(spec.display, component_class.DISPLAY)
self.assertIs(spec.component_class, component_class)
self.assertIn("create", component_class.__dict__)
component = spec.create(f"{model_type}_1", self.medium, {})
self.assertEqual(
component.parameter_values,
{
definition.name: definition.default
for definition in component_class.PARAMETERS
},
)
def test_result_metadata_exactly_describes_each_exposed_value(self) -> None:
for component in self.component_instances():
with self.subTest(component=component.name):
metadata = component.result_variable_metadata()
keys = [variable.key for variable in metadata]
self.assertEqual(len(keys), len(set(keys)))
self.assertTrue(all(variable.label for variable in metadata))
self.assertTrue(all(variable.quantity for variable in metadata))
def test_storage_and_port_variables_include_display_metadata(self) -> None:
cylinder = Cylinder("cylinder_1", self.medium)
metadata = {
variable.key: variable
for variable in cylinder.result_variable_metadata()
}
pressure = metadata["cylinder_1.p"]
self.assertEqual(pressure.scope, "component")
self.assertEqual(pressure.label, "压力")
self.assertEqual(pressure.quantity, "pressure")
self.assertEqual(pressure.unit, "Pa")
mass_flow = metadata["cylinder_1.port_b.m_flow"]
self.assertEqual(mass_flow.scope, "port")
self.assertEqual(mass_flow.port_name, "port_b")
self.assertEqual(mass_flow.label, "质量流量")
self.assertEqual(mass_flow.quantity, "mass_flow")
self.assertEqual(mass_flow.unit, "kg/s")
def test_port_display_metadata_is_not_part_of_the_physical_contract(self) -> None:
first = PortVariableDefinition(
"p",
"effort",
"equal",
label="压力",
quantity="pressure",
unit="Pa",
)
second = PortVariableDefinition(
"p",
"effort",
"equal",
label="Pressure",
quantity="absolute_pressure",
unit="kPa",
)
self.assertEqual(first, second)
if __name__ == "__main__":
unittest.main()