DynamicSimulationParametersTest.java

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

import java.io.IOException;
import java.nio.file.FileSystem;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import com.google.auto.service.AutoService;
import com.google.common.jimfs.Configuration;
import com.google.common.jimfs.Jimfs;
import com.powsybl.commons.config.InMemoryPlatformConfig;
import com.powsybl.commons.config.MapModuleConfig;
import com.powsybl.commons.config.PlatformConfig;
import com.powsybl.commons.extensions.AbstractExtension;

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

/**
 * @author Marcos de Miguel {@literal <demiguelm at aia.es>}
 */
class DynamicSimulationParametersTest {

    private InMemoryPlatformConfig platformConfig;
    private FileSystem fileSystem;

    @BeforeEach
    void setUp() {
        fileSystem = Jimfs.newFileSystem(Configuration.unix());
        platformConfig = new InMemoryPlatformConfig(fileSystem);
    }

    @AfterEach
    void tearDown() throws IOException {
        fileSystem.close();
    }

    private static void checkValues(DynamicSimulationParameters parameters, double startTime, double stopTime) {
        assertEquals(parameters.getStartTime(), startTime);
        assertEquals(parameters.getStopTime(), stopTime);
    }

    @Test
    void testNoConfig() {
        DynamicSimulationParameters parameters = new DynamicSimulationParameters();
        DynamicSimulationParameters.load(parameters, platformConfig);
        checkValues(parameters, DynamicSimulationParameters.DEFAULT_START_TIME,
                DynamicSimulationParameters.DEFAULT_STOP_TIME);
    }

    @Test
    void testConstructorStartTimeAsssertion() {
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> new DynamicSimulationParameters(-1, 0));
        assertTrue(e.getMessage().contains("Start time should be zero or positive"));
    }

    @Test
    void testConstructorStopTimeAsssertion() {
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> new DynamicSimulationParameters(0, 0));
        assertTrue(e.getMessage().contains("Stop time should be greater than start time"));
    }

    @Test
    void testStartTimeAsssertion() {
        DynamicSimulationParameters parameters = new DynamicSimulationParameters();
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> parameters.setStartTime(-1));
        assertTrue(e.getMessage().contains("Start time should be zero or positive"));
    }

    @Test
    void testStopTimeAsssertion() {
        DynamicSimulationParameters parameters = new DynamicSimulationParameters();
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> parameters.setStopTime(0));
        assertTrue(e.getMessage().contains("Stop time should be greater than start time"));
    }

    @Test
    void testToString() {
        DynamicSimulationParameters parameters = new DynamicSimulationParameters(0, 40.55);
        assertEquals("{startTime=0.0, stopTime=40.55}", parameters.toString());
    }

    @Test
    void checkConfig() {
        int startTime = 1;
        int stopTime = 100;

        MapModuleConfig moduleConfig = platformConfig.createModuleConfig("dynamic-simulation-default-parameters");
        moduleConfig.setStringProperty("startTime", Integer.toString(startTime));
        moduleConfig.setStringProperty("stopTime", Integer.toString(stopTime));
        DynamicSimulationParameters parameters = new DynamicSimulationParameters();
        DynamicSimulationParameters.load(parameters, platformConfig);
        checkValues(parameters, startTime, stopTime);
    }

    @Test
    void checkSetters() {
        int startTime = 1;
        int stopTime = 100;

        DynamicSimulationParameters parameters = new DynamicSimulationParameters();
        DynamicSimulationParameters.load(parameters, platformConfig);
        parameters.setStartTime(startTime);
        parameters.setStopTime(stopTime);

        checkValues(parameters, startTime, stopTime);
    }

    @Test
    void checkClone() {
        int startTime = 1;
        int stopTime = 100;
        DynamicSimulationParameters parameters = new DynamicSimulationParameters(startTime, stopTime);
        DynamicSimulationParameters parametersCloned = parameters.copy();
        checkValues(parametersCloned, parameters.getStartTime(), parameters.getStopTime());
    }

    @Test
    void testExtensions() {
        DynamicSimulationParameters parameters = new DynamicSimulationParameters();
        DummyExtension dummyExtension = new DummyExtension();
        parameters.addExtension(DummyExtension.class, dummyExtension);

        assertEquals(1, parameters.getExtensions().size());
        assertTrue(parameters.getExtensions().contains(dummyExtension));
        assertInstanceOf(DummyExtension.class, parameters.getExtensionByName("dummyExtension"));
        assertInstanceOf(DummyExtension.class, parameters.getExtension(DummyExtension.class));
    }

    @Test
    void testNoExtensions() {
        DynamicSimulationParameters parameters = new DynamicSimulationParameters();

        assertEquals(0, parameters.getExtensions().size());
        assertFalse(parameters.getExtensions().contains(new DummyExtension()));
        assertFalse(parameters.getExtensionByName("dummyExtension") instanceof DummyExtension);
        assertNull(parameters.getExtension(DummyExtension.class));
    }

    @Test
    void testExtensionFromConfig() {
        DynamicSimulationParameters parameters = DynamicSimulationParameters.load(platformConfig);

        assertEquals(1, parameters.getExtensions().size());
        assertInstanceOf(DummyExtension.class, parameters.getExtensionByName("dummyExtension"));
        assertNotNull(parameters.getExtension(DummyExtension.class));
    }

    private static class DummyExtension extends AbstractExtension<DynamicSimulationParameters> {

        @Override
        public String getName() {
            return "dummyExtension";
        }
    }

    @AutoService(DynamicSimulationParameters.ConfigLoader.class)
    public static class DummyLoader implements DynamicSimulationParameters.ConfigLoader<DummyExtension> {

        @Override
        public DummyExtension load(PlatformConfig platformConfig) {
            return new DummyExtension();
        }

        @Override
        public String getExtensionName() {
            return "dummyExtension";
        }

        @Override
        public String getCategoryName() {
            return "dynamic-simulation-parameters";
        }

        @Override
        public Class<? super DummyExtension> getExtensionClass() {
            return DummyExtension.class;
        }
    }
}