RemoveHvdcLineTest.java

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

import com.powsybl.commons.PowsyblException;
import com.powsybl.commons.report.PowsyblCoreReportResourceBundle;
import com.powsybl.commons.test.PowsyblCoreTestReportResourceBundle;
import com.powsybl.commons.report.ReportNode;
import com.powsybl.commons.test.AbstractSerDeTest;
import com.powsybl.iidm.modification.AbstractNetworkModification;
import com.powsybl.iidm.modification.NetworkModification;
import com.powsybl.iidm.modification.NetworkModificationImpact;
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.Substation;
import com.powsybl.iidm.network.TopologyKind;
import com.powsybl.iidm.network.VoltageLevel;
import com.powsybl.iidm.network.test.HvdcTestNetwork;
import org.junit.jupiter.api.Test;

import java.util.List;

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

/**
 * @author Anis Touri {@literal <anis-1.touri@rte-france.com>}
 */
class RemoveHvdcLineTest extends AbstractSerDeTest {

    @Test
    void testRemoveHvdcLineLcc() {
        Network network = HvdcTestNetwork.createLcc();
        new RemoveHvdcLineBuilder().withHvdcLineId("L").build().apply(network);
        assertNull(network.getHvdcLine("L"));
        assertNull(network.getLccConverterStation("C1"));
        assertNotNull(network.getShuntCompensator("C1_Filter1"));
    }

    @Test
    void testRemoveHvdcLineLccWithShuntCompensator() {
        Network network = HvdcTestNetwork.createLcc();
        addVoltageLevelWithShuntCompensator(network);
        new RemoveHvdcLineBuilder().withHvdcLineId("L").withShuntCompensatorIds(List.of("C1_Filter1", "C1_Filter2", "C5_Filter5")).build().apply(network);
        assertNull(network.getHvdcLine("L"));
        assertNull(network.getLccConverterStation("C1"));
        assertNull(network.getShuntCompensator("C1_Filter1"));
        assertNull(network.getShuntCompensator("C1_Filter2"));
        assertNotNull(network.getShuntCompensator("C5_Filter5")); // not removed because it is not in the same VLs as the Lcc
    }

    @Test
    void testRemoveHvdcLineVsc() {
        Network network = HvdcTestNetwork.createVsc();
        new RemoveHvdcLineBuilder().withHvdcLineId("L").build().apply(network);
        assertNull(network.getHvdcLine("L"));
        assertNull(network.getVscConverterStation("C1"));
        assertNull(network.getVscConverterStation("C2"));
    }

    @Test
    void testRemoveHvdcLineVscWithIgnoredShunt() {
        Network network = HvdcTestNetwork.createVsc();
        addVoltageLevelWithShuntCompensator(network);
        new RemoveHvdcLineBuilder().withHvdcLineId("L").withShuntCompensatorIds("C5_Filter5").build().apply(network);
        assertNull(network.getHvdcLine("L"));
        assertNull(network.getVscConverterStation("C1"));
        assertNull(network.getVscConverterStation("C2"));
        assertNotNull(network.getShuntCompensator("C5_Filter5"));
    }

    @Test
    void testRemoveHvdcLineUnknownShunt() {
        Network network = HvdcTestNetwork.createLcc();
        ReportNode reportNode = ReportNode.newRootReportNode()
                .withResourceBundles(PowsyblCoreTestReportResourceBundle.TEST_BASE_NAME, PowsyblCoreReportResourceBundle.BASE_NAME)
                .withMessageTemplate("reportTestRemoveHvdcLineWithUnknownShunt")
                .build();
        RemoveHvdcLine removeHvdcLine = new RemoveHvdcLineBuilder().withHvdcLineId("L").withShuntCompensatorIds("UnknownShunt").build();
        PowsyblException e = assertThrows(PowsyblException.class, () -> removeHvdcLine.apply(network, true, reportNode));
        assertEquals("Shunt UnknownShunt not found", e.getMessage());
        assertEquals("core.iidm.modification.notFoundShunt", reportNode.getChildren().get(0).getMessageKey());
        assertDoesNotThrow(() -> removeHvdcLine.apply(network, false, reportNode));
    }

    @Test
    void testRemoveHvdcLineUnknownLine() {
        Network network = Network.create("empty", "test");
        ReportNode reportNode = ReportNode.newRootReportNode()
                .withResourceBundles(PowsyblCoreTestReportResourceBundle.TEST_BASE_NAME, PowsyblCoreReportResourceBundle.BASE_NAME)
                .withMessageTemplate("reportTestRemoveHvdcLineUnknownLine")
                .build();
        RemoveHvdcLine removeHvdcLine = new RemoveHvdcLineBuilder().withHvdcLineId("L").build();
        PowsyblException e = assertThrows(PowsyblException.class, () -> removeHvdcLine.apply(network, true, reportNode));
        assertEquals("Hvdc Line L not found", e.getMessage());
        assertEquals("core.iidm.modification.HvdcNotFound", reportNode.getChildren().get(0).getMessageKey());
        assertDoesNotThrow(() -> removeHvdcLine.apply(network, false, reportNode));
    }

    private static void addVoltageLevelWithShuntCompensator(Network network) {
        Substation s1 = network.getSubstation("S1");
        VoltageLevel vl3 = s1.newVoltageLevel()
                .setId("VL3")
                .setNominalV(400)
                .setTopologyKind(TopologyKind.BUS_BREAKER)
                .add();
        vl3.getBusBreakerView().newBus()
                .setId("B5")
                .add();
        vl3.newShuntCompensator()
                .setId("C5_Filter5")
                .setName("Filter 5")
                .setConnectableBus("B5")
                .setBus("B5")
                .setSectionCount(1)
                .newLinearModel()
                .setBPerSection(1e-5)
                .setMaximumSectionCount(1)
                .add()
                .add();
    }

    @Test
    void testGetName() {
        AbstractNetworkModification networkModification = new RemoveHvdcLineBuilder().withHvdcLineId("L").build();
        assertEquals("RemoveHvdcLine", networkModification.getName());
    }

    @Test
    void testHasImpact() {
        Network network = HvdcTestNetwork.createLcc();

        NetworkModification modification1 = new RemoveHvdcLineBuilder().withHvdcLineId("WRONG_ID").build();
        assertEquals(NetworkModificationImpact.CANNOT_BE_APPLIED, modification1.hasImpactOnNetwork(network));

        NetworkModification modification2 = new RemoveHvdcLineBuilder().withHvdcLineId("L").build();
        assertEquals(NetworkModificationImpact.HAS_IMPACT_ON_NETWORK, modification2.hasImpactOnNetwork(network));
    }
}