TestCase11SubstationGraph.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/.
 * SPDX-License-Identifier: MPL-2.0
 */
package com.powsybl.sld.iidm;

import com.powsybl.diagram.test.Networks;
import com.powsybl.iidm.network.extensions.ConnectablePosition;
import com.powsybl.sld.builders.NetworkGraphBuilder;
import com.powsybl.sld.layout.HorizontalSubstationLayoutFactory;
import com.powsybl.sld.layout.LayoutParameters;
import com.powsybl.sld.layout.PositionVoltageLevelLayoutFactory;
import com.powsybl.sld.layout.VerticalSubstationLayoutFactory;
import com.powsybl.sld.model.graphs.SubstationGraph;
import com.powsybl.sld.svg.DefaultLabelProvider;
import com.powsybl.sld.svg.styles.BasicStyleProvider;
import com.powsybl.sld.svg.styles.NominalVoltageStyleProvider;
import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

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

/**
 * @author Franck Lecuyer {@literal <franck.lecuyer at rte-france.com>}
 */
class TestCase11SubstationGraph extends AbstractTestCaseIidm {

    @BeforeEach
    public void setUp() {
        network = Networks.createTestCase11Network();
        substation = network.getSubstation("subst");
        graphBuilder = new NetworkGraphBuilder(network);
    }

    @Test
    void testHorizontal() {

        // build substation graph
        SubstationGraph g = graphBuilder.buildSubstationGraph(substation.getId());

        // Run horizontal substation layout
        substationGraphLayout(g);

        assertEquals(toString("/TestCase11SubstationGraphH.json"), toJson(g, "/TestCase11SubstationGraphH.json"));
    }

    @Test
    void testHorizontalFirstAlignment() {
        runHorizontalALignmentTest(LayoutParameters.Alignment.FIRST);
    }

    @Test
    void testHorizontalLastAlignment() {
        runHorizontalALignmentTest(LayoutParameters.Alignment.LAST);
    }

    @Test
    void testHorizontalMiddleAlignment() {
        runHorizontalALignmentTest(LayoutParameters.Alignment.MIDDLE);
    }

    @Test
    void testHorizontalNoneAlignment() {
        runHorizontalALignmentTest(LayoutParameters.Alignment.NONE);
    }

    private void runHorizontalALignmentTest(LayoutParameters.Alignment alignment) {
        layoutParameters.setBusbarsAlignment(alignment);

        // build substation graph
        SubstationGraph g = graphBuilder.buildSubstationGraph(substation.getId());

        // Run horizontal substation layout
        substationGraphLayout(g);

        String filename = "/TestCase11SubstationGraphH" + StringUtils.capitalize(alignment.name().toLowerCase()) + ".svg";
        assertEquals(toString(filename), toSVG(g, filename, componentLibrary, layoutParameters, svgParameters, getDefaultDiagramLabelProvider(), getDefaultDiagramStyleProvider()));
    }

    @Test
    void testVertical() {
        // build substation graph
        SubstationGraph g = graphBuilder.buildSubstationGraph(substation.getId());

        // Run vertical substation layout
        new VerticalSubstationLayoutFactory().create(g, new PositionVoltageLevelLayoutFactory()).run(layoutParameters);

        assertEquals(toString("/TestCase11SubstationGraphV.json"), toJson(g, "/TestCase11SubstationGraphV.json"));
    }

    @Test
    void testRight3wtOrientation() {
        // build substation graph
        network.getThreeWindingsTransformer("trf7").remove();
        Networks.createThreeWindingsTransformer(substation, "trf7", "trf7", "vl3", "vl2", "vl1",
                0.5, 0.5, 0.5, 1., 1., 1., 0.1, 0.1,
                50., 225., 400.,
                8, 19, 31,
                "trf73", 3, ConnectablePosition.Direction.BOTTOM,
                "trf72", 4, ConnectablePosition.Direction.TOP,
                "trf71", 6, ConnectablePosition.Direction.BOTTOM);

        SubstationGraph g = graphBuilder.buildSubstationGraph(substation.getId());

        // Run vertical substation layout
        new VerticalSubstationLayoutFactory().create(g, new PositionVoltageLevelLayoutFactory()).run(layoutParameters);

        assertEquals(toString("/TestCase11Right3wtOrientation.json"), toJson(g, "/TestCase11Right3wtOrientation.json"));
    }

