VscConverterStationModificationTest.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;

import com.powsybl.commons.PowsyblException;
import com.powsybl.commons.report.ReportNode;
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.VscConverterStation;
import com.powsybl.iidm.network.test.FourSubstationsNodeBreakerFactory;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.OptionalDouble;

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

/**
 * @author Nicolas PIERRE {@literal <nicolas.pierre at artelys.com>}
 */
class VscConverterStationModificationTest {

    private Network network;
    private VscConverterStation vsc;

    @BeforeEach
    public void setUp() {
        network = FourSubstationsNodeBreakerFactory.create();
        assertTrue(network.getVscConverterStationCount() > 0);
        vsc = network.getVscConverterStations().iterator().next();
    }

    @Test
    void testConstructorCoherence() {
        // Ok
        assertDoesNotThrow(
            () -> new VscConverterStationModification(vsc.getId(), null, 10.));
        assertDoesNotThrow(
            () -> new VscConverterStationModification(vsc.getId(), 10., null));
        assertDoesNotThrow(
            () -> new VscConverterStationModification(vsc.getId(), 10., 10.));
        // Warn log but ok
        assertDoesNotThrow(
            () -> new VscConverterStationModification(vsc.getId(), null, null));
    }

    @Test
    void testApplyChecks() {
        VscConverterStationModification modif1 = new VscConverterStationModification("UNKNOWN_ID", 1.,
            2.);
        assertThrows(PowsyblException.class, () -> modif1.apply(network, true, ReportNode.NO_OP),
            "An invalid ID should fail to apply.");
        assertDoesNotThrow(() -> modif1.apply(network, false, ReportNode.NO_OP),
            "An invalid ID should not throw if throwException is false.");

        VscConverterStationModification modif2 = new VscConverterStationModification(vsc.getId(), 1.,
            2.);
        modif2.apply(network, true, ReportNode.NO_OP);
        assertEquals(1, vsc.getVoltageSetpoint(), "Failed to modify network during apply.");
        assertEquals(2, vsc.getReactivePowerSetpoint(), "Failed to modify network during apply.");
    }

    @Test
    void testGetters() {
        VscConverterStationModification modif = new VscConverterStationModification("UNKNOWN_ID",
            1., null);
        assertEquals(OptionalDouble.empty(), modif.getOptionalReactivePowerSetpoint());
        assertNull(modif.getReactivePowerSetpoint());
        assertEquals(OptionalDouble.of(1.), modif.getOptionalVoltageSetpoint());
        assertEquals(1., modif.getVoltageSetpoint());
    }

    @Test
    void testGetName() {
        AbstractNetworkModification networkModification = new VscConverterStationModification("ID", 10., null);
        assertEquals("VscConverterStationModification", networkModification.getName());
    }

    @Test
    void testHasImpact() {
        NetworkModification modification1 = new VscConverterStationModification("UNKNOWN_ID", 1., 2.);
        assertEquals(NetworkModificationImpact.CANNOT_BE_APPLIED, modification1.hasImpactOnNetwork(network));

        NetworkModification modification2 = new VscConverterStationModification("VSC1", 400., 500.);
        assertEquals(NetworkModificationImpact.NO_IMPACT_ON_NETWORK, modification2.hasImpactOnNetwork(network));

        NetworkModification modification3 = new VscConverterStationModification("VSC1", 1., 500.);
        assertEquals(NetworkModificationImpact.HAS_IMPACT_ON_NETWORK, modification3.hasImpactOnNetwork(network));

        NetworkModification modification4 = new VscConverterStationModification("VSC1", 400., 1.);
        assertEquals(NetworkModificationImpact.HAS_IMPACT_ON_NETWORK, modification4.hasImpactOnNetwork(network));

        NetworkModification modification5 = new VscConverterStationModification("VSC1", null, null);
        assertEquals(NetworkModificationImpact.NO_IMPACT_ON_NETWORK, modification5.hasImpactOnNetwork(network));
    }
}