LoadFlowDefaultParametersLoaderTest.java

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

import com.google.common.jimfs.Configuration;
import com.google.common.jimfs.Jimfs;
import com.powsybl.commons.PowsyblException;
import com.powsybl.commons.config.InMemoryPlatformConfig;
import com.powsybl.commons.config.MapModuleConfig;
import com.powsybl.commons.extensions.Extension;
import com.powsybl.loadflow.json.JsonLoadFlowParametersTest;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.nio.file.FileSystem;
import java.util.List;

import static com.powsybl.loadflow.LoadFlowParameters.load;
import static org.junit.jupiter.api.Assertions.*;

/**
 * @author Hugo Kulesza {@literal <hugo.kulesza at rte-france.com>}
 */
class LoadFlowDefaultParametersLoaderTest {

    InMemoryPlatformConfig platformConfig;

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

    @Test
    void testLoadParametersFromClassPath() {
        LoadFlowDefaultParametersLoaderMock loader = new LoadFlowDefaultParametersLoaderMock("test");

        LoadFlowParameters parameters = new LoadFlowParameters(List.of(loader), platformConfig);

        assertFalse(parameters.isUseReactiveLimits());
        assertEquals(LoadFlowParameters.VoltageInitMode.DC_VALUES, parameters.getVoltageInitMode());
        List<Extension<LoadFlowParameters>> extensions = parameters.getExtensions().stream().toList();
        assertEquals(1, extensions.size());
        JsonLoadFlowParametersTest.DummyExtension dummyExtension = (JsonLoadFlowParametersTest.DummyExtension) extensions.get(0);
        assertEquals(5, dummyExtension.getParameterDouble());
    }

    @Test
    void testWithAModuleButNoProperty() {
        LoadFlowDefaultParametersLoaderMock loader = new LoadFlowDefaultParametersLoaderMock("test");

        platformConfig.createModuleConfig("load-flow");

        LoadFlowParameters parameters = new LoadFlowParameters(List.of(loader), platformConfig);
        JsonLoadFlowParametersTest.DummyExtension extension = parameters.getExtension(JsonLoadFlowParametersTest.DummyExtension.class);
        // The module is present in configuration, but no "default-parameters-loader" is set.
        // A unique loader is found: it is used.
        assertNotNull(extension);
        assertEquals("Hello", extension.getParameterString());
    }

    @Test
    void testLoaderButWrongDefault() {
        LoadFlowDefaultParametersLoaderMock loader = new LoadFlowDefaultParametersLoaderMock("test1");

        MapModuleConfig moduleConfig = platformConfig.createModuleConfig("load-flow");
        moduleConfig.setStringProperty("default-parameters-loader", "test2");

        LoadFlowParameters parameters = new LoadFlowParameters(List.of(loader), platformConfig);
        // The loader was not used since it doesn't match the expected one. No exception is thrown.
        assertNull(parameters.getExtension(JsonLoadFlowParametersTest.DummyExtension.class));
    }

    @Test
    void testConflictBetweenDefaultParametersLoader() {
        LoadFlowDefaultParametersLoaderMock loader1 = new LoadFlowDefaultParametersLoaderMock("test1");
        LoadFlowDefaultParametersLoaderMock loader2 = new LoadFlowDefaultParametersLoaderMock("test2");
        List<LoadFlowDefaultParametersLoader> loaders = List.of(loader1, loader2);

        assertThrows(PowsyblException.class, () -> new LoadFlowParameters(loaders, platformConfig));

        MapModuleConfig moduleConfig = platformConfig.createModuleConfig("load-flow");
        moduleConfig.setStringProperty("default-parameters-loader", "test1");

        LoadFlowParameters parameters = new LoadFlowParameters(loaders, platformConfig);
        List<Extension<LoadFlowParameters>> extensions = parameters.getExtensions().stream().toList();
        assertEquals(1, extensions.size());
    }

    @Test
    void testCorrectLoadingOrder() {
        MapModuleConfig moduleConfig = platformConfig.createModuleConfig("load-flow-default-parameters");
        moduleConfig.setStringProperty("voltageInitMode", "PREVIOUS_VALUES");

        LoadFlowDefaultParametersLoaderMock loader = new LoadFlowDefaultParametersLoaderMock("test");

        LoadFlowParameters parameters = new LoadFlowParameters(List.of(loader));
        load(parameters, platformConfig);
        assertFalse(parameters.isUseReactiveLimits());
        assertEquals(LoadFlowParameters.VoltageInitMode.PREVIOUS_VALUES, parameters.getVoltageInitMode());
    }

    @Test
    void testProviderParameters() {
        LoadFlowDefaultParametersLoaderMock loader = new LoadFlowDefaultParametersLoaderMock("test");
        LoadFlowParameters parameters = new LoadFlowParameters(List.of(loader), platformConfig);

        // LoadFlowDefaultParametersLoaderMock creates provider parameters extensions
        JsonLoadFlowParametersTest.DummyExtension beforePlatformConfig = parameters.getExtension(JsonLoadFlowParametersTest.DummyExtension.class);
        assertNotNull(beforePlatformConfig);
        assertEquals(5, beforePlatformConfig.getParameterDouble());
        assertEquals("Hello", beforePlatformConfig.getParameterString());

        MapModuleConfig moduleConfig = platformConfig.createModuleConfig("dummy-extension");
        moduleConfig.setStringProperty("parameterString", "modified");

        load(parameters, platformConfig);
        parameters.loadExtensions(platformConfig);

        // loadExtensions only override values that are present in PlatformConfig
        JsonLoadFlowParametersTest.DummyExtension afterPlatformConfig = parameters.getExtension(JsonLoadFlowParametersTest.DummyExtension.class);
        assertNotNull(afterPlatformConfig);
        assertEquals(5, afterPlatformConfig.getParameterDouble());
        assertEquals("modified", afterPlatformConfig.getParameterString());
    }
}