From 44494c1d72c098b276cf35b4e6ea137f4b4e2dda Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 4 Jul 2025 12:51:27 +0200 Subject: [PATCH 1/3] Fixed valid fields for `EmInput` --- CHANGELOG.md | 3 +- .../input/AssetInputEntityFactory.java | 26 ++++++- .../io/factory/input/EmInputFactory.java | 19 +---- .../input/AssetInputEntityFactoryTest.groovy | 6 +- .../factory/input/EmInputFactoryTest.groovy | 73 +++++++++++++++++++ .../FixedFeedInInputFactoryTest.groovy | 16 +++- 6 files changed, 117 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7593a97d..a176bc37f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fixed handling of `CongestionResult.InputModelType` in `EntityProcessor` [#1325](https://github.com/ie3-institute/PowerSystemDataModel/issues/1325) -- -Fixed em fields in input models [#1331](https://github.com/ie3-institute/PowerSystemDataModel/issues/1331) +- Fixed em fields in input models [#1331](https://github.com/ie3-institute/PowerSystemDataModel/issues/1331) +- Fixed valid fields for `EmInput` [#1360](https://github.com/ie3-institute/PowerSystemDataModel/issues/1360) ### Changed - Updated dependabot workflow and added CODEOWNERS [#1328](https://github.com/ie3-institute/PowerSystemDataModel/issues/1328) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactory.java index b9a104137..9670eca99 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactory.java @@ -24,8 +24,9 @@ public abstract class AssetInputEntityFactory extends UniqueEntityFactory { - private static final String OPERATES_FROM = "operatesFrom"; - private static final String OPERATES_UNTIL = "operatesUntil"; + protected static final String OPERATOR = "operator"; + protected static final String OPERATES_FROM = "operatesFrom"; + protected static final String OPERATES_UNTIL = "operatesUntil"; @SafeVarargs protected AssetInputEntityFactory(Class... allowedClasses) { @@ -48,14 +49,33 @@ protected List> getFields(Class entityClass) { Set constructorParamsUntil = expandSet(constructorParamsMin, OPERATES_UNTIL); Set constructorParamsBoth = expandSet(constructorParamsFrom, OPERATES_UNTIL); + // with operator field + Set constructorParamsOperator = expandSet(constructorParamsMin, OPERATOR); + Set constructorParamsOperatorFrom = expandSet(constructorParamsFrom, OPERATOR); + Set constructorParamsOperatorUntil = expandSet(constructorParamsUntil, OPERATOR); + Set constructorParamsOperatorBoth = expandSet(constructorParamsBoth, OPERATOR); + final String[] additionalFields = getAdditionalFields(); constructorParamsMin = expandSet(constructorParamsMin, additionalFields); constructorParamsFrom = expandSet(constructorParamsFrom, additionalFields); constructorParamsUntil = expandSet(constructorParamsUntil, additionalFields); constructorParamsBoth = expandSet(constructorParamsBoth, additionalFields); + + constructorParamsOperator = expandSet(constructorParamsOperator, additionalFields); + constructorParamsOperatorFrom = expandSet(constructorParamsOperatorFrom, additionalFields); + constructorParamsOperatorUntil = expandSet(constructorParamsOperatorUntil, additionalFields); + constructorParamsOperatorBoth = expandSet(constructorParamsOperatorBoth, additionalFields); + return Arrays.asList( - constructorParamsMin, constructorParamsFrom, constructorParamsUntil, constructorParamsBoth); + constructorParamsMin, + constructorParamsFrom, + constructorParamsUntil, + constructorParamsBoth, + constructorParamsOperator, + constructorParamsOperatorFrom, + constructorParamsOperatorUntil, + constructorParamsOperatorBoth); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/EmInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/EmInputFactory.java index 4e2535f70..85e15822d 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/EmInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/EmInputFactory.java @@ -8,10 +8,7 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.OperatorInput; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.UUID; +import java.util.*; public class EmInputFactory extends AssetInputEntityFactory { @@ -23,21 +20,9 @@ public EmInputFactory() { super(EmInput.class); } - @Override - protected List> getFields(Class entityClass) { - List> fields = new ArrayList<>(super.getFields(entityClass)); - - List> withEm = - fields.stream().map(f -> (Set) expandSet(f, CONTROLLING_EM)).toList(); - - fields.addAll(withEm); - - return fields; - } - @Override protected String[] getAdditionalFields() { - return new String[] {CONTROL_STRATEGY}; + return new String[] {CONTROL_STRATEGY, CONTROLLING_EM}; } @Override diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactoryTest.groovy index f6fa90645..a468dfc4e 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactoryTest.groovy @@ -289,7 +289,11 @@ class AssetInputEntityFactoryTest extends Specification implements FactoryTestHe "0: [id, uuid] or [id, uuid]\n" + "1: [id, operatesFrom, uuid] or [id, operates_from, uuid]\n" + "2: [id, operatesUntil, uuid] or [id, operates_until, uuid]\n" + - "3: [id, operatesFrom, operatesUntil, uuid] or [id, operates_from, operates_until, uuid]\n" + "3: [id, operatesFrom, operatesUntil, uuid] or [id, operates_from, operates_until, uuid]\n" + + "4: [id, operator, uuid] or [id, operator, uuid]\n" + + "5: [id, operatesFrom, operator, uuid] or [id, operates_from, operator, uuid]\n" + + "6: [id, operatesUntil, operator, uuid] or [id, operates_until, operator, uuid]\n" + + "7: [id, operatesFrom, operatesUntil, operator, uuid] or [id, operates_from, operates_until, operator, uuid]\n" } private static class TestAssetInput extends AssetInput { diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy index 113fc739e..1c302161d 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy @@ -24,6 +24,79 @@ class EmInputFactoryTest extends Specification { inputFactory.supportedClasses == expectedClasses } + def "An EmInputFactory should return the valid fields correctly"() { + given: + def inputFactory = new EmInputFactory() + def validCombinations = [ + [ + "uuid", + "id", + "controlStrategy", + "controllingEm" + ] as Set, + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operatesFrom" + ] as Set, + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operatesUntil" + ] as Set, + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operatesFrom", + "operatesUntil" + ] as Set, + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operator" + ] as Set, + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operator", + "operatesFrom" + ] as Set, + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operator", + "operatesUntil" + ] as Set, + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operator", + "operatesFrom", + "operatesUntil" + ] as Set, + ] + + when: + def fieldCombinations = inputFactory.getFields(EmInput) + + then: + fieldCombinations == validCombinations + } + def "A EmInputFactory should parse a valid EmInput with parent EM correctly"() { given: def inputFactory = new EmInputFactory() diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactoryTest.groovy index f43e60e6e..3f4eeb84a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactoryTest.groovy @@ -92,9 +92,17 @@ class FixedFeedInInputFactoryTest extends Specification implements FactoryTestHe "1: [cosPhiRated, id, operatesFrom, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operates_from, q_characteristics, s_rated, uuid]\n" + "2: [cosPhiRated, id, operatesUntil, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operates_until, q_characteristics, s_rated, uuid]\n" + "3: [cosPhiRated, id, operatesFrom, operatesUntil, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operates_from, operates_until, q_characteristics, s_rated, uuid]\n" + - "4: [controllingEm, cosPhiRated, id, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, q_characteristics, s_rated, uuid]\n" + - "5: [controllingEm, cosPhiRated, id, operatesFrom, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_from, q_characteristics, s_rated, uuid]\n" + - "6: [controllingEm, cosPhiRated, id, operatesUntil, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_until, q_characteristics, s_rated, uuid]\n" + - "7: [controllingEm, cosPhiRated, id, operatesFrom, operatesUntil, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_from, operates_until, q_characteristics, s_rated, uuid]\n" + "4: [cosPhiRated, id, operator, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operator, q_characteristics, s_rated, uuid]\n" + + "5: [cosPhiRated, id, operatesFrom, operator, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operates_from, operator, q_characteristics, s_rated, uuid]\n" + + "6: [cosPhiRated, id, operatesUntil, operator, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operates_until, operator, q_characteristics, s_rated, uuid]\n" + + "7: [cosPhiRated, id, operatesFrom, operatesUntil, operator, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operates_from, operates_until, operator, q_characteristics, s_rated, uuid]\n" + + "8: [controllingEm, cosPhiRated, id, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, q_characteristics, s_rated, uuid]\n" + + "9: [controllingEm, cosPhiRated, id, operatesFrom, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_from, q_characteristics, s_rated, uuid]\n" + + "10: [controllingEm, cosPhiRated, id, operatesUntil, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_until, q_characteristics, s_rated, uuid]\n" + + "11: [controllingEm, cosPhiRated, id, operatesFrom, operatesUntil, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_from, operates_until, q_characteristics, s_rated, uuid]\n" + + "12: [controllingEm, cosPhiRated, id, operator, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operator, q_characteristics, s_rated, uuid]\n" + + "13: [controllingEm, cosPhiRated, id, operatesFrom, operator, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_from, operator, q_characteristics, s_rated, uuid]\n" + + "14: [controllingEm, cosPhiRated, id, operatesUntil, operator, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_until, operator, q_characteristics, s_rated, uuid]\n" + + "15: [controllingEm, cosPhiRated, id, operatesFrom, operatesUntil, operator, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_from, operates_until, operator, q_characteristics, s_rated, uuid]\n" } } From 48fb0ba7bcf02126b800afe27ff2fc7dbbf0db2d Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 7 Jul 2025 11:47:40 +0200 Subject: [PATCH 2/3] Improving test. --- .../factory/input/EmInputFactoryTest.groovy | 86 +++++++------------ 1 file changed, 30 insertions(+), 56 deletions(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy index 1c302161d..9a10787e3 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy @@ -12,6 +12,7 @@ import edu.ie3.datamodel.utils.Try import spock.lang.Specification import java.time.ZonedDateTime +import java.util.stream.Collectors class EmInputFactoryTest extends Specification { @@ -27,67 +28,40 @@ class EmInputFactoryTest extends Specification { def "An EmInputFactory should return the valid fields correctly"() { given: def inputFactory = new EmInputFactory() - def validCombinations = [ - [ - "uuid", - "id", - "controlStrategy", - "controllingEm" - ] as Set, - [ - "uuid", - "id", - "controlStrategy", - "controllingEm", - "operatesFrom" - ] as Set, - [ - "uuid", - "id", - "controlStrategy", - "controllingEm", - "operatesUntil" - ] as Set, + + def requiredFields = [ + "uuid", + "id", + "controlStrategy", + "controllingEm" + ] as Set + + def operationCombinations = [ + ["operatesFrom"], + ["operatesUntil"], [ - "uuid", - "id", - "controlStrategy", - "controllingEm", "operatesFrom", "operatesUntil" - ] as Set, - [ - "uuid", - "id", - "controlStrategy", - "controllingEm", - "operator" - ] as Set, + ], + ["operator"], + ["operatesFrom", "operator"], + ["operatesUntil", "operator"], [ - "uuid", - "id", - "controlStrategy", - "controllingEm", - "operator", - "operatesFrom" - ] as Set, - [ - "uuid", - "id", - "controlStrategy", - "controllingEm", - "operator", - "operatesUntil" - ] as Set, - [ - "uuid", - "id", - "controlStrategy", - "controllingEm", - "operator", "operatesFrom", - "operatesUntil" - ] as Set, + "operatesUntil", + "operator" + ] + ] + + def validCombinations = [ + requiredFields, + requiredFields + operationCombinations.get(0), + requiredFields + operationCombinations.get(1), + requiredFields + operationCombinations.get(2), + requiredFields + operationCombinations.get(3), + requiredFields + operationCombinations.get(4), + requiredFields + operationCombinations.get(5), + requiredFields + operationCombinations.get(6), ] when: From d8451f5583205f484bfc2ea0c6a5b7ab6fcf67f9 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Tue, 8 Jul 2025 19:31:54 +0200 Subject: [PATCH 3/3] proposal for testing fields of EmInputFactory --- .../factory/input/EmInputFactoryTest.groovy | 83 ++++++++++++------- 1 file changed, 55 insertions(+), 28 deletions(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy index 9a10787e3..5cc32ca9d 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy @@ -28,41 +28,68 @@ class EmInputFactoryTest extends Specification { def "An EmInputFactory should return the valid fields correctly"() { given: def inputFactory = new EmInputFactory() - - def requiredFields = [ - "uuid", - "id", - "controlStrategy", - "controllingEm" - ] as Set - - def operationCombinations = [ - ["operatesFrom"], - ["operatesUntil"], + def validCombinations = [ [ - "operatesFrom", + "uuid", + "id", + "controlStrategy", + "controllingEm" + ], + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operatesFrom" + ], + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", "operatesUntil" ], - ["operator"], - ["operatesFrom", "operator"], - ["operatesUntil", "operator"], [ + "uuid", + "id", + "controlStrategy", + "controllingEm", "operatesFrom", - "operatesUntil", + "operatesUntil" + ], + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", "operator" + ], + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operator", + "operatesFrom" + ], + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operator", + "operatesUntil" + ], + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operator", + "operatesFrom", + "operatesUntil" ] - ] - - def validCombinations = [ - requiredFields, - requiredFields + operationCombinations.get(0), - requiredFields + operationCombinations.get(1), - requiredFields + operationCombinations.get(2), - requiredFields + operationCombinations.get(3), - requiredFields + operationCombinations.get(4), - requiredFields + operationCombinations.get(5), - requiredFields + operationCombinations.get(6), - ] + ].collect { it as Set } when: def fieldCombinations = inputFactory.getFields(EmInput)