Skip to content
This repository has been archived by the owner on May 16, 2018. It is now read-only.

Commit

Permalink
Added tests
Browse files Browse the repository at this point in the history
  • Loading branch information
massimo-ferraro committed Mar 9, 2017
1 parent 04cc8ac commit 16e77da
Show file tree
Hide file tree
Showing 2 changed files with 135 additions and 26 deletions.
25 changes: 21 additions & 4 deletions security-analysis/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,22 +23,22 @@

<dependencies>
<dependency>
<groupId>eu.itesla_project</groupId>
<groupId>${project.groupId}</groupId>
<artifactId>contingency-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>eu.itesla_project</groupId>
<groupId>${project.groupId}</groupId>
<artifactId>iidm-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>eu.itesla_project</groupId>
<groupId>${project.groupId}</groupId>
<artifactId>iidm-converter-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>eu.itesla_project</groupId>
<groupId>${project.groupId}</groupId>
<artifactId>loadflow-api</artifactId>
<version>${project.version}</version>
</dependency>
Expand All @@ -59,11 +59,28 @@
<artifactId>mockito-all</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>iidm-impl</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>iidm-test</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,24 @@
package eu.itesla_project.security;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.io.StringWriter;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;

import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;

import eu.itesla_project.commons.io.table.CsvTableFormatterFactory;
import eu.itesla_project.commons.io.table.TableFormatterConfig;
import eu.itesla_project.contingency.Contingency;
import eu.itesla_project.iidm.network.Bus;
import eu.itesla_project.iidm.network.Network;
import eu.itesla_project.iidm.network.test.EurostagTutorialExample1Factory;
import eu.itesla_project.security.Security.CurrentLimitType;

