Skip to content

Commit 9c37b56

Browse files
committed
test + doc + review changes -> fix tests related to fileSystem
Signed-off-by: Samir Romdhani <samir.romdhani_externe@rte-france.com> add doc Signed-off-by: Samir Romdhani <samir.romdhani_externe@rte-france.com> test Signed-off-by: Samir Romdhani <samir.romdhani_externe@rte-france.com> fix fix test Signed-off-by: Samir Romdhani <samir.romdhani_externe@rte-france.com> test Signed-off-by: Samir Romdhani <samir.romdhani_externe@rte-france.com>
1 parent 75f191e commit 9c37b56

File tree

9 files changed

+71
-120
lines changed

9 files changed

+71
-120
lines changed

docs/user/itools/loadflow-validation.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ usage: itools [OPTIONS] loadflow-validation --case-file <FILE>
1414
[--load-flow] --output-folder <FOLDER> [--output-format
1515
<VALIDATION_WRITER>] [--run-computation <COMPUTATION>] [--types
1616
<VALIDATION_TYPE,VALIDATION_TYPE,...>] [--verbose]
17+
[--with-extensions-validation]
1718
1819
Available options are:
1920
--config-name <CONFIG_NAME> Override configuration file name
@@ -86,6 +87,9 @@ Use the `--load-flow` parameter to run a load-flow before the validation. This o
8687
`--output-format`<br>
8788
Use the `--output-format` parameter to specify the format of the output files. The available output formats are `CSV` or `CSV_MULTILINE`.
8889

90+
`--with-extensions-validation`<br>
91+
Use the `--with-extensions-validation` parameter to perform extensions validation.
92+
8993
If this parameter is set to `CSV`, in the output files a line contains all values of validated equipment. If the parameter
9094
is set to `CSV_MULTILINE`, in the output files the values of a piece of equipment are split in multiple lines, one value for each
9195
line, see examples below:

loadflow/loadflow-validation/note.md

Lines changed: 0 additions & 23 deletions
This file was deleted.

loadflow/loadflow-validation/src/main/java/com/powsybl/loadflow/validation/ValidationTool.java

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
import com.google.auto.service.AutoService;
1111
import com.google.common.base.Preconditions;
12-
import com.google.common.collect.Sets;
1312
import com.powsybl.commons.PowsyblException;
1413
import com.powsybl.iidm.network.ImportConfig;
1514
import com.powsybl.iidm.network.Network;
@@ -29,11 +28,8 @@
2928
import java.io.IOException;
3029
import java.nio.file.Files;
3130
import java.nio.file.Path;
32-
import java.nio.file.Paths;
33-
import java.util.Arrays;
34-
import java.util.Objects;
35-
import java.util.Properties;
36-
import java.util.Set;
31+
32+
import java.util.*;
3733
import java.util.stream.Collectors;
3834

