Coverage for tests/cim_converter/unit/test_transformer_tank_impedances.py: 100%
80 statements
« prev ^ index » next coverage.py v7.10.6, created at 2025-11-13 17:34 -0800
« prev ^ index » next coverage.py v7.10.6, created at 2025-11-13 17:34 -0800
1import pytest
2from cimgraph.data_profile import cimhub_2023 as cim
3from distopf.cim_importer.processors.transformer_processor import TransformerProcessor
6def make_tank_end_with_basevoltage(nominal_voltage: float = 480.0):
7 # Construct minimal TransformerTankEnd and set attributes after
8 base_voltage = cim.BaseVoltage()
9 base_voltage.nominalVoltage = float(nominal_voltage)
10 tank_end = cim.TransformerTankEnd()
11 tank_end.BaseVoltage = base_voltage
12 tank_end.FromMeshImpedance = []
13 tank_end.orderedPhases = cim.OrderedPhaseCodeKind(value="AN")
14 tank_end.StarImpedance = None
15 tank_end.r = None
16 tank_end.x = None
17 return tank_end
20def test_transformer_tank_frommeshimpedance_used_for_impedance():
21 tp = TransformerProcessor(1e6)
22 mesh_imp = cim.TransformerMeshImpedance()
23 mesh_imp.r = 0.2
24 mesh_imp.x = 0.4
25 tank_end = make_tank_end_with_basevoltage(480.0)
26 tank_end.FromMeshImpedance = [mesh_imp]
27 tank = cim.TransformerTank(name="tank1", TransformerTankEnds=[tank_end])
28 xfmr_like = cim.PowerTransformer(TransformerTanks=[tank])
30 data = {}
31 tp._process_transformer_tank_impedance(xfmr_like, data)
32 v_base = float(tank_end.BaseVoltage.nominalVoltage)
33 v_ln_base = v_base / (3**0.5)
34 z_base = v_ln_base**2 / tp.s_base
35 expected_r = float(mesh_imp.r) / z_base
36 expected_x = float(mesh_imp.x) / z_base
37 assert pytest.approx(data["raa"], rel=1e-9) == expected_r
38 assert pytest.approx(data["xaa"], rel=1e-9) == expected_x
39 assert data["phases"]
42def test_transformer_tank_starimpedance_used_for_impedance():
43 tp = TransformerProcessor(1e6)
44 star_imp = cim.TransformerStarImpedance()
45 star_imp.r = 0.12
46 star_imp.x = 0.24
47 tank_end = make_tank_end_with_basevoltage(480.0)
48 tank_end.StarImpedance = star_imp
49 tank = cim.TransformerTank(name="tank_star", TransformerTankEnds=[tank_end])
50 xfmr_like = cim.PowerTransformer(TransformerTanks=[tank])
52 data = {}
53 tp._process_transformer_tank_impedance(xfmr_like, data)
54 v_base = float(tank_end.BaseVoltage.nominalVoltage)
55 v_ln = v_base / (3**0.5)
56 z_base = v_ln**2 / tp.s_base
57 expected_r = float(star_imp.r) / z_base
58 expected_x = float(star_imp.x) / z_base
59 assert pytest.approx(data["raa"], rel=1e-9) == expected_r
60 assert pytest.approx(data["xaa"], rel=1e-9) == expected_x
63def test_transformer_tank_direct_attributes_and_default_fallback():
64 tp = TransformerProcessor(1e6)
65 tank_end = cim.TransformerTankEnd()
66 # Set BaseVoltage and direct r/x attributes on the end
67 tank_end.BaseVoltage = cim.BaseVoltage()
68 tank_end.BaseVoltage.nominalVoltage = 480.0
69 tank_end.FromMeshImpedance = []
70 tank_end.StarImpedance = None
71 tank_end.r = 0.05
72 tank_end.x = 0.06
73 tank = cim.TransformerTank(name="tank_direct", TransformerTankEnds=[tank_end])
74 xfmr_like = cim.PowerTransformer(TransformerTanks=[tank])
75 data = {}
76 tp._process_transformer_tank_impedance(xfmr_like, data)
77 v_base = float(tank_end.BaseVoltage.nominalVoltage)
78 z_base = (v_base / (3**0.5)) ** 2 / tp.s_base
79 expected_r = float(tank_end.r) / z_base
80 expected_x = float(tank_end.x) / z_base
81 assert pytest.approx(data["raa"], rel=1e-9) == expected_r
82 assert pytest.approx(data["xaa"], rel=1e-9) == expected_x
84 # Now fallback default when no impedance found
85 empty_tank_end = cim.TransformerTankEnd()
86 empty_tank_end.BaseVoltage = None
87 empty_tank_end.FromMeshImpedance = []
88 empty_tank_end.StarImpedance = None
89 empty_tank = cim.TransformerTank(
90 name="tank_empty", TransformerTankEnds=[empty_tank_end]
91 )
92 xfmr_empty = cim.PowerTransformer(TransformerTanks=[empty_tank])
93 data2 = {}
94 tp._process_transformer_tank_impedance(xfmr_empty, data2)
95 assert pytest.approx(data2["raa"], rel=1e-12) == 0.01
96 assert pytest.approx(data2["xaa"], rel=1e-12) == 0.05