SecurityAnalysisResultComparisonWriterTest.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.security.comparator;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import com.powsybl.iidm.network.TwoSides;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.powsybl.security.LimitViolation;
import com.powsybl.security.LimitViolationType;
/**
*
* @author Massimo Ferraro {@literal <massimo.ferraro@techrain.eu>}
*/
class SecurityAnalysisResultComparisonWriterTest {
LimitViolation vlViolation;
LimitViolation lineViolation;
LimitViolation similarLineViolation;
List<String> actions;
Writer writer;
SecurityAnalysisResultComparisonWriter comparisonWriter;
@BeforeEach
void setUp() {
vlViolation = new LimitViolation("VL1", LimitViolationType.HIGH_VOLTAGE, 200.0, 1, 250.0);
lineViolation = new LimitViolation("NHV1_NHV2_1", LimitViolationType.CURRENT, "PermanentLimit", Integer.MAX_VALUE, 1000.0, 1, 1100.0, TwoSides.ONE);
similarLineViolation = new LimitViolation("NHV1_NHV2_1", LimitViolationType.CURRENT, "PermanentLimit", Integer.MAX_VALUE, 1000.0, 1, 1100.09, TwoSides.ONE);
actions = Arrays.asList("action1", "action2");
writer = new StringWriter();
comparisonWriter = new SecurityAnalysisResultComparisonWriter(writer);
}
@AfterEach
void tearDown() throws IOException {
comparisonWriter.close();
}
@Test
void write() {
String content = String.join(System.lineSeparator(),
"Security Analysis Results Comparison",
String.join(";", "Contingency", "StatusResult1", "StatusResult2", "Equipment", "End", "ViolationType",
"ViolationNameResult1", "ValueResult1", "LimitResult1", "ViolationNameResult2", "ValueResult2",
"LimitResult2", "ActionsResult1", "ActionsResult2", "Comparison"),
String.join(";", "", "converge", "converge", "", "", "", "", "", "", "", "", "", "", "", "equivalent"),
String.join(";", "", "", "", "VL1", "", LimitViolationType.HIGH_VOLTAGE.name(),
"", String.format(Locale.getDefault(), "%g", 250.0), String.format(Locale.getDefault(), "%g", 200.0),
"", String.format(Locale.getDefault(), "%g", 250.0), String.format(Locale.getDefault(), "%g", 200.0),
"", "", "equivalent"),
String.join(";", "contingency", "converge", "converge", "", "", "", "", "", "", "", "", "", "", "", "equivalent"),
String.join(";", "contingency", "", "", "VL1", "", LimitViolationType.HIGH_VOLTAGE.name(),
"", String.format(Locale.getDefault(), "%g", 250.0), String.format(Locale.getDefault(), "%g", 200.0),
"", String.format(Locale.getDefault(), "%g", 250.0), String.format(Locale.getDefault(), "%g", 200.0),
"", "", "equivalent"),
String.join(";", "contingency", "", "", "NHV1_NHV2_1", TwoSides.ONE.name(), LimitViolationType.CURRENT.name(),
"PermanentLimit", String.format(Locale.getDefault(), "%g", 1100.0), String.format(Locale.getDefault(), "%g", 1000.0),
"PermanentLimit", String.format(Locale.getDefault(), "%g", 1100.09), String.format(Locale.getDefault(), "%g", 1000.0),
"", "", "equivalent"),
String.join(";", "contingency", "", "", "", "", "", "", "", "", "", "", "", actions.toString(), actions.toString(), "equivalent"));
// precontingency violations results
comparisonWriter.write(true, true, true);
comparisonWriter.write(vlViolation, vlViolation, true);
comparisonWriter.write(Collections.emptyList(), Collections.emptyList(), true);
// postcontingency violations results
comparisonWriter.setContingency("contingency");
comparisonWriter.write(true, true, true);
comparisonWriter.write(vlViolation, vlViolation, true);
comparisonWriter.write(lineViolation, similarLineViolation, true);
comparisonWriter.write(actions, actions, true);
assertEquals(content, writer.toString().trim());
}
@Test
void writeMissingResult1() {
String content = String.join(System.lineSeparator(),
"Security Analysis Results Comparison",
String.join(";", "Contingency", "StatusResult1", "StatusResult2", "Equipment", "End", "ViolationType",
"ViolationNameResult1", "ValueResult1", "LimitResult1", "ViolationNameResult2", "ValueResult2",
"LimitResult2", "ActionsResult1", "ActionsResult2", "Comparison"),
String.join(";", "", "converge", "converge", "", "", "", "", "", "", "", "", "", "", "", "equivalent"),
String.join(";", "", "", "", "VL1", "", LimitViolationType.HIGH_VOLTAGE.name(),
"", String.format(Locale.getDefault(), "%g", 250.0), String.format(Locale.getDefault(), "%g", 200.0),
"", String.format(Locale.getDefault(), "%g", 250.0), String.format(Locale.getDefault(), "%g", 200.0),
"", "", "equivalent"),
String.join(";", "contingency", "diverge", "converge", "", "", "", "", "", "", "", "", "", "", "", "different"),
String.join(";", "contingency", "", "", "VL1", "", LimitViolationType.HIGH_VOLTAGE.name(),
"", "", "",
"", String.format(Locale.getDefault(), "%g", 250.0), String.format(Locale.getDefault(), "%g", 200.0),
"", "", "different"),
String.join(";", "contingency", "", "", "NHV1_NHV2_1", TwoSides.ONE.name(), LimitViolationType.CURRENT.name(),
"", "", "",
"PermanentLimit", String.format(Locale.getDefault(), "%g", 1100.0), String.format(Locale.getDefault(), "%g", 1000.0),
"", "", "different"),
String.join(";", "contingency", "", "", "", "", "", "", "", "", "", "", "", "", actions.toString(), "different"));
// precontingency violations results
comparisonWriter.write(true, true, true);
comparisonWriter.write(vlViolation, vlViolation, true);
comparisonWriter.write(Collections.emptyList(), Collections.emptyList(), true);
// missing postcontingency results
comparisonWriter.setContingency("contingency");
comparisonWriter.write(false, true, false);
comparisonWriter.write(null, vlViolation, false);
comparisonWriter.write(null, lineViolation, false);
comparisonWriter.write(null, actions, false);
assertEquals(content, writer.toString().trim());
}
@Test
void writeMissingResult2() {
String content = String.join(System.lineSeparator(),
"Security Analysis Results Comparison",
String.join(";", "Contingency", "StatusResult1", "StatusResult2", "Equipment", "End", "ViolationType",
"ViolationNameResult1", "ValueResult1", "LimitResult1", "ViolationNameResult2", "ValueResult2",
"LimitResult2", "ActionsResult1", "ActionsResult2", "Comparison"),
String.join(";", "", "converge", "converge", "", "", "", "", "", "", "", "", "", "", "", "equivalent"),
String.join(";", "", "", "", "VL1", "", LimitViolationType.HIGH_VOLTAGE.name(),
"", String.format(Locale.getDefault(), "%g", 250.0), String.format(Locale.getDefault(), "%g", 200.0),
"", String.format(Locale.getDefault(), "%g", 250.0), String.format(Locale.getDefault(), "%g", 200.0),
"", "", "equivalent"),
String.join(";", "contingency", "converge", "", "", "", "", "", "", "", "", "", "", "", "", "different"),
String.join(";", "contingency", "", "", "VL1", "", LimitViolationType.HIGH_VOLTAGE.name(),
"", String.format(Locale.getDefault(), "%g", 250.0), String.format(Locale.getDefault(), "%g", 200.0),
"", "", "", "", "", "different"),
String.join(";", "contingency", "", "", "NHV1_NHV2_1", TwoSides.ONE.name(), LimitViolationType.CURRENT.name(),
"PermanentLimit", String.format(Locale.getDefault(), "%g", 1100.0), String.format(Locale.getDefault(), "%g", 1000.0),
"", "", "", "", "", "different"),
String.join(";", "contingency", "", "", "", "", "", "", "", "", "", "", "", actions.toString(), "", "different"));
// precontingency violations results
comparisonWriter.write(true, true, true);
comparisonWriter.write(vlViolation, vlViolation, true);
comparisonWriter.write(Collections.emptyList(), Collections.emptyList(), true);
// missing postcontingency results
comparisonWriter.setContingency("contingency");
comparisonWriter.write(true, null, false);
comparisonWriter.write(vlViolation, null, false);
comparisonWriter.write(lineViolation, null, false);
comparisonWriter.write(actions, null, false);
assertEquals(content, writer.toString().trim());
}
@Test
void nullInput() {
try {
comparisonWriter.write((Boolean) null, null, true);
fail();
} catch (Exception ignored) {
}
try {
comparisonWriter.write((LimitViolation) null, null, true);
fail();
} catch (Exception ignored) {
}
try {
comparisonWriter.write((List<String>) null, null, true);
fail();
} catch (Exception ignored) {
}
}
}