TieLineUtilTest.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.network;

import com.powsybl.iidm.network.util.TieLineUtil;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.Optional;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

/**
 * @author Olivier Perrin {@literal <olivier.perrin at rte-france.com>}
 */
public class TieLineUtilTest {

    public static final String PAIRING_KEY = "key";
    private static Network network;
    private static DanglingLine dlConnected1;
    private static DanglingLine dlConnected2;
    private static DanglingLine dlDisconnected1;
    private static DanglingLine dlDisconnected2;

    @BeforeAll
    public static void setup() {
        network = mock(Network.class);
        dlConnected1 = createDanglingLine("connected1", true);
        dlConnected2 = createDanglingLine("connected2", true);
        dlDisconnected1 = createDanglingLine("disconnected1", false);
        dlDisconnected2 = createDanglingLine("disconnected2", false);
    }

    @Test
    void testFindCandidateDanglingLinesWithNoConnected() {
        // 0 connected, 0 disconnected
        configureDanglingLines();
        Assertions.assertTrue(getCandidate().isEmpty());

        // 0 connected, 1 disconnected
        configureDanglingLines(dlDisconnected1);
        Assertions.assertEquals(dlDisconnected1, getCandidate().orElse(null));

        // 0 connected, several disconnected
        configureDanglingLines(dlDisconnected1, dlDisconnected2);
        Assertions.assertTrue(getCandidate().isEmpty());
    }

    @Test
    void testFindCandidateDanglingLinesWithOneConnected() {
        // 1 connected, 0 disconnected
        configureDanglingLines(dlConnected1);
        Assertions.assertEquals(dlConnected1, getCandidate().orElse(null));

        // 1 connected, 1 disconnected
        configureDanglingLines(dlConnected1, dlDisconnected1);
        Assertions.assertEquals(dlConnected1, getCandidate().orElse(null));

        // 1 connected, several disconnected
        configureDanglingLines(dlConnected1, dlDisconnected1, dlDisconnected2);
        Assertions.assertEquals(dlConnected1, getCandidate().orElse(null));
    }

    @Test
    void testFindCandidateDanglingLinesWithSeveralConnected() {
        // several connected, 0 disconnected
        configureDanglingLines(dlConnected1, dlConnected2);
        Assertions.assertTrue(getCandidate().isEmpty());

        // several connected, 1 disconnected
        configureDanglingLines(dlConnected1, dlConnected2, dlDisconnected1);
        Assertions.assertTrue(getCandidate().isEmpty());

        // several connected, several disconnected
        configureDanglingLines(dlConnected1, dlConnected2, dlDisconnected1, dlDisconnected2);
        Assertions.assertTrue(getCandidate().isEmpty());
    }

    private static void configureDanglingLines(DanglingLine... danglingLines) {
        when(network.getDanglingLines(DanglingLineFilter.UNPAIRED)).thenReturn(Arrays.asList(danglingLines));
    }

    private static Optional<DanglingLine> getCandidate() {
        return TieLineUtil.findCandidateDanglingLines(network, k -> false).stream().findFirst();
    }

    private static DanglingLine createDanglingLine(String id, boolean connected) {
        DanglingLine dl = mock(DanglingLine.class);
        when(dl.getId()).thenReturn(id);
        when(dl.getPairingKey()).thenReturn(PAIRING_KEY);
        Terminal terminal = mock(Terminal.class);
        when(terminal.isConnected()).thenReturn(connected);
        when(dl.getTerminal()).thenReturn(terminal);
        return dl;
    }
}