TestSerialBlock.java
/**
* Copyright (c) 2019, 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/.
*/
package com.powsybl.sld.iidm;
import com.powsybl.diagram.test.Networks;
import com.powsybl.iidm.network.Country;
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.SwitchKind;
import com.powsybl.iidm.network.TopologyKind;
import com.powsybl.iidm.network.extensions.ConnectablePosition;
import com.powsybl.sld.builders.NetworkGraphBuilder;
import com.powsybl.sld.layout.*;
import com.powsybl.sld.model.graphs.VoltageLevelGraph;
import com.powsybl.sld.layout.CalculateCoordBlockVisitor;
import com.powsybl.sld.layout.LayoutContext;
import com.powsybl.sld.model.blocks.Block;
import com.powsybl.sld.model.blocks.SerialBlock;
import com.powsybl.sld.model.cells.Cell;
import com.powsybl.sld.model.coordinate.Orientation;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.util.Optional;
import static com.powsybl.sld.model.coordinate.Coord.Dimension.X;
import static com.powsybl.sld.model.coordinate.Coord.Dimension.Y;
import static com.powsybl.sld.model.coordinate.Position.Dimension.H;
import static com.powsybl.sld.model.coordinate.Position.Dimension.V;
import static com.powsybl.sld.model.nodes.Node.NodeType.BUS;
import static com.powsybl.sld.model.nodes.Node.NodeType.FEEDER;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* @author Benoit Jeanson {@literal <benoit.jeanson at rte-france.com>}
* @author Franck Lecuyer {@literal <franck.lecuyer at rte-france.com>}
*/
class TestSerialBlock extends AbstractTestCaseIidm {
@BeforeEach
public void setUp() {
Network network = Network.create("testCase1", "test");
graphBuilder = new NetworkGraphBuilder(network);
substation = Networks.createSubstation(network, "s", "s", Country.FR);
vl = Networks.createVoltageLevel(substation, "vl", "vl", TopologyKind.NODE_BREAKER, 380);
Networks.createBusBarSection(vl, "bbs", "bbs", 0, 1, 1);
Networks.createLoad(vl, "la", "la", "la", 10, ConnectablePosition.Direction.TOP, 2, 10, 10);
Networks.createSwitch(vl, "ba", "ba", SwitchKind.BREAKER, false, false, false, 2, 1);
Networks.createSwitch(vl, "da", "da", SwitchKind.DISCONNECTOR, false, false, false, 1, 0);
}
@Test
void test() {
// build graph
VoltageLevelGraph g = graphBuilder.buildVoltageLevelGraph(vl.getId());
// layout
new PositionVoltageLevelLayoutFactory().create(g).run(layoutParameters);
assertEquals(1, g.getCellStream().count());
Optional<Cell> oCell = g.getCellStream().findFirst();
assertTrue(oCell.isPresent());
Cell cell = oCell.get();
assertEquals(Block.Type.SERIAL, cell.getRootBlock().getType());
SerialBlock sb = (SerialBlock) cell.getRootBlock();
assertTrue(sb.isEmbeddingNodeType(BUS));
assertTrue(sb.isEmbeddingNodeType(FEEDER));
assertTrue(sb.getLowerBlock().isEmbeddingNodeType(BUS));
assertTrue(sb.getUpperBlock().isEmbeddingNodeType(FEEDER));
assertTrue(sb.getSubBlocks().get(0).isEmbeddingNodeType(BUS));
assertTrue(sb.getSubBlocks().get(2).isEmbeddingNodeType(FEEDER));
assertEquals("bbs", sb.getSubBlocks().get(0).getStartingNode().getId());
assertEquals("INTERNAL_vl_da-ba", sb.getSubBlocks().get(0).getEndingNode().getId());
assertEquals("INTERNAL_vl_da-ba", sb.getSubBlocks().get(1).getStartingNode().getId());
assertEquals("INTERNAL_vl_la", sb.getSubBlocks().get(1).getEndingNode().getId());
assertEquals("INTERNAL_vl_la", sb.getSubBlocks().get(2).getStartingNode().getId());
assertEquals("la", sb.getSubBlocks().get(2).getEndingNode().getId());
sb.sizing();
assertEquals(0, sb.getPosition().get(H));
assertEquals(0, sb.getPosition().get(V));
assertEquals(2, sb.getPosition().getSpan(H));
assertEquals(4, sb.getPosition().getSpan(V));
assertEquals(0, sb.getLowerBlock().getPosition().get(H));
assertEquals(0, sb.getLowerBlock().getPosition().get(V));
assertEquals(2, sb.getLowerBlock().getPosition().getSpan(H));
assertEquals(0, sb.getLowerBlock().getPosition().getSpan(V));
assertEquals(0, sb.getSubBlocks().get(1).getPosition().get(H));
assertEquals(0, sb.getSubBlocks().get(1).getPosition().get(V));
assertEquals(2, sb.getSubBlocks().get(1).getPosition().getSpan(H));
assertEquals(4, sb.getSubBlocks().get(1).getPosition().getSpan(V));
assertEquals(0, sb.getUpperBlock().getPosition().get(H));
assertEquals(4, sb.getUpperBlock().getPosition().get(V));
assertEquals(2, sb.getUpperBlock().getPosition().getSpan(H));
assertEquals(0, sb.getUpperBlock().getPosition().getSpan(V));
sb.getCoord().set(X, 10, 100);
sb.getCoord().set(Y, 20, 200);
CalculateCoordBlockVisitor ccbv = CalculateCoordBlockVisitor.create(layoutParameters, new LayoutContext(0., 0., 0., null));
sb.getPosition().setOrientation(Orientation.LEFT);
sb.accept(ccbv);
assertEquals(10, sb.getLowerBlock().getCoord().get(X), 0);
assertEquals(20, sb.getLowerBlock().getCoord().get(Y), 0);
assertEquals(100, sb.getLowerBlock().getCoord().getSpan(X), 0);
assertEquals(200, sb.getLowerBlock().getCoord().getSpan(Y), 0);
assertEquals(10, sb.getSubBlocks().get(1).getCoord().get(X), 0);
assertEquals(20, sb.getSubBlocks().get(1).getCoord().get(Y), 0);
assertEquals(100, sb.getSubBlocks().get(1).getCoord().getSpan(X), 0);
assertEquals(200, sb.getSubBlocks().get(1).getCoord().getSpan(Y), 0);
assertEquals(10, sb.getUpperBlock().getCoord().get(X), 0);
assertEquals(20, sb.getUpperBlock().getCoord().get(Y), 0);
assertEquals(100, sb.getUpperBlock().getCoord().getSpan(X), 0);
assertEquals(200, sb.getUpperBlock().getCoord().getSpan(Y), 0);
sb.reverseBlock();
// LegPrimaryBlock is NOT reversed (bus is always the starting node)
assertEquals("INTERNAL_vl_da-ba", sb.getSubBlocks().get(1).getEndingNode().getId());
assertEquals("bbs", sb.getSubBlocks().get(2).getStartingNode().getId());
// BodyPrimaryBlock is reversed
assertEquals("INTERNAL_vl_da-ba", sb.getSubBlocks().get(1).getEndingNode().getId());
assertEquals("INTERNAL_vl_la", sb.getSubBlocks().get(1).getStartingNode().getId());
// FeederPrimaryBlock is NOT reversed (feeder is always the ending node)
assertEquals("la", sb.getSubBlocks().get(0).getEndingNode().getId());
assertEquals("INTERNAL_vl_la", sb.getSubBlocks().get(0).getStartingNode().getId());
}
}