PhaseTapChangerTapPositionActionImplTest.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.openrao.data.crac.impl;

import com.powsybl.action.PhaseTapChangerTapPositionAction;
import com.powsybl.action.PhaseTapChangerTapPositionActionBuilder;
import com.powsybl.iidm.network.Network;
import com.powsybl.openrao.data.crac.impl.utils.CommonCracCreation;
import com.powsybl.openrao.data.crac.impl.utils.NetworkImportsUtil;
import com.powsybl.openrao.data.crac.api.Crac;
import com.powsybl.openrao.data.crac.api.networkaction.NetworkAction;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

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

/**
 * @author Pauline JEAN-MARIE {@literal <pauline.jean-marie at artelys.com>}
 */
class PhaseTapChangerTapPositionActionImplTest {

    private Network network;

    @BeforeEach
    public void setUp() {
        network = NetworkImportsUtil.import12NodesNetwork();
    }

    @Test
    void basicMethods() {
        Crac crac = new CracImplFactory().create("cracId");
        NetworkAction pstSetpoint = crac.newNetworkAction()
            .withId("pstSetpoint")
            .newPhaseTapChangerTapPositionAction()
                .withNetworkElement("BBE2AA1  BBE3AA1  1")
                .withTapPosition(12)
                .add()
            .add();
        assertEquals(1, pstSetpoint.getNetworkElements().size());
        assertEquals("BBE2AA1  BBE3AA1  1", pstSetpoint.getNetworkElements().iterator().next().getId());
        assertTrue(pstSetpoint.canBeApplied(network));
    }

    @Test
    void hasImpactOnNetwork() {
        Crac crac = new CracImplFactory().create("cracId");
        NetworkAction pstSetpoint = crac.newNetworkAction()
            .withId("pstSetpoint")
            .newPhaseTapChangerTapPositionAction()
            .withNetworkElement("BBE2AA1  BBE3AA1  1")
            .withTapPosition(-9)
            .add()
            .add();
        assertTrue(pstSetpoint.hasImpactOnNetwork(network));
    }

    @Test
    void hasNoImpactOnNetwork() {
        Crac crac = new CracImplFactory().create("cracId");
        NetworkAction pstSetpoint = crac.newNetworkAction()
            .withId("pstSetpoint")
            .newPhaseTapChangerTapPositionAction()
            .withNetworkElement("BBE2AA1  BBE3AA1  1")
            .withTapPosition(0)
            .add()
            .add();
        assertFalse(pstSetpoint.hasImpactOnNetwork(network));

    }

    @Test
    void applyCenteredOnZero() {
        Crac crac = new CracImplFactory().create("cracId");
        NetworkAction pstSetpoint = crac.newNetworkAction()
            .withId("pstSetpoint")
            .newPhaseTapChangerTapPositionAction()
            .withNetworkElement("BBE2AA1  BBE3AA1  1")
            .withTapPosition(-9)
            .add()
            .add();
        assertEquals(0, network.getTwoWindingsTransformer("BBE2AA1  BBE3AA1  1").getPhaseTapChanger().getTapPosition());
        pstSetpoint.apply(network);
        assertEquals(-9, network.getTwoWindingsTransformer("BBE2AA1  BBE3AA1  1").getPhaseTapChanger().getTapPosition());
    }

    @Test
    void applyOutOfBoundStartsAtOne() {
        Crac crac = new CracImplFactory().create("cracId");
        NetworkAction pstSetpoint = crac.newNetworkAction()
            .withId("pstSetpoint")
            .newPhaseTapChangerTapPositionAction()
            .withNetworkElement("BBE2AA1  BBE3AA1  1")
            .withTapPosition(17)
            .add()
            .add();
        assertFalse(pstSetpoint.apply(network));
    }

    @Test
    void applyOutOfBoundCenteredOnZero() {
        Crac crac = new CracImplFactory().create("cracId");
        NetworkAction pstSetpoint = crac.newNetworkAction()
            .withId("pstSetpoint")
            .newPhaseTapChangerTapPositionAction()
            .withNetworkElement("BBE2AA1  BBE3AA1  1")
            .withTapPosition(50)
            .add()
            .add();
        assertFalse(pstSetpoint.apply(network));
    }