3935
import static com.powsybl.iidm.network.tools.ConversionToolUtils.*;
@@ -54,7 +50,7 @@ public class ValidationTool implements Tool {
5450
private static final String COMPARE_RESULTS = "compare-results";
5551
private static final String RUN_COMPUTATION = "run-computation";
5652
private static final String COMPARE_CASE_FILE = "compare-case-file";
57-
public static final String WITH_EXTENSIONS_OPTION = "with-extensions";
53+
public static final String WITH_EXTENSIONS_OPTION = "with-extensions-validation";
5854

5955
private static final Command COMMAND = new Command() {
6056

@@ -144,8 +140,8 @@ public Command getCommand() {
144140

145141
@Override
146142
public void run(CommandLine line, ToolRunningContext context) throws Exception {
147-
Path caseFile = Paths.get(line.getOptionValue(CASE_FILE));
148-
Path outputFolder = Paths.get(line.getOptionValue(OUTPUT_FOLDER));
143+
Path caseFile = context.getFileSystem().getPath(line.getOptionValue(CASE_FILE));
144+
Path outputFolder = context.getFileSystem().getPath(line.getOptionValue(OUTPUT_FOLDER));
149145
if (!Files.exists(outputFolder)) {
150146
Files.createDirectories(outputFolder);
151147
}
@@ -156,23 +152,18 @@ public void run(CommandLine line, ToolRunningContext context) throws Exception {
156152
if (line.hasOption(OUTPUT_FORMAT)) {
157153
config.setValidationOutputWriter(ValidationOutputWriter.valueOf(line.getOptionValue(OUTPUT_FORMAT)));
158154
}
159-
160155
ComparisonType comparisonType = null;
161156
if (line.hasOption(COMPARE_RESULTS)) {
162157
config.setCompareResults(true);
163158
comparisonType = ComparisonType.valueOf(line.getOptionValue(COMPARE_RESULTS));
164159
}
165-
Set<ValidationType> validationTypes = Sets.newHashSet(ValidationType.values());
160+
Set<ValidationType> validationTypes = new TreeSet<>(Arrays.asList(ValidationType.values()));
166161
if (line.hasOption(TYPES)) {
167162
validationTypes = Arrays.stream(line.getOptionValue(TYPES).split(","))
168-
.map(ValidationType::valueOf)
169-
.collect(Collectors.toSet());
163+
.map(ValidationType::valueOf)
164+
.collect(Collectors.toCollection(TreeSet::new));
170165
}
171166
Network network = loadNetwork(caseFile, line, context);
172-
if (line.hasOption(WITH_EXTENSIONS_OPTION)) {
173-
ExtensionsValidation extensionsValidation = new ExtensionsValidation();
174-
extensionsValidation.runExtensionValidations(network, config, outputFolder, context);
175-
}
176167
try (ValidationWriters validationWriters = new ValidationWriters(network.getId(), validationTypes, outputFolder, config)) {
177168
if (config.isCompareResults() && ComparisonType.COMPUTATION.equals(comparisonType)) {
178169
Preconditions.checkArgument(line.hasOption(LOAD_FLOW) || line.hasOption(RUN_COMPUTATION),
@@ -194,12 +185,16 @@ public void run(CommandLine line, ToolRunningContext context) throws Exception {
194185

195186
if (config.isCompareResults() && ComparisonType.BASECASE.equals(comparisonType)) {
196187
Preconditions.checkArgument(line.hasOption(COMPARE_CASE_FILE),
197-
"Basecases comparison requires to provide a second basecase (option --" + COMPARE_CASE_FILE + ").");
198-
Path compareCaseFile = Paths.get(line.getOptionValue(COMPARE_CASE_FILE));
188+
"Base cases comparison requires to provide a second basecase (option --" + COMPARE_CASE_FILE + ").");
189+
Path compareCaseFile = context.getFileSystem().getPath(line.getOptionValue(COMPARE_CASE_FILE));
199190
Network compareNetwork = loadNetwork(compareCaseFile, line, context);
200191
context.getOutputStream().println("Running validation on network " + compareNetwork.getId() + " to compare");
201192
runValidation(compareNetwork, config, validationTypes, validationWriters, context);
202193
}
194+
if (line.hasOption(WITH_EXTENSIONS_OPTION)) {
195+
ExtensionsValidation extensionsValidation = new ExtensionsValidation();
196+
extensionsValidation.runExtensionValidations(network, config, context);
197+
}
203198
}
204199
}
205200

loadflow/loadflow-validation/src/main/java/com/powsybl/loadflow/validation/extension/ExtensionValidation.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,18 @@
55
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
* SPDX-License-Identifier: MPL-2.0
77
*/
8-
package com.powsybl.loadflow.validation.extension; import com.powsybl.iidm.network.Network;
8+
package com.powsybl.loadflow.validation.extension;
9+
import com.powsybl.iidm.network.Network;
910
import com.powsybl.loadflow.validation.ValidationConfig;
1011

11-
import java.io.IOException;
12-
import java.nio.file.Path;
13-
import java.util.Objects;
14-
1512
/**
1613
*
1714
* @author Samir Romdhani {@literal <samir.romdhani at rte-france.com>}
1815
*/
1916
public interface ExtensionValidation {
2017

21-
String getType();
22-
2318
String getName();
2419

25-
boolean check(Network network, ValidationConfig config, Path outputFile) throws IOException;
20+
boolean check(Network network, ValidationConfig config);
2621

27-
default Path getOutputFile(Path folder) {
28-
Objects.requireNonNull(folder);
29-
return folder.resolve(getName() + ".csv");
30-
}
3122
}

loadflow/loadflow-validation/src/main/java/com/powsybl/loadflow/validation/extension/ExtensionsValidation.java

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,16 @@
77
*/
88
package com.powsybl.loadflow.validation.extension;
99

10-
import com.google.common.base.Supplier;
1110
import com.google.common.base.Suppliers;
1211
import com.google.common.collect.Lists;
1312
import com.powsybl.iidm.network.Network;
1413
import com.powsybl.loadflow.validation.ValidationConfig;
1514
import com.powsybl.tools.ToolRunningContext;
1615

17-
import java.io.IOException;
18-
import java.nio.file.Path;
1916
import java.util.List;
2017
import java.util.Optional;
2118
import java.util.ServiceLoader;
19+
import java.util.function.Supplier;
2220

2321
/**
2422
* @author Samir Romdhani {@literal <samir.romdhani at rte-france.com>}
@@ -40,18 +38,12 @@ public static Optional<ExtensionValidation> getExtension(String name) {
4038
return getExtensions().stream().filter(v -> v.getName().equals(name)).findFirst();
4139
}
4240

43-
public void runExtensionValidations(Network network, ValidationConfig config, Path outputFolder, ToolRunningContext context) {
44-
41+
public void runExtensionValidations(Network network, ValidationConfig config, ToolRunningContext context) {
4542
getExtensions().forEach(extensionValidation -> {
46-
try {
47-
boolean success = extensionValidation.check(network, config, extensionValidation.getOutputFile(outputFolder));
48-
String message = "Validate extension behaviour of network " + network.getId()
49-
+ " - extension validation type: " + extensionValidation.getType()
50-
+ " - result: " + (success ? "success" : "fail");
51-
context.getOutputStream().println(message);
52-
} catch (IOException e) {
53-
throw new java.io.UncheckedIOException(e);
54-
}
43+
boolean success = extensionValidation.check(network, config);
44+
context.getOutputStream().println("Validate load-flow results of network " + network.getId()
45+
+ " - validation type: Extension/" + extensionValidation.getName()
46+
+ " - result: " + (success ? "success" : "fail"));
5547
});
5648
}
5749
}

loadflow/loadflow-validation/src/test/java/com/powsybl/loadflow/validation/ValidationToolTest.java

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@
1010
import com.powsybl.tools.Tool;
1111
import com.powsybl.tools.test.AbstractToolTest;
1212
import org.junit.jupiter.api.BeforeEach;
13-
import org.junit.jupiter.api.Disabled;
1413
import org.junit.jupiter.api.Test;
1514

16-
import java.io.IOException;
1715
import java.nio.file.Files;
1816
import java.util.Collections;
1917
import java.util.Objects;
@@ -29,6 +27,7 @@ class ValidationToolTest extends AbstractToolTest {
2927
private static final String COMMAND_NAME = "loadflow-validation";
3028
private final ValidationTool tool = new ValidationTool();
3129

30+
@Override
3231
@BeforeEach
3332
public void setUp() throws Exception {
3433
super.setUp();
@@ -51,7 +50,7 @@ public void assertCommand() {
5150
assertOption(tool.getCommand().getOptions(), "output-folder", true, true);
5251
assertOption(tool.getCommand().getOptions(), "load-flow", false, false);
5352
assertOption(tool.getCommand().getOptions(), "types", false, true);
54-
assertOption(tool.getCommand().getOptions(), "with-extensions", false, false);
53+
assertOption(tool.getCommand().getOptions(), "with-extensions-validation", false, false);
5554
}
5655

5756
@Test
@@ -60,9 +59,31 @@ void testCommand() {
6059
}
6160

6261
@Test
63-
@Disabled
64-
void test() throws IOException {
65-
//TODO File network.xiidm does not exist !!!!!
66-
assertCommandErrorMatch(new String[]{"loadflow-validation", "--case-file", "network.xiidm", "--output-folder", "result"}, "");
62+
void loadFlowValidationShouldSucceedWithRequiredOption() {
63+
String expectedOut = String.join(System.lineSeparator(),
64+
"Loading case network.xiidm",
65+
"Validate load-flow results of network network - validation type: FLOWS - result: success",
66+
"Validate load-flow results of network network - validation type: GENERATORS - result: success",
67+
"Validate load-flow results of network network - validation type: BUSES - result: success",
68+
"Validate load-flow results of network network - validation type: SVCS - result: success",
69+
"Validate load-flow results of network network - validation type: SHUNTS - result: success",
70+
"Validate load-flow results of network network - validation type: TWTS - result: success",
71+
"Validate load-flow results of network network - validation type: TWTS3W - result: success" + System.lineSeparator());
72+
assertCommandSuccessfulMatch(new String[]{"loadflow-validation", "--case-file", "network.xiidm", "--output-folder", "test"}, expectedOut);
73+
}
74+
75+
@Test
76+
void loadFlowValidationShouldComputePrivateValidation() {
77+
String expectedOut = String.join(System.lineSeparator(),
78+
"Loading case network.xiidm",
79+
"Validate load-flow results of network network - validation type: FLOWS - result: success",
80+
"Validate load-flow results of network network - validation type: GENERATORS - result: success",
81+
"Validate load-flow results of network network - validation type: BUSES - result: success",
82+
"Validate load-flow results of network network - validation type: SVCS - result: success",
83+
"Validate load-flow results of network network - validation type: SHUNTS - result: success",
84+
"Validate load-flow results of network network - validation type: TWTS - result: success",
85+
"Validate load-flow results of network network - validation type: TWTS3W - result: success",
86+
"Validate load-flow results of network network - validation type: Extension/extensionValidationMock1 - result: success" + System.lineSeparator());
87+
assertCommandSuccessfulMatch(new String[]{"loadflow-validation", "--case-file", "network.xiidm", "--output-folder", "test", "--with-extensions-validation"}, expectedOut);
6788
}
6889
}

loadflow/loadflow-validation/src/test/java/com/powsybl/loadflow/validation/extension/ExtensionValidationMock.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,26 @@
55
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
* SPDX-License-Identifier: MPL-2.0
77
*/
8-
package com.powsybl.loadflow.validation.extension; import com.google.auto.service.AutoService;
8+
package com.powsybl.loadflow.validation.extension;
9+
import com.google.auto.service.AutoService;
910
import com.powsybl.iidm.network.Network;
1011
import com.powsybl.loadflow.validation.ValidationConfig;
1112

12-
import java.io.IOException;
13-
import java.nio.file.Path;
14-
1513
/**
1614
*
1715
* @author Samir Romdhani {@literal <samir.romdhani at rte-france.com>}
1816
*/
1917
@AutoService(ExtensionValidation.class)
2018
public class ExtensionValidationMock implements ExtensionValidation {
2119

22-
@Override
23-
public String getType() {
24-
return "private1";
25-
}
26-
2720
@Override
2821
public String getName() {
2922
return "extensionValidationMock1";
3023
}
3124

3225
@Override
33-
public boolean check(Network network, ValidationConfig config, Path outputFile) throws IOException {
26+
public boolean check(Network network, ValidationConfig config) {
3427
return true;
3528
}
29+
3630
}

loadflow/loadflow-validation/src/test/java/com/powsybl/loadflow/validation/extension/ExtensionsValidationTest.java

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,8 @@
1616
import org.mockito.ArgumentCaptor;
1717
import org.mockito.MockedStatic;
1818

19-
import java.io.IOException;
2019
import java.io.PrintStream;
2120
import java.nio.file.FileSystem;
22-
import java.nio.file.Path;
2321
import java.util.List;
2422

2523
import static org.junit.jupiter.api.Assertions.*;
@@ -34,59 +32,51 @@ class ExtensionsValidationTest {
3432

3533
ExtensionsValidation extensionsValidation = new ExtensionsValidation();
3634
private final Network network = EurostagTutorialExample1Factory.create();
37-
private final Path outputFolder = mock(Path.class);
3835

3936
@Test
4037
void getExtensionsShouldSucceed() {
4138
assertEquals(1, ExtensionsValidation.getExtensions().size());
4239
}
4340

4441
@Test
45-
void getExtensionsNamesShouldSucceed() {
42+
void getExtensionsNamesShouldReturnExistingExtension() {
4643
assertEquals(List.of("extensionValidationMock1"), ExtensionsValidation.getExtensionsNames());
4744
}
4845

4946
@Test
5047
void getExtensionShouldReturnExistingExtension() {
5148
assertTrue(ExtensionsValidation.getExtension("extensionValidationMock1").isPresent());
5249
assertEquals("extensionValidationMock1", ExtensionsValidation.getExtension("extensionValidationMock1").get().getName());
53-
assertEquals("private1", ExtensionsValidation.getExtension("extensionValidationMock1").get().getType());
54-
when(outputFolder.resolve(anyString())).thenReturn(outputFolder);
55-
assertNotNull(ExtensionsValidation.getExtension("extensionValidationMock1").get().getOutputFile(outputFolder));
5650
}
5751

5852
@Test
59-
void testRunExtensionValidationsShouldSucceed() throws IOException {
53+
void runExtensionValidationsShouldSucceed() {
6054
//Given
6155
ValidationConfig config = ValidationConfig.load();
6256
ToolRunningContext context = new ToolRunningContext(mock(PrintStream.class), mock(PrintStream.class), mock(FileSystem.class), mock(ComputationManager.class), mock(ComputationManager.class));
6357

6458
ExtensionValidation extension1 = mock(ExtensionValidation.class);
6559
ExtensionValidation extension2 = mock(ExtensionValidation.class);
6660

67-
when(extension1.getType()).thenReturn("type1");
68-
when(extension1.getOutputFile(outputFolder)).thenReturn(mock(Path.class));
69-
when(extension1.check(any(), any(), any())).thenReturn(true);
61+
when(extension1.getName()).thenReturn("ExtensionName1");
62+
when(extension1.check(any(), any())).thenReturn(true);
7063

71-
when(extension2.getType()).thenReturn("type2");
72-
when(extension2.getOutputFile(outputFolder)).thenReturn(mock(Path.class));
73-
when(extension2.check(any(), any(), any())).thenReturn(false);
64+
when(extension2.getName()).thenReturn("ExtensionName2");
65+
when(extension2.check(any(), any())).thenReturn(false);
7466

7567
try (MockedStatic<ExtensionsValidation> mocked = mockStatic(ExtensionsValidation.class)) {
7668
mocked.when(ExtensionsValidation::getExtensions).thenReturn(List.of(extension1, extension2));
7769
// When
78-
extensionsValidation.runExtensionValidations(network, config, outputFolder, context);
70+
extensionsValidation.runExtensionValidations(network, config, context);
7971
// Then
80-
8172
ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
8273
verify(context.getOutputStream(), times(2)).println(captor.capture());
8374
List<String> messages = captor.getAllValues();
84-
assertTrue(messages.get(0).contains("success"));
85-
assertTrue(messages.get(1).contains("fail"));
86-
87-
// check() was called on extensions
88-
verify(extension1, times(1)).check(eq(network), eq(config), any());
89-
verify(extension2, times(1)).check(eq(network), eq(config), any());
75+
assertTrue(messages.get(0).contains("validation type: Extension/ExtensionName1 - result: success"));
76+
assertTrue(messages.get(1).contains("validation type: Extension/ExtensionName2 - result: fail"));
77+
// check method was called on extensions
78+
verify(extension1, times(1)).check(network, config);
79+
verify(extension2, times(1)).check(network, config);
9080
}
9181
}
9282
}

0 commit comments

Comments
 (0)