from __future__ import annotations import unittest from app.main import ( ReactFlowProjectPayload, build_reactflow_system_xml, compile_reactflow_network, run_system_xml_simulation, ) from app.system_xml import validate_system_xml_document from tests.test_generic_system_xml_simulation import component_node, physical_edge from tests.test_system_xml_protocol import physical_port def _storage_nodes(*, source_pressure: float = 500000.0, sink_pressure: float = 100000.0) -> list: return [ component_node( "cylinder_1", "cylinder", [physical_port("port_b", "outlet", "right")], {"volume": 0.01, "p0": source_pressure, "T0": 300.0}, ), component_node( "tank_1", "tank", [physical_port("port_a", "inlet", "left")], {"volume": 0.1, "p0": sink_pressure, "T0": 300.0}, ), ] def _dynamic_pipe_params() -> dict[str, float]: return { "diam": 0.01, "le": 1.0, "rr": 1.0e-5, "k": 1.35, "kth": 0.0, "extemp": 300.0, "gi": 1.0, "mode": 2.0, "p0": 300000.0, "T0": 300.0, } def _resistance_node(name: str) -> object: return component_node( name, "amesim_pnl00r", [ physical_port("port_1", "bidirectional", "left"), physical_port("port_2", "bidirectional", "right"), ], {"diam": 0.01, "le": 0.5, "rr": 1.0e-5, "gi": 1.0}, ) def amesim_pnl0002_project() -> ReactFlowProjectPayload: return ReactFlowProjectPayload( name="amesim-pnl0002-smoke", nodes=[ _storage_nodes()[0], component_node( "pnl_2", "amesim_pnl0002", [ physical_port("port_1", "bidirectional", "left"), physical_port("port_2", "bidirectional", "right"), ], _dynamic_pipe_params(), ), _storage_nodes()[1], ], edges=[ physical_edge("edge-1", "cylinder_1", "port_b", "pnl_2", "port_1"), physical_edge("edge-2", "pnl_2", "port_2", "tank_1", "port_a"), ], simulation={"t_start": 0.0, "t_stop": 0.002, "step": 0.001, "max_step": 0.001, "method": "BDF"}, ) def amesim_pnl0003_project() -> ReactFlowProjectPayload: params = { key: value for key, value in _dynamic_pipe_params().items() if key not in {"p0", "T0"} } params.update({"p1_0": 300000.0, "T1_0": 300.0, "p2_0": 300000.0, "T2_0": 300.0}) return ReactFlowProjectPayload( name="amesim-pnl0003-smoke", nodes=[ _storage_nodes(source_pressure=300000.0, sink_pressure=300000.0)[0], _resistance_node("resistance_1"), component_node( "pnl_3", "amesim_pnl0003", [ physical_port("port_1", "bidirectional", "left"), physical_port("port_2", "bidirectional", "right"), ], params, ), _resistance_node("resistance_2"), _storage_nodes(source_pressure=300000.0, sink_pressure=300000.0)[1], ], edges=[ physical_edge("edge-1", "cylinder_1", "port_b", "resistance_1", "port_1"), physical_edge("edge-2", "resistance_1", "port_2", "pnl_3", "port_1"), physical_edge("edge-3", "pnl_3", "port_2", "resistance_2", "port_1"), physical_edge("edge-4", "resistance_2", "port_2", "tank_1", "port_a"), ], simulation={"t_start": 0.0, "t_stop": 0.002, "step": 0.001, "max_step": 0.001, "method": "BDF"}, ) class AmesimPnl0002Pnl0003XmlTests(unittest.TestCase): def test_pnl0002_reactflow_project_compiles(self) -> None: network = compile_reactflow_network(amesim_pnl0002_project()) self.assertIn("pnl_2", network.components) self.assertEqual(network.components["pnl_2"].model_type, "amesim_pnl0002") self.assertTrue(network.pressure_flow_structure_dict()["isSquare"]) def test_pnl0002_system_xml_validates_and_simulates(self) -> None: xml = build_reactflow_system_xml(amesim_pnl0002_project()) report = validate_system_xml_document(xml) self.assertTrue(report.valid, report.as_dict()) result = run_system_xml_simulation(xml) self.assertTrue(result["success"], result["message"]) self.assertEqual(result["series"]["time"], [0.0, 0.001, 0.002]) self.assertIn("pnl_2.port_1.m_flow", result["series"]) self.assertIn("pnl_2.m", result["series"]) def test_pnl0003_reactflow_project_compiles(self) -> None: network = compile_reactflow_network(amesim_pnl0003_project()) self.assertIn("pnl_3", network.components) self.assertEqual(network.components["pnl_3"].model_type, "amesim_pnl0003") self.assertTrue(network.pressure_flow_structure_dict()["isSquare"]) def test_pnl0003_system_xml_validates_and_simulates(self) -> None: xml = build_reactflow_system_xml(amesim_pnl0003_project()) report = validate_system_xml_document(xml) self.assertTrue(report.valid, report.as_dict()) result = run_system_xml_simulation(xml) self.assertTrue(result["success"], result["message"]) self.assertEqual(result["series"]["time"], [0.0, 0.001, 0.002]) self.assertIn("pnl_3.port_1.m_flow", result["series"]) self.assertIn("pnl_3.dmctr", result["series"]) if __name__ == "__main__": unittest.main()