IidmCnecElementHelperTest.java

/*
 * Copyright (c) 2021, 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/.
 */

package com.powsybl.openrao.data.crac.io.commons.iidm;

import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.TwoSides;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

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

/**
 * @author Baptiste Seguinot{@literal <baptiste.seguinot at rte-france.com>}
 */
class IidmCnecElementHelperTest {

    private static final double DOUBLE_TOLERANCE = 1e-3;
    private Network network;

    @BeforeEach
    public void setUp() {
        network = Network.read("TestCase_severalVoltageLevels_Xnodes.uct", getClass().getResourceAsStream("/TestCase_severalVoltageLevels_Xnodes.uct"));
    }

    @Test
    void testValidBranch() {
        // internal branch
        IidmCnecElementHelper cnecHelper = new IidmCnecElementHelper("BBE1AA1  BBE2AA1  1", network);
        assertTrue(cnecHelper.isValid());
        assertEquals("BBE1AA1  BBE2AA1  1", cnecHelper.getIdInNetwork());
        assertEquals(380., cnecHelper.getNominalVoltage(TwoSides.ONE), DOUBLE_TOLERANCE);
        assertEquals(380., cnecHelper.getNominalVoltage(TwoSides.TWO), DOUBLE_TOLERANCE);
        assertEquals(5000., cnecHelper.getCurrentLimit(TwoSides.ONE), DOUBLE_TOLERANCE);
        assertEquals(5000., cnecHelper.getCurrentLimit(TwoSides.TWO), DOUBLE_TOLERANCE);
        assertFalse(cnecHelper.isHalfLine());
        assertFalse(cnecHelper.isInvertedInNetwork());

        // tie-line with full id
        cnecHelper = new IidmCnecElementHelper("FFR3AA1  XBEFR11  1 + XBEFR11  BBE2AA1  1", network);
        assertTrue(cnecHelper.isValid());
        assertEquals("FFR3AA1  XBEFR11  1 + XBEFR11  BBE2AA1  1", cnecHelper.getIdInNetwork());
        assertEquals(380., cnecHelper.getNominalVoltage(TwoSides.ONE), DOUBLE_TOLERANCE);
        assertEquals(380., cnecHelper.getNominalVoltage(TwoSides.TWO), DOUBLE_TOLERANCE);
        assertEquals(5000., cnecHelper.getCurrentLimit(TwoSides.ONE), DOUBLE_TOLERANCE);
        assertEquals(5000., cnecHelper.getCurrentLimit(TwoSides.TWO), DOUBLE_TOLERANCE);
        assertFalse(cnecHelper.isHalfLine());
        assertFalse(cnecHelper.isInvertedInNetwork());
    }

    @Test
    void testInvalidInternalBranch() {
        // unknown from
        assertFalse(new IidmCnecElementHelper("UNKNOW1 BBE1AA1 1", network).isValid());

        // unknown to
        assertFalse(new IidmCnecElementHelper("BBE3AA1 UNKNOW1 1", network).isValid());

        // branch exists but not with this order code
        assertFalse(new IidmCnecElementHelper("BBE1AA1  BBE2AA1  4", network).isValid());
    }

    @Test
    void testValidTransformer() {

        /* note that transformers from/to node are systematically inverted by PowSyBl UCTE importer
        For instance, the transformer with id "UCTNODE1 UCTNODE2 1" have :
            - terminal1 = UCTNODE2
            - terminal2 = UCTNODE1
        That's why the branch is inverted when from/to is aligned with what is defined in the UCTE file, and vice versa.
        This is note the case for the other type of Branch, where terminal 1 and 2 match the id.
         */

        // transformer with order code, from/to same as network
        IidmCnecElementHelper cnecHelper = new IidmCnecElementHelper("BBE2AA1  BBE3AA1  1", network);
        assertTrue(cnecHelper.isValid());
        assertEquals("BBE2AA1  BBE3AA1  1", cnecHelper.getIdInNetwork());
        assertEquals(380., cnecHelper.getNominalVoltage(TwoSides.ONE), DOUBLE_TOLERANCE);
        assertEquals(380., cnecHelper.getNominalVoltage(TwoSides.TWO), DOUBLE_TOLERANCE);
        assertEquals(4500., cnecHelper.getCurrentLimit(TwoSides.ONE), DOUBLE_TOLERANCE);
        assertEquals(4500., cnecHelper.getCurrentLimit(TwoSides.TWO), DOUBLE_TOLERANCE);

        cnecHelper = new IidmCnecElementHelper("FFR1AA2  FFR1AA1  5", network);
        assertTrue(cnecHelper.isValid());
        assertEquals("FFR1AA2  FFR1AA1  5", cnecHelper.getIdInNetwork());
        assertEquals(380., cnecHelper.getNominalVoltage(TwoSides.ONE), DOUBLE_TOLERANCE);
        assertEquals(220., cnecHelper.getNominalVoltage(TwoSides.TWO), DOUBLE_TOLERANCE);
        assertEquals(1500. * 220 / 380, cnecHelper.getCurrentLimit(TwoSides.ONE), DOUBLE_TOLERANCE);
        assertEquals(1500., cnecHelper.getCurrentLimit(TwoSides.TWO), DOUBLE_TOLERANCE);

        cnecHelper = new IidmCnecElementHelper("BBE2AA2  BBE2AA1  2", network);
        assertTrue(cnecHelper.isValid());
        assertEquals("BBE2AA2  BBE2AA1  2", cnecHelper.getIdInNetwork());
        assertEquals(380., cnecHelper.getNominalVoltage(TwoSides.ONE), DOUBLE_TOLERANCE);
        assertEquals(220., cnecHelper.getNominalVoltage(TwoSides.TWO), DOUBLE_TOLERANCE);
        assertEquals(1200. * 220 / 380, cnecHelper.getCurrentLimit(TwoSides.ONE), DOUBLE_TOLERANCE);
        assertEquals(1200., cnecHelper.getCurrentLimit(TwoSides.TWO), DOUBLE_TOLERANCE);
    }

