From d0db95a4ed133469470ce88f915043865d00b846 Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Mon, 3 Aug 2026 13:24:32 +0200 Subject: [PATCH 01/18] AER-4568 Fix import - Fix import by not requiring adblue for U-method --- .../nl/overheid/aerius/validation/OffRoadValidator.java | 6 +++++- .../overheid/aerius/validation/OffRoadValidatorTest.java | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java index 649a291e..84a376c3 100644 --- a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java +++ b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java @@ -120,7 +120,7 @@ private boolean validateOffRoadOperatingHours(final StandardOffRoadMobileSource private boolean validateOffRoadLiterAdBlue(final StandardOffRoadMobileSource subSource) { boolean valid = true; - if (validationHelper.expectsLiterAdBluePerYear(subSource.getOffRoadMobileSourceCode())) { + if (validationHelper.expectsLiterAdBluePerYear(subSource.getOffRoadMobileSourceCode()) && !usesUMethod(subSource)) { if (subSource.getLiterAdBluePerYear() == null) { getErrors().add(new AeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_LITER_ADBLUE, subSource.getDescription())); valid = false; @@ -133,6 +133,10 @@ private boolean validateOffRoadLiterAdBlue(final StandardOffRoadMobileSource sub return valid; } + private boolean usesUMethod(final StandardOffRoadMobileSource subSource) { + return subSource.getPower() != null && subSource.getPower() > 0; + } + private void validateAdBlueFuelRatio(final StandardOffRoadMobileSource subSource) { final OptionalDouble maxRatio = validationHelper.getMaxAdBlueFuelRatio(subSource.getOffRoadMobileSourceCode()); if (maxRatio.isPresent()) { diff --git a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java index 43fda4da..5366989e 100644 --- a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java +++ b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java @@ -204,6 +204,15 @@ void testSubSourceTooMuchLiterAdBlue() { warnings.get(0)); } + @Test + void testValidUMethodSubSourceShouldNotRequireAdBlue() { + when(validationHelper.getPowerRange(any())).thenReturn(Optional.of(IntRangeUtil.valueOf("[67,420]"))); + final OffRoadMobileEmissionSource source = createSource(200, null, 1_337, null); + + mockCategory(MockCategory.POWER, MockCategory.HOURS, MockCategory.ADBLUE); + assertNoErrorsOrWarnings(source); + } + private static OffRoadMobileEmissionSource createSource(final Integer power, final Integer fuel, final Integer hours, final Integer adBlue) { final OffRoadMobileEmissionSource source = new OffRoadMobileEmissionSource(); final StandardOffRoadMobileSource subSource = new StandardOffRoadMobileSource(); From 93b3dad8d438ea53de56a56225a832746b727665 Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Mon, 3 Aug 2026 14:05:17 +0200 Subject: [PATCH 02/18] - Split "validateOffRoadLiterAdBlue()" into "validateAUBMethod()" and "validateUMethod()" --- .../aerius/validation/OffRoadValidator.java | 54 ++++++++++--------- .../validation/OffRoadValidatorTest.java | 4 +- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java index 84a376c3..91b1009c 100644 --- a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java +++ b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java @@ -65,30 +65,46 @@ private boolean validateStandardOffRoad(final StandardOffRoadMobileSource subSou private boolean validateOffRoadProperties(final StandardOffRoadMobileSource subSource) { // Combine all validations in separate statements to make sure each validation is run to collect all validation warnings/errors. - boolean valid = validatePowerOrLiterFuel(subSource); + final boolean usesUMethod = subSource.getPower() != null && subSource.getPower() > 0; + boolean valid = usesUMethod ? validateUMethod(subSource) : validateAUBMethod(subSource); valid = validateOffRoadPowerRange(subSource) && valid; valid = validateOffRoadOperatingHours(subSource) && valid; - return validateOffRoadLiterAdBlue(subSource) && valid; + validateOffRoadLiterAdBlue(subSource); + return valid; + } + + private boolean validateUMethod(final StandardOffRoadMobileSource subSource) { + boolean valid = true; + final String code = subSource.getOffRoadMobileSourceCode(); + if (!validationHelper.expectsPower(code)) { + getErrors().add(new AeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, subSource.getDescription())); + valid = false; + } + // Fuel and AdBlue belong to the AUB method and are not used when the U-method (power) is applied. + subSource.setLiterFuelPerYear(null); + subSource.setLiterAdBluePerYear(null); + return valid; } - private boolean validatePowerOrLiterFuel(final StandardOffRoadMobileSource subSource) { + private boolean validateAUBMethod(final StandardOffRoadMobileSource subSource) { boolean valid = true; final String code = subSource.getOffRoadMobileSourceCode(); final boolean expectsPower = validationHelper.expectsPower(code); final boolean expectsFuel = validationHelper.expectsLiterFuelPerYear(code); - final boolean noPowerButExpected = expectsPower && subSource.getPower() == null; - final boolean noFuelButExpected = expectsFuel && subSource.getLiterFuelPerYear() == null; - if ((noPowerButExpected && noFuelButExpected) || (noPowerButExpected && !expectsFuel) || (noFuelButExpected && !expectsPower)) { + subSource.setPower(null); + // No power supplied: fail when fuel is required but missing, or the category only supports the U-method. + if ((expectsFuel && subSource.getLiterFuelPerYear() == null) || (expectsPower && !expectsFuel)) { getErrors().add(new AeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, subSource.getDescription())); valid = false; } - if (!expectsPower) { - subSource.setPower(null); - } if (!expectsFuel) { subSource.setLiterFuelPerYear(null); } + if (validationHelper.expectsLiterAdBluePerYear(code) && subSource.getLiterAdBluePerYear() == null) { + getErrors().add(new AeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_LITER_ADBLUE, subSource.getDescription())); + valid = false; + } return valid; } @@ -118,23 +134,13 @@ private boolean validateOffRoadOperatingHours(final StandardOffRoadMobileSource return valid; } - private boolean validateOffRoadLiterAdBlue(final StandardOffRoadMobileSource subSource) { - boolean valid = true; - if (validationHelper.expectsLiterAdBluePerYear(subSource.getOffRoadMobileSourceCode()) && !usesUMethod(subSource)) { - if (subSource.getLiterAdBluePerYear() == null) { - getErrors().add(new AeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_LITER_ADBLUE, subSource.getDescription())); - valid = false; - } else if (subSource.getLiterFuelPerYear() != null) { - validateAdBlueFuelRatio(subSource); - } - } else if (subSource.getLiterAdBluePerYear() != null && subSource.getLiterAdBluePerYear() == 0) { + private void validateOffRoadLiterAdBlue(final StandardOffRoadMobileSource subSource) { + if (subSource.getLiterAdBluePerYear() != null && subSource.getLiterAdBluePerYear() == 0) { subSource.setLiterAdBluePerYear(null); + } else if (subSource.getLiterAdBluePerYear() != null && subSource.getLiterFuelPerYear() != null + && validationHelper.expectsLiterAdBluePerYear(subSource.getOffRoadMobileSourceCode())) { + validateAdBlueFuelRatio(subSource); } - return valid; - } - - private boolean usesUMethod(final StandardOffRoadMobileSource subSource) { - return subSource.getPower() != null && subSource.getPower() > 0; } private void validateAdBlueFuelRatio(final StandardOffRoadMobileSource subSource) { diff --git a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java index 5366989e..1be7bc49 100644 --- a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java +++ b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java @@ -232,9 +232,9 @@ private void mockCategory(final MockCategory... mockCategories) { final Set mockCategoriesSet = Set.of(mockCategories); when(validationHelper.isValidOffRoadMobileSourceCode(CODE)).thenReturn(true); when(validationHelper.expectsPower(CODE)).thenReturn(mockCategoriesSet.contains(MockCategory.POWER)); - when(validationHelper.expectsLiterFuelPerYear(CODE)).thenReturn(mockCategoriesSet.contains(MockCategory.FUEL)); when(validationHelper.expectsOperatingHoursPerYear(CODE)).thenReturn(mockCategoriesSet.contains(MockCategory.HOURS)); - when(validationHelper.expectsLiterAdBluePerYear(CODE)).thenReturn(mockCategoriesSet.contains(MockCategory.ADBLUE)); + lenient().when(validationHelper.expectsLiterFuelPerYear(CODE)).thenReturn(mockCategoriesSet.contains(MockCategory.FUEL)); + lenient().when(validationHelper.expectsLiterAdBluePerYear(CODE)).thenReturn(mockCategoriesSet.contains(MockCategory.ADBLUE)); lenient().when(validationHelper.getMaxAdBlueFuelRatio(CODE)).thenReturn(OptionalDouble.of(0.07)); } From e38a052131ffcec967b5e3a578375791bb17ebbd Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Mon, 3 Aug 2026 14:13:02 +0200 Subject: [PATCH 03/18] - Small tweaks --- .../nl/overheid/aerius/validation/OffRoadValidator.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java index 91b1009c..ec20fb3a 100644 --- a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java +++ b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java @@ -80,7 +80,7 @@ private boolean validateUMethod(final StandardOffRoadMobileSource subSource) { getErrors().add(new AeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, subSource.getDescription())); valid = false; } - // Fuel and AdBlue belong to the AUB method and are not used when the U-method (power) is applied. + // Unused in U-method; Set to null subSource.setLiterFuelPerYear(null); subSource.setLiterAdBluePerYear(null); return valid; @@ -92,8 +92,6 @@ private boolean validateAUBMethod(final StandardOffRoadMobileSource subSource) { final boolean expectsPower = validationHelper.expectsPower(code); final boolean expectsFuel = validationHelper.expectsLiterFuelPerYear(code); - subSource.setPower(null); - // No power supplied: fail when fuel is required but missing, or the category only supports the U-method. if ((expectsFuel && subSource.getLiterFuelPerYear() == null) || (expectsPower && !expectsFuel)) { getErrors().add(new AeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, subSource.getDescription())); valid = false; @@ -105,6 +103,8 @@ private boolean validateAUBMethod(final StandardOffRoadMobileSource subSource) { getErrors().add(new AeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_LITER_ADBLUE, subSource.getDescription())); valid = false; } + // Fallback if custom GML is passed with power = 0 + subSource.setPower(null); return valid; } From fa45fe0bb8aae4aebe91dab34ef510907092f616 Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Mon, 3 Aug 2026 14:48:40 +0200 Subject: [PATCH 04/18] - Add explanation comment --- .../java/nl/overheid/aerius/validation/OffRoadValidator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java index ec20fb3a..83e85a01 100644 --- a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java +++ b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java @@ -135,6 +135,7 @@ private boolean validateOffRoadOperatingHours(final StandardOffRoadMobileSource } private void validateOffRoadLiterAdBlue(final StandardOffRoadMobileSource subSource) { + // No need for null check, as validateAUBMethod() handles that if required if (subSource.getLiterAdBluePerYear() != null && subSource.getLiterAdBluePerYear() == 0) { subSource.setLiterAdBluePerYear(null); } else if (subSource.getLiterAdBluePerYear() != null && subSource.getLiterFuelPerYear() != null From ee76361a672f5c8486018fa15a334610d70b01a9 Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Mon, 3 Aug 2026 14:56:26 +0200 Subject: [PATCH 05/18] - Renamed to "PowerBased" and "FuelBased" --- .../overheid/aerius/validation/OffRoadValidator.java | 10 +++++----- .../aerius/validation/OffRoadValidatorTest.java | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java index 83e85a01..73f4530c 100644 --- a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java +++ b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java @@ -66,27 +66,27 @@ private boolean validateStandardOffRoad(final StandardOffRoadMobileSource subSou private boolean validateOffRoadProperties(final StandardOffRoadMobileSource subSource) { // Combine all validations in separate statements to make sure each validation is run to collect all validation warnings/errors. final boolean usesUMethod = subSource.getPower() != null && subSource.getPower() > 0; - boolean valid = usesUMethod ? validateUMethod(subSource) : validateAUBMethod(subSource); + boolean valid = usesUMethod ? validatePowerBased(subSource) : validateFuelBased(subSource); valid = validateOffRoadPowerRange(subSource) && valid; valid = validateOffRoadOperatingHours(subSource) && valid; validateOffRoadLiterAdBlue(subSource); return valid; } - private boolean validateUMethod(final StandardOffRoadMobileSource subSource) { + private boolean validatePowerBased(final StandardOffRoadMobileSource subSource) { boolean valid = true; final String code = subSource.getOffRoadMobileSourceCode(); if (!validationHelper.expectsPower(code)) { getErrors().add(new AeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, subSource.getDescription())); valid = false; } - // Unused in U-method; Set to null + // Unused for power based; Set to null subSource.setLiterFuelPerYear(null); subSource.setLiterAdBluePerYear(null); return valid; } - private boolean validateAUBMethod(final StandardOffRoadMobileSource subSource) { + private boolean validateFuelBased(final StandardOffRoadMobileSource subSource) { boolean valid = true; final String code = subSource.getOffRoadMobileSourceCode(); final boolean expectsPower = validationHelper.expectsPower(code); @@ -135,7 +135,7 @@ private boolean validateOffRoadOperatingHours(final StandardOffRoadMobileSource } private void validateOffRoadLiterAdBlue(final StandardOffRoadMobileSource subSource) { - // No need for null check, as validateAUBMethod() handles that if required + // No need for null check, as validateFuelBased() handles that if required if (subSource.getLiterAdBluePerYear() != null && subSource.getLiterAdBluePerYear() == 0) { subSource.setLiterAdBluePerYear(null); } else if (subSource.getLiterAdBluePerYear() != null && subSource.getLiterFuelPerYear() != null diff --git a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java index 1be7bc49..0007b1a6 100644 --- a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java +++ b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java @@ -205,7 +205,7 @@ void testSubSourceTooMuchLiterAdBlue() { } @Test - void testValidUMethodSubSourceShouldNotRequireAdBlue() { + void testValidPowerBasedSubSourceShouldNotRequireAdBlue() { when(validationHelper.getPowerRange(any())).thenReturn(Optional.of(IntRangeUtil.valueOf("[67,420]"))); final OffRoadMobileEmissionSource source = createSource(200, null, 1_337, null); From b9598c110841aac385342d43353e4d0b6427a5c8 Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Tue, 4 Aug 2026 09:32:45 +0200 Subject: [PATCH 06/18] - Move U- and AUB- method specific code to their specific functions - Remove redundant check --- .../aerius/validation/OffRoadValidator.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java index 73f4530c..ae0e3c01 100644 --- a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java +++ b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java @@ -67,23 +67,18 @@ private boolean validateOffRoadProperties(final StandardOffRoadMobileSource subS // Combine all validations in separate statements to make sure each validation is run to collect all validation warnings/errors. final boolean usesUMethod = subSource.getPower() != null && subSource.getPower() > 0; boolean valid = usesUMethod ? validatePowerBased(subSource) : validateFuelBased(subSource); - valid = validateOffRoadPowerRange(subSource) && valid; valid = validateOffRoadOperatingHours(subSource) && valid; - validateOffRoadLiterAdBlue(subSource); return valid; } private boolean validatePowerBased(final StandardOffRoadMobileSource subSource) { - boolean valid = true; - final String code = subSource.getOffRoadMobileSourceCode(); - if (!validationHelper.expectsPower(code)) { - getErrors().add(new AeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, subSource.getDescription())); - valid = false; - } + // Power validation has been handled in "usesUMethod" already + // Unused for power based; Set to null subSource.setLiterFuelPerYear(null); subSource.setLiterAdBluePerYear(null); - return valid; + + return validateOffRoadPowerRange(subSource); } private boolean validateFuelBased(final StandardOffRoadMobileSource subSource) { @@ -105,6 +100,8 @@ private boolean validateFuelBased(final StandardOffRoadMobileSource subSource) { } // Fallback if custom GML is passed with power = 0 subSource.setPower(null); + + validateOffRoadLiterAdBlue(subSource); return valid; } @@ -114,7 +111,7 @@ private boolean validateOffRoadPowerRange(final StandardOffRoadMobileSource subS if (validationHelper.expectsPower(code)) { final Optional powerRange = validationHelper.getPowerRange(code); - if (subSource.getPower() != null && subSource.getPower() > 0 && !powerRange.map(range -> range.inRange(subSource.getPower())).orElse(false)) { + if (!powerRange.map(range -> range.inRange(subSource.getPower())).orElse(false)) { getErrors().add(new AeriusException(ImaerExceptionReason.MOBILE_SOURCE_POWER_NOT_WITHIN_RANGE, subSource.getDescription(), powerRange.get().toString(), String.valueOf(subSource.getPower()))); return false; From 0aa032af2ce12ac026172b431e97a80d0a73ea7b Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Tue, 4 Aug 2026 10:04:23 +0200 Subject: [PATCH 07/18] - Fix tests --- .../validation/OffRoadValidatorTest.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java index 0007b1a6..082482f6 100644 --- a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java +++ b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java @@ -151,15 +151,9 @@ void testSubSourceMissingPower(final Integer fuel) { assertFirstError(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, List.of(SUB_SOURCE_DESCRIPTION)); } - /** - * Test if correct error is given when fuel value is missing. - * - * @param power Test both with and without power value, should have the same results as no emission factors for power present - */ - @ParameterizedTest - @CsvSource({",", "200"}) - void testSubSourceMissingLiterFuel(final Integer power) { - final OffRoadMobileEmissionSource source = createSource(power, null, 3_000, 500); + @Test + void testSubSourceMissingLiterFuel() { + final OffRoadMobileEmissionSource source = createSource(null, null, 3_000, 500); mockCategory(MockCategory.FUEL, MockCategory.HOURS, MockCategory.ADBLUE); @@ -167,6 +161,16 @@ void testSubSourceMissingLiterFuel(final Integer power) { assertFirstError(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, List.of(SUB_SOURCE_DESCRIPTION)); } + @Test + void testSubSourceMissingLiterFuelButPowerSuppliedShouldBeValid() { + // Power > 0 makes the source power-based, so the missing-fuel error should not be thrown. + final OffRoadMobileEmissionSource source = createSource(200, null, 3_000, 500); + + mockCategory(MockCategory.FUEL, MockCategory.HOURS, MockCategory.ADBLUE); + + assertNoErrorsOrWarnings(source); + } + @Test void testSubSourceMissingOperatingHours() { final OffRoadMobileEmissionSource source = createSource(null, 10_000, null, 500); From 54bef39ba0208519280bfbb020e2bc6105aab319 Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Tue, 4 Aug 2026 11:27:53 +0200 Subject: [PATCH 08/18] - Cleanup --- .../nl/overheid/aerius/validation/OffRoadValidatorTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java index 082482f6..4924af84 100644 --- a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java +++ b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java @@ -152,7 +152,7 @@ void testSubSourceMissingPower(final Integer fuel) { } @Test - void testSubSourceMissingLiterFuel() { + void testSubSourceMissingLiterFuelAndPower() { final OffRoadMobileEmissionSource source = createSource(null, null, 3_000, 500); mockCategory(MockCategory.FUEL, MockCategory.HOURS, MockCategory.ADBLUE); @@ -163,7 +163,7 @@ void testSubSourceMissingLiterFuel() { @Test void testSubSourceMissingLiterFuelButPowerSuppliedShouldBeValid() { - // Power > 0 makes the source power-based, so the missing-fuel error should not be thrown. + // Power > 0 makes the source power-based, so the missing-fuel-or-power error should not be thrown. final OffRoadMobileEmissionSource source = createSource(200, null, 3_000, 500); mockCategory(MockCategory.FUEL, MockCategory.HOURS, MockCategory.ADBLUE); From d915e2e31271833f07732d602591a033c3202e67 Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Tue, 4 Aug 2026 12:48:42 +0200 Subject: [PATCH 09/18] - Verify the emission method beforehand, so if it is wrong (MISSING), we can throw "ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL" seperately --- .../aerius/validation/OffRoadValidator.java | 32 +++++++++++++++---- .../validation/OffRoadValidatorTest.java | 15 +++++++-- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java index ae0e3c01..88ea2e99 100644 --- a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java +++ b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java @@ -33,6 +33,10 @@ */ class OffRoadValidator extends SourceValidator { + private enum EmissionMethod { + POWER, FUEL, MISSING + } + private final OffRoadValidationHelper validationHelper; OffRoadValidator(final List errors, final List warnings, final OffRoadValidationHelper validationHelper) { @@ -65,14 +69,29 @@ private boolean validateStandardOffRoad(final StandardOffRoadMobileSource subSou private boolean validateOffRoadProperties(final StandardOffRoadMobileSource subSource) { // Combine all validations in separate statements to make sure each validation is run to collect all validation warnings/errors. - final boolean usesUMethod = subSource.getPower() != null && subSource.getPower() > 0; - boolean valid = usesUMethod ? validatePowerBased(subSource) : validateFuelBased(subSource); - valid = validateOffRoadOperatingHours(subSource) && valid; - return valid; + final boolean valid = switch (determineEmissionMethod(subSource)) { + case POWER -> validatePowerBased(subSource); + case FUEL -> validateFuelBased(subSource); + case MISSING -> { + getErrors().add(new AeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, subSource.getDescription())); + yield false; + } + }; + return validateOffRoadOperatingHours(subSource) && valid; + } + + private EmissionMethod determineEmissionMethod(final StandardOffRoadMobileSource subSource) { + final String code = subSource.getOffRoadMobileSourceCode(); + final boolean hasPower = subSource.getPower() != null && subSource.getPower() > 0; + // A category can accept power, fuel, both or neither. At least one is mandatory. + if (hasPower) { + return validationHelper.expectsPower(code) ? EmissionMethod.POWER : EmissionMethod.MISSING; + } + return validationHelper.expectsPower(code) && !validationHelper.expectsLiterFuelPerYear(code) ? EmissionMethod.MISSING : EmissionMethod.FUEL; } private boolean validatePowerBased(final StandardOffRoadMobileSource subSource) { - // Power validation has been handled in "usesUMethod" already + // Power "!= null && > 0" checks have been handled in determineEmissionMethod already // Unused for power based; Set to null subSource.setLiterFuelPerYear(null); @@ -84,10 +103,9 @@ private boolean validatePowerBased(final StandardOffRoadMobileSource subSource) private boolean validateFuelBased(final StandardOffRoadMobileSource subSource) { boolean valid = true; final String code = subSource.getOffRoadMobileSourceCode(); - final boolean expectsPower = validationHelper.expectsPower(code); final boolean expectsFuel = validationHelper.expectsLiterFuelPerYear(code); - if ((expectsFuel && subSource.getLiterFuelPerYear() == null) || (expectsPower && !expectsFuel)) { + if (expectsFuel && subSource.getLiterFuelPerYear() == null) { getErrors().add(new AeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, subSource.getDescription())); valid = false; } diff --git a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java index 4924af84..eaa89ff9 100644 --- a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java +++ b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java @@ -142,7 +142,7 @@ void testValidSubSourceAllRequired() { */ @ParameterizedTest @CsvSource({",", "10_000"}) - void testSubSourceMissingPower(final Integer fuel) { + void testPowerSubSourceMissingPower(final Integer fuel) { final OffRoadMobileEmissionSource source = createSource(null, fuel, 3_000, 500); mockCategory(MockCategory.POWER); @@ -162,12 +162,21 @@ void testSubSourceMissingLiterFuelAndPower() { } @Test - void testSubSourceMissingLiterFuelButPowerSuppliedShouldBeValid() { - // Power > 0 makes the source power-based, so the missing-fuel-or-power error should not be thrown. + void testSubSourcePowerSuppliedButNotExpectedShouldBeInvalid() { final OffRoadMobileEmissionSource source = createSource(200, null, 3_000, 500); mockCategory(MockCategory.FUEL, MockCategory.HOURS, MockCategory.ADBLUE); + assertValidate(source, 1, 0); + assertFirstError(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, List.of(SUB_SOURCE_DESCRIPTION)); + } + + @Test + void testSubSourceFuelSuppliedForPowerAndFuelCategoryShouldBeValid() { + final OffRoadMobileEmissionSource source = createSource(null, 10_000, null, null); + + mockCategory(MockCategory.POWER, MockCategory.FUEL); + assertNoErrorsOrWarnings(source); } From dbd8d22303478c4d82b16f618de1f747027bc5a3 Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Tue, 4 Aug 2026 12:51:43 +0200 Subject: [PATCH 10/18] - Fix comment --- .../java/nl/overheid/aerius/validation/OffRoadValidator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java index 88ea2e99..cc0b07ec 100644 --- a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java +++ b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java @@ -83,7 +83,7 @@ private boolean validateOffRoadProperties(final StandardOffRoadMobileSource subS private EmissionMethod determineEmissionMethod(final StandardOffRoadMobileSource subSource) { final String code = subSource.getOffRoadMobileSourceCode(); final boolean hasPower = subSource.getPower() != null && subSource.getPower() > 0; - // A category can accept power, fuel, both or neither. At least one is mandatory. + // A category can accept power or fuel. At least one is mandatory. if (hasPower) { return validationHelper.expectsPower(code) ? EmissionMethod.POWER : EmissionMethod.MISSING; } From 94a11e3244bd1564990367560622e14e45288d7c Mon Sep 17 00:00:00 2001 From: Michiel Janssen <78349449+MichielJanssen-DAT@users.noreply.github.com> Date: Tue, 4 Aug 2026 13:11:04 +0200 Subject: [PATCH 11/18] Update source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java Co-authored-by: Bert Scholten --- .../overheid/aerius/validation/OffRoadValidator.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java index cc0b07ec..41f7f4e1 100644 --- a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java +++ b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java @@ -83,11 +83,15 @@ private boolean validateOffRoadProperties(final StandardOffRoadMobileSource subS private EmissionMethod determineEmissionMethod(final StandardOffRoadMobileSource subSource) { final String code = subSource.getOffRoadMobileSourceCode(); final boolean hasPower = subSource.getPower() != null && subSource.getPower() > 0; + final boolean hasFuel = subSource.getLiterFuelPerYear() != null && subSource.getLiterFuelPerYear() > 0; // A category can accept power or fuel. At least one is mandatory. - if (hasPower) { - return validationHelper.expectsPower(code) ? EmissionMethod.POWER : EmissionMethod.MISSING; + if (hasPower && validationHelper.expectsPower(code)) { + return EmissionMethod.POWER; + } else if (hasFuel && validationHelper.expectsLiterFuelPerYear(code)) { + return EmissionMethod.FUEL; + } else { + return EmissionMethod.MISSING; } - return validationHelper.expectsPower(code) && !validationHelper.expectsLiterFuelPerYear(code) ? EmissionMethod.MISSING : EmissionMethod.FUEL; } private boolean validatePowerBased(final StandardOffRoadMobileSource subSource) { From 58d610ccd10608e8fd655f9dd13a922d3cc09b7b Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Tue, 4 Aug 2026 13:48:15 +0200 Subject: [PATCH 12/18] - Reverted changes to "validateOffRoadLiterAdBlue()" --- .../aerius/validation/OffRoadValidator.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java index 41f7f4e1..c1f3431d 100644 --- a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java +++ b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java @@ -116,14 +116,10 @@ private boolean validateFuelBased(final StandardOffRoadMobileSource subSource) { if (!expectsFuel) { subSource.setLiterFuelPerYear(null); } - if (validationHelper.expectsLiterAdBluePerYear(code) && subSource.getLiterAdBluePerYear() == null) { - getErrors().add(new AeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_LITER_ADBLUE, subSource.getDescription())); - valid = false; - } // Fallback if custom GML is passed with power = 0 subSource.setPower(null); - validateOffRoadLiterAdBlue(subSource); + valid = validateOffRoadLiterAdBlue(subSource) && valid; return valid; } @@ -153,14 +149,19 @@ private boolean validateOffRoadOperatingHours(final StandardOffRoadMobileSource return valid; } - private void validateOffRoadLiterAdBlue(final StandardOffRoadMobileSource subSource) { - // No need for null check, as validateFuelBased() handles that if required - if (subSource.getLiterAdBluePerYear() != null && subSource.getLiterAdBluePerYear() == 0) { +private boolean validateOffRoadLiterAdBlue(final StandardOffRoadMobileSource subSource) { + boolean valid = true; + if (validationHelper.expectsLiterAdBluePerYear(subSource.getOffRoadMobileSourceCode())) { + if (subSource.getLiterAdBluePerYear() == null) { + getErrors().add(new AeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_LITER_ADBLUE, subSource.getDescription())); + valid = false; + } else if (subSource.getLiterFuelPerYear() != null) { + validateAdBlueFuelRatio(subSource); + } + } else if (subSource.getLiterAdBluePerYear() != null && subSource.getLiterAdBluePerYear() == 0) { subSource.setLiterAdBluePerYear(null); - } else if (subSource.getLiterAdBluePerYear() != null && subSource.getLiterFuelPerYear() != null - && validationHelper.expectsLiterAdBluePerYear(subSource.getOffRoadMobileSourceCode())) { - validateAdBlueFuelRatio(subSource); } + return valid; } private void validateAdBlueFuelRatio(final StandardOffRoadMobileSource subSource) { From 41ae502b173b5f3ed1a6faa14a78d9777daf2304 Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Tue, 4 Aug 2026 13:48:22 +0200 Subject: [PATCH 13/18] - Fix tests --- .../aerius/validation/OffRoadValidatorTest.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java index eaa89ff9..8cff7a21 100644 --- a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java +++ b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java @@ -116,7 +116,8 @@ void testValidSubSourceOnlyOperatingHours() { final OffRoadMobileEmissionSource source = createSource(null, null, 3_000, null); mockCategory(MockCategory.HOURS); - assertNoErrorsOrWarnings(source); + assertValidate(source, 1, 0); + assertFirstError(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, List.of(SUB_SOURCE_DESCRIPTION)); } @Test @@ -124,7 +125,8 @@ void testValidSubSourceOnlyAdBlue() { final OffRoadMobileEmissionSource source = createSource(null, null, null, 500); mockCategory(MockCategory.ADBLUE); - assertNoErrorsOrWarnings(source); + assertValidate(source, 1, 0); + assertFirstError(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, List.of(SUB_SOURCE_DESCRIPTION)); } @Test @@ -203,7 +205,7 @@ void testSubSourceMissingAll() { final OffRoadMobileEmissionSource source = createSource(null, null, null, null); mockCategory(MockCategory.POWER, MockCategory.FUEL, MockCategory.HOURS, MockCategory.ADBLUE); - assertValidate(source, 3, 0); + assertValidate(source, 2, 0); } @Test @@ -244,8 +246,8 @@ private static OffRoadMobileEmissionSource createSource(final Integer power, fin private void mockCategory(final MockCategory... mockCategories) { final Set mockCategoriesSet = Set.of(mockCategories); when(validationHelper.isValidOffRoadMobileSourceCode(CODE)).thenReturn(true); - when(validationHelper.expectsPower(CODE)).thenReturn(mockCategoriesSet.contains(MockCategory.POWER)); when(validationHelper.expectsOperatingHoursPerYear(CODE)).thenReturn(mockCategoriesSet.contains(MockCategory.HOURS)); + lenient().when(validationHelper.expectsPower(CODE)).thenReturn(mockCategoriesSet.contains(MockCategory.POWER)); lenient().when(validationHelper.expectsLiterFuelPerYear(CODE)).thenReturn(mockCategoriesSet.contains(MockCategory.FUEL)); lenient().when(validationHelper.expectsLiterAdBluePerYear(CODE)).thenReturn(mockCategoriesSet.contains(MockCategory.ADBLUE)); lenient().when(validationHelper.getMaxAdBlueFuelRatio(CODE)).thenReturn(OptionalDouble.of(0.07)); From a9550a285a156158cb5b0c04f32a46f6f562f47f Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Tue, 4 Aug 2026 13:48:52 +0200 Subject: [PATCH 14/18] - Fix whitespace --- .../java/nl/overheid/aerius/validation/OffRoadValidator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java index c1f3431d..5a66584e 100644 --- a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java +++ b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java @@ -149,7 +149,7 @@ private boolean validateOffRoadOperatingHours(final StandardOffRoadMobileSource return valid; } -private boolean validateOffRoadLiterAdBlue(final StandardOffRoadMobileSource subSource) { + private boolean validateOffRoadLiterAdBlue(final StandardOffRoadMobileSource subSource) { boolean valid = true; if (validationHelper.expectsLiterAdBluePerYear(subSource.getOffRoadMobileSourceCode())) { if (subSource.getLiterAdBluePerYear() == null) { From 5b6fa5bdd01c4e5271a7c1d4e8375aab4781fd4f Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Tue, 4 Aug 2026 13:50:27 +0200 Subject: [PATCH 15/18] - Comment tweak --- .../java/nl/overheid/aerius/validation/OffRoadValidator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java index 5a66584e..76fe9dad 100644 --- a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java +++ b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java @@ -116,7 +116,7 @@ private boolean validateFuelBased(final StandardOffRoadMobileSource subSource) { if (!expectsFuel) { subSource.setLiterFuelPerYear(null); } - // Fallback if custom GML is passed with power = 0 + // Fallback in case custom GML is passed with power = 0 subSource.setPower(null); valid = validateOffRoadLiterAdBlue(subSource) && valid; From 011dd6efef560ca51e57d6505065903a2fe17275 Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Tue, 4 Aug 2026 14:10:31 +0200 Subject: [PATCH 16/18] - Added "NOT_REQUIRED" option for emission methods that require Power nor LiterFuelPerYear --- .../aerius/validation/OffRoadValidator.java | 14 ++++++++++++-- .../aerius/validation/OffRoadValidatorTest.java | 6 ++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java index 76fe9dad..d23dc25b 100644 --- a/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java +++ b/source/imaer-util/src/main/java/nl/overheid/aerius/validation/OffRoadValidator.java @@ -34,7 +34,7 @@ class OffRoadValidator extends SourceValidator { private enum EmissionMethod { - POWER, FUEL, MISSING + POWER, FUEL, NOT_REQUIRED, MISSING } private final OffRoadValidationHelper validationHelper; @@ -72,6 +72,7 @@ private boolean validateOffRoadProperties(final StandardOffRoadMobileSource subS final boolean valid = switch (determineEmissionMethod(subSource)) { case POWER -> validatePowerBased(subSource); case FUEL -> validateFuelBased(subSource); + case NOT_REQUIRED -> validateNotRequired(subSource); case MISSING -> { getErrors().add(new AeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, subSource.getDescription())); yield false; @@ -84,16 +85,25 @@ private EmissionMethod determineEmissionMethod(final StandardOffRoadMobileSource final String code = subSource.getOffRoadMobileSourceCode(); final boolean hasPower = subSource.getPower() != null && subSource.getPower() > 0; final boolean hasFuel = subSource.getLiterFuelPerYear() != null && subSource.getLiterFuelPerYear() > 0; - // A category can accept power or fuel. At least one is mandatory. + // A category can accept power, fuel or neither. if (hasPower && validationHelper.expectsPower(code)) { return EmissionMethod.POWER; } else if (hasFuel && validationHelper.expectsLiterFuelPerYear(code)) { return EmissionMethod.FUEL; + } else if (!validationHelper.expectsPower(code) && !validationHelper.expectsLiterFuelPerYear(code)) { + return EmissionMethod.NOT_REQUIRED; } else { return EmissionMethod.MISSING; } } + private boolean validateNotRequired(final StandardOffRoadMobileSource subSource) { + // Category expects neither power nor fuel; clear those inputs. + subSource.setPower(null); + subSource.setLiterFuelPerYear(null); + return validateOffRoadLiterAdBlue(subSource); + } + private boolean validatePowerBased(final StandardOffRoadMobileSource subSource) { // Power "!= null && > 0" checks have been handled in determineEmissionMethod already diff --git a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java index 8cff7a21..9bd6464c 100644 --- a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java +++ b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java @@ -116,8 +116,7 @@ void testValidSubSourceOnlyOperatingHours() { final OffRoadMobileEmissionSource source = createSource(null, null, 3_000, null); mockCategory(MockCategory.HOURS); - assertValidate(source, 1, 0); - assertFirstError(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, List.of(SUB_SOURCE_DESCRIPTION)); + assertNoErrorsOrWarnings(source); } @Test @@ -125,8 +124,7 @@ void testValidSubSourceOnlyAdBlue() { final OffRoadMobileEmissionSource source = createSource(null, null, null, 500); mockCategory(MockCategory.ADBLUE); - assertValidate(source, 1, 0); - assertFirstError(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, List.of(SUB_SOURCE_DESCRIPTION)); + assertNoErrorsOrWarnings(source); } @Test From 75176dbcc07790f82febfb36e40976e90c2b6cc6 Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Tue, 4 Aug 2026 14:36:02 +0200 Subject: [PATCH 17/18] - Use older test instead --- .../aerius/validation/OffRoadValidatorTest.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java index 9bd6464c..a8c3c4b2 100644 --- a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java +++ b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java @@ -161,9 +161,15 @@ void testSubSourceMissingLiterFuelAndPower() { assertFirstError(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, List.of(SUB_SOURCE_DESCRIPTION)); } - @Test - void testSubSourcePowerSuppliedButNotExpectedShouldBeInvalid() { - final OffRoadMobileEmissionSource source = createSource(200, null, 3_000, 500); + /** + * Test if correct error is given when fuel value is missing. + * + * @param power Test both with and without power value, should have the same results as no emission factors for power present + */ + @ParameterizedTest + @CsvSource({",", "200"}) + void testSubSourceMissingLiterFuel(final Integer power) { + final OffRoadMobileEmissionSource source = createSource(power, null, 3_000, 500); mockCategory(MockCategory.FUEL, MockCategory.HOURS, MockCategory.ADBLUE); From 62fd4e9765e8bd3fc9c713c2afe048108d3e3198 Mon Sep 17 00:00:00 2001 From: Michiel Janssen Date: Tue, 4 Aug 2026 14:38:50 +0200 Subject: [PATCH 18/18] - Assert specific errors are shown --- .../nl/overheid/aerius/validation/OffRoadValidatorTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java index a8c3c4b2..239df6f7 100644 --- a/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java +++ b/source/imaer-util/src/test/java/nl/overheid/aerius/validation/OffRoadValidatorTest.java @@ -210,6 +210,8 @@ void testSubSourceMissingAll() { mockCategory(MockCategory.POWER, MockCategory.FUEL, MockCategory.HOURS, MockCategory.ADBLUE); assertValidate(source, 2, 0); + assertAeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_POWER_OR_LITER_FUEL, List.of(SUB_SOURCE_DESCRIPTION), errors.get(0)); + assertAeriusException(ImaerExceptionReason.MOBILE_SOURCE_MISSING_OPERATING_HOURS, List.of(SUB_SOURCE_DESCRIPTION), errors.get(1)); } @Test