From 3845ef53d814281f28616f3d549043fa38b4bd30 Mon Sep 17 00:00:00 2001 From: Florent MILLOT <75525996+flomillot@users.noreply.github.com> Date: Fri, 20 Feb 2026 18:47:31 +0100 Subject: [PATCH 1/6] Add RATIO_HIGH_TAP_POSITION and PHASE_HIGH_TAP_POSITION to TwoWindingsTransformerField Add high tap position fields for both ratio and phase tap changers in TwoWindingsTransformerField enum. These read-only fields are handled in isEquipmentEditable and getReferenceValue methods, following the same pattern as their LOW_TAP_POSITION counterparts. Signed-off-by: Florent Signed-off-by: Florent MILLOT <75525996+flomillot@users.noreply.github.com> --- .../equipmentfield/TwoWindingsTransformerField.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/TwoWindingsTransformerField.java b/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/TwoWindingsTransformerField.java index e73b31db..2f458866 100644 --- a/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/TwoWindingsTransformerField.java +++ b/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/TwoWindingsTransformerField.java @@ -37,10 +37,12 @@ public enum TwoWindingsTransformerField { RATED_S, TARGET_V, RATIO_LOW_TAP_POSITION, + RATIO_HIGH_TAP_POSITION, RATIO_TAP_POSITION, RATIO_TARGET_DEADBAND, REGULATION_VALUE, PHASE_LOW_TAP_POSITION, + PHASE_HIGH_TAP_POSITION, PHASE_TAP_POSITION, PHASE_TARGET_DEADBAND, SELECTED_OPERATIONAL_LIMITS_GROUP_ID1, @@ -56,7 +58,7 @@ public static boolean isEquipmentEditable(TwoWindingsTransformer twoWindingsTran TwoWindingsTransformerField field = TwoWindingsTransformerField.valueOf(editedField); return switch (field) { - case TARGET_V, RATIO_LOW_TAP_POSITION, RATIO_TAP_POSITION, RATIO_TARGET_DEADBAND -> { + case TARGET_V, RATIO_LOW_TAP_POSITION, RATIO_HIGH_TAP_POSITION, RATIO_TAP_POSITION, RATIO_TARGET_DEADBAND -> { boolean isEditable = twoWindingsTransformer.getRatioTapChanger() != null; if (!isEditable) { equipmentsReport.add(ReportNode.newRootReportNode() @@ -69,7 +71,7 @@ public static boolean isEquipmentEditable(TwoWindingsTransformer twoWindingsTran } yield isEditable; } - case REGULATION_VALUE, PHASE_LOW_TAP_POSITION, PHASE_TAP_POSITION, PHASE_TARGET_DEADBAND -> { + case REGULATION_VALUE, PHASE_LOW_TAP_POSITION, PHASE_HIGH_TAP_POSITION, PHASE_TAP_POSITION, PHASE_TARGET_DEADBAND -> { boolean isEditable = twoWindingsTransformer.getPhaseTapChanger() != null; if (!isEditable) { equipmentsReport.add(ReportNode.newRootReportNode() @@ -102,6 +104,8 @@ public static String getReferenceValue(TwoWindingsTransformer transformer, Strin case TARGET_V -> ratioTapChanger != null ? String.valueOf(ratioTapChanger.getTargetV()) : null; case RATIO_LOW_TAP_POSITION -> ratioTapChanger != null ? String.valueOf(ratioTapChanger.getLowTapPosition()) : null; + case RATIO_HIGH_TAP_POSITION -> + ratioTapChanger != null ? String.valueOf(ratioTapChanger.getHighTapPosition()) : null; case RATIO_TAP_POSITION -> ratioTapChanger != null ? String.valueOf(ratioTapChanger.getTapPosition()) : null; case RATIO_TARGET_DEADBAND -> @@ -110,6 +114,8 @@ public static String getReferenceValue(TwoWindingsTransformer transformer, Strin phaseTapChanger != null ? String.valueOf(phaseTapChanger.getRegulationValue()) : null; case PHASE_LOW_TAP_POSITION -> phaseTapChanger != null ? String.valueOf(phaseTapChanger.getLowTapPosition()) : null; + case PHASE_HIGH_TAP_POSITION -> + phaseTapChanger != null ? String.valueOf(phaseTapChanger.getHighTapPosition()) : null; case PHASE_TAP_POSITION -> phaseTapChanger != null ? String.valueOf(phaseTapChanger.getTapPosition()) : null; case PHASE_TARGET_DEADBAND -> From af6499a76008a71577796c1097ba6ffe96bedce8 Mon Sep 17 00:00:00 2001 From: Florent MILLOT <75525996+flomillot@users.noreply.github.com> Date: Mon, 23 Feb 2026 12:19:20 +0100 Subject: [PATCH 2/6] Mark RATIO_HIGH_TAP_POSITION and PHASE_HIGH_TAP_POSITION as non-editable fields in TwoWindingsTransformerField Signed-off-by: Florent MILLOT <75525996+flomillot@users.noreply.github.com> --- .../equipmentfield/TwoWindingsTransformerField.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/TwoWindingsTransformerField.java b/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/TwoWindingsTransformerField.java index 2f458866..a303ebcf 100644 --- a/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/TwoWindingsTransformerField.java +++ b/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/TwoWindingsTransformerField.java @@ -58,7 +58,7 @@ public static boolean isEquipmentEditable(TwoWindingsTransformer twoWindingsTran TwoWindingsTransformerField field = TwoWindingsTransformerField.valueOf(editedField); return switch (field) { - case TARGET_V, RATIO_LOW_TAP_POSITION, RATIO_HIGH_TAP_POSITION, RATIO_TAP_POSITION, RATIO_TARGET_DEADBAND -> { + case TARGET_V, RATIO_LOW_TAP_POSITION, RATIO_TAP_POSITION, RATIO_TARGET_DEADBAND -> { boolean isEditable = twoWindingsTransformer.getRatioTapChanger() != null; if (!isEditable) { equipmentsReport.add(ReportNode.newRootReportNode() @@ -71,7 +71,7 @@ public static boolean isEquipmentEditable(TwoWindingsTransformer twoWindingsTran } yield isEditable; } - case REGULATION_VALUE, PHASE_LOW_TAP_POSITION, PHASE_HIGH_TAP_POSITION, PHASE_TAP_POSITION, PHASE_TARGET_DEADBAND -> { + case REGULATION_VALUE, PHASE_LOW_TAP_POSITION, PHASE_TAP_POSITION, PHASE_TARGET_DEADBAND -> { boolean isEditable = twoWindingsTransformer.getPhaseTapChanger() != null; if (!isEditable) { equipmentsReport.add(ReportNode.newRootReportNode() @@ -84,6 +84,7 @@ public static boolean isEquipmentEditable(TwoWindingsTransformer twoWindingsTran } yield isEditable; } + case RATIO_HIGH_TAP_POSITION, PHASE_HIGH_TAP_POSITION -> false; default -> true; }; @@ -137,6 +138,8 @@ public static void setNewValue(TwoWindingsTransformer transformer, String twoWin PHASE_TARGET_DEADBAND -> setNewDoubleValue(transformer, field, newValue, errorMessage); case SELECTED_OPERATIONAL_LIMITS_GROUP_ID1, SELECTED_OPERATIONAL_LIMITS_GROUP_ID2 -> setNewStringValue(transformer, field, newValue, errorMessage); + case RATIO_HIGH_TAP_POSITION, PHASE_HIGH_TAP_POSITION -> + throw new IllegalArgumentException(String.format("field %s is not editable", field)); } } From 3e546828a3a387aad1fb95a9c5dc42826130253e Mon Sep 17 00:00:00 2001 From: Florent MILLOT <75525996+flomillot@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:07:40 +0100 Subject: [PATCH 3/6] Add tests for unmodifiable high tap position fields in transformers Integrate validation for RATIO_HIGH_TAP_POSITION and PHASE_HIGH_TAP_POSITION to ensure their values remain consistent and unmodified in assignment and formula modifications. Signed-off-by: Florent MILLOT <75525996+flomillot@users.noreply.github.com> --- ...ansformerModificationByAssignmentTest.java | 26 ++++++++++++++++--- ...sTransformerByFormulaModificationTest.java | 26 ++++++++++++++++--- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java b/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java index 3b45da28..7f4af680 100644 --- a/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java @@ -317,6 +317,20 @@ protected List> getAssignmentInfos() { .value("") .build(); + // High tap position is always equals to lowTapPosition + steps.size() - 1 and its modification is ignored + IntegerAssignmentInfos assignmentInfos20 = IntegerAssignmentInfos.builder() + .filters(List.of(filter1)) + .editedField(TwoWindingsTransformerField.RATIO_HIGH_TAP_POSITION.name()) + .value(10) + .build(); + + // High tap position is always equals to lowTapPosition + steps.size() - 1 and its modification is ignored + IntegerAssignmentInfos assignmentInfos21 = IntegerAssignmentInfos.builder() + .filters(List.of(filter3)) + .editedField(TwoWindingsTransformerField.PHASE_HIGH_TAP_POSITION.name()) + .value(10) + .build(); + List> infosList = super.getAssignmentInfos(); infosList.addAll(List.of(assignmentInfos1, assignmentInfos2, @@ -336,7 +350,9 @@ protected List> getAssignmentInfos() { assignmentInfos16, assignmentInfos17, assignmentInfos18, - assignmentInfos19)); + assignmentInfos19, + assignmentInfos20, + assignmentInfos21)); return infosList; } @@ -359,6 +375,7 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(2, ratioTapChanger1.getTargetV(), 0); assertEquals(4, ratioTapChanger1.getLowTapPosition()); assertEquals(8, ratioTapChanger1.getTapPosition()); + assertEquals(9, ratioTapChanger1.getHighTapPosition()); assertEquals(5, ratioTapChanger1.getTargetDeadband(), 0); assertEquals(20, twt1.getX(), 0); assertEquals(2.5, twt1.getB(), 0); @@ -378,6 +395,7 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(2, ratioTapChanger2.getTargetV(), 0); assertEquals(3, ratioTapChanger2.getLowTapPosition()); assertEquals(4, ratioTapChanger2.getTapPosition()); + assertEquals(8, ratioTapChanger2.getHighTapPosition()); assertEquals(5, ratioTapChanger2.getTargetDeadband(), 0); assertEquals(20, twt2.getX(), 0); assertEquals(2.5, twt2.getB(), 0); @@ -409,6 +427,7 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(2, phaseTapChanger4.getRegulationValue(), 0); assertEquals(2, phaseTapChanger4.getLowTapPosition()); assertEquals(3, phaseTapChanger4.getTapPosition()); + assertEquals(7, phaseTapChanger4.getHighTapPosition()); assertEquals(10, phaseTapChanger4.getTargetDeadband(), 0); assertEquals(2, twt4.getR(), 0); assertEquals(20, twt4.getX(), 0); @@ -422,9 +441,10 @@ protected void assertAfterNetworkModificationApplication() { TwoWindingsTransformer twt5 = getNetwork().getTwoWindingsTransformer(TWT_ID_5); PhaseTapChanger phaseTapChanger5 = twt5.getPhaseTapChanger(); - assertNotNull(phaseTapChanger4); + assertNotNull(phaseTapChanger5); assertEquals(2, phaseTapChanger5.getLowTapPosition()); assertEquals(2, phaseTapChanger5.getTapPosition()); + assertEquals(7, phaseTapChanger5.getHighTapPosition()); assertEquals(2, twt5.getR(), 0); assertEquals(2.5, twt5.getB(), 0); assertEquals(0.5, twt5.getRatedU2(), 0); @@ -433,7 +453,7 @@ protected void assertAfterNetworkModificationApplication() { TwoWindingsTransformer twt6 = getNetwork().getTwoWindingsTransformer(TWT_ID_6); PhaseTapChanger phaseTapChanger6 = twt6.getPhaseTapChanger(); - assertNotNull(phaseTapChanger4); + assertNotNull(phaseTapChanger6); assertEquals(2, phaseTapChanger6.getRegulationValue(), 0); assertEquals(10, phaseTapChanger6.getTargetDeadband(), 0); assertEquals(20, twt6.getX(), 0); diff --git a/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java index 651d0fe3..3b7e0277 100644 --- a/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java @@ -290,6 +290,20 @@ protected List getFormulaInfos() { ReferenceFieldOrValue.builder().value(200.).build(), ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.RATED_S.name()).build()); + // High tap position is always equals to lowTapPosition + steps.size() - 1 and its modification is ignored + FormulaInfos formulaInfos16 = getFormulaInfo(TwoWindingsTransformerField.RATIO_HIGH_TAP_POSITION.name(), + List.of(filter1), + Operator.ADDITION, + ReferenceFieldOrValue.builder().value(2.).build(), + ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.RATIO_TAP_POSITION.name()).build()); + + // High tap position is always equals to lowTapPosition + steps.size() - 1 and its modification is ignored + FormulaInfos formulaInfos17 = getFormulaInfo(TwoWindingsTransformerField.PHASE_HIGH_TAP_POSITION.name(), + List.of(filter3), + Operator.ADDITION, + ReferenceFieldOrValue.builder().value(2.).build(), + ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.PHASE_TAP_POSITION.name()).build()); + return List.of(formulaInfos1, formulaInfos2, formulaInfos3, @@ -304,7 +318,9 @@ protected List getFormulaInfos() { formulaInfos12, formulaInfos13, formulaInfos14, - formulaInfos15); + formulaInfos15, + formulaInfos16, + formulaInfos17); } @Override @@ -325,6 +341,7 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(100, ratioTapChanger1.getTargetV(), 0); assertEquals(1, ratioTapChanger1.getLowTapPosition()); assertEquals(5, ratioTapChanger1.getTapPosition()); + assertEquals(6, ratioTapChanger1.getHighTapPosition()); // unmodified assertEquals(11, ratioTapChanger1.getTargetDeadband(), 0); assertEquals(60, twt1.getX(), 0); assertEquals(150, twt1.getB(), 0); @@ -340,6 +357,7 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(106, ratioTapChanger2.getTargetV(), 0); assertEquals(3, ratioTapChanger2.getLowTapPosition()); assertEquals(4, ratioTapChanger2.getTapPosition()); + assertEquals(8, ratioTapChanger2.getHighTapPosition()); // unmodified assertEquals(11.6, ratioTapChanger2.getTargetDeadband(), 0); assertEquals(65, twt2.getX(), 0); assertEquals(162.5, twt2.getB(), 0); @@ -363,6 +381,7 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(90, phaseTapChanger4.getRegulationValue(), 0); assertEquals(2, phaseTapChanger4.getLowTapPosition()); assertEquals(5, phaseTapChanger4.getTapPosition()); + assertEquals(7, phaseTapChanger4.getHighTapPosition()); // unmodified assertEquals(24, phaseTapChanger4.getTargetDeadband(), 0); assertEquals(90, twt4.getR(), 0); assertEquals(75, twt4.getX(), 0); @@ -374,16 +393,17 @@ protected void assertAfterNetworkModificationApplication() { TwoWindingsTransformer twt5 = getNetwork().getTwoWindingsTransformer(TWT_ID_5); PhaseTapChanger phaseTapChanger5 = twt5.getPhaseTapChanger(); - assertNotNull(phaseTapChanger4); + assertNotNull(phaseTapChanger5); assertEquals(4, phaseTapChanger5.getLowTapPosition()); assertEquals(6, phaseTapChanger5.getTapPosition()); + assertEquals(9, phaseTapChanger5.getHighTapPosition()); // unmodified assertEquals(100, twt5.getR(), 0); assertEquals(200, twt5.getB(), 0); assertEquals(20, twt5.getRatedU2(), 0); TwoWindingsTransformer twt6 = getNetwork().getTwoWindingsTransformer(TWT_ID_6); PhaseTapChanger phaseTapChanger6 = twt6.getPhaseTapChanger(); - assertNotNull(phaseTapChanger4); + assertNotNull(phaseTapChanger6); assertEquals(94, phaseTapChanger6.getRegulationValue(), 0); assertEquals(26, phaseTapChanger6.getTargetDeadband(), 0); assertEquals(85, twt6.getX(), 0); From eb210689fa518d58b850fbbe139e45306d4007ff Mon Sep 17 00:00:00 2001 From: Florent MILLOT <75525996+flomillot@users.noreply.github.com> Date: Mon, 23 Feb 2026 17:17:13 +0100 Subject: [PATCH 4/6] Remove obsolete comments for unmodifiable high tap position fields in test assertions Signed-off-by: Florent MILLOT <75525996+flomillot@users.noreply.github.com> --- .../TwoWindingsTransformerByFormulaModificationTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java index 3b7e0277..602ea144 100644 --- a/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java @@ -341,7 +341,7 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(100, ratioTapChanger1.getTargetV(), 0); assertEquals(1, ratioTapChanger1.getLowTapPosition()); assertEquals(5, ratioTapChanger1.getTapPosition()); - assertEquals(6, ratioTapChanger1.getHighTapPosition()); // unmodified + assertEquals(6, ratioTapChanger1.getHighTapPosition()); assertEquals(11, ratioTapChanger1.getTargetDeadband(), 0); assertEquals(60, twt1.getX(), 0); assertEquals(150, twt1.getB(), 0); @@ -357,7 +357,7 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(106, ratioTapChanger2.getTargetV(), 0); assertEquals(3, ratioTapChanger2.getLowTapPosition()); assertEquals(4, ratioTapChanger2.getTapPosition()); - assertEquals(8, ratioTapChanger2.getHighTapPosition()); // unmodified + assertEquals(8, ratioTapChanger2.getHighTapPosition()); assertEquals(11.6, ratioTapChanger2.getTargetDeadband(), 0); assertEquals(65, twt2.getX(), 0); assertEquals(162.5, twt2.getB(), 0); @@ -381,7 +381,7 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(90, phaseTapChanger4.getRegulationValue(), 0); assertEquals(2, phaseTapChanger4.getLowTapPosition()); assertEquals(5, phaseTapChanger4.getTapPosition()); - assertEquals(7, phaseTapChanger4.getHighTapPosition()); // unmodified + assertEquals(7, phaseTapChanger4.getHighTapPosition()); assertEquals(24, phaseTapChanger4.getTargetDeadband(), 0); assertEquals(90, twt4.getR(), 0); assertEquals(75, twt4.getX(), 0); @@ -396,7 +396,7 @@ protected void assertAfterNetworkModificationApplication() { assertNotNull(phaseTapChanger5); assertEquals(4, phaseTapChanger5.getLowTapPosition()); assertEquals(6, phaseTapChanger5.getTapPosition()); - assertEquals(9, phaseTapChanger5.getHighTapPosition()); // unmodified + assertEquals(9, phaseTapChanger5.getHighTapPosition()); assertEquals(100, twt5.getR(), 0); assertEquals(200, twt5.getB(), 0); assertEquals(20, twt5.getRatedU2(), 0); From a56a9e4327daeb112016cf7129067f6b400252b0 Mon Sep 17 00:00:00 2001 From: Florent MILLOT <75525996+flomillot@users.noreply.github.com> Date: Wed, 25 Feb 2026 12:05:37 +0100 Subject: [PATCH 5/6] Add tests for validation and behavior of high tap position fields in transformers Enhance test coverage for RATIO_HIGH_TAP_POSITION and PHASE_HIGH_TAP_POSITION with new filters, formula modifications, and non-editable field validations in assignment tests. Signed-off-by: Florent MILLOT <75525996+flomillot@users.noreply.github.com> --- ...ansformerModificationByAssignmentTest.java | 28 ++++++++++++++++ ...sTransformerByFormulaModificationTest.java | 32 +++++++++++++++++-- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java b/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java index 7f4af680..18618e38 100644 --- a/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java @@ -6,6 +6,7 @@ */ package org.gridsuite.modification.modifications.byfilter.assignment; +import com.powsybl.commons.report.ReportNode; import com.powsybl.iidm.network.*; import com.powsybl.iidm.network.extensions.ConnectablePosition; import org.gridsuite.filter.utils.EquipmentType; @@ -19,6 +20,7 @@ import org.gridsuite.modification.dto.byfilter.equipmentfield.TwoWindingsTransformerField; import org.junit.jupiter.api.Test; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.UUID; @@ -118,6 +120,32 @@ void testModifyTwtWithWarning() throws Exception { assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_6).getRatioTapChanger()); } + @Test + void isEquipmentEditable_shouldBeFalseForHighTapPositions() { + TwoWindingsTransformer twtRatio = getNetwork().getTwoWindingsTransformer(TWT_ID_1); + TwoWindingsTransformer twtPhase = getNetwork().getTwoWindingsTransformer(TWT_ID_4); + + List equipReports = new ArrayList<>(); + boolean editableRatioHigh = TwoWindingsTransformerField.isEquipmentEditable(twtRatio, TwoWindingsTransformerField.RATIO_HIGH_TAP_POSITION.name(), equipReports); + boolean editablePhaseHigh = TwoWindingsTransformerField.isEquipmentEditable(twtPhase, TwoWindingsTransformerField.PHASE_HIGH_TAP_POSITION.name(), equipReports); + + assertFalse(editableRatioHigh); + assertFalse(editablePhaseHigh); + } + + @Test + void setNewValue_shouldThrowForNonEditableHighTapPositions() { + TwoWindingsTransformer twtRatio = getNetwork().getTwoWindingsTransformer(TWT_ID_1); + TwoWindingsTransformer twtPhase = getNetwork().getTwoWindingsTransformer(TWT_ID_4); + + assertThrows(IllegalArgumentException.class, () -> + TwoWindingsTransformerField.setNewValue(twtRatio, TwoWindingsTransformerField.RATIO_HIGH_TAP_POSITION.name(), "10") + ); + assertThrows(IllegalArgumentException.class, () -> + TwoWindingsTransformerField.setNewValue(twtPhase, TwoWindingsTransformerField.PHASE_HIGH_TAP_POSITION.name(), "10") + ); + } + @Override protected void createEquipments() { Substation s1 = getNetwork().getSubstation("s1"); diff --git a/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java index 602ea144..ed318c70 100644 --- a/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java @@ -17,6 +17,7 @@ import org.gridsuite.modification.dto.byfilter.formula.Operator; import org.gridsuite.modification.dto.byfilter.formula.ReferenceFieldOrValue; import org.junit.jupiter.api.Test; + import java.util.List; import java.util.Map; import java.util.UUID; @@ -195,7 +196,17 @@ protected Map getTestFilters() { new IdentifiableAttributes(TWT_ID_6, getIdentifiableType(), 7.0) )).build(); - return Map.of(FILTER_ID_1, filter1, FILTER_ID_2, filter2, FILTER_ID_3, filter3, FILTER_ID_4, filter4); + FilterEquipments filter5 = FilterEquipments.builder().filterId(FILTER_ID_5).identifiableAttributes(List.of( + new IdentifiableAttributes(TWT_ID_2, getIdentifiableType(), 2.0) + )).build(); + + FilterEquipments filter6 = FilterEquipments.builder().filterId(FILTER_ID_6).identifiableAttributes(List.of( + new IdentifiableAttributes(TWT_ID_6, getIdentifiableType(), 7.0) + )).build(); + + return Map.of(FILTER_ID_1, filter1, FILTER_ID_2, filter2, FILTER_ID_3, filter3, FILTER_ID_4, filter4, + FILTER_ID_5, filter5, FILTER_ID_6, filter6); + } @Override @@ -304,6 +315,18 @@ protected List getFormulaInfos() { ReferenceFieldOrValue.builder().value(2.).build(), ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.PHASE_TAP_POSITION.name()).build()); + FormulaInfos formulaInfos18 = getFormulaInfo(TwoWindingsTransformerField.RATIO_TAP_POSITION.name(), + List.of(filter5), + Operator.SUBTRACTION, + ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.RATIO_HIGH_TAP_POSITION.name()).build(), + ReferenceFieldOrValue.builder().value(2.).build()); + + FormulaInfos formulaInfos19 = getFormulaInfo(TwoWindingsTransformerField.PHASE_TAP_POSITION.name(), + List.of(filter6), + Operator.SUBTRACTION, + ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.PHASE_HIGH_TAP_POSITION.name()).build(), + ReferenceFieldOrValue.builder().value(2.).build()); + return List.of(formulaInfos1, formulaInfos2, formulaInfos3, @@ -320,7 +343,9 @@ protected List getFormulaInfos() { formulaInfos14, formulaInfos15, formulaInfos16, - formulaInfos17); + formulaInfos17, + formulaInfos18, + formulaInfos19); } @Override @@ -356,7 +381,7 @@ protected void assertAfterNetworkModificationApplication() { assertNotNull(ratioTapChanger2); assertEquals(106, ratioTapChanger2.getTargetV(), 0); assertEquals(3, ratioTapChanger2.getLowTapPosition()); - assertEquals(4, ratioTapChanger2.getTapPosition()); + assertEquals(6, ratioTapChanger2.getTapPosition()); assertEquals(8, ratioTapChanger2.getHighTapPosition()); assertEquals(11.6, ratioTapChanger2.getTargetDeadband(), 0); assertEquals(65, twt2.getX(), 0); @@ -404,6 +429,7 @@ protected void assertAfterNetworkModificationApplication() { TwoWindingsTransformer twt6 = getNetwork().getTwoWindingsTransformer(TWT_ID_6); PhaseTapChanger phaseTapChanger6 = twt6.getPhaseTapChanger(); assertNotNull(phaseTapChanger6); + assertEquals(4, phaseTapChanger6.getTapPosition()); assertEquals(94, phaseTapChanger6.getRegulationValue(), 0); assertEquals(26, phaseTapChanger6.getTargetDeadband(), 0); assertEquals(85, twt6.getX(), 0); From f2947b9fc175f125d0115075f98895bf67bcd8ed Mon Sep 17 00:00:00 2001 From: Florent MILLOT <75525996+flomillot@users.noreply.github.com> Date: Wed, 25 Feb 2026 12:09:26 +0100 Subject: [PATCH 6/6] Refactor test method names for consistency in TwoWindingsTransformerModificationByAssignmentTest Signed-off-by: Florent MILLOT <75525996+flomillot@users.noreply.github.com> --- .../TwoWindingsTransformerModificationByAssignmentTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java b/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java index 18618e38..628cfb2c 100644 --- a/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java @@ -121,7 +121,7 @@ void testModifyTwtWithWarning() throws Exception { } @Test - void isEquipmentEditable_shouldBeFalseForHighTapPositions() { + void isEquipmentEditableShouldBeFalseForHighTapPositions() { TwoWindingsTransformer twtRatio = getNetwork().getTwoWindingsTransformer(TWT_ID_1); TwoWindingsTransformer twtPhase = getNetwork().getTwoWindingsTransformer(TWT_ID_4); @@ -134,7 +134,7 @@ void isEquipmentEditable_shouldBeFalseForHighTapPositions() { } @Test - void setNewValue_shouldThrowForNonEditableHighTapPositions() { + void setNewValueShouldThrowForNonEditableHighTapPositions() { TwoWindingsTransformer twtRatio = getNetwork().getTwoWindingsTransformer(TWT_ID_1); TwoWindingsTransformer twtPhase = getNetwork().getTwoWindingsTransformer(TWT_ID_4);