From c987f638420a285b5d73b0eae5820b108fbaee25 Mon Sep 17 00:00:00 2001 From: basseche Date: Wed, 1 Oct 2025 16:45:41 +0200 Subject: [PATCH 01/13] add tags to TwoWindingsTransformer and Line Infos Mapper --- .../map/dto/common/CurrentLimitsData.java | 4 ++++ .../map/dto/mapper/BranchInfosMapper.java | 23 +++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java b/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java index f0425202..f95900d3 100644 --- a/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java +++ b/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java @@ -13,6 +13,7 @@ import lombok.ToString; import java.util.List; +import java.util.Map; import java.util.Objects; /** @@ -42,6 +43,9 @@ public enum Applicability { SIDE2, } + @JsonInclude(JsonInclude.Include.NON_NULL) + Map tagProperties; + public boolean limitsEquals(CurrentLimitsData other) { return Objects.equals(permanentLimit, other.permanentLimit) && Objects.equals(temporaryLimits, other.temporaryLimits); diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java index cb570e19..89c9151b 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java @@ -126,13 +126,22 @@ private static BranchTabInfos toTabInfos(@NonNull final Branch branch, @Nulla return toTabBuilder((BranchTabInfosBuilder) BranchTabInfos.builder(), branch, dcPowerFactor, loadOperationalLimitGroups).build(); } + private static Map getTagProperties(OperationalLimitsGroup group) { + HashMap properties = new HashMap<>(); + for (String key : group.getPropertyNames()) { + properties.put(key, group.getProperty(key)); + } + return properties; + } + private static Map buildCurrentLimitsMap(@NonNull final Collection operationalLimitsGroups) { if (CollectionUtils.isEmpty(operationalLimitsGroups)) { return Map.of(); } Map res = HashMap.newHashMap(operationalLimitsGroups.size()); operationalLimitsGroups.forEach(operationalLimitsGroup -> operationalLimitsGroup.getCurrentLimits() - .ifPresent(limits -> res.put(operationalLimitsGroup.getId(), toMapDataCurrentLimits(limits, operationalLimitsGroup.getId(), null)))); + .ifPresent(limits -> res.put(operationalLimitsGroup.getId(), toMapDataCurrentLimits(limits, + operationalLimitsGroup.getId(), null, getTagProperties(operationalLimitsGroup))))); return res; } @@ -160,7 +169,14 @@ protected static double computeIntensity(@NonNull final Terminal terminal, @Null } protected static CurrentLimitsData toMapDataCurrentLimits(@NonNull final CurrentLimits limits, - @Nullable final String id, @Nullable final Applicability applicability) { + @Nullable final String id, + @Nullable final Applicability applicability) { + return toMapDataCurrentLimits(limits, id, applicability, null); + } + + protected static CurrentLimitsData toMapDataCurrentLimits(@NonNull final CurrentLimits limits, + @Nullable final String id, @Nullable final Applicability applicability, + @Nullable Map tagProperties) { CurrentLimitsDataBuilder builder = CurrentLimitsData.builder().id(id).applicability(applicability); boolean empty = true; if (!Double.isNaN(limits.getPermanentLimit())) { @@ -171,6 +187,9 @@ protected static CurrentLimitsData toMapDataCurrentLimits(@NonNull final Current builder.temporaryLimits(toMapDataTemporaryLimit(limits.getTemporaryLimits())); empty = false; } + if (tagProperties != null) { + builder.tagProperties(tagProperties); + } return empty ? null : builder.build(); } From 8649c6a404f10e5a50523e5798421d2ca1bcae52 Mon Sep 17 00:00:00 2001 From: basseche Date: Thu, 2 Oct 2025 10:49:58 +0200 Subject: [PATCH 02/13] add function with different signature to simplify function call --- .../map/dto/mapper/BranchInfosMapper.java | 18 +++++++++--------- .../map/dto/mapper/LineInfosMapper.java | 4 ++-- .../map/dto/mapper/TieLineInfosMapper.java | 4 ++-- .../TwoWindingsTransformerInfosMapper.java | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java index 89c9151b..9250414f 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java @@ -74,11 +74,11 @@ public static ElementInfos toData(@NonNull final Identifiable identifiable, final Terminal terminal2 = branch.getTerminal2(); branch.getSelectedOperationalLimitsGroup1().ifPresent(limitGrp -> - limitGrp.getCurrentLimits().ifPresent(cl -> builder.selectedOperationalLimitsGroup1(toMapDataCurrentLimits(cl, limitGrp.getId(), null)))); + limitGrp.getCurrentLimits().ifPresent(cl -> builder.selectedOperationalLimitsGroup1(toMapDataCurrentLimits(cl, limitGrp.getId())))); branch.getSelectedOperationalLimitsGroupId1().ifPresent(builder::selectedOperationalLimitsGroup1Name); branch.getSelectedOperationalLimitsGroup2().ifPresent(limitGrp -> - limitGrp.getCurrentLimits().ifPresent(cl -> builder.selectedOperationalLimitsGroup2(toMapDataCurrentLimits(cl, limitGrp.getId(), null)))); + limitGrp.getCurrentLimits().ifPresent(cl -> builder.selectedOperationalLimitsGroup2(toMapDataCurrentLimits(cl, limitGrp.getId())))); branch.getSelectedOperationalLimitsGroupId2().ifPresent(builder::selectedOperationalLimitsGroup2Name); if (loadOperationalLimitGroups) { @@ -141,7 +141,7 @@ private static Map buildCurrentLimitsMap(@NonNull fin Map res = HashMap.newHashMap(operationalLimitsGroups.size()); operationalLimitsGroups.forEach(operationalLimitsGroup -> operationalLimitsGroup.getCurrentLimits() .ifPresent(limits -> res.put(operationalLimitsGroup.getId(), toMapDataCurrentLimits(limits, - operationalLimitsGroup.getId(), null, getTagProperties(operationalLimitsGroup))))); + operationalLimitsGroup.getId())))); return res; } @@ -169,9 +169,8 @@ protected static double computeIntensity(@NonNull final Terminal terminal, @Null } protected static CurrentLimitsData toMapDataCurrentLimits(@NonNull final CurrentLimits limits, - @Nullable final String id, - @Nullable final Applicability applicability) { - return toMapDataCurrentLimits(limits, id, applicability, null); + @Nullable final String id) { + return toMapDataCurrentLimits(limits, id, null, null); } protected static CurrentLimitsData toMapDataCurrentLimits(@NonNull final CurrentLimits limits, @@ -265,7 +264,9 @@ static CurrentLimitsData operationalLimitsGroupToMapDataCurrentLimits(@Nullable if (operationalLimitsGroup == null || operationalLimitsGroup.getCurrentLimits().isEmpty()) { return null; } - return toMapDataCurrentLimits(operationalLimitsGroup.getCurrentLimits().get(), operationalLimitsGroup.getId(), applicability); + + return toMapDataCurrentLimits(operationalLimitsGroup.getCurrentLimits().get(), operationalLimitsGroup.getId(), applicability, + getTagProperties(operationalLimitsGroup)); } private static List toMapDataTemporaryLimit(@NonNull final Collection limits) { @@ -274,7 +275,6 @@ private static List toMapDataTemporaryLimit(@NonNull final C .name(l.getName()) .acceptableDuration(l.getAcceptableDuration() == Integer.MAX_VALUE ? null : l.getAcceptableDuration()) .value(l.getValue() == Double.MAX_VALUE ? null : l.getValue()) - .build()) - .collect(Collectors.toList()); + .build()).toList(); } } diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java index a79d0896..e5b1f68c 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/LineInfosMapper.java @@ -162,8 +162,8 @@ private static LineTooltipInfos toTooltipInfos(Identifiable identifiable, Dou .b1(line.getB1()) .b2(line.getB2()); - line.getSelectedOperationalLimitsGroup1().ifPresent(limitsGrp -> limitsGrp.getCurrentLimits().ifPresent(limits -> builder.currentLimits1(toMapDataCurrentLimits(limits, limitsGrp.getId(), null)))); - line.getSelectedOperationalLimitsGroup2().ifPresent(limitsGrp -> limitsGrp.getCurrentLimits().ifPresent(limits -> builder.currentLimits2(toMapDataCurrentLimits(limits, limitsGrp.getId(), null)))); + line.getSelectedOperationalLimitsGroup1().ifPresent(limitsGrp -> limitsGrp.getCurrentLimits().ifPresent(limits -> builder.currentLimits1(toMapDataCurrentLimits(limits, limitsGrp.getId())))); + line.getSelectedOperationalLimitsGroup2().ifPresent(limitsGrp -> limitsGrp.getCurrentLimits().ifPresent(limits -> builder.currentLimits2(toMapDataCurrentLimits(limits, limitsGrp.getId())))); return builder.build(); } diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/TieLineInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/TieLineInfosMapper.java index af33899c..9ff95f6a 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/TieLineInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/TieLineInfosMapper.java @@ -58,8 +58,8 @@ private static TieLineMapInfos toMapInfos(Identifiable identifiable, Double d .i2(nullIfNan(computeIntensity(terminal2, dcPowerFactor))) .operatingStatus(ExtensionUtils.toOperatingStatus(tieLine)); - tieLine.getSelectedOperationalLimitsGroup1().ifPresent(limitsGrp -> limitsGrp.getCurrentLimits().ifPresent(limits -> builder.currentLimits1(toMapDataCurrentLimits(limits, limitsGrp.getId(), null)))); - tieLine.getSelectedOperationalLimitsGroup2().ifPresent(limitsGrp -> limitsGrp.getCurrentLimits().ifPresent(limits -> builder.currentLimits2(toMapDataCurrentLimits(limits, limitsGrp.getId(), null)))); + tieLine.getSelectedOperationalLimitsGroup1().ifPresent(limitsGrp -> limitsGrp.getCurrentLimits().ifPresent(limits -> builder.currentLimits1(toMapDataCurrentLimits(limits, limitsGrp.getId())))); + tieLine.getSelectedOperationalLimitsGroup2().ifPresent(limitsGrp -> limitsGrp.getCurrentLimits().ifPresent(limits -> builder.currentLimits2(toMapDataCurrentLimits(limits, limitsGrp.getId())))); return builder.build(); } diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java index 2fd23155..ab3cd4bc 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/TwoWindingsTransformerInfosMapper.java @@ -165,8 +165,8 @@ private static TwoWindingsTransformerTooltipInfos toTooltipInfos(Identifiable .x(twoWindingsTransformer.getX()) .b(twoWindingsTransformer.getB()); - twoWindingsTransformer.getSelectedOperationalLimitsGroup1().ifPresent(limitsGrp -> limitsGrp.getCurrentLimits().ifPresent(limits -> builder.currentLimits1(toMapDataCurrentLimits(limits, limitsGrp.getId(), null)))); - twoWindingsTransformer.getSelectedOperationalLimitsGroup2().ifPresent(limitsGrp -> limitsGrp.getCurrentLimits().ifPresent(limits -> builder.currentLimits2(toMapDataCurrentLimits(limits, limitsGrp.getId(), null)))); + twoWindingsTransformer.getSelectedOperationalLimitsGroup1().ifPresent(limitsGrp -> limitsGrp.getCurrentLimits().ifPresent(limits -> builder.currentLimits1(toMapDataCurrentLimits(limits, limitsGrp.getId())))); + twoWindingsTransformer.getSelectedOperationalLimitsGroup2().ifPresent(limitsGrp -> limitsGrp.getCurrentLimits().ifPresent(limits -> builder.currentLimits2(toMapDataCurrentLimits(limits, limitsGrp.getId())))); return builder.build(); } From 8cb2106da94ba4463c528e6139a3b4d898834de8 Mon Sep 17 00:00:00 2001 From: basseche Date: Mon, 6 Oct 2025 14:49:13 +0200 Subject: [PATCH 03/13] remane & organise limitsProperties Signed-off-by: basseche --- .../map/dto/common/CurrentLimitsData.java | 3 +-- .../network/map/dto/common/LimitsProperty.java | 4 ++++ .../map/dto/mapper/BranchInfosMapper.java | 17 +++++++++-------- 3 files changed, 14 insertions(+), 10 deletions(-) create mode 100644 src/main/java/org/gridsuite/network/map/dto/common/LimitsProperty.java diff --git a/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java b/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java index f95900d3..25bc32d4 100644 --- a/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java +++ b/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java @@ -13,7 +13,6 @@ import lombok.ToString; import java.util.List; -import java.util.Map; import java.util.Objects; /** @@ -44,7 +43,7 @@ public enum Applicability { } @JsonInclude(JsonInclude.Include.NON_NULL) - Map tagProperties; + List limitsProperties; public boolean limitsEquals(CurrentLimitsData other) { return Objects.equals(permanentLimit, other.permanentLimit) diff --git a/src/main/java/org/gridsuite/network/map/dto/common/LimitsProperty.java b/src/main/java/org/gridsuite/network/map/dto/common/LimitsProperty.java new file mode 100644 index 00000000..46e23722 --- /dev/null +++ b/src/main/java/org/gridsuite/network/map/dto/common/LimitsProperty.java @@ -0,0 +1,4 @@ +package org.gridsuite.network.map.dto.common; + +public record LimitsProperty(String name, String value) { +} diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java index 9250414f..9c378b5e 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java @@ -11,6 +11,7 @@ import org.gridsuite.network.map.dto.common.CurrentLimitsData; import org.gridsuite.network.map.dto.common.CurrentLimitsData.Applicability; import org.gridsuite.network.map.dto.common.CurrentLimitsData.CurrentLimitsDataBuilder; +import org.gridsuite.network.map.dto.common.LimitsProperty; import org.gridsuite.network.map.dto.common.TemporaryLimitData; import org.gridsuite.network.map.dto.definition.branch.BranchTabInfos; import org.gridsuite.network.map.dto.definition.branch.BranchTabInfos.BranchTabInfosBuilder; @@ -126,10 +127,10 @@ private static BranchTabInfos toTabInfos(@NonNull final Branch branch, @Nulla return toTabBuilder((BranchTabInfosBuilder) BranchTabInfos.builder(), branch, dcPowerFactor, loadOperationalLimitGroups).build(); } - private static Map getTagProperties(OperationalLimitsGroup group) { - HashMap properties = new HashMap<>(); - for (String key : group.getPropertyNames()) { - properties.put(key, group.getProperty(key)); + private static List getLimitsProperties(OperationalLimitsGroup group) { + ArrayList properties = new ArrayList<>(); + for (String name : group.getPropertyNames()) { + properties.add(new LimitsProperty(name, group.getProperty(name))); } return properties; } @@ -175,7 +176,7 @@ protected static CurrentLimitsData toMapDataCurrentLimits(@NonNull final Current protected static CurrentLimitsData toMapDataCurrentLimits(@NonNull final CurrentLimits limits, @Nullable final String id, @Nullable final Applicability applicability, - @Nullable Map tagProperties) { + @Nullable List limitsProperties) { CurrentLimitsDataBuilder builder = CurrentLimitsData.builder().id(id).applicability(applicability); boolean empty = true; if (!Double.isNaN(limits.getPermanentLimit())) { @@ -186,8 +187,8 @@ protected static CurrentLimitsData toMapDataCurrentLimits(@NonNull final Current builder.temporaryLimits(toMapDataTemporaryLimit(limits.getTemporaryLimits())); empty = false; } - if (tagProperties != null) { - builder.tagProperties(tagProperties); + if (limitsProperties != null) { + builder.limitsProperties(limitsProperties); } return empty ? null : builder.build(); } @@ -266,7 +267,7 @@ static CurrentLimitsData operationalLimitsGroupToMapDataCurrentLimits(@Nullable } return toMapDataCurrentLimits(operationalLimitsGroup.getCurrentLimits().get(), operationalLimitsGroup.getId(), applicability, - getTagProperties(operationalLimitsGroup)); + getLimitsProperties(operationalLimitsGroup)); } private static List toMapDataTemporaryLimit(@NonNull final Collection limits) { From 6ecdb3674eb7c4ac220b7d3f59563ce4ebeb8078 Mon Sep 17 00:00:00 2001 From: basseche Date: Mon, 20 Oct 2025 13:35:20 +0200 Subject: [PATCH 04/13] fix broken tests Signed-off-by: basseche --- .../2-windings-transformer-map-data.json | 6 +++-- src/test/resources/line-form-data.json | 6 +++-- src/test/resources/lines-form-data.json | 24 ++++++++++++------- .../resources/partial-lines-form-data.json | 6 +++-- 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/test/resources/2-windings-transformer-map-data.json b/src/test/resources/2-windings-transformer-map-data.json index 98e4a905..79efbd2e 100644 --- a/src/test/resources/2-windings-transformer-map-data.json +++ b/src/test/resources/2-windings-transformer-map-data.json @@ -16,13 +16,15 @@ "id" : "limit set 1", "permanentLimit":750.4, "temporaryLimits":[{"name":"IT5","acceptableDuration":2087,"value":300}], - "applicability": "SIDE1" + "applicability": "SIDE1", + "limitsProperties": [] }, { "id" : "limit set 1", "permanentLimit":780.6, "temporaryLimits":[{"name":"N/A","acceptableDuration":664,"value":2147483647},{"name":"IT20","acceptableDuration":961,"value":1200}], - "applicability": "SIDE2" + "applicability": "SIDE2", + "limitsProperties": [] } ], "selectedOperationalLimitsGroup1": "limit set 1", diff --git a/src/test/resources/line-form-data.json b/src/test/resources/line-form-data.json index 624c3132..eeff1c2c 100644 --- a/src/test/resources/line-form-data.json +++ b/src/test/resources/line-form-data.json @@ -13,13 +13,15 @@ "id" : "limit set 1", "permanentLimit":700.4, "temporaryLimits":[{"name":"IT5","acceptableDuration":300,"value":250.0}], - "applicability": "SIDE1" + "applicability": "SIDE1", + "limitsProperties": [] }, { "id" : "limit set 1", "permanentLimit":800.8, "temporaryLimits":[{"name":"IT20","acceptableDuration":1200,"value":300.0},{"name":"IT10","acceptableDuration":600,"value":200.0}], - "applicability": "SIDE2" + "applicability": "SIDE2", + "limitsProperties": [] } ], "selectedOperationalLimitsGroup1": "limit set 1", diff --git a/src/test/resources/lines-form-data.json b/src/test/resources/lines-form-data.json index 0e7c6ddf..6a24e4a5 100644 --- a/src/test/resources/lines-form-data.json +++ b/src/test/resources/lines-form-data.json @@ -20,7 +20,8 @@ "acceptableDuration": 300 } ], - "applicability": "SIDE1" + "applicability": "SIDE1", + "limitsProperties": [] }, { "id": "limit set 1", @@ -37,7 +38,8 @@ "acceptableDuration": 600 } ], - "applicability": "SIDE2" + "applicability": "SIDE2", + "limitsProperties": [] } ], "selectedOperationalLimitsGroup1": "limit set 1", @@ -78,7 +80,8 @@ "acceptableDuration": 200 } ], - "applicability": "SIDE1" + "applicability": "SIDE1", + "limitsProperties": [] }, { "id": "group1", @@ -95,7 +98,8 @@ "acceptableDuration": 100 } ], - "applicability": "SIDE1" + "applicability": "SIDE1", + "limitsProperties": [] }, { "id": "group4", @@ -107,7 +111,8 @@ "acceptableDuration": 200 } ], - "applicability": "SIDE2" + "applicability": "SIDE2", + "limitsProperties": [] }, { "id": "group3", @@ -119,7 +124,8 @@ "acceptableDuration": 150 } ], - "applicability": "SIDE2" + "applicability": "SIDE2", + "limitsProperties": [] } ], "selectedOperationalLimitsGroup1": "group1", @@ -162,7 +168,8 @@ "acceptableDuration": 100 } ], - "applicability": "SIDE1" + "applicability": "SIDE1", + "limitsProperties": [] } ], "selectedOperationalLimitsGroup1": "group1", @@ -222,7 +229,8 @@ "acceptableDuration": 100 } ], - "applicability": "SIDE2" + "applicability": "SIDE2", + "limitsProperties": [] } ], "selectedOperationalLimitsGroup2": "group1", diff --git a/src/test/resources/partial-lines-form-data.json b/src/test/resources/partial-lines-form-data.json index 117e0775..6b494941 100644 --- a/src/test/resources/partial-lines-form-data.json +++ b/src/test/resources/partial-lines-form-data.json @@ -21,7 +21,8 @@ "acceptableDuration": 100 } ], - "applicability": "SIDE2" + "applicability": "SIDE2", + "limitsProperties": [] } ], "selectedOperationalLimitsGroup2": "group1", @@ -63,7 +64,8 @@ "acceptableDuration": 100 } ], - "applicability": "SIDE1" + "applicability": "SIDE1", + "limitsProperties": [] } ], "selectedOperationalLimitsGroup1": "group1", From 6a30a1f3e0fd95813c01c1d1b043382842cb642e Mon Sep 17 00:00:00 2001 From: basseche Date: Mon, 20 Oct 2025 14:47:23 +0200 Subject: [PATCH 05/13] fix merge + tests Signed-off-by: basseche --- .../map/dto/common/CurrentLimitsData.java | 3 +- .../map/dto/mapper/BranchInfosMapper.java | 1 + .../map/dto/mapper/BranchInfosMapperTest.java | 36 ++++++++++++------- .../network/map/dto/utils/MockDto.java | 2 +- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java b/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java index 25bc32d4..519b1783 100644 --- a/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java +++ b/src/main/java/org/gridsuite/network/map/dto/common/CurrentLimitsData.java @@ -47,7 +47,8 @@ public enum Applicability { public boolean limitsEquals(CurrentLimitsData other) { return Objects.equals(permanentLimit, other.permanentLimit) - && Objects.equals(temporaryLimits, other.temporaryLimits); + && Objects.equals(temporaryLimits, other.temporaryLimits) + && Objects.equals(limitsProperties, other.limitsProperties); } } diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java index 3654fbfb..7b2e5d1c 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java @@ -243,6 +243,7 @@ protected static List mergeCurrentLimits(@NonNull final Colle .applicability(Applicability.EQUIPMENT) .temporaryLimits(limitsData.getTemporaryLimits()) .permanentLimit(limitsData.getPermanentLimit()) + .limitsProperties(limitsData.getLimitsProperties()) .build()); return; } diff --git a/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java b/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java index 8683fe2d..6b50a51b 100644 --- a/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java +++ b/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java @@ -8,6 +8,7 @@ import org.assertj.core.api.junit.jupiter.SoftAssertionsExtension; import org.gridsuite.network.map.dto.common.CurrentLimitsData; import org.gridsuite.network.map.dto.common.CurrentLimitsData.Applicability; +import org.gridsuite.network.map.dto.common.LimitsProperty; import org.gridsuite.network.map.dto.common.TemporaryLimitData; import org.gridsuite.network.map.dto.utils.MockDto; import org.gridsuite.network.map.dto.utils.MockDto.CurrentLimitsDtoTest; @@ -24,6 +25,7 @@ import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.function.Function; @@ -57,7 +59,9 @@ void setDown() { */ @SafeVarargs - private CurrentLimitsData testResult(final String id, @Nullable final Double permanentLimit, @Nullable final Triple... temporaryLimits) { + private CurrentLimitsData testResult(final String id, @Nullable final Double permanentLimit, + @Nullable final List limitsProperties, + @Nullable final Triple... temporaryLimits) { final var dtoMocks = MockDto.buildOperationalLimitsGroup(true, id, permanentLimit, temporaryLimits); final TemporaryLimitDtoTest tlMock = CollectionUtils.isEmpty(dtoMocks.getRight()) ? null : dtoMocks.getRight().getFirst(); if (tlMock != null) { @@ -76,6 +80,7 @@ private CurrentLimitsData testResult(final String id, @Nullable final Double per Mockito.verify(olgMock, Mockito.times(permanentLimit == null ? 1 : 2)).getCurrentLimits(); if (permanentLimit != null) { Mockito.verify(olgMock).getId(); + Mockito.verify(olgMock, Mockito.times(CollectionUtils.isEmpty(limitsProperties) ? 1 : 2)).getPropertyNames(); Mockito.verify(clMock, Mockito.times(Double.isNaN(permanentLimit) ? 1 : 2)).getPermanentLimit(); Mockito.verify(clMock, Mockito.times(ArrayUtils.isEmpty(temporaryLimits) ? 1 : 2)).getTemporaryLimits(); if (ArrayUtils.isNotEmpty(temporaryLimits)) { @@ -92,62 +97,66 @@ private CurrentLimitsData testResult(final String id, @Nullable final Double per @Order(1) void nullInput() { // null -> null - assertThat(testResult(null, null, (Triple[]) null)).isNull(); + assertThat(testResult(null, null, null, (Triple[]) null)).isNull(); } @Test @Order(2) void emptyCurrentLimits() { // OLG("id", null) -> null - assertThat(testResult("id", null /*,new Triple[0]*/)).isNull(); + assertThat(testResult("id", null, Collections.emptyList() /*,new Triple[0]*/)).isNull(); } @Test @Order(3) void nanPermLimitAndNullTempLimit() { // OLG("id", CL(NaN, null)) -> null - assertThat(testResult("id", Double.NaN, (Triple[]) null)).isNull(); + assertThat(testResult("id", Double.NaN, Collections.emptyList(), (Triple[]) null)).isNull(); } @Test @Order(4) void nanPermLimitAndEmptyTempLimit() { // OLG("id", CL(NaN, [])) -> null - assertThat(testResult("id", Double.NaN /*,new Triple[0]*/)).isNull(); + assertThat(testResult("id", Double.NaN, Collections.emptyList() /*,new Triple[0]*/)).isNull(); } @Test @Order(5) void nanPermLimitAndNonEmptyTempLimit() { // OLG("my id", CL(Nan, [TL("testLimit", 456.789, 123)])) -> CLD("my id", null, [TLD("testLimit", 456.789, 123)], null) - assertThat(testResult("my id", Double.NaN, Triple.of("testLimit", 456.789, 123))) + assertThat(testResult("my id", Double.NaN, Collections.emptyList(), Triple.of("testLimit", 456.789, 123))) .isEqualTo(CurrentLimitsData.builder().id("my id").applicability(null).permanentLimit(null).temporaryLimits( - List.of(TemporaryLimitData.builder().acceptableDuration(123).name("testLimit").value(456.789).build())).build()); + List.of(TemporaryLimitData.builder().acceptableDuration(123).name("testLimit").value(456.789).build())) + .limitsProperties(Collections.emptyList()).build()); } @Test @Order(6) void nonNanPermLimitAndNullTempLimit() { // OLG("my id", CL(0.123, null)) -> CLD("my id", 0.123, null, null) - assertThat(testResult("my id", 0.123, (Triple[]) null)) - .isEqualTo(CurrentLimitsData.builder().id("my id").applicability(null).permanentLimit(0.123).temporaryLimits(null).build()); + assertThat(testResult("my id", 0.123, Collections.emptyList(), (Triple[]) null)) + .isEqualTo(CurrentLimitsData.builder().id("my id").applicability(null).permanentLimit(0.123).temporaryLimits(null) + .limitsProperties(Collections.emptyList()).build()); } @Test @Order(7) void nonNanPermLimitAndEmptyTempLimit() { // OLG("my id", CL(0.123, [])) -> CLD("my id", 0.123, [], null) - assertThat(testResult("my id", 0.123 /*,new Triple[0]*/)) - .isEqualTo(CurrentLimitsData.builder().id("my id").applicability(null).permanentLimit(0.123).temporaryLimits(null).build()); + assertThat(testResult("my id", 0.123, Collections.emptyList() /*,new Triple[0]*/)) + .isEqualTo(CurrentLimitsData.builder().id("my id").applicability(null).permanentLimit(0.123) + .temporaryLimits(null).limitsProperties(Collections.emptyList()).build()); } @Test @Order(8) void nonNanPermLimitAndNonEmptyTempLimit() { // OLG("my id", CL(0.0, [TL("testLimit", 456.789, 123)])) -> CLD("my id", 0.0, [TLD("testLimit", 456.789, 123)], null) - assertThat(testResult("my id", 0.0, Triple.of("testLimit", 456.789, 123))) + assertThat(testResult("my id", 0.0, Collections.emptyList(), Triple.of("testLimit", 456.789, 123))) .isEqualTo(CurrentLimitsData.builder().id("my id").applicability(null).permanentLimit(0.0).temporaryLimits( - List.of(TemporaryLimitData.builder().acceptableDuration(123).name("testLimit").value(456.789).build())).build()); + List.of(TemporaryLimitData.builder().acceptableDuration(123).name("testLimit").value(456.789).build())) + .limitsProperties(Collections.emptyList()).build()); } } @@ -167,6 +176,7 @@ private static CurrentLimitsData buildResult(final boolean withPL, final boolean TemporaryLimitData.builder().acceptableDuration(100).name("temporary1").value(50.0).build(), TemporaryLimitData.builder().acceptableDuration(150).name("temporary2").value(70.0).build() )).applicability(isSide1or2 == null ? Applicability.EQUIPMENT : (isSide1or2 ? Applicability.SIDE1 : Applicability.SIDE2)) + .limitsProperties(Collections.emptyList()) .build(); } diff --git a/src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java b/src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java index d0f77d79..ac758b49 100644 --- a/src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java +++ b/src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java @@ -249,7 +249,7 @@ public boolean removeProperty(String key) { @Override public Set getPropertyNames() { - throw new NotImplementedException("Not supported yet."); + return Set.of(); } @Override From a605c8fdeca1b53ab4527730916c60df85c26095 Mon Sep 17 00:00:00 2001 From: basseche Date: Mon, 20 Oct 2025 16:31:12 +0200 Subject: [PATCH 06/13] Fix Sonar warning Signed-off-by: basseche --- .../network/map/dto/mapper/BranchInfosMapper.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java index 7b2e5d1c..8474892c 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java @@ -264,12 +264,11 @@ protected static List mergeCurrentLimits(@NonNull final Colle @Nullable static CurrentLimitsData operationalLimitsGroupToMapDataCurrentLimits(@Nullable final OperationalLimitsGroup operationalLimitsGroup, @Nullable final Applicability applicability) { - if (operationalLimitsGroup == null || operationalLimitsGroup.getCurrentLimits().isEmpty()) { - return null; - } - return toMapDataCurrentLimits(operationalLimitsGroup.getCurrentLimits().get(), operationalLimitsGroup.getId(), applicability, - getLimitsProperties(operationalLimitsGroup)); + CurrentLimits currentLimits = operationalLimitsGroup != null ? operationalLimitsGroup.getCurrentLimits().orElse(null) : null; + + return currentLimits != null ? toMapDataCurrentLimits(currentLimits, operationalLimitsGroup.getId(), applicability, + getLimitsProperties(operationalLimitsGroup)) : null; } private static List toMapDataTemporaryLimit(@NonNull final Collection limits) { From 13f1fa74a7b9fe215bbb994c5c3a32d898a81f87 Mon Sep 17 00:00:00 2001 From: basseche Date: Mon, 20 Oct 2025 17:26:35 +0200 Subject: [PATCH 07/13] Fix Tests Signed-off-by: basseche --- .../map/dto/mapper/BranchInfosMapperTest.java | 30 ++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java b/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java index 6b50a51b..3b52bac8 100644 --- a/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java +++ b/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java @@ -8,7 +8,6 @@ import org.assertj.core.api.junit.jupiter.SoftAssertionsExtension; import org.gridsuite.network.map.dto.common.CurrentLimitsData; import org.gridsuite.network.map.dto.common.CurrentLimitsData.Applicability; -import org.gridsuite.network.map.dto.common.LimitsProperty; import org.gridsuite.network.map.dto.common.TemporaryLimitData; import org.gridsuite.network.map.dto.utils.MockDto; import org.gridsuite.network.map.dto.utils.MockDto.CurrentLimitsDtoTest; @@ -42,7 +41,6 @@ class OperationalLimitsGroupToMapDataCurrentLimits { @AfterEach void setDown() { if (!mocks.isEmpty()) { - Mockito.verifyNoMoreInteractions(mocks.toArray(Object[]::new)); mocks.clear(); } } @@ -60,7 +58,6 @@ void setDown() { @SafeVarargs private CurrentLimitsData testResult(final String id, @Nullable final Double permanentLimit, - @Nullable final List limitsProperties, @Nullable final Triple... temporaryLimits) { final var dtoMocks = MockDto.buildOperationalLimitsGroup(true, id, permanentLimit, temporaryLimits); final TemporaryLimitDtoTest tlMock = CollectionUtils.isEmpty(dtoMocks.getRight()) ? null : dtoMocks.getRight().getFirst(); @@ -77,16 +74,15 @@ private CurrentLimitsData testResult(final String id, @Nullable final Double per } final CurrentLimitsData result = BranchInfosMapper.operationalLimitsGroupToMapDataCurrentLimits(olgMock, null); if (id != null) { - Mockito.verify(olgMock, Mockito.times(permanentLimit == null ? 1 : 2)).getCurrentLimits(); + Mockito.verify(olgMock, Mockito.atLeast(1)).getCurrentLimits(); if (permanentLimit != null) { Mockito.verify(olgMock).getId(); - Mockito.verify(olgMock, Mockito.times(CollectionUtils.isEmpty(limitsProperties) ? 1 : 2)).getPropertyNames(); - Mockito.verify(clMock, Mockito.times(Double.isNaN(permanentLimit) ? 1 : 2)).getPermanentLimit(); - Mockito.verify(clMock, Mockito.times(ArrayUtils.isEmpty(temporaryLimits) ? 1 : 2)).getTemporaryLimits(); + Mockito.verify(clMock, Mockito.atLeast(1)).getPermanentLimit(); + Mockito.verify(clMock, Mockito.atLeast(1)).getTemporaryLimits(); if (ArrayUtils.isNotEmpty(temporaryLimits)) { Mockito.verify(tlMock).getName(); - Mockito.verify(tlMock, Mockito.times(2)).getValue(); - Mockito.verify(tlMock, Mockito.times(2)).getAcceptableDuration(); + Mockito.verify(tlMock, Mockito.atLeast(1)).getValue(); + Mockito.verify(tlMock, Mockito.atLeast(1)).getAcceptableDuration(); } } } @@ -97,35 +93,35 @@ private CurrentLimitsData testResult(final String id, @Nullable final Double per @Order(1) void nullInput() { // null -> null - assertThat(testResult(null, null, null, (Triple[]) null)).isNull(); + assertThat(testResult(null, null, (Triple[]) null)).isNull(); } @Test @Order(2) void emptyCurrentLimits() { // OLG("id", null) -> null - assertThat(testResult("id", null, Collections.emptyList() /*,new Triple[0]*/)).isNull(); + assertThat(testResult("id", null /*,new Triple[0]*/)).isNull(); } @Test @Order(3) void nanPermLimitAndNullTempLimit() { // OLG("id", CL(NaN, null)) -> null - assertThat(testResult("id", Double.NaN, Collections.emptyList(), (Triple[]) null)).isNull(); + assertThat(testResult("id", Double.NaN, (Triple[]) null)).isNull(); } @Test @Order(4) void nanPermLimitAndEmptyTempLimit() { // OLG("id", CL(NaN, [])) -> null - assertThat(testResult("id", Double.NaN, Collections.emptyList() /*,new Triple[0]*/)).isNull(); + assertThat(testResult("id", Double.NaN /*,new Triple[0]*/)).isNull(); } @Test @Order(5) void nanPermLimitAndNonEmptyTempLimit() { // OLG("my id", CL(Nan, [TL("testLimit", 456.789, 123)])) -> CLD("my id", null, [TLD("testLimit", 456.789, 123)], null) - assertThat(testResult("my id", Double.NaN, Collections.emptyList(), Triple.of("testLimit", 456.789, 123))) + assertThat(testResult("my id", Double.NaN, Triple.of("testLimit", 456.789, 123))) .isEqualTo(CurrentLimitsData.builder().id("my id").applicability(null).permanentLimit(null).temporaryLimits( List.of(TemporaryLimitData.builder().acceptableDuration(123).name("testLimit").value(456.789).build())) .limitsProperties(Collections.emptyList()).build()); @@ -135,7 +131,7 @@ void nanPermLimitAndNonEmptyTempLimit() { @Order(6) void nonNanPermLimitAndNullTempLimit() { // OLG("my id", CL(0.123, null)) -> CLD("my id", 0.123, null, null) - assertThat(testResult("my id", 0.123, Collections.emptyList(), (Triple[]) null)) + assertThat(testResult("my id", 0.123, (Triple[]) null)) .isEqualTo(CurrentLimitsData.builder().id("my id").applicability(null).permanentLimit(0.123).temporaryLimits(null) .limitsProperties(Collections.emptyList()).build()); } @@ -144,7 +140,7 @@ void nonNanPermLimitAndNullTempLimit() { @Order(7) void nonNanPermLimitAndEmptyTempLimit() { // OLG("my id", CL(0.123, [])) -> CLD("my id", 0.123, [], null) - assertThat(testResult("my id", 0.123, Collections.emptyList() /*,new Triple[0]*/)) + assertThat(testResult("my id", 0.123 /*,new Triple[0]*/)) .isEqualTo(CurrentLimitsData.builder().id("my id").applicability(null).permanentLimit(0.123) .temporaryLimits(null).limitsProperties(Collections.emptyList()).build()); } @@ -153,7 +149,7 @@ void nonNanPermLimitAndEmptyTempLimit() { @Order(8) void nonNanPermLimitAndNonEmptyTempLimit() { // OLG("my id", CL(0.0, [TL("testLimit", 456.789, 123)])) -> CLD("my id", 0.0, [TLD("testLimit", 456.789, 123)], null) - assertThat(testResult("my id", 0.0, Collections.emptyList(), Triple.of("testLimit", 456.789, 123))) + assertThat(testResult("my id", 0.0, Triple.of("testLimit", 456.789, 123))) .isEqualTo(CurrentLimitsData.builder().id("my id").applicability(null).permanentLimit(0.0).temporaryLimits( List.of(TemporaryLimitData.builder().acceptableDuration(123).name("testLimit").value(456.789).build())) .limitsProperties(Collections.emptyList()).build()); From 5c226d97c460bf7ec0f17dfacf2a44aafc412316 Mon Sep 17 00:00:00 2001 From: basseche Date: Fri, 24 Oct 2025 12:03:49 +0200 Subject: [PATCH 08/13] review Signed-off-by: basseche --- .../map/dto/common/LimitsProperty.java | 11 +++++++ .../map/dto/mapper/BranchInfosMapper.java | 20 ++++++------ .../map/dto/mapper/BranchInfosMapperTest.java | 31 +++++++------------ .../2-windings-transformer-map-data.json | 6 ++-- src/test/resources/line-form-data.json | 6 ++-- src/test/resources/lines-form-data.json | 29 ++++++++--------- .../resources/partial-lines-form-data.json | 8 ++--- 7 files changed, 54 insertions(+), 57 deletions(-) diff --git a/src/main/java/org/gridsuite/network/map/dto/common/LimitsProperty.java b/src/main/java/org/gridsuite/network/map/dto/common/LimitsProperty.java index 46e23722..15c75a63 100644 --- a/src/main/java/org/gridsuite/network/map/dto/common/LimitsProperty.java +++ b/src/main/java/org/gridsuite/network/map/dto/common/LimitsProperty.java @@ -1,4 +1,15 @@ +/** + * Copyright (c) 2025, 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/. + */ + package org.gridsuite.network.map.dto.common; +/** + * @author El Cheikh Bassel + */ + public record LimitsProperty(String name, String value) { } diff --git a/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java b/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java index 8474892c..c643fae3 100644 --- a/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java +++ b/src/main/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapper.java @@ -129,11 +129,7 @@ private static BranchTabInfos toTabInfos(@NonNull final Branch branch, @Nulla } private static List getLimitsProperties(OperationalLimitsGroup group) { - ArrayList properties = new ArrayList<>(); - for (String name : group.getPropertyNames()) { - properties.add(new LimitsProperty(name, group.getProperty(name))); - } - return properties; + return group.getPropertyNames().stream().map(propertyName -> new LimitsProperty(propertyName, group.getProperty(propertyName))).collect(Collectors.toCollection(ArrayList::new)); } private static Map buildCurrentLimitsMap(@NonNull final Collection operationalLimitsGroups) { @@ -188,8 +184,9 @@ protected static CurrentLimitsData toMapDataCurrentLimits(@NonNull final Current builder.temporaryLimits(toMapDataTemporaryLimit(limits.getTemporaryLimits())); empty = false; } - if (limitsProperties != null) { + if (!CollectionUtils.isEmpty(limitsProperties)) { builder.limitsProperties(limitsProperties); + empty = false; } return empty ? null : builder.build(); } @@ -265,10 +262,13 @@ protected static List mergeCurrentLimits(@NonNull final Colle static CurrentLimitsData operationalLimitsGroupToMapDataCurrentLimits(@Nullable final OperationalLimitsGroup operationalLimitsGroup, @Nullable final Applicability applicability) { - CurrentLimits currentLimits = operationalLimitsGroup != null ? operationalLimitsGroup.getCurrentLimits().orElse(null) : null; + if (operationalLimitsGroup == null) { + return null; + } - return currentLimits != null ? toMapDataCurrentLimits(currentLimits, operationalLimitsGroup.getId(), applicability, - getLimitsProperties(operationalLimitsGroup)) : null; + Optional currentLimits = operationalLimitsGroup.getCurrentLimits(); + return currentLimits.map(limits -> toMapDataCurrentLimits(limits, operationalLimitsGroup.getId(), applicability, + getLimitsProperties(operationalLimitsGroup))).orElse(null); } private static List toMapDataTemporaryLimit(@NonNull final Collection limits) { @@ -277,6 +277,6 @@ private static List toMapDataTemporaryLimit(@NonNull final C .name(l.getName()) .acceptableDuration(l.getAcceptableDuration() == Integer.MAX_VALUE ? null : l.getAcceptableDuration()) .value(l.getValue() == Double.MAX_VALUE ? null : l.getValue()) - .build()).toList(); + .build()).collect(Collectors.toList()); } } diff --git a/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java b/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java index 3b52bac8..2ec75da2 100644 --- a/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java +++ b/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java @@ -24,7 +24,6 @@ import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.function.Function; @@ -57,8 +56,7 @@ void setDown() { */ @SafeVarargs - private CurrentLimitsData testResult(final String id, @Nullable final Double permanentLimit, - @Nullable final Triple... temporaryLimits) { + private CurrentLimitsData testResult(final String id, @Nullable final Double permanentLimit, @Nullable final Triple... temporaryLimits) { final var dtoMocks = MockDto.buildOperationalLimitsGroup(true, id, permanentLimit, temporaryLimits); final TemporaryLimitDtoTest tlMock = CollectionUtils.isEmpty(dtoMocks.getRight()) ? null : dtoMocks.getRight().getFirst(); if (tlMock != null) { @@ -73,16 +71,16 @@ private CurrentLimitsData testResult(final String id, @Nullable final Double per mocks.add(olgMock); } final CurrentLimitsData result = BranchInfosMapper.operationalLimitsGroupToMapDataCurrentLimits(olgMock, null); - if (id != null) { - Mockito.verify(olgMock, Mockito.atLeast(1)).getCurrentLimits(); + if (id != null && result != null) { + Mockito.verify(olgMock).getId(); if (permanentLimit != null) { - Mockito.verify(olgMock).getId(); - Mockito.verify(clMock, Mockito.atLeast(1)).getPermanentLimit(); - Mockito.verify(clMock, Mockito.atLeast(1)).getTemporaryLimits(); + Mockito.verify(olgMock, Mockito.atLeast(1)).getCurrentLimits(); + Mockito.verify(clMock, Mockito.times(Double.isNaN(permanentLimit) ? 1 : 2)).getPermanentLimit(); + Mockito.verify(clMock, Mockito.times(ArrayUtils.isEmpty(temporaryLimits) ? 1 : 2)).getTemporaryLimits(); if (ArrayUtils.isNotEmpty(temporaryLimits)) { Mockito.verify(tlMock).getName(); - Mockito.verify(tlMock, Mockito.atLeast(1)).getValue(); - Mockito.verify(tlMock, Mockito.atLeast(1)).getAcceptableDuration(); + Mockito.verify(tlMock, Mockito.times(2)).getValue(); + Mockito.verify(tlMock, Mockito.times(2)).getAcceptableDuration(); } } } @@ -123,8 +121,7 @@ void nanPermLimitAndNonEmptyTempLimit() { // OLG("my id", CL(Nan, [TL("testLimit", 456.789, 123)])) -> CLD("my id", null, [TLD("testLimit", 456.789, 123)], null) assertThat(testResult("my id", Double.NaN, Triple.of("testLimit", 456.789, 123))) .isEqualTo(CurrentLimitsData.builder().id("my id").applicability(null).permanentLimit(null).temporaryLimits( - List.of(TemporaryLimitData.builder().acceptableDuration(123).name("testLimit").value(456.789).build())) - .limitsProperties(Collections.emptyList()).build()); + List.of(TemporaryLimitData.builder().acceptableDuration(123).name("testLimit").value(456.789).build())).build()); } @Test @@ -132,8 +129,7 @@ void nanPermLimitAndNonEmptyTempLimit() { void nonNanPermLimitAndNullTempLimit() { // OLG("my id", CL(0.123, null)) -> CLD("my id", 0.123, null, null) assertThat(testResult("my id", 0.123, (Triple[]) null)) - .isEqualTo(CurrentLimitsData.builder().id("my id").applicability(null).permanentLimit(0.123).temporaryLimits(null) - .limitsProperties(Collections.emptyList()).build()); + .isEqualTo(CurrentLimitsData.builder().id("my id").applicability(null).permanentLimit(0.123).temporaryLimits(null).build()); } @Test @@ -141,8 +137,7 @@ void nonNanPermLimitAndNullTempLimit() { void nonNanPermLimitAndEmptyTempLimit() { // OLG("my id", CL(0.123, [])) -> CLD("my id", 0.123, [], null) assertThat(testResult("my id", 0.123 /*,new Triple[0]*/)) - .isEqualTo(CurrentLimitsData.builder().id("my id").applicability(null).permanentLimit(0.123) - .temporaryLimits(null).limitsProperties(Collections.emptyList()).build()); + .isEqualTo(CurrentLimitsData.builder().id("my id").applicability(null).permanentLimit(0.123).temporaryLimits(null).build()); } @Test @@ -151,8 +146,7 @@ void nonNanPermLimitAndNonEmptyTempLimit() { // OLG("my id", CL(0.0, [TL("testLimit", 456.789, 123)])) -> CLD("my id", 0.0, [TLD("testLimit", 456.789, 123)], null) assertThat(testResult("my id", 0.0, Triple.of("testLimit", 456.789, 123))) .isEqualTo(CurrentLimitsData.builder().id("my id").applicability(null).permanentLimit(0.0).temporaryLimits( - List.of(TemporaryLimitData.builder().acceptableDuration(123).name("testLimit").value(456.789).build())) - .limitsProperties(Collections.emptyList()).build()); + List.of(TemporaryLimitData.builder().acceptableDuration(123).name("testLimit").value(456.789).build())).build()); } } @@ -172,7 +166,6 @@ private static CurrentLimitsData buildResult(final boolean withPL, final boolean TemporaryLimitData.builder().acceptableDuration(100).name("temporary1").value(50.0).build(), TemporaryLimitData.builder().acceptableDuration(150).name("temporary2").value(70.0).build() )).applicability(isSide1or2 == null ? Applicability.EQUIPMENT : (isSide1or2 ? Applicability.SIDE1 : Applicability.SIDE2)) - .limitsProperties(Collections.emptyList()) .build(); } diff --git a/src/test/resources/2-windings-transformer-map-data.json b/src/test/resources/2-windings-transformer-map-data.json index 79efbd2e..98e4a905 100644 --- a/src/test/resources/2-windings-transformer-map-data.json +++ b/src/test/resources/2-windings-transformer-map-data.json @@ -16,15 +16,13 @@ "id" : "limit set 1", "permanentLimit":750.4, "temporaryLimits":[{"name":"IT5","acceptableDuration":2087,"value":300}], - "applicability": "SIDE1", - "limitsProperties": [] + "applicability": "SIDE1" }, { "id" : "limit set 1", "permanentLimit":780.6, "temporaryLimits":[{"name":"N/A","acceptableDuration":664,"value":2147483647},{"name":"IT20","acceptableDuration":961,"value":1200}], - "applicability": "SIDE2", - "limitsProperties": [] + "applicability": "SIDE2" } ], "selectedOperationalLimitsGroup1": "limit set 1", diff --git a/src/test/resources/line-form-data.json b/src/test/resources/line-form-data.json index eeff1c2c..624c3132 100644 --- a/src/test/resources/line-form-data.json +++ b/src/test/resources/line-form-data.json @@ -13,15 +13,13 @@ "id" : "limit set 1", "permanentLimit":700.4, "temporaryLimits":[{"name":"IT5","acceptableDuration":300,"value":250.0}], - "applicability": "SIDE1", - "limitsProperties": [] + "applicability": "SIDE1" }, { "id" : "limit set 1", "permanentLimit":800.8, "temporaryLimits":[{"name":"IT20","acceptableDuration":1200,"value":300.0},{"name":"IT10","acceptableDuration":600,"value":200.0}], - "applicability": "SIDE2", - "limitsProperties": [] + "applicability": "SIDE2" } ], "selectedOperationalLimitsGroup1": "limit set 1", diff --git a/src/test/resources/lines-form-data.json b/src/test/resources/lines-form-data.json index 6a24e4a5..a128d24c 100644 --- a/src/test/resources/lines-form-data.json +++ b/src/test/resources/lines-form-data.json @@ -20,8 +20,7 @@ "acceptableDuration": 300 } ], - "applicability": "SIDE1", - "limitsProperties": [] + "applicability": "SIDE1" }, { "id": "limit set 1", @@ -38,8 +37,7 @@ "acceptableDuration": 600 } ], - "applicability": "SIDE2", - "limitsProperties": [] + "applicability": "SIDE2" } ], "selectedOperationalLimitsGroup1": "limit set 1", @@ -80,8 +78,7 @@ "acceptableDuration": 200 } ], - "applicability": "SIDE1", - "limitsProperties": [] + "applicability": "SIDE1" }, { "id": "group1", @@ -98,8 +95,8 @@ "acceptableDuration": 100 } ], - "applicability": "SIDE1", - "limitsProperties": [] + "applicability": "SIDE1" + }, { "id": "group4", @@ -111,8 +108,8 @@ "acceptableDuration": 200 } ], - "applicability": "SIDE2", - "limitsProperties": [] + "applicability": "SIDE2" + }, { "id": "group3", @@ -124,8 +121,8 @@ "acceptableDuration": 150 } ], - "applicability": "SIDE2", - "limitsProperties": [] + "applicability": "SIDE2" + } ], "selectedOperationalLimitsGroup1": "group1", @@ -168,8 +165,8 @@ "acceptableDuration": 100 } ], - "applicability": "SIDE1", - "limitsProperties": [] + "applicability": "SIDE1" + } ], "selectedOperationalLimitsGroup1": "group1", @@ -229,8 +226,8 @@ "acceptableDuration": 100 } ], - "applicability": "SIDE2", - "limitsProperties": [] + "applicability": "SIDE2" + } ], "selectedOperationalLimitsGroup2": "group1", diff --git a/src/test/resources/partial-lines-form-data.json b/src/test/resources/partial-lines-form-data.json index 6b494941..2888a809 100644 --- a/src/test/resources/partial-lines-form-data.json +++ b/src/test/resources/partial-lines-form-data.json @@ -21,8 +21,8 @@ "acceptableDuration": 100 } ], - "applicability": "SIDE2", - "limitsProperties": [] + "applicability": "SIDE2" + } ], "selectedOperationalLimitsGroup2": "group1", @@ -64,8 +64,8 @@ "acceptableDuration": 100 } ], - "applicability": "SIDE1", - "limitsProperties": [] + "applicability": "SIDE1" + } ], "selectedOperationalLimitsGroup1": "group1", From 2be82ed777bfdcf329c14fc353ca95f62a579777 Mon Sep 17 00:00:00 2001 From: basseche Date: Fri, 24 Oct 2025 12:07:44 +0200 Subject: [PATCH 09/13] review 2 --- .../java/org/gridsuite/network/map/dto/utils/MockDto.java | 2 +- src/test/resources/lines-form-data.json | 5 ----- src/test/resources/partial-lines-form-data.json | 2 -- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java b/src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java index ac758b49..d0f77d79 100644 --- a/src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java +++ b/src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java @@ -249,7 +249,7 @@ public boolean removeProperty(String key) { @Override public Set getPropertyNames() { - return Set.of(); + throw new NotImplementedException("Not supported yet."); } @Override diff --git a/src/test/resources/lines-form-data.json b/src/test/resources/lines-form-data.json index a128d24c..0e7c6ddf 100644 --- a/src/test/resources/lines-form-data.json +++ b/src/test/resources/lines-form-data.json @@ -96,7 +96,6 @@ } ], "applicability": "SIDE1" - }, { "id": "group4", @@ -109,7 +108,6 @@ } ], "applicability": "SIDE2" - }, { "id": "group3", @@ -122,7 +120,6 @@ } ], "applicability": "SIDE2" - } ], "selectedOperationalLimitsGroup1": "group1", @@ -166,7 +163,6 @@ } ], "applicability": "SIDE1" - } ], "selectedOperationalLimitsGroup1": "group1", @@ -227,7 +223,6 @@ } ], "applicability": "SIDE2" - } ], "selectedOperationalLimitsGroup2": "group1", diff --git a/src/test/resources/partial-lines-form-data.json b/src/test/resources/partial-lines-form-data.json index 2888a809..117e0775 100644 --- a/src/test/resources/partial-lines-form-data.json +++ b/src/test/resources/partial-lines-form-data.json @@ -22,7 +22,6 @@ } ], "applicability": "SIDE2" - } ], "selectedOperationalLimitsGroup2": "group1", @@ -65,7 +64,6 @@ } ], "applicability": "SIDE1" - } ], "selectedOperationalLimitsGroup1": "group1", From 6ca2327243e88f4304ed93c1f5f720797aff3008 Mon Sep 17 00:00:00 2001 From: basseche Date: Fri, 24 Oct 2025 13:07:27 +0200 Subject: [PATCH 10/13] Fix tests --- src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java b/src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java index d0f77d79..ac758b49 100644 --- a/src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java +++ b/src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java @@ -249,7 +249,7 @@ public boolean removeProperty(String key) { @Override public Set getPropertyNames() { - throw new NotImplementedException("Not supported yet."); + return Set.of(); } @Override From 0faf0fa7c34b21da0e31942e7e9c3e83a8329773 Mon Sep 17 00:00:00 2001 From: basseche Date: Fri, 24 Oct 2025 13:19:50 +0200 Subject: [PATCH 11/13] add test with properties Signed-off-by: basseche --- .../gridsuite/network/map/NetworkMapControllerTest.java | 8 ++++++++ src/test/resources/line-form-data.json | 5 ++++- src/test/resources/lines-form-data.json | 5 ++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/gridsuite/network/map/NetworkMapControllerTest.java b/src/test/java/org/gridsuite/network/map/NetworkMapControllerTest.java index 12cede0e..6db24ff2 100644 --- a/src/test/java/org/gridsuite/network/map/NetworkMapControllerTest.java +++ b/src/test/java/org/gridsuite/network/map/NetworkMapControllerTest.java @@ -38,6 +38,7 @@ import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; import java.util.function.Function; @@ -134,6 +135,13 @@ void setUp() { .withDirection(ConnectablePosition.Direction.BOTTOM).add() .add(); + // add limits properties on operational limits group side 1 + Optional op = l1.getOperationalLimitsGroup1("limit set 1"); + if (op.isPresent()) { + op.get().setProperty("prop1", "value1"); + op.get().setProperty("prop2", "value2"); + } + Line l2 = network.getLine("NHV1_NHV2_2"); l2.newOperationalLimitsGroup1("group1").newCurrentLimits() .setPermanentLimit(220.0) diff --git a/src/test/resources/line-form-data.json b/src/test/resources/line-form-data.json index 624c3132..2388a7a1 100644 --- a/src/test/resources/line-form-data.json +++ b/src/test/resources/line-form-data.json @@ -13,7 +13,10 @@ "id" : "limit set 1", "permanentLimit":700.4, "temporaryLimits":[{"name":"IT5","acceptableDuration":300,"value":250.0}], - "applicability": "SIDE1" + "applicability": "SIDE1", + "limitsProperties": [{ + "name": "prop1", "value": "value1" + }, {"name": "prop2", "value": "value2"}] }, { "id" : "limit set 1", diff --git a/src/test/resources/lines-form-data.json b/src/test/resources/lines-form-data.json index 0e7c6ddf..c55cece4 100644 --- a/src/test/resources/lines-form-data.json +++ b/src/test/resources/lines-form-data.json @@ -20,7 +20,10 @@ "acceptableDuration": 300 } ], - "applicability": "SIDE1" + "applicability": "SIDE1", + "limitsProperties": [{ + "name": "prop1", "value": "value1" + }, {"name": "prop2", "value": "value2"}] }, { "id": "limit set 1", From 390a9343e869550ff8c652467f8ff644e81702e3 Mon Sep 17 00:00:00 2001 From: basseche Date: Tue, 28 Oct 2025 16:47:58 +0100 Subject: [PATCH 12/13] fix tests Signed-off-by: basseche --- .../network/map/dto/mapper/BranchInfosMapperTest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java b/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java index 2ec75da2..851a8ee5 100644 --- a/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java +++ b/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java @@ -40,6 +40,7 @@ class OperationalLimitsGroupToMapDataCurrentLimits { @AfterEach void setDown() { if (!mocks.isEmpty()) { + //Mockito.verifyNoMoreInteractions(mocks.toArray(Object[]::new)); mocks.clear(); } } @@ -71,10 +72,10 @@ private CurrentLimitsData testResult(final String id, @Nullable final Double per mocks.add(olgMock); } final CurrentLimitsData result = BranchInfosMapper.operationalLimitsGroupToMapDataCurrentLimits(olgMock, null); - if (id != null && result != null) { - Mockito.verify(olgMock).getId(); + if (id != null) { + Mockito.verify(olgMock, Mockito.times(1)).getCurrentLimits(); if (permanentLimit != null) { - Mockito.verify(olgMock, Mockito.atLeast(1)).getCurrentLimits(); + Mockito.verify(olgMock).getId(); Mockito.verify(clMock, Mockito.times(Double.isNaN(permanentLimit) ? 1 : 2)).getPermanentLimit(); Mockito.verify(clMock, Mockito.times(ArrayUtils.isEmpty(temporaryLimits) ? 1 : 2)).getTemporaryLimits(); if (ArrayUtils.isNotEmpty(temporaryLimits)) { From 91d46daa1a23a6fe3a87dd4c7992b07b9e81f890 Mon Sep 17 00:00:00 2001 From: basseche Date: Wed, 29 Oct 2025 10:24:32 +0100 Subject: [PATCH 13/13] fix tests Signed-off-by: basseche --- .../map/dto/mapper/BranchInfosMapperTest.java | 3 ++- .../org/gridsuite/network/map/dto/utils/MockDto.java | 12 +++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java b/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java index 851a8ee5..32195725 100644 --- a/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java +++ b/src/test/java/org/gridsuite/network/map/dto/mapper/BranchInfosMapperTest.java @@ -40,7 +40,7 @@ class OperationalLimitsGroupToMapDataCurrentLimits { @AfterEach void setDown() { if (!mocks.isEmpty()) { - //Mockito.verifyNoMoreInteractions(mocks.toArray(Object[]::new)); + Mockito.verifyNoMoreInteractions(mocks.toArray(Object[]::new)); mocks.clear(); } } @@ -76,6 +76,7 @@ private CurrentLimitsData testResult(final String id, @Nullable final Double per Mockito.verify(olgMock, Mockito.times(1)).getCurrentLimits(); if (permanentLimit != null) { Mockito.verify(olgMock).getId(); + Mockito.verify(olgMock, Mockito.times(1)).getPropertyNames(); Mockito.verify(clMock, Mockito.times(Double.isNaN(permanentLimit) ? 1 : 2)).getPermanentLimit(); Mockito.verify(clMock, Mockito.times(ArrayUtils.isEmpty(temporaryLimits) ? 1 : 2)).getTemporaryLimits(); if (ArrayUtils.isNotEmpty(temporaryLimits)) { diff --git a/src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java b/src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java index ac758b49..8f27b652 100644 --- a/src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java +++ b/src/test/java/org/gridsuite/network/map/dto/utils/MockDto.java @@ -13,6 +13,7 @@ import org.mockito.Mockito; import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Optional; import java.util.Set; @@ -152,9 +153,10 @@ public LimitType getLimitType() { public static class OperationalLimitsGroupDtoTest implements OperationalLimitsGroup { private String id; private Optional currentLimits; + private HashMapproperties; public OperationalLimitsGroupDtoTest(String id, CurrentLimits currentLimits) { - this(id, Optional.ofNullable(currentLimits)); + this(id, Optional.ofNullable(currentLimits), new HashMap<>()); } @Override @@ -229,7 +231,7 @@ public boolean hasProperty(String key) { @Override public String getProperty(String key) { - throw new NotImplementedException("Not supported yet."); + return properties.get(key); } @Override @@ -239,17 +241,17 @@ public String getProperty(String key, String defaultValue) { @Override public String setProperty(String key, String value) { - throw new NotImplementedException("Not supported yet."); + return properties.put(key, value); } @Override public boolean removeProperty(String key) { - throw new NotImplementedException("Not supported yet."); + return properties.remove(key) != null; } @Override public Set getPropertyNames() { - return Set.of(); + return properties.keySet(); } @Override