AbstractManipulationsOnVariantsTest.java

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

import com.google.common.collect.Sets;
import com.powsybl.commons.PowsyblException;
import com.powsybl.iidm.network.DefaultNetworkListener;
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.NetworkListener;
import com.powsybl.iidm.network.VariantManager;
import com.powsybl.iidm.network.test.NoEquipmentNetworkFactory;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import static com.powsybl.iidm.network.VariantManagerConstants.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

/**
 * @author Yichen Tang {@literal <yichen.tang at rte-france.com>}
 */
public abstract class AbstractManipulationsOnVariantsTest {

    private Network network;
    private VariantManager variantManager;

    @BeforeEach
    public void setUp() {
        network = NoEquipmentNetworkFactory.create();
        variantManager = network.getVariantManager();
    }

    @Test
    public void errorRemoveInitialVariant() {
        PowsyblException e = assertThrows(PowsyblException.class, () -> variantManager.removeVariant(INITIAL_VARIANT_ID));
        assertEquals("Removing initial variant is forbidden", e.getMessage());
    }

    @Test
    public void errorNotExistingVariant() {
        PowsyblException e = assertThrows(PowsyblException.class, () -> variantManager.removeVariant("not_exists"));
        assertTrue(e.getMessage().contains("not found"));
    }

    @Test
    public void errorCloneToEmptyVariants() {
        IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> variantManager.cloneVariant(INITIAL_VARIANT_ID, Collections.emptyList()));
        assertEquals("Empty target variant id list", e.getMessage());
    }

    @Test
    public void errorCloneToExistingVariant() {
        variantManager.cloneVariant(INITIAL_VARIANT_ID, "hello");
        PowsyblException e = assertThrows(PowsyblException.class, () -> variantManager.cloneVariant(INITIAL_VARIANT_ID, "hello"));
        assertTrue(e.getMessage().contains("already exists"));
    }

    @Test
    public void baseTests() {
        NetworkListener exceptionListener = mock(DefaultNetworkListener.class);
        doThrow(new UnsupportedOperationException()).when(exceptionListener).onVariantCreated(any(), anyString());
        doThrow(new UnsupportedOperationException()).when(exceptionListener).onVariantOverwritten(any(), any());
        doThrow(new UnsupportedOperationException()).when(exceptionListener).onVariantRemoved(any());

        NetworkListener mockedListener = mock(DefaultNetworkListener.class);
        // Add observer changes to current network
        network.addListener(exceptionListener);
        network.addListener(mockedListener);

        List<String> variantsToAdd = Arrays.asList("s1", "s2", "s3", "s4");
        // extend
        variantManager.cloneVariant(INITIAL_VARIANT_ID, variantsToAdd);
        assertEquals(Sets.newHashSet(INITIAL_VARIANT_ID, "s1", "s2", "s3", "s4"), variantManager.getVariantIds());

        // Check variant creation notification
        verify(mockedListener, times(1)).onVariantCreated(INITIAL_VARIANT_ID, "s1");
        verify(mockedListener, times(1)).onVariantCreated(INITIAL_VARIANT_ID, "s2");
        verify(mockedListener, times(1)).onVariantCreated(INITIAL_VARIANT_ID, "s3");
        verify(mockedListener, times(1)).onVariantCreated(INITIAL_VARIANT_ID, "s4");

        // delete
        variantManager.removeVariant("s2");
        assertEquals(Sets.newHashSet(INITIAL_VARIANT_ID, "s1", "s3", "s4"), variantManager.getVariantIds());

        // Check variant removal notification
        verify(mockedListener, times(1)).onVariantRemoved("s2");
        // No notification for Allocation & Reduction
        verifyNoMoreInteractions(mockedListener);

        // allocate
        variantManager.cloneVariant("s4", "s2b");
        assertEquals(Sets.newHashSet(INITIAL_VARIANT_ID, "s1", "s2b", "s3", "s4"), variantManager.getVariantIds());

        // Overwrite
        variantManager.cloneVariant("s4", "s2b", true);
        verify(mockedListener, times(1)).onVariantOverwritten("s4", "s2b");

        // reduce
        variantManager.setWorkingVariant("s4");
        variantManager.removeVariant("s4");
        assertEquals(Sets.newHashSet(INITIAL_VARIANT_ID, "s2b", "s1", "s3"), variantManager.getVariantIds());

        try {
            variantManager.getWorkingVariantId();
            fail();
        } catch (Exception ignored) {
            // ignore
        }

        network.removeListener(mockedListener);
    }
}