ReactiveCapabilityCurveImplTest.java
/**
* Copyright (c) 2016, All partners of the iTesla project (http://www.itesla-project.eu/consortium)
* 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.impl;
import com.powsybl.iidm.network.ReactiveCapabilityCurve.Point;
import com.powsybl.iidm.network.impl.ReactiveCapabilityCurveImpl.PointImpl;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import java.util.TreeMap;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
*
* @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
*/
class ReactiveCapabilityCurveImplTest {
private ReactiveCapabilityCurveImpl createCurve(Point... points) {
TreeMap<Double, Point> map = new TreeMap<>();
for (Point pt : points) {
map.put(pt.getP(), pt);
}
return new ReactiveCapabilityCurveImpl(map, "ReactiveCapabilityCurve owner");
}
@Test
void testReactiveCapabilityCurve() {
ReactiveCapabilityCurveImpl curve = createCurve(new PointImpl(100.0, 200.0, 300.0),
new PointImpl(200.0, 300.0, 400.0));
// bounds test
assertEquals(200.0, curve.getMinQ(100.0), 0.0);
assertEquals(300.0, curve.getMaxQ(100.0), 0.0);
assertEquals(300.0, curve.getMinQ(200.0), 0.0);
assertEquals(400.0, curve.getMaxQ(200.0), 0.0);
// interpolation test
assertEquals(250.0, curve.getMinQ(150.0), 0.0);
assertEquals(350.0, curve.getMaxQ(150.0), 0.0);
assertEquals(210.0, curve.getMinQ(110.0), 0.0);
assertEquals(310.0, curve.getMaxQ(110.0), 0.0);
// out of bounds test
assertEquals(200.0, curve.getMinQ(0.0), 0.0);
assertEquals(300.0, curve.getMaxQ(0.0), 0.0);
assertEquals(300.0, curve.getMinQ(1000.0), 0.0);
assertEquals(400.0, curve.getMaxQ(1000.0), 0.0);
}
@ParameterizedTest
@ValueSource(booleans = {true, false})
void testReactiveCapabilityCurveWithReactiveLimitsExtrapolation(boolean extrapolate) {
ReactiveCapabilityCurveImpl curve = createCurve(new PointImpl(100.0, 200.0, 300.0),
new PointImpl(200.0, 300.0, 400.0),
new PointImpl(300.0, 300.0, 400.0),
new PointImpl(400.0, 310.0, 390.0));
// bounds test
assertEquals(200.0, curve.getMinQ(100.0, extrapolate), 0.0);
assertEquals(300.0, curve.getMaxQ(100.0, extrapolate), 0.0);
assertEquals(300.0, curve.getMinQ(200.0, extrapolate), 0.0);
assertEquals(400.0, curve.getMaxQ(200.0, extrapolate), 0.0);
// interpolation test
assertEquals(250.0, curve.getMinQ(150.0, extrapolate), 0.0);
assertEquals(350.0, curve.getMaxQ(150.0, extrapolate), 0.0);
assertEquals(210.0, curve.getMinQ(110.0, extrapolate), 0.0);
assertEquals(310.0, curve.getMaxQ(110.0, extrapolate), 0.0);
// out of bounds test
assertEquals(extrapolate ? 100.0 : 200.0, curve.getMinQ(0.0, extrapolate), 0.0);
assertEquals(extrapolate ? 200.0 : 300.0, curve.getMaxQ(0.0, extrapolate), 0.0);
assertEquals(extrapolate ? 320.0 : 310.0, curve.getMinQ(500.0, extrapolate), 0.0);
assertEquals(extrapolate ? 380.0 : 390.0, curve.getMaxQ(500.0, extrapolate), 0.0);
// intersecting reactive limits test
assertEquals(extrapolate ? 350.0 : 310.0, curve.getMinQ(1500.0, extrapolate), 0.0);
assertEquals(extrapolate ? 350.0 : 390.0, curve.getMaxQ(1500.0, extrapolate), 0.0);
}
@Test
void testWithNegativeZeroValue() {
ReactiveCapabilityCurveImpl curve = createCurve(new PointImpl(0.0, 200.0, 300.0),
new PointImpl(200.0, 300.0, 400.0));
// "-0.0 == 0.0" (JLS), but "Double.compareTo(-0.0, 0.0) = -1"
// This test asserts that -0.0 is considered as equal to 0.0 by the reactive capability curve.
assertEquals(200.0, curve.getMinQ(-0.0), 0.0);
}
}