DoubleBusbarSectionTest.java

/**
 * Copyright (c) 2019-2020, 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.sld.cgmes.layout;

import com.powsybl.iidm.network.*;
import com.powsybl.sld.builders.NetworkGraphBuilder;
import com.powsybl.sld.cgmes.dl.iidm.extensions.*;
import com.powsybl.diagram.test.Networks;
import com.powsybl.sld.layout.LayoutParameters;
import com.powsybl.sld.model.coordinate.Orientation;
import com.powsybl.sld.model.graphs.VoltageLevelGraph;
import com.powsybl.sld.model.nodes.BusNode;
import com.powsybl.sld.model.nodes.Node;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

/**
 * @author Christian Biasuzzi {@literal <christian.biasuzzi@techrain.eu>}
 */
class DoubleBusbarSectionTest {

    private static final String DIAGRAM_NAME = "default";

    private VoltageLevel voltageLevel;

    private int iNode = 2;

    @BeforeEach
    public void setUp() {
        Network network = Networks.createNetworkWithDoubleBusbarSections();
        voltageLevel = network.getVoltageLevel("VoltageLevel1");
    }

    private void addDiagramData(boolean isVoltageLevelDataEnabled) {
        Network network = voltageLevel.getNetwork();
        addBusbarSectionDiagramData(network.getBusbarSection("BusbarSection1"), new DiagramPoint(20, 10, 1),
                new DiagramPoint(180, 10, 2));
        addBusbarSectionDiagramData(network.getBusbarSection("BusbarSection2"), new DiagramPoint(20, 40, 1),
                new DiagramPoint(180, 40, 2));
        addGeneratorDiagramData(network.getGenerator("Generator1"), new DiagramPoint(80, 100, 0));
        addSwitchDiagramData(network.getSwitch("Disconnector1"), new DiagramPoint(75, 10, 0), 0);
        addSwitchDiagramData(network.getSwitch("Disconnector2"), new DiagramPoint(75, 40, 0), 0);
        addSwitchDiagramData(network.getSwitch("Breaker1"), new DiagramPoint(80, 50, 0), 0);
        if (isVoltageLevelDataEnabled) {
            VoltageLevelDiagramData.addInternalNodeDiagramPoint(voltageLevel, DIAGRAM_NAME, iNode, new DiagramPoint(80, 45, 0));
        }
        NetworkDiagramData.addDiagramName(network, DIAGRAM_NAME, "Substation1");
    }

    private void addBusbarSectionDiagramData(BusbarSection busbarSection, DiagramPoint point1, DiagramPoint point2) {
        NodeDiagramData<BusbarSection> busbarDiagramData = new NodeDiagramData<>(busbarSection);
        NodeDiagramData.NodeDiagramDataDetails diagramDetails = busbarDiagramData.new NodeDiagramDataDetails();
        diagramDetails.setPoint1(point1);
        diagramDetails.setPoint2(point2);
        busbarDiagramData.addData(DIAGRAM_NAME, diagramDetails);
        busbarSection.addExtension(NodeDiagramData.class, busbarDiagramData);
    }

    private void addGeneratorDiagramData(Generator generator, DiagramPoint generatorPoint) {
        InjectionDiagramData<Generator> generatorDiagramData = new InjectionDiagramData<>(generator);
        InjectionDiagramData.InjectionDiagramDetails diagramDetails = generatorDiagramData.new InjectionDiagramDetails(generatorPoint, 0);
        generatorDiagramData.addData(DIAGRAM_NAME, diagramDetails);
        generator.addExtension(InjectionDiagramData.class, generatorDiagramData);
    }

    private void addSwitchDiagramData(Switch sw, DiagramPoint switchPoint, int rotation) {
        CouplingDeviceDiagramData<Switch> switchDiagramData = new CouplingDeviceDiagramData<>(sw);
        CouplingDeviceDiagramData.CouplingDeviceDiagramDetails diagramDetails = switchDiagramData.new CouplingDeviceDiagramDetails(switchPoint, rotation);
        switchDiagramData.addData(DIAGRAM_NAME, diagramDetails);
        sw.addExtension(CouplingDeviceDiagramData.class, switchDiagramData);
    }