    @Test
    void testInvalidTransformer() {

        // transformer exists but not with this order code
        assertFalse(new IidmCnecElementHelper("BBE2AA1  BBE3AA1  2", network).isValid());

        // transformer exists but not with this element name
        assertFalse(new IidmCnecElementHelper("FFR1AA2  FFR1AA1  COUCOU", network).isValid());
    }

    @Test
    void testValidDanglingLine() {

        // dangling-line with order code
        IidmCnecElementHelper cnecHelper = new IidmCnecElementHelper("BBE2AA1  XBE2AL1  1", network);
        assertTrue(cnecHelper.isValid());
        assertEquals("BBE2AA1  XBE2AL1  1", cnecHelper.getIdInNetwork());
        assertEquals(380., cnecHelper.getNominalVoltage(TwoSides.ONE), DOUBLE_TOLERANCE);
        assertEquals(380., cnecHelper.getNominalVoltage(TwoSides.TWO), DOUBLE_TOLERANCE);
        assertEquals(1250, cnecHelper.getCurrentLimit(TwoSides.ONE), DOUBLE_TOLERANCE);
        assertEquals(1250, cnecHelper.getCurrentLimit(TwoSides.TWO), DOUBLE_TOLERANCE);

        cnecHelper = new IidmCnecElementHelper("BBE2AA1  XBE2AL1  1", network);
        assertTrue(cnecHelper.isValid());
        assertEquals("BBE2AA1  XBE2AL1  1", cnecHelper.getIdInNetwork());
    }

    @Test
    void testInvalidDanglingLine() {
        // dangling-line exists but not with this order code
        assertFalse(new IidmCnecElementHelper("XBE2AL1  BBE2AA1  2", network).isValid());
    }

    @Test
    void testValidHalfLine() {

        // if half-line is put in argument, the associated tie-line is recognized
        IidmCnecElementHelper cnecHelper = new IidmCnecElementHelper("FFR3AA1  XBEFR11  1", network);
        assertTrue(cnecHelper.isValid());
        assertEquals("FFR3AA1  XBEFR11  1 + XBEFR11  BBE2AA1  1", cnecHelper.getIdInNetwork());
        assertEquals(380., cnecHelper.getNominalVoltage(TwoSides.ONE), DOUBLE_TOLERANCE);
        assertEquals(380., cnecHelper.getNominalVoltage(TwoSides.TWO), DOUBLE_TOLERANCE);
        assertEquals(5000., cnecHelper.getCurrentLimit(TwoSides.ONE), DOUBLE_TOLERANCE);
        assertEquals(5000., cnecHelper.getCurrentLimit(TwoSides.TWO), DOUBLE_TOLERANCE);
        assertTrue(cnecHelper.isHalfLine());
        assertFalse(cnecHelper.isInvertedInNetwork());

        cnecHelper = new IidmCnecElementHelper("XBEFR11  BBE2AA1  1", network);
        assertTrue(cnecHelper.isValid());
        assertEquals("FFR3AA1  XBEFR11  1 + XBEFR11  BBE2AA1  1", cnecHelper.getIdInNetwork());
        assertEquals(380., cnecHelper.getNominalVoltage(TwoSides.ONE), DOUBLE_TOLERANCE);
        assertEquals(380., cnecHelper.getNominalVoltage(TwoSides.TWO), DOUBLE_TOLERANCE);
        assertEquals(5000., cnecHelper.getCurrentLimit(TwoSides.ONE), DOUBLE_TOLERANCE);
        assertEquals(5000., cnecHelper.getCurrentLimit(TwoSides.TWO), DOUBLE_TOLERANCE);
        assertTrue(cnecHelper.isHalfLine());
        assertFalse(cnecHelper.isInvertedInNetwork());
    }

    @Test
    void testInvalidConstructor() {
        assertFalse(new IidmCnecElementHelper(null, network).isValid());
    }
}