ElementaryFlowCnecResultTest.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.raoresult.impl;

import com.powsybl.openrao.commons.OpenRaoException;
import com.powsybl.openrao.commons.Unit;
import com.powsybl.iidm.network.TwoSides;
import org.junit.jupiter.api.Test;

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

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

    private void assertMarginsAreNan(ElementaryFlowCnecResult elementaryFlowCnecResult, Unit unit) {
        assertEquals(Double.NaN, elementaryFlowCnecResult.getMargin(unit), 1e-3);
        assertEquals(Double.NaN, elementaryFlowCnecResult.getRelativeMargin(unit), 1e-3);
    }

    private void assertFlowsAreNan(ElementaryFlowCnecResult elementaryFlowCnecResult, Unit unit, TwoSides side) {
        assertEquals(Double.NaN, elementaryFlowCnecResult.getFlow(side, unit), 1e-3);
        assertEquals(Double.NaN, elementaryFlowCnecResult.getCommercialFlow(side, unit), 1e-3);
        assertEquals(Double.NaN, elementaryFlowCnecResult.getLoopFlow(side, unit), 1e-3);
    }

    @Test
    void defaultValuesTest() {
        ElementaryFlowCnecResult elementaryFlowCnecResult = new ElementaryFlowCnecResult();

        assertMarginsAreNan(elementaryFlowCnecResult, Unit.MEGAWATT);
        assertMarginsAreNan(elementaryFlowCnecResult, Unit.AMPERE);

        assertFlowsAreNan(elementaryFlowCnecResult, Unit.MEGAWATT, TwoSides.ONE);
        assertFlowsAreNan(elementaryFlowCnecResult, Unit.MEGAWATT, TwoSides.TWO);
        assertFlowsAreNan(elementaryFlowCnecResult, Unit.AMPERE, TwoSides.ONE);
        assertFlowsAreNan(elementaryFlowCnecResult, Unit.AMPERE, TwoSides.TWO);

        assertEquals(Double.NaN, elementaryFlowCnecResult.getPtdfZonalSum(TwoSides.ONE), 1e-3);
        assertEquals(Double.NaN, elementaryFlowCnecResult.getPtdfZonalSum(TwoSides.TWO), 1e-3);
    }

    @Test
    void getterAndSetters() {
        ElementaryFlowCnecResult elementaryFlowCnecResult = new ElementaryFlowCnecResult();

        // Per unit
        elementaryFlowCnecResult.setMargin(101, Unit.MEGAWATT);
        elementaryFlowCnecResult.setRelativeMargin(102, Unit.MEGAWATT);
        elementaryFlowCnecResult.setMargin(201, Unit.AMPERE);
        elementaryFlowCnecResult.setRelativeMargin(202, Unit.AMPERE);
        assertEquals(101, elementaryFlowCnecResult.getMargin(Unit.MEGAWATT), 1e-3);
        assertEquals(102, elementaryFlowCnecResult.getRelativeMargin(Unit.MEGAWATT), 1e-3);
        assertEquals(201, elementaryFlowCnecResult.getMargin(Unit.AMPERE), 1e-3);
        assertEquals(202, elementaryFlowCnecResult.getRelativeMargin(Unit.AMPERE), 1e-3);

        // Per side
        elementaryFlowCnecResult.setPtdfZonalSum(TwoSides.ONE, 1);
        elementaryFlowCnecResult.setPtdfZonalSum(TwoSides.TWO, 2);
        assertEquals(1, elementaryFlowCnecResult.getPtdfZonalSum(TwoSides.ONE), 1e-3);
        assertEquals(2, elementaryFlowCnecResult.getPtdfZonalSum(TwoSides.TWO), 1e-3);

        // Per unit per side
        elementaryFlowCnecResult.setFlow(TwoSides.ONE, 100, Unit.MEGAWATT);
        elementaryFlowCnecResult.setCommercialFlow(TwoSides.ONE, 103, Unit.MEGAWATT);
        elementaryFlowCnecResult.setLoopFlow(TwoSides.ONE, 104, Unit.MEGAWATT);
        elementaryFlowCnecResult.setFlow(TwoSides.TWO, 105, Unit.MEGAWATT);
        elementaryFlowCnecResult.setCommercialFlow(TwoSides.TWO, 106, Unit.MEGAWATT);
        elementaryFlowCnecResult.setLoopFlow(TwoSides.TWO, 107, Unit.MEGAWATT);
        assertEquals(100, elementaryFlowCnecResult.getFlow(TwoSides.ONE, Unit.MEGAWATT), 1e-3);
        assertEquals(103, elementaryFlowCnecResult.getCommercialFlow(TwoSides.ONE, Unit.MEGAWATT), 1e-3);
        assertEquals(104, elementaryFlowCnecResult.getLoopFlow(TwoSides.ONE, Unit.MEGAWATT), 1e-3);
        assertEquals(105, elementaryFlowCnecResult.getFlow(TwoSides.TWO, Unit.MEGAWATT), 1e-3);
        assertEquals(106, elementaryFlowCnecResult.getCommercialFlow(TwoSides.TWO, Unit.MEGAWATT), 1e-3);
        assertEquals(107, elementaryFlowCnecResult.getLoopFlow(TwoSides.TWO, Unit.MEGAWATT), 1e-3);

        elementaryFlowCnecResult.setFlow(TwoSides.ONE, 200, Unit.AMPERE);
        elementaryFlowCnecResult.setCommercialFlow(TwoSides.ONE, 203, Unit.AMPERE);
        elementaryFlowCnecResult.setLoopFlow(TwoSides.ONE, 204, Unit.AMPERE);
        elementaryFlowCnecResult.setFlow(TwoSides.TWO, 205, Unit.AMPERE);
        elementaryFlowCnecResult.setCommercialFlow(TwoSides.TWO, 206, Unit.AMPERE);
        elementaryFlowCnecResult.setLoopFlow(TwoSides.TWO, 207, Unit.AMPERE);
        assertEquals(200, elementaryFlowCnecResult.getFlow(TwoSides.ONE, Unit.AMPERE), 1e-3);
        assertEquals(203, elementaryFlowCnecResult.getCommercialFlow(TwoSides.ONE, Unit.AMPERE), 1e-3);
        assertEquals(204, elementaryFlowCnecResult.getLoopFlow(TwoSides.ONE, Unit.AMPERE), 1e-3);
        assertEquals(205, elementaryFlowCnecResult.getFlow(TwoSides.TWO, Unit.AMPERE), 1e-3);
        assertEquals(206, elementaryFlowCnecResult.getCommercialFlow(TwoSides.TWO, Unit.AMPERE), 1e-3);
        assertEquals(207, elementaryFlowCnecResult.getLoopFlow(TwoSides.TWO, Unit.AMPERE), 1e-3);
    }

    @Test
    void notAFlowUnitTest() {
        ElementaryFlowCnecResult elementaryFlowCnecResult = new ElementaryFlowCnecResult();
        assertThrows(OpenRaoException.class, () -> elementaryFlowCnecResult.setLoopFlow(TwoSides.TWO, 100, Unit.KILOVOLT));
    }
}