/**
* @author Geoffroy Jamgotchian <geoffroy.jamgotchian at rte-france.com>
Expand All @@ -27,59 +34,144 @@ public class SecurityTest {
private final TableFormatterConfig formatterConfig = new TableFormatterConfig(Locale.US, ',', "inv", true, true);

private final CsvTableFormatterFactory formatterFactory = new CsvTableFormatterFactory();

private SecurityAnalysisResult result;
private LimitViolation line1Violation;
private LimitViolation line2Violation;

private static SecurityAnalysisResult createResult() {
@Before
public void setUp() {
// create pre-contingency results, just one violation on line1
LimitViolation line1Violation = new LimitViolation("line1", LimitViolationType.CURRENT, 1000f, "20'", 1100);
PreContingencyResult preContingencyResult = new PreContingencyResult(true, Arrays.asList(line1Violation));
line1Violation = new LimitViolation("line1", LimitViolationType.CURRENT, 1000f, "20'", 1100);
PreContingencyResult preContingencyResult = new PreContingencyResult(true, Arrays.asList(line1Violation), Arrays.asList("action1"));

// create post-contingency results, still the line1 violation plus line2 violation
Contingency contingency1 = Mockito.mock(Contingency.class);
Mockito.when(contingency1.getId()).thenReturn("contingency1");
LimitViolation line2Violation = new LimitViolation("line2", LimitViolationType.CURRENT, 900f, "10'", 950);
PostContingencyResult postContingencyResult = new PostContingencyResult(contingency1, true, Arrays.asList(line1Violation, line2Violation));
return new SecurityAnalysisResult(preContingencyResult, Arrays.asList(postContingencyResult));
line2Violation = new LimitViolation("line2", LimitViolationType.CURRENT, 900f, "10'", 950);
PostContingencyResult postContingencyResult = new PostContingencyResult(contingency1, true, Arrays.asList(line1Violation, line2Violation), Arrays.asList("action2"));
result = new SecurityAnalysisResult(preContingencyResult, Arrays.asList(postContingencyResult));
}

@Test
public void printPreContingencyViolations() throws Exception {
StringWriter writer = new StringWriter();
try {
Security.printPreContingencyViolations(createResult(), writer, formatterFactory, formatterConfig, null);
Security.printPreContingencyViolations(result, writer, formatterFactory, formatterConfig, null);
} finally {
writer.close();
}
assertEquals(writer.toString(), "Pre-contingency violations" + System.lineSeparator() +
"Action,Equipment,Violation type,Violation name,Value,Limit,Charge %" + System.lineSeparator() +
",line1,CURRENT,20',1100.00,1000.0,110" + System.lineSeparator());
assertEquals("Pre-contingency violations" + System.lineSeparator() +
"Action,Equipment,Violation type,Violation name,Value,Limit,Charge %" + System.lineSeparator() +
"action1,,,,,," + System.lineSeparator() +
",line1,CURRENT,20',1100.00,1000.0,110" + System.lineSeparator(),
writer.toString());
}

@Test
public void printPostContingencyViolations() throws Exception {
StringWriter writer = new StringWriter();
try {
Security.printPostContingencyViolations(createResult(), writer, formatterFactory, formatterConfig, null, false);
Security.printPostContingencyViolations(result, writer, formatterFactory, formatterConfig, null, false);
} finally {
writer.close();
}
assertEquals(writer.toString(), "Post-contingency limit violations" + System.lineSeparator() +
"Contingency,Status,Action,Equipment,Violation type,Violation name,Value,Limit,Charge %" + System.lineSeparator() +
"contingency1,converge,,,,,,," + System.lineSeparator() +
",,,line1,CURRENT,20',1100.00,1000.0,110" + System.lineSeparator() +
",,,line2,CURRENT,10',950.000,900.0,106" + System.lineSeparator());
assertEquals("Post-contingency limit violations" + System.lineSeparator() +
"Contingency,Status,Action,Equipment,Violation type,Violation name,Value,Limit,Charge %" + System.lineSeparator() +
"contingency1,converge,,,,,,," + System.lineSeparator() +
",,action2,,,,,," + System.lineSeparator() +
",,,line1,CURRENT,20',1100.00,1000.0,110" + System.lineSeparator() +
",,,line2,CURRENT,10',950.000,900.0,106" + System.lineSeparator(),
writer.toString());
}

@Test
public void printPostContingencyViolationsWithPreContingencyViolationsFiltering() throws Exception {
StringWriter writer = new StringWriter();
try {
Security.printPostContingencyViolations(createResult(), writer, formatterFactory, formatterConfig, null, true);
Security.printPostContingencyViolations(result, writer, formatterFactory, formatterConfig, null, true);
} finally {
writer.close();
}
assertEquals(writer.toString(), "Post-contingency limit violations" + System.lineSeparator() +
"Contingency,Status,Action,Equipment,Violation type,Violation name,Value,Limit,Charge %" + System.lineSeparator() +
"contingency1,converge,,,,,,," + System.lineSeparator() +
",,,line2,CURRENT,10',950.000,900.0,106" + System.lineSeparator());
assertEquals("Post-contingency limit violations" + System.lineSeparator() +
"Contingency,Status,Action,Equipment,Violation type,Violation name,Value,Limit,Charge %" + System.lineSeparator() +
"contingency1,converge,,,,,,," + System.lineSeparator() +
",,action2,,,,,," + System.lineSeparator() +
",,,line2,CURRENT,10',950.000,900.0,106" + System.lineSeparator(),
writer.toString());
}
}

@Test
public void printLimitsViolations() {
assertEquals("+---------+--------------+---------------+----------------+----------------+--------+--------+------------------+----------+\n" +
"| Country | Base voltage | Equipment (2) | Violation type | Violation name | value | limit | abs(value-limit) | charge % |\n" +
"+---------+--------------+---------------+----------------+----------------+--------+--------+------------------+----------+\n" +
"| | | line1 | CURRENT | 20' | 1100.0 | 1000.0 | 100.0 | 110 |\n" +
"| | | line2 | CURRENT | 10' | 950.0 | 900.0 | 50.0 | 106 |\n" +
"+---------+--------------+---------------+----------------+----------------+--------+--------+------------------+----------+",
Security.printLimitsViolations(Arrays.asList(line1Violation, line2Violation), new LimitViolationFilter()));
}

@Test
public void checkLimits() {
Network network = EurostagTutorialExample1Factory.create();
((Bus) network.getIdentifiable("NHV1")).setV(380f);
((Bus) network.getIdentifiable("NHV1")).getVoltageLevel().setLowVoltageLimit(400f);
((Bus) network.getIdentifiable("NHV1")).getVoltageLevel().setHighVoltageLimit(500f);
((Bus) network.getIdentifiable("NHV2")).setV(380f);
((Bus) network.getIdentifiable("NHV2")).getVoltageLevel().setLowVoltageLimit(300f);
((Bus) network.getIdentifiable("NHV2")).getVoltageLevel().setHighVoltageLimit(500f);
network.getLine("NHV1_NHV2_1").getTerminal1().setP(560f);
network.getLine("NHV1_NHV2_1").getTerminal1().setQ(550f);
network.getLine("NHV1_NHV2_1").getTerminal2().setP(560f);
network.getLine("NHV1_NHV2_1").getTerminal2().setQ(550f);
network.getLine("NHV1_NHV2_1").newCurrentLimits1().setPermanentLimit(1500f).add();
network.getLine("NHV1_NHV2_1").newCurrentLimits2()
.setPermanentLimit(1100f)
.beginTemporaryLimit()
.setName("10'")
.setAcceptableDuration(10 * 60)
.setValue(1200)
.endTemporaryLimit()
.add();
network.getLine("NHV1_NHV2_2").getTerminal1().setP(560f);
network.getLine("NHV1_NHV2_2").getTerminal1().setQ(550f);
network.getLine("NHV1_NHV2_2").getTerminal2().setP(560f);
network.getLine("NHV1_NHV2_2").getTerminal2().setQ(550f);
network.getLine("NHV1_NHV2_2").newCurrentLimits1()
.setPermanentLimit(1100f)
.beginTemporaryLimit()
.setName("20'")
.setAcceptableDuration(20 * 60)
.setValue(1200)
.endTemporaryLimit()
.add();
network.getLine("NHV1_NHV2_2").newCurrentLimits2().setPermanentLimit(1500f).add();

List<LimitViolation> violations = Security.checkLimits(network);

assertEquals(3, violations.size());
violations.forEach( violation ->
{
assertTrue(Arrays.asList("VLHV1", "NHV1_NHV2_1", "NHV1_NHV2_2").contains(violation.getSubjectId()));
if ( "VLHV1".equals(violation.getSubjectId()) ) {
assertEquals(LimitViolationType.LOW_VOLTAGE, violation.getLimitType());
} else {
assertEquals(LimitViolationType.CURRENT, violation.getLimitType());
}
});

violations = Security.checkLimits(network, CurrentLimitType.TATL, 1);

assertEquals(3, violations.size());
violations.forEach( violation ->
{
assertTrue(Arrays.asList("VLHV1", "NHV1_NHV2_1", "NHV1_NHV2_2").contains(violation.getSubjectId()));
if ( "VLHV1".equals(violation.getSubjectId()) ) {
assertEquals(LimitViolationType.LOW_VOLTAGE, violation.getLimitType());
} else {
assertEquals(LimitViolationType.CURRENT, violation.getLimitType());
}
});
}
}

0 comments on commit 16e77da

Please sign in to comment.