TestCase13ZoneGraph.java

/**
 * Copyright (c) 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.iidm;

import com.powsybl.commons.*;
import com.powsybl.diagram.test.Networks;
import com.powsybl.sld.builders.NetworkGraphBuilder;
import com.powsybl.sld.layout.*;
import com.powsybl.sld.layout.pathfinding.*;
import com.powsybl.sld.model.graphs.ZoneGraph;
import com.powsybl.sld.svg.SvgParameters;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.List;

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

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

    private static final String SUBSTATION_ID_1 = "Substation1";
    private static final String SUBSTATION_ID_2 = "Substation2";

    @BeforeEach
    public void setUp() {
        svgParameters.setCssLocation(SvgParameters.CssLocation.INSERTED_IN_SVG);
        network = Networks.createNetworkWithLine();
        // In order to keep same results -> can be removed later
        network.getVoltageLevelStream().forEach(vl -> vl.setNominalV(380));
    }

    @Test
    void test() {
        List<String> zone = Arrays.asList(SUBSTATION_ID_1, SUBSTATION_ID_2);
        ZoneGraph g = new NetworkGraphBuilder(network).buildZoneGraph(zone);
        // write Json and compare to reference
        assertEquals(toString("/TestCase13ZoneGraph.json"), toJson(g, "/TestCase13ZoneGraph.json"));
    }

    @Test
    void test2() {
        List<String> zone = Arrays.asList(SUBSTATION_ID_1, SUBSTATION_ID_2);
        ZoneGraph g = new NetworkGraphBuilder(network).buildZoneGraph(zone);
        // write Json and compare to reference
        assertEquals(toString("/TestCase13ZoneGraphNoCoords.json"), toJson(g, "/TestCase13ZoneGraphNoCoords.json", false));
    }

    @Test
    void testZoneGraphHWithSubstationH() {
        // build zone graph
        network = Networks.createNetworkWithManySubstations();
        List<String> zone = Arrays.asList("A", "B", "C", "D", "E");
        ZoneGraph g = new NetworkGraphBuilder(network).buildZoneGraph(zone);

        layoutParameters.setDiagrammPadding(1.0, 1.0, 1.0, 1.0);

        // Run horizontal zone layout
        new HorizontalZoneLayoutFactory().create(g, DijkstraPathFinder::new, new HorizontalSubstationLayoutFactory(), new PositionVoltageLevelLayoutFactory()).run(layoutParameters);

        assertEquals(toString("/TestCase13ZoneGraphHH.svg"), toSVG(g, "/TestCase13ZoneGraphHH.svg"));
    }

    @Test
    void testZoneGraphVWithSubstationV() {
        // build zone graph
        network = Networks.createNetworkWithManySubstations();
        List<String> zone = Arrays.asList("A", "B", "C", "D", "E");
        ZoneGraph g = new NetworkGraphBuilder(network).buildZoneGraph(zone);

        layoutParameters.setDiagrammPadding(1.0, 1.0, 1.0, 1.0);

        // Run vertical zone layout
        new VerticalZoneLayoutFactory().create(g, DijkstraPathFinder::new, new VerticalSubstationLayoutFactory(), new PositionVoltageLevelLayoutFactory()).run(layoutParameters);

        assertEquals(toString("/TestCase13ZoneGraphVV.svg"), toSVG(g, "/TestCase13ZoneGraphVV.svg"));
    }

    @Test
    void testZoneGraphVWithSubstationH() {
        // build zone graph
        network = Networks.createNetworkWithManySubstations();
        List<String> zone = Arrays.asList("A", "B", "C", "D", "E");
        ZoneGraph g = new NetworkGraphBuilder(network).buildZoneGraph(zone);

        layoutParameters.setDiagrammPadding(1.0, 1.0, 1.0, 1.0);

        // Run vertical zone layout
        new VerticalZoneLayoutFactory().create(g, DijkstraPathFinder::new, new HorizontalSubstationLayoutFactory(), new PositionVoltageLevelLayoutFactory()).run(layoutParameters);

        assertEquals(toString("/TestCase13ZoneGraphVH.svg"), toSVG(g, "/TestCase13ZoneGraphVH.svg"));
    }

    @Test
    void testZoneGraphHWithSubstationV() {
        // build zone graph
        network = Networks.createNetworkWithManySubstations();
        List<String> zone = Arrays.asList("A", "B", "C", "D", "E");
        ZoneGraph g = new NetworkGraphBuilder(network).buildZoneGraph(zone);

        layoutParameters.setDiagrammPadding(1.0, 1.0, 1.0, 1.0);

        // Run vertical zone layout
        new HorizontalZoneLayoutFactory().create(g, DijkstraPathFinder::new, new VerticalSubstationLayoutFactory(), new PositionVoltageLevelLayoutFactory()).run(layoutParameters);

        assertEquals(toString("/TestCase13ZoneGraphHV.svg"), toSVG(g, "/TestCase13ZoneGraphHV.svg"));
    }

    @Test
    void testZoneGraphMatrix2rows3cols() {
        // build zone graph
        network = Networks.createNetworkWithManySubstations();
        List<String> zone = Arrays.asList("A", "B", "C", "D", "E");
        ZoneGraph g = new NetworkGraphBuilder(network).buildZoneGraph(zone);

        layoutParameters.setDiagrammPadding(50.0, 50.0, 50.0, 50.0);
        layoutParameters.setVoltageLevelPadding(20, 60, 20, 60);

        // Run matrix zone layout
        String[][] substationsIds = {{"A", "B", "C"},
                                     {"D", "", "E"}};
        //String[][] substationsIds = {{"B", "C"}};
        new MatrixZoneLayoutFactory(substationsIds).create(g, DijkstraPathFinder::new, new HorizontalSubstationLayoutFactory(), new PositionVoltageLevelLayoutFactory()).run(layoutParameters);

        assertEquals(toString("/TestCase13ZoneGraphMatrix2x3.svg"), toSVG(g, "/TestCase13ZoneGraphMatrix2x3.svg"));
    }

    @Test
    void testZoneGraphMatrix1row5cols() {
        // build zone graph
        network = Networks.createNetworkWithManySubstations();
        List<String> zone = Arrays.asList("A", "B", "C", "D", "E");
        ZoneGraph g = new NetworkGraphBuilder(network).buildZoneGraph(zone);

        layoutParameters.setDiagrammPadding(0.0, 0.0, 0.0, 0.0);
        layoutParameters.setVoltageLevelPadding(20, 60, 20, 60);

        // Run default matrix zone layout
        String[][] matrix = {{"A", "B", "C", "D", "E"}};
        new MatrixZoneLayoutFactory(matrix).create(g, DijkstraPathFinder::new, new VerticalSubstationLayoutFactory(), new PositionVoltageLevelLayoutFactory()).run(layoutParameters);

        assertEquals(toString("/TestCase13ZoneGraphMatrix1x5.svg"), toSVG(g, "/TestCase13ZoneGraphMatrix1x5.svg"));
    }

    @Test
    void testZoneGraphMatrix1rows2cols() {
        // build zone graph
        network = Networks.createNetworkWithManySubstations();
        List<String> zone = Arrays.asList("B", "C");
        ZoneGraph g = new NetworkGraphBuilder(network).buildZoneGraph(zone);

        layoutParameters.setDiagrammPadding(0.0, 0.0, 0.0, 0.0);

        // Run matrix zone layout
        String[][] substationsIds = {{"B", "C"}};
        new MatrixZoneLayoutFactory(substationsIds).create(g, DijkstraPathFinder::new, new HorizontalSubstationLayoutFactory(), new PositionVoltageLevelLayoutFactory()).run(layoutParameters);

        assertEquals(toString("/TestCase13ZoneGraphMatrix1x2.svg"), toSVG(g, "/TestCase13ZoneGraphMatrix1x2.svg"));
    }

    @Test
    void testInvalidZoneGraphMatrix() {
        // build zone graph
        network = Networks.createNetworkWithManySubstations();
        List<String> zone = Arrays.asList("B", "C");
        ZoneGraph g = new NetworkGraphBuilder(network).buildZoneGraph(zone);

        layoutParameters.setDiagrammPadding(0.0, 0.0, 0.0, 0.0);

        // Run matrix zone layout
        String[][] substationsIds = {{"B", "A"}};

        ZoneLayoutPathFinderFactory pFinderFactory = DijkstraPathFinder::new;
        SubstationLayoutFactory sFactory = new HorizontalSubstationLayoutFactory();
        VoltageLevelLayoutFactory vFactory = new PositionVoltageLevelLayoutFactory();
        MatrixZoneLayoutFactory mFactory = new MatrixZoneLayoutFactory(substationsIds);
        Layout layout = mFactory.create(g, pFinderFactory, sFactory, vFactory);
        PowsyblException e = assertThrows(PowsyblException.class, () -> layout.run(layoutParameters));
        assertEquals("Substation 'A' was not found in zone graph 'B_C'", e.getMessage());
    }
}