    private void checkGraph(VoltageLevelGraph graph) {
        assertEquals(7, graph.getNodes().size());

        assertEquals(Node.NodeType.BUS, graph.getNodes().get(0).getType());
        assertEquals(Node.NodeType.BUS, graph.getNodes().get(1).getType());
        assertEquals(Node.NodeType.FEEDER, graph.getNodes().get(2).getType());
        assertEquals(Node.NodeType.SWITCH, graph.getNodes().get(3).getType());
        assertEquals(Node.NodeType.INTERNAL, graph.getNodes().get(4).getType());
        assertEquals(Node.NodeType.SWITCH, graph.getNodes().get(5).getType());
        assertEquals(Node.NodeType.SWITCH, graph.getNodes().get(6).getType());

        assertEquals(1, graph.getNodes().get(0).getAdjacentNodes().size());
        assertEquals(1, graph.getNodes().get(1).getAdjacentNodes().size());
        assertEquals(1, graph.getNodes().get(2).getAdjacentNodes().size());
        assertEquals(2, graph.getNodes().get(3).getAdjacentNodes().size());
        assertEquals(3, graph.getNodes().get(4).getAdjacentNodes().size());
        assertEquals(2, graph.getNodes().get(5).getAdjacentNodes().size());
        assertEquals(2, graph.getNodes().get(6).getAdjacentNodes().size());

        assertEquals(6, graph.getEdges().size());
    }

    private void checkNodeCoordinates(VoltageLevelGraph graph, boolean isVoltageLevelDataEnabled) {
        assertEquals(20, graph.getNodes().get(0).getX(), 0);
        assertEquals(10, graph.getNodes().get(0).getY(), 0);
        assertEquals(160, ((BusNode) graph.getNodes().get(0)).getPxWidth(), 0);
        assertEquals(Orientation.RIGHT, graph.getNodes().get(0).getOrientation());

        assertEquals(20, graph.getNodes().get(1).getX(), 0);
        assertEquals(40, graph.getNodes().get(1).getY(), 0);
        assertEquals(160, ((BusNode) graph.getNodes().get(1)).getPxWidth(), 0);
        assertEquals(Orientation.RIGHT, graph.getNodes().get(1).getOrientation());

        assertEquals(80, graph.getNodes().get(2).getX(), 0);
        assertEquals(100, graph.getNodes().get(2).getY(), 0);

        assertEquals(75, graph.getNodes().get(3).getX(), 0);
        assertEquals(10, graph.getNodes().get(3).getY(), 0);
        assertEquals(Orientation.UP, graph.getNodes().get(3).getOrientation());

        assertEquals(isVoltageLevelDataEnabled ? 80 : -1, graph.getNodes().get(4).getX(), 0);
        assertEquals(isVoltageLevelDataEnabled ? 45 : -1, graph.getNodes().get(4).getY(), 0);
        assertEquals(Orientation.UP, graph.getNodes().get(4).getOrientation());

        assertEquals(75, graph.getNodes().get(5).getX(), 0);
        assertEquals(40, graph.getNodes().get(5).getY(), 0);
        assertEquals(Orientation.UP, graph.getNodes().get(5).getOrientation());

        assertEquals(80, graph.getNodes().get(6).getX(), 0);
        assertEquals(50, graph.getNodes().get(6).getY(), 0);
        assertEquals(Orientation.UP, graph.getNodes().get(6).getOrientation());
    }

    private VoltageLevelGraph processCgmesLayout() {
        NetworkGraphBuilder graphBuilder = new NetworkGraphBuilder(voltageLevel.getNetwork());
        VoltageLevelGraph graph = graphBuilder.buildVoltageLevelGraph(voltageLevel.getId());
        LayoutParameters layoutParameters = new LayoutParameters();
        layoutParameters.setCgmesScaleFactor(1);
        layoutParameters.setCgmesDiagramName(DIAGRAM_NAME);
        new CgmesVoltageLevelLayout(graph, voltageLevel.getNetwork()).run(layoutParameters);
        return graph;
    }

    @Test
    void testVoltageLevelData() {
        addDiagramData(true);
        VoltageLevelGraph graph = processCgmesLayout();
        checkGraph(graph);
        checkNodeCoordinates(graph, true);
    }

    @Test
    void testNoVoltageLevelData() {
        addDiagramData(false);
        VoltageLevelGraph graph = processCgmesLayout();
        checkGraph(graph);
        checkNodeCoordinates(graph, false);
    }
}