AngleCnecCreationTest.java

package com.powsybl.openrao.data.crac.io.nc.craccreator.cnec;

import com.powsybl.openrao.data.crac.io.nc.craccreator.NcCracCreationContext;
import com.powsybl.openrao.data.crac.io.nc.craccreator.NcCracCreationTestUtil;
import com.powsybl.openrao.data.crac.api.cnec.AngleCnec;
import com.powsybl.openrao.data.crac.api.usagerule.UsageMethod;
import com.powsybl.openrao.data.crac.io.commons.api.ImportStatus;
import org.junit.jupiter.api.Test;

import java.util.Comparator;
import java.util.List;

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

class AngleCnecCreationTest {

    @Test
    void importAngleCnecs() {
        NcCracCreationContext cracCreationContext = NcCracCreationTestUtil.getNcCracCreationContext("/profiles/cnecs/AngleCNECs.zip", NcCracCreationTestUtil.NETWORK);

        List<AngleCnec> importedFlowCnecs = cracCreationContext.getCrac().getAngleCnecs().stream().sorted(Comparator.comparing(AngleCnec::getId)).toList();
        assertEquals(10, importedFlowCnecs.size());

        NcCracCreationTestUtil.assertAngleCnecEquality(
            importedFlowCnecs.get(0),
            "RTE_AE1 (assessed-element-1) - RTE_CO1 - curative 3",
            "BBE1AA1 ",
            "BBE4AA1 ",
            NcCracCreationTestUtil.CURATIVE_3_INSTANT_ID,
            "contingency-1",
            60d,
            -60d,
            "RTE",
            "ES-FR");

        NcCracCreationTestUtil.assertAngleCnecEquality(
            importedFlowCnecs.get(1),
            "RTE_AE1 (assessed-element-1) - preventive",
            "BBE1AA1 ",
            "BBE4AA1 ",
            NcCracCreationTestUtil.PREVENTIVE_INSTANT_ID,
            null,
            60d,
            -60d,
            "RTE", "ES-FR");

        NcCracCreationTestUtil.assertAngleCnecEquality(
            importedFlowCnecs.get(2),
            "RTE_AE2 (assessed-element-2) - RTE_CO1 - curative 3",
            "BBE1AA1 ",
            "BBE4AA1 ",
            NcCracCreationTestUtil.CURATIVE_3_INSTANT_ID,
            "contingency-1",
            45d,
            -45d,
            "RTE", "ES-FR");

        NcCracCreationTestUtil.assertAngleCnecEquality(
            importedFlowCnecs.get(3),
            "RTE_AE2 (assessed-element-2) - RTE_CO2 - curative 3",
            "BBE1AA1 ",
            "BBE4AA1 ",
            NcCracCreationTestUtil.CURATIVE_3_INSTANT_ID,
            "contingency-2",
            45d,
            -45d,
            "RTE", "ES-FR");

        NcCracCreationTestUtil.assertAngleCnecEquality(
            importedFlowCnecs.get(4),
            "RTE_AE2 (assessed-element-2) - preventive",
            "BBE1AA1 ",
            "BBE4AA1 ",
            NcCracCreationTestUtil.PREVENTIVE_INSTANT_ID,
            null,
            45d,
            -45d,
            "RTE", "ES-FR");

        NcCracCreationTestUtil.assertAngleCnecEquality(
            importedFlowCnecs.get(5),
            "RTE_AE3 (assessed-element-3) - RTE_CO1 - curative 3",
            "BBE4AA1 ",
            "BBE1AA1 ",
            NcCracCreationTestUtil.CURATIVE_3_INSTANT_ID,
            "contingency-1",
            45d,
            -45d,
            "RTE", "ES-FR");

        NcCracCreationTestUtil.assertAngleCnecEquality(
            importedFlowCnecs.get(6),
            "RTE_AE3 (assessed-element-3) - RTE_CO2 - curative 3",
            "BBE4AA1 ",
            "BBE1AA1 ",
            NcCracCreationTestUtil.CURATIVE_3_INSTANT_ID,
            "contingency-2",
            45d,
            -45d,
            "RTE", "ES-FR");

        NcCracCreationTestUtil.assertAngleCnecEquality(
            importedFlowCnecs.get(7),
            "RTE_AE3 (assessed-element-3) - preventive",
            "BBE4AA1 ",
            "BBE1AA1 ",
            NcCracCreationTestUtil.PREVENTIVE_INSTANT_ID,
            null,
            45d,
            -45d,
            "RTE", "ES-FR");

        NcCracCreationTestUtil.assertAngleCnecEquality(
            importedFlowCnecs.get(8),
            "RTE_AE4 (assessed-element-4) - RTE_CO2 - curative 3",
            "BBE1AA1 ",
            "BBE4AA1 ",
            NcCracCreationTestUtil.CURATIVE_3_INSTANT_ID,
            "contingency-2",
            60d,
            null,
            "RTE", "ES-FR");

        NcCracCreationTestUtil.assertAngleCnecEquality(
            importedFlowCnecs.get(9),
            "RTE_AE5 (assessed-element-5) - preventive",
            "BBE1AA1 ",
            "BBE4AA1 ",
            NcCracCreationTestUtil.PREVENTIVE_INSTANT_ID,
            null,
            null,
            -30d,
            "RTE", "ES-FR");

        assertEquals(8, cracCreationContext.getCnecCreationContexts().stream().filter(context -> !context.isImported()).toList().size());

        NcCracCreationTestUtil.assertCnecNotImported(cracCreationContext, "assessed-element-6", ImportStatus.INCONSISTENCY_IN_DATA, "AssessedElement assessed-element-6 ignored because AngleCNEC's importing and exporting equipments are the same: BBE4AA1 ");
        NcCracCreationTestUtil.assertCnecNotImported(cracCreationContext, "assessed-element-7", ImportStatus.ELEMENT_NOT_FOUND_IN_NETWORK, "AssessedElement assessed-element-7 ignored because the angle limit equipment unknown-terminal is missing in network");
        NcCracCreationTestUtil.assertCnecNotImported(cracCreationContext, "assessed-element-8", ImportStatus.ELEMENT_NOT_FOUND_IN_NETWORK, "AssessedElement assessed-element-8 ignored because the angle limit equipment unknown-terminal is missing in network");
        NcCracCreationTestUtil.assertCnecNotImported(cracCreationContext, "assessed-element-9", ImportStatus.INCONSISTENCY_IN_DATA, "AssessedElement assessed-element-9 ignored because the angle limit's normal value is negative");
        NcCracCreationTestUtil.assertCnecNotImported(cracCreationContext, "assessed-element-10", ImportStatus.INCONSISTENCY_IN_DATA, "AssessedElement assessed-element-10 ignored because of an ambiguous angle limit direction definition from an undefined VoltageAngleLimit.isFlowToRefTerminal and an OperationalLimit.OperationalLimitType: http://iec.ch/TC57/CIM100#OperationalLimitDirectionKind.low");
        NcCracCreationTestUtil.assertCnecNotImported(cracCreationContext, "assessed-element-11", ImportStatus.INCONSISTENCY_IN_DATA, "AssessedElement assessed-element-11 ignored because of an ambiguous angle limit direction definition from an undefined VoltageAngleLimit.isFlowToRefTerminal and an OperationalLimit.OperationalLimitType: http://iec.ch/TC57/CIM100#OperationalLimitDirectionKind.high");
        NcCracCreationTestUtil.assertCnecNotImported(cracCreationContext, "assessed-element-12", ImportStatus.INCONSISTENCY_IN_DATA, "AssessedElement assessed-element-12 ignored because the network element FFR1AA1 _generator is not a bus bar section");
        NcCracCreationTestUtil.assertCnecNotImported(cracCreationContext, "assessed-element-13", ImportStatus.INCONSISTENCY_IN_DATA, "AssessedElement assessed-element-13 ignored because the network element FFR2AA1 _generator is not a bus bar section");

        NcCracCreationTestUtil.assertHasOnConstraintUsageRule(cracCreationContext, "remedial-action-1", "RTE_AE1 (assessed-element-1) - RTE_CO1 - curative 3", cracCreationContext.getCrac().getInstant(NcCracCreationTestUtil.CURATIVE_3_INSTANT_ID), UsageMethod.AVAILABLE, AngleCnec.class);
    }
}