mod cgmes_common;
use std::path::Path;
use gridoxide::cgmes::{cgmes_to_buses_and_branches, cgmes_topological_node_bus_index, load_profiles};
use gridoxide::network::{build_ybus, stamp_shunts};
use gridoxide::run_power_flow_analysis_from_ybus;
use gridoxide::types::BusType;
#[test]
fn test_cgmes_smallgrid() {
let dir = Path::new(env!("CARGO_MANIFEST_DIR"))
.join("tests/data/CGMES-Test-Configurations/v3.0/SmallGrid/SmallGrid-Merged");
if !dir.exists() {
eprintln!(
"skipping: {} not found — run `git submodule update --init tests/data/CGMES-Test-Configurations`",
dir.display()
);
return;
}
let eq_bd = dir.join("SmallGrid_EQBD.xml");
let eq = dir.join("SmallGrid_EQ.xml");
let ssh = dir.join("SmallGrid_SSH.xml");
let tp = dir.join("SmallGrid_TP.xml");
let sv = dir.join("SmallGrid_SV.xml");
let ds = load_profiles(&[&eq_bd, &eq, &ssh, &tp, &sv]).expect("failed to decode CGMES profiles");
let tn_mrids = ds.by_type["TopologicalNode"].clone();
assert_eq!(tn_mrids.len(), 167, "expected 167 physical TopologicalNode buses before switch merging");
let expected = cgmes_common::expected_voltages(&ds);
let s_base_va = 100e6;
let (buses, lines, transformers, shunts) =
cgmes_to_buses_and_branches(&ds, s_base_va).expect("conversion failed");
assert_eq!(buses.len(), 163, "expected 4 TopologicalNodes to merge via closed switches, 167 -> 163");
assert_eq!(lines.len(), 185, "expected 185 ACLineSegment lines");
assert_eq!(transformers.len(), 14, "expected 14 two-winding transformers");
assert_eq!(shunts.len(), 14, "expected 14 LinearShuntCompensator shunts");
let n_deenergized = buses.iter().filter(|b| b.bus_type == BusType::Slack && b.voltage_mag == 0.0).count();
assert_eq!(n_deenergized, 40, "expected 40 de-energized (TopologicalIsland-absent) buses");
let n = buses.len();
let mut ybus = build_ybus(n, &lines, &transformers);
stamp_shunts(&mut ybus, &shunts);
let result = run_power_flow_analysis_from_ybus(buses, ybus).buses;
let bus_index = cgmes_topological_node_bus_index(&ds).expect("bus index lookup failed");
cgmes_common::assert_matches_sv(&result, &bus_index, &expected, 2e-2);
}