from __future__ import annotations import unittest from app.simulation.components.amesim.flow.orifices import AmesimPnvo001FixedOpening from app.simulation.core.medium import IdealGasMedium from app.simulation.registry import COMPONENT_MODEL_REGISTRY class AmesimPnvo001FixedOpeningComponentTests(unittest.TestCase): def setUp(self) -> None: self.medium = IdealGasMedium() def test_default_create_preserves_fixed_opening_contract(self) -> None: valve = COMPONENT_MODEL_REGISTRY["amesim_pnvo001_fixed"].create( "valve_1", self.medium, {}, ) self.assertIsInstance(valve, AmesimPnvo001FixedOpening) self.assertEqual(set(valve.ports), {"port_2", "port_3"}) self.assertEqual( set(valve.parameter_values), {"cq", "area0", "Cv", "Kv", "gi", "flowset", "opening"}, ) self.assertEqual(valve.opening, 1.0) def test_rejects_fractional_flowset(self) -> None: with self.assertRaisesRegex(ValueError, "flowset must be an integer"): COMPONENT_MODEL_REGISTRY["amesim_pnvo001_fixed"].create( "valve_1", self.medium, {"flowset": 1.5}, ) def test_opening_scales_effective_area(self) -> None: valve = AmesimPnvo001FixedOpening( "valve_1", self.medium, area0=2.0e-6, opening=0.25, ) self.assertAlmostEqual(valve.maximum_area, 2.0e-6) self.assertAlmostEqual(valve.effective_area, 0.5e-6) self.assertEqual(valve.component_result_values()["xv"], 0.25) def test_zero_opening_blocks_flow(self) -> None: valve = AmesimPnvo001FixedOpening("valve_1", self.medium, opening=0.0) self.assertEqual(valve.mass_flow(500000.0, 100000.0), 0.0) def test_mass_flow_is_bidirectional_by_pressure_order(self) -> None: valve = AmesimPnvo001FixedOpening("valve_1", self.medium, opening=0.5) forward = valve.mass_flow(500000.0, 100000.0) reverse = valve.mass_flow(100000.0, 500000.0) self.assertGreater(forward, 0.0) self.assertLess(reverse, 0.0) self.assertAlmostEqual(forward, -reverse) if __name__ == "__main__": unittest.main()