    @Test
    void equals() {
        Crac crac = new CracImplFactory().create("cracId");
        NetworkAction dummy = crac.newNetworkAction()
            .withId("dummy")
            .newPhaseTapChangerTapPositionAction()
            .withNetworkElement("BBE2AA1  BBE3AA1  1")
            .withTapPosition(-9)
            .add()
            .add();
        assertEquals(1, dummy.getElementaryActions().size());

        NetworkAction dummy2 = crac.newNetworkAction()
            .withId("dummy2")
            .newPhaseTapChangerTapPositionAction()
            .withNetworkElement("BBE2AA1  BBE3AA1  2")
            .withTapPosition(-9)
            .add()
            .newPhaseTapChangerTapPositionAction()
            .withNetworkElement("BBE2AA1  BBE3AA1  2")
            .withTapPosition(-9)
            .add()
            .add();
        assertEquals(1, dummy2.getElementaryActions().size());

        NetworkAction dummy3 = crac.newNetworkAction()
            .withId("dummy3")
            .newPhaseTapChangerTapPositionAction()
            .withNetworkElement("BBE2AA1  BBE3AA1  3")
            .withTapPosition(-9)
            .add()
            .newPhaseTapChangerTapPositionAction()
            .withNetworkElement("BBE2AA1  BBE3AA1  3")
            .withTapPosition(-10)
            .add()
            .add();
        assertEquals(2, dummy3.getElementaryActions().size());

        NetworkAction dummy4 = crac.newNetworkAction()
            .withId("dummy4")
            .newPhaseTapChangerTapPositionAction()
            .withNetworkElement("BBE2AA1  BBE3AA1  4")
            .withTapPosition(-9)
            .add()
            .newPhaseTapChangerTapPositionAction()
            .withNetworkElement("BBE2AA1  BBE3AA1  5")
            .withTapPosition(-9)
            .add()
            .add();
        assertEquals(2, dummy4.getElementaryActions().size());

        PhaseTapChangerTapPositionAction phaseTapChangerTapPositionAction = new PhaseTapChangerTapPositionActionBuilder().withId("id").withNetworkElementId("T1").withTapPosition(-9).withRelativeValue(false).build();
        PhaseTapChangerTapPositionAction samePhaseTapChangerTapPositionAction = new PhaseTapChangerTapPositionActionBuilder().withId("id").withNetworkElementId("T1").withTapPosition(-9).withRelativeValue(false).build();
        assertEquals(phaseTapChangerTapPositionAction, samePhaseTapChangerTapPositionAction);
        NetworkAction dummy5 = new NetworkActionImpl("id", "name", "operator", null,
            new HashSet<>(List.of(phaseTapChangerTapPositionAction, samePhaseTapChangerTapPositionAction)), 0, null, Set.of());
        assertEquals(1, dummy5.getElementaryActions().size());
    }

    @Test
    void compatibility() {
        Crac crac = CommonCracCreation.createCracWithRemedialActions();
        NetworkAction pstSetpoint = crac.getNetworkAction("pst-1-tap-3");

        assertTrue(pstSetpoint.isCompatibleWith(pstSetpoint));
        assertTrue(pstSetpoint.isCompatibleWith(crac.getNetworkAction("open-switch-2")));
        assertTrue(pstSetpoint.isCompatibleWith(crac.getNetworkAction("close-switch-1")));
        assertTrue(pstSetpoint.isCompatibleWith(crac.getNetworkAction("close-switch-2")));

        assertTrue(pstSetpoint.isCompatibleWith(crac.getNetworkAction("generator-1-75-mw")));
        assertTrue(pstSetpoint.isCompatibleWith(crac.getNetworkAction("generator-1-100-mw")));
        assertTrue(pstSetpoint.isCompatibleWith(crac.getNetworkAction("generator-2-75-mw")));
        assertTrue(pstSetpoint.isCompatibleWith(crac.getNetworkAction("generator-2-100-mw")));

        assertTrue(pstSetpoint.isCompatibleWith(crac.getNetworkAction("pst-1-tap-3")));
        assertFalse(pstSetpoint.isCompatibleWith(crac.getNetworkAction("pst-1-tap-8")));
        assertTrue(pstSetpoint.isCompatibleWith(crac.getNetworkAction("pst-2-tap-3")));
        assertTrue(pstSetpoint.isCompatibleWith(crac.getNetworkAction("pst-2-tap-8")));

        assertTrue(pstSetpoint.isCompatibleWith(crac.getNetworkAction("open-switch-1-close-switch-2")));
        assertTrue(pstSetpoint.isCompatibleWith(crac.getNetworkAction("open-switch-2-close-switch-1")));
        assertTrue(pstSetpoint.isCompatibleWith(crac.getNetworkAction("open-switch-3-close-switch-4")));
        assertTrue(pstSetpoint.isCompatibleWith(crac.getNetworkAction("open-switch-1-close-switch-3")));
        assertTrue(pstSetpoint.isCompatibleWith(crac.getNetworkAction("open-switch-3-close-switch-2")));
    }
}