    @Test
    void testLeft3wtOrientation() {
        // build substation graph
        network.getThreeWindingsTransformer("trf7").remove();
        Networks.createThreeWindingsTransformer(substation, "trf7", "trf7", "vl2", "vl1", "vl3",
                0.5, 0.5, 0.5, 1., 1., 1., 0.1, 0.1,
                225., 400., 50.,
                19, 31, 8,
                "trf72", 4, ConnectablePosition.Direction.TOP,
                "trf71", 6, ConnectablePosition.Direction.BOTTOM,
                "trf73", 3, ConnectablePosition.Direction.BOTTOM);

        SubstationGraph g = graphBuilder.buildSubstationGraph(substation.getId());

        // Run vertical substation layout
        new VerticalSubstationLayoutFactory().create(g, new PositionVoltageLevelLayoutFactory()).run(layoutParameters);

        assertEquals(toString("/TestCase11Left3wtOrientation.json"), toJson(g, "/TestCase11Left3wtOrientation.json"));
    }

    @Test
    void testWithHvdcLines() {
        network = Networks.createNetworkWithHvdcLines();
        substation = network.getSubstation("Substation1");
        graphBuilder = new NetworkGraphBuilder(network);

        SubstationGraph g = graphBuilder.buildSubstationGraph(substation.getId());

        // Run vertical substation layout
        new VerticalSubstationLayoutFactory().create(g, new PositionVoltageLevelLayoutFactory()).run(layoutParameters);

        assertEquals(toString("/TestCase11SubstationGraphVWithHvdcLines.json"), toJson(g, "/TestCase11SubstationGraphVWithHvdcLines.json"));
    }

    @Test
    void testMetadataWithHvdcLines() {
        network = Networks.createNetworkWithHvdcLines("VSC_1", "VSC_2", "LCC_1", "LCC_2");
        substation = network.getSubstation("Substation1");
        graphBuilder = new NetworkGraphBuilder(network);

        SubstationGraph g = graphBuilder.buildSubstationGraph(substation.getId());
        new HorizontalSubstationLayoutFactory().create(g, new PositionVoltageLevelLayoutFactory()).run(layoutParameters);

        assertEquals(toString("/substDiag_with_hvdc_line_metadata.json"), toMetadata(g, "/substDiag_with_hvdc_line_metadata.json",
                componentLibrary,
                layoutParameters,
                svgParameters,
                new DefaultLabelProvider(network, componentLibrary, layoutParameters, svgParameters), new BasicStyleProvider()));
    }

    @Test
    void testHorizontalDefaultStyle() {
        // compare metadata of substation diagram with reference
        // (with horizontal substation layout)
        SubstationGraph substationGraph = graphBuilder.buildSubstationGraph(substation.getId());
        new HorizontalSubstationLayoutFactory().create(substationGraph, new PositionVoltageLevelLayoutFactory()).run(layoutParameters);

        assertEquals(toString("/substDiag_metadata.json"), toMetadata(substationGraph, "/substDiag_metadata.json", componentLibrary, layoutParameters, svgParameters, getDefaultDiagramLabelProvider(), new BasicStyleProvider()));
    }

    @Test
    void testHorizontalNominalStyle() {
        // compare metadata of substation diagram with reference
        // (with horizontal substation layout)
        SubstationGraph graph = graphBuilder.buildSubstationGraph(substation.getId());
        new HorizontalSubstationLayoutFactory().create(graph, new PositionVoltageLevelLayoutFactory()).run(layoutParameters);

        assertEquals(toString("/substDiag_metadata.json"), toMetadata(graph, "/substDiag_metadata.json", componentLibrary, layoutParameters, svgParameters, getDefaultDiagramLabelProvider(), new NominalVoltageStyleProvider()));
    }
}