From e139b01d902f0b391a8902c21fc08f222ad58dc9 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 25 Feb 2025 16:06:37 +0100 Subject: [PATCH 1/3] Adding validation for bdew load profile sources. --- CHANGELOG.md | 1 + src/main/resources/load/lpts_g5.csv | 2 +- .../ThermalValidationUtilsTest.groovy | 28 -- .../resources/load/BdewLoadProfileTest.groovy | 384 ++++++++++++++++++ 4 files changed, 386 insertions(+), 29 deletions(-) create mode 100644 src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy diff --git a/CHANGELOG.md b/CHANGELOG.md index 642923271..567f7d047 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Attribute `pThermalRated` for `ThermalStorage`s [#679](https://github.com/ie3-institute/PowerSystemDataModel/issues/679) - Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1253](https://github.com/ie3-institute/PowerSystemDataModel/issues/1253) - Added domestic hot water storage model [#1257](https://github.com/ie3-institute/PowerSystemDataModel/issues/1257) +- Validation for bdew load profile sources [#1243](https://github.com/ie3-institute/PowerSystemDataModel/issues/1243) ### Fixed - Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) diff --git a/src/main/resources/load/lpts_g5.csv b/src/main/resources/load/lpts_g5.csv index 5cdfc79bf..49b9d5cde 100644 --- a/src/main/resources/load/lpts_g5.csv +++ b/src/main/resources/load/lpts_g5.csv @@ -38,7 +38,7 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour 146.4,55.4,208.1,151.7,51.6,211.3,159.5,54.6,230.0,36 137.7,55.7,205.8,145.9,53.5,210.5,155.5,55.4,228.1,37 131.7,56.7,202.6,142.2,55.8,209.1,153.4,56.7,225.4,38 -128.0,58.4,198.5,13.09,58.4,206.5,151.1,58.4,221.7,39 +128.0,58.4,198.5,139.0,58.4,206.5,151.1,58.4,221.7,39 126.0,61.2,193.4,135.1,61.1,202.2,147.0,60.4,216.4,40 125.3,64.5,187.8,130.6,63.7,196.5,141.5,62.5,210.2,41 125.2,68.1,182.3,126.0,66.2,190.3,135.6,64.6,203.7,42 diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy index 76ccec889..7f30e8812 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy @@ -167,32 +167,4 @@ class ThermalValidationUtilsTest extends Specification { thermalHouse || expectedSize || expectedException new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", thermalHouse) } - - def "ThermalValidationUtils.check() works for complete ThermalGrid as well"() { - when: - def thermalBus = ThermalUnitInputTestData.thermalBus - def cylindricalStorageInput = [ - ThermalUnitInputTestData.cylindricalStorageInput - ] - def domesticHotWaterStorageInput = [ - ThermalUnitInputTestData.domesticHotWaterStorageInput - ] - - - ThermalGrid thermalGrid = new ThermalGrid(thermalBus, [thermalHouse], cylindricalStorageInput, domesticHotWaterStorageInput) - - - List> exceptions = ThermalValidationUtils.check(thermalGrid).stream().filter { it -> it.failure }.toList() - - then: - exceptions.size() == expectedSize - Exception ex = exceptions.get(0).exception.get() - ex.class == expectedException.class - ex.message == expectedException.message - - - where: - thermalHouse || expectedSize || expectedException - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, "house", 2) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", thermalHouse) - } } diff --git a/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy b/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy new file mode 100644 index 000000000..13c5607c1 --- /dev/null +++ b/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy @@ -0,0 +1,384 @@ +/* + * © 2025. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.resources.load + +import edu.ie3.datamodel.io.factory.timeseries.BdewLoadProfileFactory +import edu.ie3.datamodel.io.factory.timeseries.LoadProfileData +import edu.ie3.datamodel.io.naming.FileNamingStrategy +import edu.ie3.datamodel.io.source.csv.CsvDataSource +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile +import edu.ie3.datamodel.models.value.load.BdewLoadValues +import spock.lang.Shared +import spock.lang.Specification + +import java.nio.file.Path +import java.util.function.Function + +class BdewLoadProfileTest extends Specification { + + @Shared + private CsvDataSource source + + @Shared + private BdewLoadProfileFactory factory = new BdewLoadProfileFactory() + + def setupSpec() { + Path resourcePath = Path.of(".", "src", "main", "resources", "load") + source = new CsvDataSource(",", resourcePath, new FileNamingStrategy()) + } + + def "The bdew profile g0 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.G0) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 9994d + suSu == 6187.2d + suWd == 11784.4d + + trSa == 10434.2d + trSu == 6293.7d + trWd == 12239.9d + + wiSa == 10693.2d + wiSu == 6227.4d + wiWd == 12827.2d + } + + def "The bdew profile g1 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.G1) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 2613.7d + suSu == 2127.5d + suWd == 12499.4d + + trSa == 3048.3d + trSu == 1955.6d + trWd == 14523.8d + + wiSa == 3294.2d + wiSu == 2808.7d + wiWd == 17431.7d + } + + def "The bdew profile g2 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.G2) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 9221.1d + suSu == 7924.7d + suWd == 9954.1d + + trSa == 10706.3d + trSu == 8897.2d + trWd == 11272.5d + + wiSa == 12456d + wiSu == 10596 + wiWd == 12837.4d + } + + def "The bdew profile g3 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.G3) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 10834d + suSu == 9656 + suWd == 11544.3d + + trSa == 10544.1d + trSu == 9160.9d + trWd == 10978.1d + + wiSa == 10645.9d + wiSu == 9216.2d + wiWd == 11679.7d + } + + def "The bdew profile g4 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.G4) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 10513d + suSu == 6640.3d + suWd == 11968.2d + + trSa == 10120.5d + trSu == 6166.7d + trWd == 11947d + + wiSa == 10733.4d + wiSu == 6202.3d + wiWd == 12749.4d + } + + def "The bdew profile g5 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.G5) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 12107.1d + suSu == 5401d + suWd == 12042.8d + + trSa == 11861.1d + trSu == 5111d + trWd == 11969.3d + + wiSa == 12337.1d + wiSu == 5165.2d + wiWd == 12477.4d + } + + def "The bdew profile g6 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.G6) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 11793.6d + suSu == 12017.4d + suWd == 9053.4d + + trSa == 12718.5d + trSu == 13591.8d + trWd == 10111.4d + + wiSa == 13647.2d + wiSu == 13741.2d + wiWd == 10748.5d + } + + def "The bdew profile h0 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.H0) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 12132d + suSu == 11416d + suWd == 11255.9d + + trSa == 12054.9d + trSu == 11079.4d + trWd == 10783.3d + + wiSa == 11546d + wiSu == 10742d + wiWd == 10223.7d + } + + def "The bdew profile L0 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.L0) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 9536.1d + suSu == 10243d + suWd == 9985.2d + + trSa == 10662.1d + trSu == 11012.7d + trWd == 10929.7d + + wiSa == 11452.7d + wiSu == 12006.8d + wiWd == 11934.3d + } + + def "The bdew profile L1 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.L1) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 9320.5d + suSu == 10011.8d + suWd == 9963.3d + + trSa == 10484.5d + trSu == 10913.8d + trWd == 10874.8d + + wiSa == 11717.6d + wiSu == 12241.9d + wiWd == 12010d + } + + def "The bdew profile L2 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.L2) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 9645.7d + suSu == 10408.9d + suWd == 10090.1d + + trSa == 10652.4d + trSu == 10980.3d + trWd == 10927.8d + + wiSa == 11326.9d + wiSu == 11908.2d + wiWd == 11847.5d + } + + + // helper methods + + private List read(BdewStandardLoadProfile profile) { + source.getSourceData(Path.of("lpts_"+profile.key)).map { it -> factory.buildModel(new LoadProfileData<>(it, BdewLoadValues)).value }.toList() + } + + private static double sumValues(List values, Function extractor) { + values.stream().map { extractor.apply(it) }.mapToDouble { it.doubleValue() }.sum() + } +} From 8e6576254decf62cc68eda208b8ae5bc83fc417d Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 26 Feb 2025 09:28:04 +0100 Subject: [PATCH 2/3] Improving load profile value validation. --- CHANGELOG.md | 2 +- .../resources/load/BdewLoadProfileTest.groovy | 434 +++++++++--------- 2 files changed, 215 insertions(+), 221 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7e16c3a6..fc76df9e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Attribute `pThermalRated` for `ThermalStorage`s [#679](https://github.com/ie3-institute/PowerSystemDataModel/issues/679) - Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1253](https://github.com/ie3-institute/PowerSystemDataModel/issues/1253) - Added domestic hot water storage model [#1257](https://github.com/ie3-institute/PowerSystemDataModel/issues/1257) -- Validation for bdew load profile sources [#1243](https://github.com/ie3-institute/PowerSystemDataModel/issues/1243) +- Validation for BDEW load profile values [#1243](https://github.com/ie3-institute/PowerSystemDataModel/issues/1243) ### Fixed - Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) diff --git a/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy b/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy index 13c5607c1..46bd5cdae 100644 --- a/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy +++ b/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy @@ -11,10 +11,12 @@ import edu.ie3.datamodel.io.naming.FileNamingStrategy import edu.ie3.datamodel.io.source.csv.CsvDataSource import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.value.load.BdewLoadValues +import edu.ie3.util.TimeUtil import spock.lang.Shared import spock.lang.Specification import java.nio.file.Path +import java.time.ZonedDateTime import java.util.function.Function class BdewLoadProfileTest extends Specification { @@ -30,345 +32,337 @@ class BdewLoadProfileTest extends Specification { source = new CsvDataSource(",", resourcePath, new FileNamingStrategy()) } - def "The bdew profile g0 should be correct"() { + def "The BDEW profile G0 should be correct"() { given: def data = read(BdewStandardLoadProfile.G0) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) - - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 9994d - suSu == 6187.2d - suWd == 11784.4d + results["suSa"] == 9994.0 + results["suSu"] == 6187.2 + results["suWd"] == 11784.4 - trSa == 10434.2d - trSu == 6293.7d - trWd == 12239.9d + results["trSa"] == 10434.2 + results["trSu"] == 6293.7 + results["trWd"] == 12239.9 - wiSa == 10693.2d - wiSu == 6227.4d - wiWd == 12827.2d + results["wiSa"] == 10693.2 + results["wiSu"] == 6227.4 + results["wiWd"] == 12827.2 } - def "The bdew profile g1 should be correct"() { + def "The BDEW profile G1 should be correct"() { given: def data = read(BdewStandardLoadProfile.G1) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) - - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 2613.7d - suSu == 2127.5d - suWd == 12499.4d + results["suSa"] == 2613.7 + results["suSu"] == 2127.5 + results["suWd"] == 12499.4 - trSa == 3048.3d - trSu == 1955.6d - trWd == 14523.8d + results["trSa"] == 3048.3 + results["trSu"] == 1955.6 + results["trWd"] == 14523.8 - wiSa == 3294.2d - wiSu == 2808.7d - wiWd == 17431.7d + results["wiSa"] == 3294.2 + results["wiSu"] == 2808.7 + results["wiWd"] == 17431.7 } - def "The bdew profile g2 should be correct"() { + def "The BDEW profile G2 should be correct"() { given: def data = read(BdewStandardLoadProfile.G2) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) - - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 9221.1d - suSu == 7924.7d - suWd == 9954.1d + results["suSa"] == 9221.1 + results["suSu"] == 7924.7 + results["suWd"] == 9954.1 - trSa == 10706.3d - trSu == 8897.2d - trWd == 11272.5d + results["trSa"] == 10706.3 + results["trSu"] == 8897.2 + results["trWd"] == 11272.5 - wiSa == 12456d - wiSu == 10596 - wiWd == 12837.4d + results["wiSa"] == 12456 + results["wiSu"] == 10596.0 + results["wiWd"] == 12837.4 } - def "The bdew profile g3 should be correct"() { + def "The BDEW profile G3 should be correct"() { given: def data = read(BdewStandardLoadProfile.G3) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) - - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 10834d - suSu == 9656 - suWd == 11544.3d + results["suSa"] == 10834.0 + results["suSu"] == 9656.0 + results["suWd"] == 11544.3 - trSa == 10544.1d - trSu == 9160.9d - trWd == 10978.1d + results["trSa"] == 10544.1 + results["trSu"] == 9160.9 + results["trWd"] == 10978.1 - wiSa == 10645.9d - wiSu == 9216.2d - wiWd == 11679.7d + results["wiSa"] == 10645.9 + results["wiSu"] == 9216.2 + results["wiWd"] == 11679.7 } - def "The bdew profile g4 should be correct"() { + def "The BDEW profile G4 should be correct"() { given: def data = read(BdewStandardLoadProfile.G4) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) - - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 10513d - suSu == 6640.3d - suWd == 11968.2d + results["suSa"] == 10513.0 + results["suSu"] == 6640.3 + results["suWd"] == 11968.2 - trSa == 10120.5d - trSu == 6166.7d - trWd == 11947d + results["trSa"] == 10120.5 + results["trSu"] == 6166.7 + results["trWd"] == 11947 - wiSa == 10733.4d - wiSu == 6202.3d - wiWd == 12749.4d + results["wiSa"] == 10733.4 + results["wiSu"] == 6202.3 + results["wiWd"] == 12749.4 } - def "The bdew profile g5 should be correct"() { + def "The BDEW profile G5 should be correct"() { given: def data = read(BdewStandardLoadProfile.G5) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) - - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 12107.1d - suSu == 5401d - suWd == 12042.8d + results["suSa"] == 12107.1 + results["suSu"] == 5401.0 + results["suWd"] == 12042.8 - trSa == 11861.1d - trSu == 5111d - trWd == 11969.3d + results["trSa"] == 11861.1 + results["trSu"] == 5111.0 + results["trWd"] == 11969.3 - wiSa == 12337.1d - wiSu == 5165.2d - wiWd == 12477.4d + results["wiSa"] == 12337.1 + results["wiSu"] == 5165.2 + results["wiWd"] == 12477.4 } - def "The bdew profile g6 should be correct"() { + def "The BDEW profile G6 should be correct"() { given: def data = read(BdewStandardLoadProfile.G6) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) - - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 11793.6d - suSu == 12017.4d - suWd == 9053.4d + results["suSa"] == 11793.6 + results["suSu"] == 12017.4 + results["suWd"] == 9053.4 - trSa == 12718.5d - trSu == 13591.8d - trWd == 10111.4d + results["trSa"] == 12718.5 + results["trSu"] == 13591.8 + results["trWd"] == 10111.4 - wiSa == 13647.2d - wiSu == 13741.2d - wiWd == 10748.5d + results["wiSa"] == 13647.2 + results["wiSu"] == 13741.2 + results["wiWd"] == 10748.5 } - def "The bdew profile h0 should be correct"() { + def "The BDEW profile H0 should be correct"() { given: def data = read(BdewStandardLoadProfile.H0) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) - - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 12132d - suSu == 11416d - suWd == 11255.9d + results["suSa"] == 12132.0 + results["suSu"] == 11416.0 + results["suWd"] == 11255.9 - trSa == 12054.9d - trSu == 11079.4d - trWd == 10783.3d + results["trSa"] == 12054.9 + results["trSu"] == 11079.4 + results["trWd"] == 10783.3 - wiSa == 11546d - wiSu == 10742d - wiWd == 10223.7d + results["wiSa"] == 11546.0 + results["wiSu"] == 10742.0 + results["wiWd"] == 10223.7 } - def "The bdew profile L0 should be correct"() { + def "The BDEW dynamization function for the profile H= should work as expected"() { + when: + def dynamizedValue = BdewLoadValues.dynamization(value, dayOfTheYear) + + then: + dynamizedValue == expectedValue + + where: + dayOfTheYear | value | expectedValue + 153 | 89.8d | 76.3d // suSa, time: 00:15 + 262 | 47.9d | 42.1d // trWd, time: 01:45 + 343 | 146.8d | 174.5d // wiSu, time: 18:15 + } + + def "The BDEW profile L0 should be correct"() { given: def data = read(BdewStandardLoadProfile.L0) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) - - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 9536.1d - suSu == 10243d - suWd == 9985.2d + results["suSa"] == 9536.1 + results["suSu"] == 10243.0 + results["suWd"] == 9985.2 - trSa == 10662.1d - trSu == 11012.7d - trWd == 10929.7d + results["trSa"] == 10662.1 + results["trSu"] == 11012.7 + results["trWd"] == 10929.7 - wiSa == 11452.7d - wiSu == 12006.8d - wiWd == 11934.3d + results["wiSa"] == 11452.7 + results["wiSu"] == 12006.8 + results["wiWd"] == 11934.3 } - def "The bdew profile L1 should be correct"() { + def "The BDEW profile L1 should be correct"() { given: def data = read(BdewStandardLoadProfile.L1) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) - - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 9320.5d - suSu == 10011.8d - suWd == 9963.3d + results["suSa"] == 9320.5 + results["suSu"] == 10011.8 + results["suWd"] == 9963.3 - trSa == 10484.5d - trSu == 10913.8d - trWd == 10874.8d + results["trSa"] == 10484.5 + results["trSu"] == 10913.8 + results["trWd"] == 10874.8 - wiSa == 11717.6d - wiSu == 12241.9d - wiWd == 12010d + results["wiSa"] == 11717.6 + results["wiSu"] == 12241.9 + results["wiWd"] == 12010.0 } - def "The bdew profile L2 should be correct"() { + def "The BDEW profile L2 should be correct"() { given: def data = read(BdewStandardLoadProfile.L2) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) - - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 9645.7d - suSu == 10408.9d - suWd == 10090.1d + results["suSa"] == 9645.7 + results["suSu"] == 10408.9 + results["suWd"] == 10090.1 - trSa == 10652.4d - trSu == 10980.3d - trWd == 10927.8d + results["trSa"] == 10652.4 + results["trSu"] == 10980.3 + results["trWd"] == 10927.8 - wiSa == 11326.9d - wiSu == 11908.2d - wiWd == 11847.5d + results["wiSa"] == 11326.9 + results["wiSu"] == 11908.2 + results["wiWd"] == 11847.5 } From af93e82d60551e402159fd36e30af65053b445c5 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 26 Feb 2025 10:20:23 +0100 Subject: [PATCH 3/3] Refactoring `BdewLoadProfileTest`. --- .../resources/load/BdewLoadProfileTest.groovy | 43 +++---------------- 1 file changed, 7 insertions(+), 36 deletions(-) diff --git a/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy b/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy index 46bd5cdae..fdbffc4d3 100644 --- a/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy +++ b/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy @@ -11,12 +11,10 @@ import edu.ie3.datamodel.io.naming.FileNamingStrategy import edu.ie3.datamodel.io.source.csv.CsvDataSource import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.value.load.BdewLoadValues -import edu.ie3.util.TimeUtil import spock.lang.Shared import spock.lang.Specification import java.nio.file.Path -import java.time.ZonedDateTime import java.util.function.Function class BdewLoadProfileTest extends Specification { @@ -27,6 +25,12 @@ class BdewLoadProfileTest extends Specification { @Shared private BdewLoadProfileFactory factory = new BdewLoadProfileFactory() + @Shared + private List keys = ['su', 'tr', 'wi'] + + @Shared + private Map results = [:] + def setupSpec() { Path resourcePath = Path.of(".", "src", "main", "resources", "load") source = new CsvDataSource(",", resourcePath, new FileNamingStrategy()) @@ -37,9 +41,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.G0) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -66,9 +67,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.G1) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -95,9 +93,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.G2) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -124,9 +119,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.G3) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -153,9 +145,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.G4) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -182,9 +171,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.G5) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -211,9 +197,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.G6) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -240,9 +223,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.H0) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -264,7 +244,7 @@ class BdewLoadProfileTest extends Specification { results["wiWd"] == 10223.7 } - def "The BDEW dynamization function for the profile H= should work as expected"() { + def "The BDEW dynamization function for the profile H0 should work as expected"() { when: def dynamizedValue = BdewLoadValues.dynamization(value, dayOfTheYear) @@ -283,9 +263,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.L0) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -312,9 +289,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.L1) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -341,9 +315,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.L2) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa")