TestCaseLimitViolation.java

/**
 * Copyright (c) 2024, 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.test.ThreeWindingsTransformerNetworkFactory;
import com.powsybl.sld.builders.NetworkGraphBuilder;
import com.powsybl.sld.model.graphs.VoltageLevelGraph;
import com.powsybl.sld.svg.styles.AnimatedFeederInfoStyleProvider;
import com.powsybl.sld.svg.styles.StyleProvider;
import com.powsybl.sld.svg.styles.StyleProvidersList;
import com.powsybl.sld.svg.styles.iidm.LimitHighlightStyleProvider;
import com.powsybl.sld.svg.styles.iidm.TopologicalStyleProvider;
import org.junit.jupiter.api.Test;

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

/**
 * @author Jamal KHEYYAD {@literal <jamal.kheyyad at rte-international.com>}
 */
class TestCaseLimitViolation extends AbstractTestCaseIidm {

    @Override
    public void setUp() {
        // initialization of networks and graph builder done in each test
    }

    @Override
    public StyleProvider getDefaultDiagramStyleProvider() {
        return new StyleProvidersList(new TopologicalStyleProvider(network), new LimitHighlightStyleProvider(network), new AnimatedFeederInfoStyleProvider(500, 1000));
    }

    @Test
    void testLineOverLoad() {
        network = Networks.createNetworkWithLine();
        network.getVoltageLevel("VoltageLevel1")
                .setHighVoltageLimit(400)
                .setLowVoltageLimit(390);
        network.getLine("Line").newCurrentLimits1().setPermanentLimit(250).add();
        network.getLine("Line").getTerminal1().setP(101).setQ(150).getBusView().getBus().setV(390);
        graphBuilder = new NetworkGraphBuilder(network);
        VoltageLevelGraph g = graphBuilder.buildVoltageLevelGraph("VoltageLevel1");
        voltageLevelGraphLayout(g);
        assertEquals(toString("/TestLineFeederInfoOverLoad.svg"), toSVG(g, "/TestLineFeederInfoOverLoad.svg"));
    }

    @Test
    void test2WTOverLoad() {
        network = Networks.createNetworkWithTwoWindingsTransformer();
        network.getTwoWindingsTransformer("Transformer").newCurrentLimits2().setPermanentLimit(250).add();
        network.getTwoWindingsTransformer("Transformer").getTerminal2().setP(101).setQ(150).getBusView().getBus().setV(390);
        graphBuilder = new NetworkGraphBuilder(network);
        VoltageLevelGraph g = graphBuilder.buildVoltageLevelGraph("VoltageLevel1");
        voltageLevelGraphLayout(g);
        assertEquals(toString("/TestTransformerFeederInfoOverLoad.svg"), toSVG(g, "/TestTransformerFeederInfoOverLoad.svg"));
    }

    @Test
    void test3WTOverLoad() {
        network = ThreeWindingsTransformerNetworkFactory.create();
        network.getThreeWindingsTransformer("3WT").getLeg1().newCurrentLimits().setPermanentLimit(250).add();
        network.getThreeWindingsTransformer("3WT").getLeg2().newCurrentLimits().setPermanentLimit(250).add();
        network.getThreeWindingsTransformer("3WT").getLeg3().newCurrentLimits().setPermanentLimit(250).add();
        network.getThreeWindingsTransformer("3WT").getLeg1().getTerminal().setP(-2800.0).setQ(400.0);
        network.getThreeWindingsTransformer("3WT").getLeg2().getTerminal().setP(1400.0).setQ(400.0);
        network.getThreeWindingsTransformer("3WT").getLeg3().getTerminal().setP(1400.0).setQ(400.0);
        graphBuilder = new NetworkGraphBuilder(network);
        // Build substation graph and run layout
        VoltageLevelGraph g = graphBuilder.buildVoltageLevelGraph("VL_132");
        voltageLevelGraphLayout(g);

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

    @Test
    void testBusOverVoltageLimitViolation() {
        network = Networks.createComplexExternCellOnFourSections();

        network.getBusbarSection("bbs3").getTerminal().getBusView().getBus().setV(390);
        network.getBusbarSection("bbs3").getTerminal().getVoltageLevel().setHighVoltageLimit(1);
        network.getBusbarSection("bbs3").getTerminal().getVoltageLevel().setLowVoltageLimit(0);

        graphBuilder = new NetworkGraphBuilder(network);
        VoltageLevelGraph g = graphBuilder.buildVoltageLevelGraph("vl");
        voltageLevelGraphLayout(g);
        assertEquals(toString("/TestBusBarOverVoltageLimitHightlight.svg"), toSVG(g, "/TestBusBarOverVoltageLimitHightlight.svg"));
    }

    @Test
    void testBusUnderVoltageLimitViolation() {
        network = Networks.createComplexExternCellOnFourSections();

        network.getBusbarSection("bbs3").getTerminal().getBusView().getBus().setV(200);
        network.getBusbarSection("bbs3").getTerminal().getVoltageLevel().setHighVoltageLimit(400);
        network.getBusbarSection("bbs3").getTerminal().getVoltageLevel().setLowVoltageLimit(390);

        graphBuilder = new NetworkGraphBuilder(network);
        VoltageLevelGraph g = graphBuilder.buildVoltageLevelGraph("vl");
        voltageLevelGraphLayout(g);
        assertEquals(toString("/TestBusBarUnderVoltageLimitHightlight.svg"), toSVG(g, "/TestBusBarUnderVoltageLimitHightlight.svg"));
    }

}