diff --git a/cgmes/cgmes-extensions/src/main/java/com/powsybl/cgmes/extensions/BaseVoltageMappingSerDe.java b/cgmes/cgmes-extensions/src/main/java/com/powsybl/cgmes/extensions/BaseVoltageMappingSerDe.java index 65d1706277d..710c64433b7 100644 --- a/cgmes/cgmes-extensions/src/main/java/com/powsybl/cgmes/extensions/BaseVoltageMappingSerDe.java +++ b/cgmes/cgmes-extensions/src/main/java/com/powsybl/cgmes/extensions/BaseVoltageMappingSerDe.java @@ -64,10 +64,10 @@ public BaseVoltageMapping read(Network extendable, DeserializerContext context) context.getReader().readChildNodes(elementName -> { if (elementName.equals(BASE_VOLTAGE_ROOT_ELEMENT)) { double nominalV = context.getReader().readDoubleAttribute("nominalVoltage"); - String sourceBV = context.getReader().readStringAttribute("source"); + Source sourceBV = context.getReader().readEnumAttribute("source", Source.class); String baseVoltageId = context.getReader().readStringAttribute("id"); context.getReader().readEndNode(); - mapping.addBaseVoltage(nominalV, baseVoltageId, Source.valueOf(sourceBV)); + mapping.addBaseVoltage(nominalV, baseVoltageId, sourceBV); } else { throw new PowsyblException("Unknown element name '" + elementName + "' in 'baseVoltageMapping'"); } diff --git a/cgmes/cgmes-extensions/src/main/java/com/powsybl/cgmes/extensions/CgmesDanglingLineBoundaryNodeSerDe.java b/cgmes/cgmes-extensions/src/main/java/com/powsybl/cgmes/extensions/CgmesDanglingLineBoundaryNodeSerDe.java index 087e359a231..a6cbc335be5 100644 --- a/cgmes/cgmes-extensions/src/main/java/com/powsybl/cgmes/extensions/CgmesDanglingLineBoundaryNodeSerDe.java +++ b/cgmes/cgmes-extensions/src/main/java/com/powsybl/cgmes/extensions/CgmesDanglingLineBoundaryNodeSerDe.java @@ -29,8 +29,7 @@ public CgmesDanglingLineBoundaryNodeSerDe() { @Override public void write(CgmesDanglingLineBoundaryNode extension, SerializerContext context) { context.getWriter().writeBooleanAttribute("isHvdc", extension.isHvdc()); - extension.getLineEnergyIdentificationCodeEic().ifPresent(lineEnergyIdentificationCodeEic -> - context.getWriter().writeStringAttribute("lineEnergyIdentificationCodeEic", lineEnergyIdentificationCodeEic)); + context.getWriter().writeStringAttribute("lineEnergyIdentificationCodeEic", extension.getLineEnergyIdentificationCodeEic().orElse(null)); } @Override diff --git a/cgmes/cgmes-extensions/src/main/java/com/powsybl/cgmes/extensions/CgmesLineBoundaryNodeSerDe.java b/cgmes/cgmes-extensions/src/main/java/com/powsybl/cgmes/extensions/CgmesLineBoundaryNodeSerDe.java index 7ddc5e459f8..76fa4e41231 100644 --- a/cgmes/cgmes-extensions/src/main/java/com/powsybl/cgmes/extensions/CgmesLineBoundaryNodeSerDe.java +++ b/cgmes/cgmes-extensions/src/main/java/com/powsybl/cgmes/extensions/CgmesLineBoundaryNodeSerDe.java @@ -29,8 +29,7 @@ public CgmesLineBoundaryNodeSerDe() { @Override public void write(CgmesLineBoundaryNode extension, SerializerContext context) { context.getWriter().writeBooleanAttribute("isHvdc", extension.isHvdc()); - extension.getLineEnergyIdentificationCodeEic().ifPresent(lineEnergyIdentificationCodeEic -> - context.getWriter().writeStringAttribute("lineEnergyIdentificationCodeEic", lineEnergyIdentificationCodeEic)); + context.getWriter().writeStringAttribute("lineEnergyIdentificationCodeEic", extension.getLineEnergyIdentificationCodeEic().orElse(null)); } @Override diff --git a/cgmes/cgmes-extensions/src/main/java/com/powsybl/cgmes/extensions/CgmesTapChangersSerDe.java b/cgmes/cgmes-extensions/src/main/java/com/powsybl/cgmes/extensions/CgmesTapChangersSerDe.java index ff12309549a..4b7c1e43935 100644 --- a/cgmes/cgmes-extensions/src/main/java/com/powsybl/cgmes/extensions/CgmesTapChangersSerDe.java +++ b/cgmes/cgmes-extensions/src/main/java/com/powsybl/cgmes/extensions/CgmesTapChangersSerDe.java @@ -72,9 +72,9 @@ public CgmesTapChangers read(C extendable, DeserializerContext context) { .setId(reader.readStringAttribute("id")) .setCombinedTapChangerId(reader.readStringAttribute("combinedTapChangerId")) .setType(reader.readStringAttribute("type")) - .setHiddenStatus(reader.readBooleanAttribute("hidden", false)) - .setControlId(reader.readStringAttribute("controlId")); + .setHiddenStatus(reader.readBooleanAttribute("hidden", false)); reader.readOptionalIntAttribute("step").ifPresent(adder::setStep); + adder.setControlId(reader.readStringAttribute("controlId")); context.getReader().readEndNode(); adder.add(); } else { diff --git a/cgmes/cgmes-extensions/src/test/java/com/powsybl/cgmes/extensions/AbstractCgmesExtensionTest.java b/cgmes/cgmes-extensions/src/test/java/com/powsybl/cgmes/extensions/AbstractCgmesExtensionTest.java index e97344dc3c6..352b6339d1d 100644 --- a/cgmes/cgmes-extensions/src/test/java/com/powsybl/cgmes/extensions/AbstractCgmesExtensionTest.java +++ b/cgmes/cgmes-extensions/src/test/java/com/powsybl/cgmes/extensions/AbstractCgmesExtensionTest.java @@ -26,10 +26,23 @@ public abstract class AbstractCgmesExtensionTest extends AbstractSerDeTest { protected void allFormatsRoundTripTest(Network network, String xmlRefFile) throws IOException { - roundTripXmlTest(network, this::jsonWriteAndRead, NetworkSerDe::write, NetworkSerDe::validateAndRead, xmlRefFile); + roundTripXmlTest(network, + (n, p) -> binWriteAndRead(jsonWriteAndRead(n, p), p), + NetworkSerDe::write, + NetworkSerDe::validateAndRead, + xmlRefFile); } - private Network jsonWriteAndRead(Network network, Path path) { + private static Network binWriteAndRead(Network network, Path path) { + var anonymizer = NetworkSerDe.write(network, new ExportOptions().setFormat(TreeDataFormat.BIN), path); + try (InputStream is = Files.newInputStream(path)) { + return NetworkSerDe.read(is, new ImportOptions().setFormat(TreeDataFormat.BIN), anonymizer); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + private static Network jsonWriteAndRead(Network network, Path path) { var anonymizer = NetworkSerDe.write(network, new ExportOptions().setFormat(TreeDataFormat.JSON), path); try (InputStream is = Files.newInputStream(path)) { return NetworkSerDe.read(is, new ImportOptions().setFormat(TreeDataFormat.JSON), anonymizer); diff --git a/cgmes/cgmes-extensions/src/test/java/com/powsybl/cgmes/extensions/BaseVoltageMappingSerDeTest.java b/cgmes/cgmes-extensions/src/test/java/com/powsybl/cgmes/extensions/BaseVoltageMappingSerDeTest.java new file mode 100644 index 00000000000..c008c197cad --- /dev/null +++ b/cgmes/cgmes-extensions/src/test/java/com/powsybl/cgmes/extensions/BaseVoltageMappingSerDeTest.java @@ -0,0 +1,32 @@ +/** + * 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.cgmes.extensions; + +import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.test.NoEquipmentNetworkFactory; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.time.ZonedDateTime; + +/** + * @author Florian Dupuy {@literal } + */ +class BaseVoltageMappingSerDeTest extends AbstractCgmesExtensionTest { + + @Test + void test() throws IOException { + Network network = NoEquipmentNetworkFactory.create(); + network.setCaseDate(ZonedDateTime.parse("2024-09-17T13:36:37.831Z")); + network.newExtension(BaseVoltageMappingAdder.class) + .addBaseVoltage("id_400", 400, Source.IGM) + .addBaseVoltage("id_380", 380, Source.BOUNDARY) + .add(); + allFormatsRoundTripTest(network, "/no_equipment_base_voltage_mapping.xml"); + } +} diff --git a/cgmes/cgmes-extensions/src/test/java/com/powsybl/cgmes/extensions/CgmesLineBoundaryNodeSerDeTest.java b/cgmes/cgmes-extensions/src/test/java/com/powsybl/cgmes/extensions/CgmesBoundaryNodeSerDeTest.java similarity index 52% rename from cgmes/cgmes-extensions/src/test/java/com/powsybl/cgmes/extensions/CgmesLineBoundaryNodeSerDeTest.java rename to cgmes/cgmes-extensions/src/test/java/com/powsybl/cgmes/extensions/CgmesBoundaryNodeSerDeTest.java index 636cdddbf53..763ae78bd42 100644 --- a/cgmes/cgmes-extensions/src/test/java/com/powsybl/cgmes/extensions/CgmesLineBoundaryNodeSerDeTest.java +++ b/cgmes/cgmes-extensions/src/test/java/com/powsybl/cgmes/extensions/CgmesBoundaryNodeSerDeTest.java @@ -16,15 +16,34 @@ /** * @author Miora Ralambotiana {@literal } */ -class CgmesLineBoundaryNodeSerDeTest extends AbstractCgmesExtensionTest { +class CgmesBoundaryNodeSerDeTest extends AbstractCgmesExtensionTest { @Test - void test() throws IOException { + void testTieLine() throws IOException { Network network = EurostagTutorialExample1Factory.createWithTieLine(); network.getTieLine("NHV1_NHV2_1").newExtension(CgmesLineBoundaryNodeAdder.class) .setHvdc(true) .setLineEnergyIdentificationCodeEic("EIC_CODE") .add(); + network.getTieLine("NHV1_NHV2_2").newExtension(CgmesLineBoundaryNodeAdder.class) + .setHvdc(true) + .add(); allFormatsRoundTripTest(network, "/eurostag_cgmes_line_boundary_node.xml"); } + + @Test + void testDanglingLine() throws IOException { + Network network = EurostagTutorialExample1Factory.createWithTieLine(); + var tl = network.getTieLine("NHV1_NHV2_1"); + tl.getDanglingLine1().newExtension(CgmesDanglingLineBoundaryNodeAdder.class) + .setHvdc(false) + .setLineEnergyIdentificationCodeEic("EIC_CODE") + .add(); + tl.getDanglingLine2().newExtension(CgmesDanglingLineBoundaryNodeAdder.class) + .setHvdc(false) + .add(); + tl.remove(); + + allFormatsRoundTripTest(network, "/eurostag_cgmes_dangling_line_boundary_node.xml"); + } } diff --git a/cgmes/cgmes-extensions/src/test/java/com/powsybl/cgmes/extensions/CgmesTapChangersSerDeTest.java b/cgmes/cgmes-extensions/src/test/java/com/powsybl/cgmes/extensions/CgmesTapChangersSerDeTest.java new file mode 100644 index 00000000000..85f1cf3c8e0 --- /dev/null +++ b/cgmes/cgmes-extensions/src/test/java/com/powsybl/cgmes/extensions/CgmesTapChangersSerDeTest.java @@ -0,0 +1,48 @@ +/** + * 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.cgmes.extensions; + +import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.ThreeWindingsTransformer; +import com.powsybl.iidm.network.TwoWindingsTransformer; +import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.time.ZonedDateTime; + +/** + * @author Florian Dupuy {@literal } + */ +class CgmesTapChangersSerDeTest extends AbstractCgmesExtensionTest { + + @Test + void test() throws IOException { + Network network = EurostagTutorialExample1Factory.createWith3wTransformer(); + network.setCaseDate(ZonedDateTime.parse("2024-09-17T12:01:34.831Z")); + TwoWindingsTransformer twoWT = network.getTwoWindingsTransformer("NGEN_NHV1"); + CgmesTapChangers ctc2wt = ((CgmesTapChangersAdder) twoWT.newExtension(CgmesTapChangersAdder.class)).add(); + ctc2wt.newTapChanger() + .setId("tc1") + .setControlId("control1") + .setType("type1") + .setHiddenStatus(false) + .add(); + ThreeWindingsTransformer threeWT = network.getThreeWindingsTransformer("NGEN_V2_NHV1"); + CgmesTapChangers ctc3wt = ((CgmesTapChangersAdder) threeWT.newExtension(CgmesTapChangersAdder.class)).add(); + ctc3wt.newTapChanger() + .setId("tc2") + .setCombinedTapChangerId("ctc2") + .setStep(1) + .setControlId("control2") + .setType("type2") + .setHiddenStatus(true) + .add(); + allFormatsRoundTripTest(network, "/eurostag_cgmes_tap_changers.xml"); + } +} diff --git a/cgmes/cgmes-extensions/src/test/resources/eurostag_cgmes_dangling_line_boundary_node.xml b/cgmes/cgmes-extensions/src/test/resources/eurostag_cgmes_dangling_line_boundary_node.xml new file mode 100644 index 00000000000..ed3e658768b --- /dev/null +++ b/cgmes/cgmes-extensions/src/test/resources/eurostag_cgmes_dangling_line_boundary_node.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cgmes/cgmes-extensions/src/test/resources/eurostag_cgmes_line_boundary_node.xml b/cgmes/cgmes-extensions/src/test/resources/eurostag_cgmes_line_boundary_node.xml index f072300a61e..21f973621ae 100644 --- a/cgmes/cgmes-extensions/src/test/resources/eurostag_cgmes_line_boundary_node.xml +++ b/cgmes/cgmes-extensions/src/test/resources/eurostag_cgmes_line_boundary_node.xml @@ -43,6 +43,9 @@ + + + diff --git a/cgmes/cgmes-extensions/src/test/resources/eurostag_cgmes_tap_changers.xml b/cgmes/cgmes-extensions/src/test/resources/eurostag_cgmes_tap_changers.xml new file mode 100644 index 00000000000..b3a759bbd20 --- /dev/null +++ b/cgmes/cgmes-extensions/src/test/resources/eurostag_cgmes_tap_changers.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cgmes/cgmes-extensions/src/test/resources/no_equipment_base_voltage_mapping.xml b/cgmes/cgmes-extensions/src/test/resources/no_equipment_base_voltage_mapping.xml new file mode 100644 index 00000000000..55780b8e958 --- /dev/null +++ b/cgmes/cgmes-extensions/src/test/resources/no_equipment_base_voltage_mapping.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/entsoe-util/src/test/java/com/powsybl/entsoe/util/EntsoeAreaSerDeTest.java b/entsoe-util/src/test/java/com/powsybl/entsoe/util/EntsoeAreaSerDeTest.java index a051655fce6..059e3d0dee4 100644 --- a/entsoe-util/src/test/java/com/powsybl/entsoe/util/EntsoeAreaSerDeTest.java +++ b/entsoe-util/src/test/java/com/powsybl/entsoe/util/EntsoeAreaSerDeTest.java @@ -52,7 +52,7 @@ void test() throws IOException { EntsoeArea country = s.getExtension(EntsoeArea.class); Network network2 = roundTripXmlTest(network, - this::jsonWriteAndRead, + (n, p) -> binWriteAndRead(jsonWriteAndRead(n, p), p), NetworkSerDe::write, NetworkSerDe::validateAndRead, "/entsoeAreaRef.xml"); @@ -63,7 +63,16 @@ void test() throws IOException { assertEquals(country.getCode(), country2.getCode()); } - private Network jsonWriteAndRead(Network network, Path path) { + private static Network binWriteAndRead(Network network, Path path) { + var anonymizer = NetworkSerDe.write(network, new ExportOptions().setFormat(TreeDataFormat.BIN), path); + try (InputStream is = Files.newInputStream(path)) { + return NetworkSerDe.read(is, new ImportOptions().setFormat(TreeDataFormat.BIN), anonymizer); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + private static Network jsonWriteAndRead(Network network, Path path) { var anonymizer = NetworkSerDe.write(network, new ExportOptions().setFormat(TreeDataFormat.JSON), path); try (InputStream is = Files.newInputStream(path)) { return NetworkSerDe.read(is, new ImportOptions().setFormat(TreeDataFormat.JSON), anonymizer); diff --git a/iidm/iidm-serde/src/test/java/com/powsybl/iidm/serde/AbstractIidmSerDeTest.java b/iidm/iidm-serde/src/test/java/com/powsybl/iidm/serde/AbstractIidmSerDeTest.java index 4bbb856f3f9..d97190c1fa4 100644 --- a/iidm/iidm-serde/src/test/java/com/powsybl/iidm/serde/AbstractIidmSerDeTest.java +++ b/iidm/iidm-serde/src/test/java/com/powsybl/iidm/serde/AbstractIidmSerDeTest.java @@ -258,7 +258,7 @@ public Network allFormatsRoundTripTest(Network network, String filename, IidmVer */ public Network allFormatsRoundTripTest(Network network, String refXmlFile, ExportOptions exportOptions) throws IOException { return roundTripXmlTest(network, - (n, p) -> jsonWriteAndRead(n, exportOptions, p), + (n, p) -> binWriteAndRead(jsonWriteAndRead(n, exportOptions, p), exportOptions, p), (n, p) -> NetworkSerDe.write(n, exportOptions, p), NetworkSerDe::validateAndRead, refXmlFile); @@ -268,22 +268,22 @@ public Network allFormatsRoundTripTest(Network network, String refXmlFile, Expor * Writes given network to JSON file, then reads the resulting file and returns the resulting network */ private static Network jsonWriteAndRead(Network networkInput, ExportOptions options, Path path) { - TreeDataFormat previousFormat = options.getFormat(); - options.setFormat(TreeDataFormat.JSON); - Anonymizer anonymizer = NetworkSerDe.write(networkInput, options, path); - - Network network1; - try (InputStream is = Files.newInputStream(path)) { - network1 = NetworkSerDe.read(is, new ImportOptions().setFormat(TreeDataFormat.JSON), anonymizer); - } catch (IOException e) { - throw new UncheckedIOException(e); - } + return writeAndRead(TreeDataFormat.JSON, networkInput, options, path); + } - options.setFormat(TreeDataFormat.BIN); - anonymizer = NetworkSerDe.write(network1, options, path); + private static Network binWriteAndRead(Network networkInput, ExportOptions options, Path path) { + return writeAndRead(TreeDataFormat.BIN, networkInput, options, path); + } + /** + * Writes given network to file of given format, then reads the resulting file and returns the resulting network + */ + private static Network writeAndRead(TreeDataFormat format, Network networkInput, ExportOptions options, Path path) { + TreeDataFormat previousFormat = options.getFormat(); + options.setFormat(format); + Anonymizer anonymizer = NetworkSerDe.write(networkInput, options, path); try (InputStream is = Files.newInputStream(path)) { - Network networkOutput = NetworkSerDe.read(is, new ImportOptions().setFormat(TreeDataFormat.BIN), anonymizer); + Network networkOutput = NetworkSerDe.read(is, new ImportOptions().setFormat(format), anonymizer); options.setFormat(previousFormat); return networkOutput; } catch (IOException e) {