AbstractBusBreakerTest.java
/**
* Copyright (c) 2017, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* SPDX-License-Identifier: MPL-2.0
*/
package com.powsybl.iidm.network.tck;
import com.google.common.collect.Lists;
import com.powsybl.commons.PowsyblException;
import com.powsybl.iidm.network.*;
import org.junit.jupiter.api.Test;
import java.util.Objects;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
public abstract class AbstractBusBreakerTest {
protected static Network createTestNetwork() {
Network network = Network.create("test", "test");
Substation s = network.newSubstation()
.setId("S1")
.setCountry(Country.FR)
.setTso("TSO1")
.setGeographicalTags("region1")
.add();
VoltageLevel vl1 = s.newVoltageLevel()
.setId("VL1")
.setNominalV(400.0)
.setTopologyKind(TopologyKind.BUS_BREAKER)
.add();
vl1.getBusBreakerView().newBus()
.setId("B1")
.add();
vl1.getBusBreakerView().newBus()
.setId("B2")
.add();
vl1.getBusBreakerView().newSwitch()
.setId("BR1")
.setBus1("B1")
.setBus2("B2")
.setOpen(false)
.add();
vl1.newGenerator()
.setId("G")
.setBus("B1")
.setMaxP(100.0)
.setMinP(50.0)
.setTargetP(100.0)
.setTargetV(400.0)
.setVoltageRegulatorOn(true)
.add();
vl1.newLoad()
.setId("LD1")
.setConnectableBus("B1")
.setBus("B1")
.setP0(1.0)
.setQ0(1.0)
.add();
vl1.newLoad()
.setId("LD2")
.setConnectableBus("B2")
.setBus("B2")
.setP0(1.0)
.setQ0(1.0)
.add();
VoltageLevel vl2 = s.newVoltageLevel()
.setId("VL2")
.setNominalV(400.0)
.setTopologyKind(TopologyKind.BUS_BREAKER)
.add();
vl2.getBusBreakerView().newBus()
.setId("B21")
.add();
vl2.newGenerator()
.setId("G2")
.setBus("B21")
.setMaxP(100.0)
.setMinP(50.0)
.setTargetP(100.0)
.setTargetV(400.0)
.setVoltageRegulatorOn(true)
.add();
network.newLine()
.setId("L1")
.setVoltageLevel1("VL1")
.setBus1("B1")
.setVoltageLevel2("VL2")
.setBus2("B21")
.setR(1.0)
.setX(1.0)
.setG1(0.0)
.setB1(0.0)
.setG2(0.0)
.setB2(0.0)
.add();
return network;
}
@Test
public void testSetterGetter() {
Network network = Network.create("test", "test");
Substation substation = network.newSubstation()
.setCountry(Country.AF)
.setTso("tso")
.setName("sub")
.setId("subId")
.add();
VoltageLevel voltageLevel = substation.newVoltageLevel()
.setTopologyKind(TopologyKind.BUS_BREAKER)
.setId("bbVL")
.setName("bbVL_name")
.setNominalV(200.0f)
.add();
// ConfiguredBus
Bus bus = voltageLevel.getBusBreakerView()
.newBus()
.setName("bus1Name")
.setId("bus1")
.add();
assertNotNull(network.getBusBreakerView().getBus("bus1"));
assertEquals("bus1", network.getBusBreakerView().getBus("bus1").getId());
assertEquals("bus1", bus.getId());
assertEquals("bus1Name", bus.getOptionalName().orElse(null));
assertEquals("bus1Name", bus.getNameOrId());
LccConverterStation lccConverterStation = voltageLevel.newLccConverterStation()
.setId("lcc")
.setName("lcc")
.setBus("bus1")
.setLossFactor(0.011f)
.setPowerFactor(0.5f)
.setConnectableBus("bus1")
.add();
VscConverterStation vscConverterStation = voltageLevel.newVscConverterStation()
.setId("vsc")
.setName("vsc")
.setBus("bus1")
.setLossFactor(0.011f)
.setVoltageRegulatorOn(false)
.setReactivePowerSetpoint(1.0)
.setConnectableBus("bus1")
.add();
assertEquals(HvdcConverterStation.HvdcType.LCC, lccConverterStation.getHvdcType());
assertEquals(HvdcConverterStation.HvdcType.VSC, vscConverterStation.getHvdcType());
double p1 = 1.0;
double q1 = 2.0;
double p2 = 10.0;
double q2 = 20.0;
lccConverterStation.getTerminal().setP(p1);
lccConverterStation.getTerminal().setQ(q1);
vscConverterStation.getTerminal().setP(p2);
vscConverterStation.getTerminal().setQ(q2);
assertSame(voltageLevel, bus.getVoltageLevel());
assertSame(network, bus.getNetwork());
try {
bus.setV(-1.0);
fail();
} catch (ValidationException ignored) {
// ignore
}
bus.setV(200.0);
assertEquals(200.0, bus.getV(), 0.0);
bus.setAngle(30.0);
assertEquals(30.0, bus.getAngle(), 0.0);
assertEquals(p1 + p2, bus.getP(), 0.0);
assertEquals(q1 + q2, bus.getQ(), 0.0);
assertEquals(0.0, bus.getFictitiousP0(), 0.0);
assertEquals(0.0, bus.getFictitiousQ0(), 0.0);
bus.setFictitiousP0(1.0).setFictitiousQ0(2.0);
assertEquals(1.0, bus.getFictitiousP0(), 0.0);
assertEquals(2.0, bus.getFictitiousQ0(), 0.0);
Bus busViewBus = bus.getConnectedTerminalStream()
.map(t -> t.getBusView().getBus())
.filter(Objects::nonNull).findFirst().orElseThrow(IllegalStateException::new);
assertEquals(1.0, busViewBus.getFictitiousP0(), 0.0);
assertEquals(2.0, busViewBus.getFictitiousQ0(), 0.0);
busViewBus.setFictitiousP0(3.0).setFictitiousQ0(4.0);
assertEquals(3.0, bus.getFictitiousP0(), 0.0);
assertEquals(4.0, bus.getFictitiousQ0(), 0.0);
}
@Test
public void testConnectedTerminals() {
Network network = createTestNetwork();
VoltageLevel vl1 = network.getVoltageLevel("VL1");
Terminal gt = network.getGenerator("G").getTerminal();
Terminal ld1t = network.getLoad("LD1").getTerminal();
Terminal ld2t = network.getLoad("LD2").getTerminal();
Terminal l1t = network.getLine("L1").getTerminal1();
assertTrue(gt.isConnected());
assertTrue(ld1t.isConnected());
assertTrue(ld2t.isConnected());
assertTrue(l1t.isConnected());
assertEquals(1, vl1.getBusView().getBusStream().count());
assertEquals(gt.getBusView().getBus(), gt.getBusView().getConnectableBus());
assertEquals(ld1t.getBusView().getBus(), ld1t.getBusView().getConnectableBus());
assertEquals(ld2t.getBusView().getBus(), ld2t.getBusView().getConnectableBus());
assertEquals(l1t.getBusView().getBus(), l1t.getBusView().getConnectableBus());
assertEquals(4, vl1.getBusView().getBus("VL1_0").getConnectedTerminalCount());
assertEquals(4, Lists.newArrayList(vl1.getBusView().getBus("VL1_0").getConnectedTerminals()).size());
}
@Test
public void testDisconnectConnect() {
Network network = createTestNetwork();
VoltageLevel vl1 = network.getVoltageLevel("VL1");
Terminal gt = network.getGenerator("G").getTerminal();
Terminal l1t = network.getLine("L1").getTerminal1();
assertTrue(gt.disconnect());
assertFalse(gt.isConnected());
assertNull(gt.getBusView().getBus());
assertNotNull(gt.getBusView().getConnectableBus());
assertEquals(vl1.getBusView().getBus("VL1_0"), gt.getBusView().getConnectableBus());
assertEquals(3, vl1.getBusView().getBus("VL1_0").getConnectedTerminalCount());
assertEquals(3, Lists.newArrayList(vl1.getBusView().getBus("VL1_0").getConnectedTerminals()).size());
assertTrue(l1t.disconnect());
assertFalse(l1t.isConnected());
assertEquals(1, vl1.getBusView().getBusStream().count());
assertNull(l1t.getBusView().getBus());
assertNotNull(l1t.getBusView().getConnectableBus());
assertEquals(vl1.getBusView().getBus("VL1_0"), l1t.getBusView().getConnectableBus());
assertTrue(l1t.connect());
assertTrue(l1t.isConnected());
assertTrue(gt.connect());
assertTrue(gt.isConnected());
assertEquals(vl1.getBusView().getBus("VL1_0"), gt.getBusView().getConnectableBus());
assertEquals(4, vl1.getBusView().getBus("VL1_0").getConnectedTerminalCount());
assertEquals(4, Lists.newArrayList(vl1.getBusView().getBus("VL1_0").getConnectedTerminals()).size());
}
@Test
public void testNodeBreakerNonSupportedMethods() {
Network network = createTestNetwork();
VoltageLevel vl1 = network.getVoltageLevel("VL1");
VoltageLevel.NodeBreakerView nodeBreakerView = vl1.getNodeBreakerView();
assertThrows(PowsyblException.class, () -> nodeBreakerView.getSwitchStream(0), "Not supported in a bus breaker topology");
assertThrows(PowsyblException.class, () -> nodeBreakerView.getSwitches(1), "Not supported in a bus breaker topology");
assertThrows(PowsyblException.class, () -> nodeBreakerView.getNodeInternalConnectedToStream(2), "Not supported in a bus breaker topology");
assertThrows(PowsyblException.class, () -> nodeBreakerView.getNodesInternalConnectedTo(3), "Not supported in a bus breaker topology");
}
}