diff --git a/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/GMLConversionData.java b/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/GMLConversionData.java index be8a31f1..86a09262 100644 --- a/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/GMLConversionData.java +++ b/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/GMLConversionData.java @@ -246,4 +246,20 @@ public S determineDefaultCharacteristicsBySect public S determineDefaultCharacteristicsBySectorId(final int sectorId, final GeometryType geometryType) { return characteristicsSupplier.determineDefaultCharacteristicsBySectorId(sectorId, geometryType); } + + /** + * Checks if the given code is a removed code and adds a warning if so. + * + * @param type the type of legacy code + * @param code the code to check + * @param sourceLabel the label of the source for warning messages + * @return true if the code is a removed code, false otherwise + */ + public boolean warnIfRemovedCode(final GMLLegacyCodeType type, final String code, final String sourceLabel) { + if (legacyCodeConverter.isRemovedCode(type, code)) { + warnings.add(new AeriusException(ImaerExceptionReason.GML_REMOVED_CODE_CONVERTED, sourceLabel, code)); + return true; + } + return false; + } } diff --git a/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/GMLLegacyCodeConverter.java b/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/GMLLegacyCodeConverter.java index 761525c0..7899ff0e 100644 --- a/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/GMLLegacyCodeConverter.java +++ b/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/GMLLegacyCodeConverter.java @@ -17,6 +17,7 @@ package nl.overheid.aerius.gml.base; import java.util.Map; +import java.util.Set; import nl.overheid.aerius.gml.base.conversion.FarmLodgingConversion; import nl.overheid.aerius.gml.base.conversion.MobileSourceOffRoadConversion; @@ -42,20 +43,24 @@ public enum GMLLegacyCodeType { private final Map mobileSourceOffRoadConversions; private final Map planConversions; private final Map farmLodgingConversions; + private final Map> removedCodes; /** * @param codeMaps The <OldCode, NewCode> maps to use for each legacy code type. * @param mobileSourceOffRoadConversions The <OldCode, ConversionValues> to use for mobile sources. * @param planConversions The <OldCode, ConversionValues> to use for plan activities. * @param farmLodgingConversions The <OldCode, ConversionValues> to use for farm lodgings. + * @param removedCodes The removed codes by type. */ public GMLLegacyCodeConverter(final Map> codeMaps, final Map mobileSourceOffRoadConversions, - final Map planConversions, final Map farmLodgingConversions) { + final Map planConversions, final Map farmLodgingConversions, + final Map> removedCodes) { this.codeMaps = safe(codeMaps); this.mobileSourceOffRoadConversions = safe(mobileSourceOffRoadConversions); this.planConversions = safe(planConversions); this.farmLodgingConversions = safe(farmLodgingConversions); + this.removedCodes = safe(removedCodes); } private static Map safe(final Map map) { @@ -89,6 +94,16 @@ protected FarmLodgingConversion getFarmLodgingConversion(final String oldCode) { return farmLodgingConversions.get(oldCode); } + /** + * Check if a code is a removed code. + * @param type The type of legacy code. + * @param code The code to check. + * @return true if the code is a removed code, false otherwise. + */ + protected boolean isRemovedCode(final GMLLegacyCodeType type, final String code) { + return removedCodes.getOrDefault(type, Set.of()).contains(code); + } + /** * The conversion of a an old code. */ diff --git a/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/GMLLegacyCodesSupplier.java b/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/GMLLegacyCodesSupplier.java index d56e9e05..a0ccd014 100644 --- a/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/GMLLegacyCodesSupplier.java +++ b/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/GMLLegacyCodesSupplier.java @@ -17,6 +17,7 @@ package nl.overheid.aerius.gml.base; import java.util.Map; +import java.util.Set; import nl.overheid.aerius.gml.base.GMLLegacyCodeConverter.Conversion; import nl.overheid.aerius.gml.base.GMLLegacyCodeConverter.GMLLegacyCodeType; @@ -69,4 +70,15 @@ default Map getLegacyFarmLodgingConversions() thr return Map.of(); } + /** + * Returns a map of removed codes by type. + * Sources with these codes will be converted to alternative representations during import. + * + * @return map of code type to set of removed codes + * @throws AeriusException + */ + default Map> getRemovedCodes() throws AeriusException { + return Map.of(); + } + } diff --git a/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/GMLVersionReaderFactory.java b/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/GMLVersionReaderFactory.java index 6fc20be6..df8dae37 100644 --- a/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/GMLVersionReaderFactory.java +++ b/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/GMLVersionReaderFactory.java @@ -50,7 +50,7 @@ protected GMLVersionReaderFactory(final GMLLegacyCodesSupplier legacyCodeSupplie schema = GMLSchemaFactory.createSchema(schemaLocation); legacyCodeConverter = new GMLLegacyCodeConverter(legacyCodeSupplier.getLegacyCodes(version), legacyCodeSupplier.getLegacyMobileSourceOffRoadConversions(), legacyCodeSupplier.getLegacyPlanConversions(), - legacyCodeSupplier.getLegacyFarmLodgingConversions()); + legacyCodeSupplier.getLegacyFarmLodgingConversions(), legacyCodeSupplier.getRemovedCodes()); } /** diff --git a/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/GML2VehicleUtil.java b/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/GML2VehicleUtil.java index 5b9d604f..84b4d529 100644 --- a/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/GML2VehicleUtil.java +++ b/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/GML2VehicleUtil.java @@ -39,8 +39,14 @@ private GML2VehicleUtil() { static void addEmissionValuesSpecific(final List addToVehicles, final IsGmlEmissionSource source, final IsGmlSpecificVehicle sv, final GMLConversionData conversionData) { - final SpecificVehicles vse = new SpecificVehicles(); final String vehicleCode = conversionData.getCode(GMLLegacyCodeType.ON_ROAD_MOBILE_SOURCE, sv.getCode(), source.getLabel()); + + if (conversionData.warnIfRemovedCode(GMLLegacyCodeType.ON_ROAD_MOBILE_SOURCE, vehicleCode, source.getLabel())) { + addToVehicles.add(RemovedVehicleUtil.toCustomVehicles(sv, vehicleCode)); + return; + } + + final SpecificVehicles vse = new SpecificVehicles(); vse.setVehicleCode(vehicleCode); vse.setTimeUnit(TimeUnit.valueOf(sv.getTimeUnit().name())); vse.setVehiclesPerTimeUnit(sv.getVehiclesPerTimeUnit()); diff --git a/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/RemovedVehicleUtil.java b/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/RemovedVehicleUtil.java new file mode 100644 index 00000000..32117496 --- /dev/null +++ b/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/RemovedVehicleUtil.java @@ -0,0 +1,46 @@ +/* + * Copyright the State of the Netherlands + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + */ +package nl.overheid.aerius.gml.base.source.road; + +import nl.overheid.aerius.shared.domain.v2.base.TimeUnit; +import nl.overheid.aerius.shared.domain.v2.source.road.CustomVehicles; + +/** + * Utility for converting removed vehicle codes to custom vehicles. + */ +public final class RemovedVehicleUtil { + + private RemovedVehicleUtil() { + // Util class + } + + /** + * Converts a specific vehicle with a removed code to a custom vehicle with zero emissions. + * + * @param sv the specific vehicle to convert + * @param vehicleCode the removed vehicle code + * @return a custom vehicle preserving the vehicle count and time unit + */ + public static CustomVehicles toCustomVehicles(final IsGmlSpecificVehicle sv, final String vehicleCode) { + final CustomVehicles custom = new CustomVehicles(); + custom.setTimeUnit(TimeUnit.valueOf(sv.getTimeUnit().name())); + custom.setVehiclesPerTimeUnit(sv.getVehiclesPerTimeUnit()); + custom.setDescription(vehicleCode); + return custom; + } + +} diff --git a/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/v40/GML2SRMRoad.java b/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/v40/GML2SRMRoad.java index 852f1f9c..7926603e 100644 --- a/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/v40/GML2SRMRoad.java +++ b/source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/v40/GML2SRMRoad.java @@ -29,6 +29,7 @@ import nl.overheid.aerius.gml.base.source.road.IsGmlCustomVehicle; import nl.overheid.aerius.gml.base.source.road.IsGmlSpecificVehicle; import nl.overheid.aerius.gml.base.source.road.IsGmlVehicle; +import nl.overheid.aerius.gml.base.source.road.RemovedVehicleUtil; import nl.overheid.aerius.shared.domain.v2.base.TimeUnit; import nl.overheid.aerius.shared.domain.v2.source.RoadEmissionSource; import nl.overheid.aerius.shared.domain.v2.source.road.CustomVehicles; @@ -121,8 +122,14 @@ protected Optional findExistingMatch(final IsGmlStandardVehicl } protected void addEmissionValues(final List addToVehicles, final T source, final IsGmlSpecificVehicle sv) { - final SpecificVehicles vse = new SpecificVehicles(); final String vehicleCode = getConversionData().getCode(GMLLegacyCodeType.ON_ROAD_MOBILE_SOURCE, sv.getCode(), source.getLabel()); + + if (getConversionData().warnIfRemovedCode(GMLLegacyCodeType.ON_ROAD_MOBILE_SOURCE, vehicleCode, source.getLabel())) { + addToVehicles.add(RemovedVehicleUtil.toCustomVehicles(sv, vehicleCode)); + return; + } + + final SpecificVehicles vse = new SpecificVehicles(); vse.setVehicleCode(vehicleCode); vse.setTimeUnit(TimeUnit.valueOf(sv.getTimeUnit().name())); vse.setVehiclesPerTimeUnit(sv.getVehiclesPerTimeUnit()); diff --git a/source/imaer-gml/src/test/java/nl/overheid/aerius/gml/AssertGML.java b/source/imaer-gml/src/test/java/nl/overheid/aerius/gml/AssertGML.java index ee34af4e..21c1fcde 100644 --- a/source/imaer-gml/src/test/java/nl/overheid/aerius/gml/AssertGML.java +++ b/source/imaer-gml/src/test/java/nl/overheid/aerius/gml/AssertGML.java @@ -43,6 +43,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -255,6 +256,7 @@ static GMLHelper mockGMLHelper(final CharacteristicsType ct) throws AeriusExcept when(gmlHelper.getLegacyMobileSourceOffRoadConversions()).thenReturn(TestValidationAndEmissionHelper.legacyMobileSourceOffRoadConversions()); when(gmlHelper.getLegacyPlanConversions()).thenReturn(TestValidationAndEmissionHelper.legacyPlanConversions()); when(gmlHelper.getLegacyFarmLodgingConversions()).thenReturn(TestValidationAndEmissionHelper.legacyFarmLodgingConversions()); + when(gmlHelper.getRemovedCodes()).thenReturn(Map.of()); when(gmlHelper.determineDefaultCharacteristicsBySectorId(anyInt(), any())).thenReturn(determineDefaultCharacteristics(ct)); when(gmlHelper.getValidationHelper()).thenReturn(validationAndEmissionHelper); when(gmlHelper.getDefaultSector()).thenReturn(new Sector(GMLTestDomain.DEFAULT_SECTOR_ID, SectorGroup.INDUSTRY, "")); diff --git a/source/imaer-gml/src/test/java/nl/overheid/aerius/gml/RemovedVehicleCodeImportTest.java b/source/imaer-gml/src/test/java/nl/overheid/aerius/gml/RemovedVehicleCodeImportTest.java new file mode 100644 index 00000000..45eb5c23 --- /dev/null +++ b/source/imaer-gml/src/test/java/nl/overheid/aerius/gml/RemovedVehicleCodeImportTest.java @@ -0,0 +1,75 @@ +/* + * Copyright the State of the Netherlands + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + */ +package nl.overheid.aerius.gml; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.io.InputStream; +import java.util.EnumSet; +import java.util.Map; +import java.util.Set; + +import org.junit.jupiter.api.Test; + +import nl.overheid.aerius.gml.base.GMLHelper; +import nl.overheid.aerius.gml.base.GMLLegacyCodeConverter.GMLLegacyCodeType; +import nl.overheid.aerius.importer.ImaerImporter; +import nl.overheid.aerius.importer.ImportOption; +import nl.overheid.aerius.shared.domain.v2.importer.ImportParcel; +import nl.overheid.aerius.shared.domain.v2.source.SRM2RoadEmissionSource; +import nl.overheid.aerius.shared.domain.v2.source.road.CustomVehicles; +import nl.overheid.aerius.shared.exception.AeriusException; +import nl.overheid.aerius.shared.exception.ImaerExceptionReason; + +/** + * Integration test verifying that ImaerImporter calls convertRemovedVehicleCodes during import. + */ +class RemovedVehicleCodeImportTest { + + private static final String REMOVED_CODE = "BA-B-E3"; + + @Test + void testRemovedVehicleCodeIsConvertedDuringImport() throws IOException, AeriusException { + final GMLHelper mockHelper = AssertGML.mockGMLHelper(); + when(mockHelper.getRemovedCodes()).thenReturn(Map.of(GMLLegacyCodeType.ON_ROAD_MOBILE_SOURCE, Set.of(REMOVED_CODE))); + + // Create fresh factory with our mock helper (not cached) so getRemovedVehicleCodes is used + final GMLReaderFactory factory = new GMLReaderFactory(mockHelper); + final ImaerImporter importer = new ImaerImporter(mockHelper, factory); + final ImportParcel result = new ImportParcel(); + + try (final InputStream inputStream = AssertGML.getFileInputStream( + AssertGML.PATH_LATEST_VERSION + "roundtrip", "road_specific_and_custom")) { + importer.importStream(inputStream, EnumSet.of(ImportOption.INCLUDE_SOURCES), result); + } + + assertEquals(0, result.getExceptions().size(), "Expected no exceptions"); + assertTrue(result.getWarnings().stream() + .anyMatch(w -> w.getReason() == ImaerExceptionReason.GML_REMOVED_CODE_CONVERTED), + "Expected warning for removed vehicle code"); + + final SRM2RoadEmissionSource roadSource = + (SRM2RoadEmissionSource) result.getSituation().getEmissionSourcesList().get(0).getProperties(); + final CustomVehicles converted = assertInstanceOf(CustomVehicles.class, roadSource.getSubSources().get(0)); + assertEquals(REMOVED_CODE, converted.getDescription()); + } + +} diff --git a/source/imaer-gml/src/test/java/nl/overheid/aerius/gml/base/source/road/GML2VehicleUtilTest.java b/source/imaer-gml/src/test/java/nl/overheid/aerius/gml/base/source/road/GML2VehicleUtilTest.java new file mode 100644 index 00000000..c441ceb0 --- /dev/null +++ b/source/imaer-gml/src/test/java/nl/overheid/aerius/gml/base/source/road/GML2VehicleUtilTest.java @@ -0,0 +1,90 @@ +/* + * Copyright the State of the Netherlands + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + */ +package nl.overheid.aerius.gml.base.source.road; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import nl.overheid.aerius.gml.base.GMLConversionData; +import nl.overheid.aerius.gml.base.GMLLegacyCodeConverter.GMLLegacyCodeType; +import nl.overheid.aerius.gml.base.source.IsGmlEmissionSource; +import nl.overheid.aerius.gml.base.source.IsGmlTimeUnit; +import nl.overheid.aerius.shared.domain.v2.source.road.CustomVehicles; +import nl.overheid.aerius.shared.domain.v2.source.road.SpecificVehicles; +import nl.overheid.aerius.shared.domain.v2.source.road.Vehicles; +import nl.overheid.aerius.shared.exception.AeriusException; + +class GML2VehicleUtilTest { + + private static final String REMOVED_CODE = "BABCEUR4"; + private static final String VALID_CODE = "VALID_CODE"; + private static final String SOURCE_LABEL = "Test source"; + + @Test + void testRemovedCodeRoutesToCustomVehicles() throws AeriusException { + final GMLConversionData conversionData = mock(GMLConversionData.class); + when(conversionData.getCode(GMLLegacyCodeType.ON_ROAD_MOBILE_SOURCE, REMOVED_CODE, SOURCE_LABEL)) + .thenReturn(REMOVED_CODE); + when(conversionData.warnIfRemovedCode(GMLLegacyCodeType.ON_ROAD_MOBILE_SOURCE, REMOVED_CODE, SOURCE_LABEL)) + .thenReturn(true); + + final List vehicles = new ArrayList<>(); + GML2VehicleUtil.addEmissionValuesSpecific(vehicles, mockSource(), mockSpecificVehicle(REMOVED_CODE), conversionData); + + assertEquals(1, vehicles.size()); + assertInstanceOf(CustomVehicles.class, vehicles.get(0)); + } + + @Test + void testUnknownCodeStaysSpecificVehicle() throws AeriusException { + final GMLConversionData conversionData = mock(GMLConversionData.class); + when(conversionData.getCode(GMLLegacyCodeType.ON_ROAD_MOBILE_SOURCE, VALID_CODE, SOURCE_LABEL)) + .thenReturn(VALID_CODE); + when(conversionData.warnIfRemovedCode(GMLLegacyCodeType.ON_ROAD_MOBILE_SOURCE, VALID_CODE, SOURCE_LABEL)) + .thenReturn(false); + + final List vehicles = new ArrayList<>(); + GML2VehicleUtil.addEmissionValuesSpecific(vehicles, mockSource(), mockSpecificVehicle(VALID_CODE), conversionData); + + assertEquals(1, vehicles.size()); + assertInstanceOf(SpecificVehicles.class, vehicles.get(0)); + } + + private IsGmlEmissionSource mockSource() { + final IsGmlEmissionSource source = mock(IsGmlEmissionSource.class); + when(source.getLabel()).thenReturn(SOURCE_LABEL); + return source; + } + + private IsGmlSpecificVehicle mockSpecificVehicle(final String code) { + final IsGmlSpecificVehicle vehicle = mock(IsGmlSpecificVehicle.class); + when(vehicle.getCode()).thenReturn(code); + when(vehicle.getVehiclesPerTimeUnit()).thenReturn(100.0); + final IsGmlTimeUnit timeUnit = mock(IsGmlTimeUnit.class); + when(timeUnit.name()).thenReturn("DAY"); + when(vehicle.getTimeUnit()).thenReturn(timeUnit); + return vehicle; + } + +} diff --git a/source/imaer-gml/src/test/java/nl/overheid/aerius/gml/base/source/road/RemovedVehicleUtilTest.java b/source/imaer-gml/src/test/java/nl/overheid/aerius/gml/base/source/road/RemovedVehicleUtilTest.java new file mode 100644 index 00000000..6d63063a --- /dev/null +++ b/source/imaer-gml/src/test/java/nl/overheid/aerius/gml/base/source/road/RemovedVehicleUtilTest.java @@ -0,0 +1,78 @@ +/* + * Copyright the State of the Netherlands + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + */ +package nl.overheid.aerius.gml.base.source.road; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.junit.jupiter.api.Test; + +import nl.overheid.aerius.gml.base.source.IsGmlTimeUnit; +import nl.overheid.aerius.shared.domain.v2.base.TimeUnit; +import nl.overheid.aerius.shared.domain.v2.source.road.CustomVehicles; + +class RemovedVehicleUtilTest { + + @Test + void testToCustomVehiclesPreservesTimeUnit() { + final IsGmlSpecificVehicle vehicle = createMockVehicle("TEST_CODE", 100.0, "DAY"); + + final CustomVehicles result = RemovedVehicleUtil.toCustomVehicles(vehicle, "TEST_CODE"); + + assertEquals(TimeUnit.DAY, result.getTimeUnit()); + } + + @Test + void testToCustomVehiclesPreservesVehicleCount() { + final IsGmlSpecificVehicle vehicle = createMockVehicle("TEST_CODE", 42.5, "YEAR"); + + final CustomVehicles result = RemovedVehicleUtil.toCustomVehicles(vehicle, "TEST_CODE"); + + assertEquals(42.5, result.getVehiclesPerTimeUnit()); + } + + @Test + void testToCustomVehiclesSetsDescriptionWithVehicleCode() { + final IsGmlSpecificVehicle vehicle = createMockVehicle("BABCEUR4", 100.0, "DAY"); + + final CustomVehicles result = RemovedVehicleUtil.toCustomVehicles(vehicle, "BABCEUR4"); + + assertEquals("BABCEUR4", result.getDescription()); + } + + @Test + void testToCustomVehiclesHasZeroEmissions() { + final IsGmlSpecificVehicle vehicle = createMockVehicle("TEST_CODE", 100.0, "DAY"); + + final CustomVehicles result = RemovedVehicleUtil.toCustomVehicles(vehicle, "TEST_CODE"); + + assertTrue(result.getEmissionFactors().isEmpty()); + } + + private IsGmlSpecificVehicle createMockVehicle(final String code, final double vehiclesPerTimeUnit, final String timeUnitName) { + final IsGmlSpecificVehicle vehicle = mock(IsGmlSpecificVehicle.class); + when(vehicle.getCode()).thenReturn(code); + when(vehicle.getVehiclesPerTimeUnit()).thenReturn(vehiclesPerTimeUnit); + final IsGmlTimeUnit timeUnit = mock(IsGmlTimeUnit.class); + when(timeUnit.name()).thenReturn(timeUnitName); + when(vehicle.getTimeUnit()).thenReturn(timeUnit); + return vehicle; + } + +} diff --git a/source/imaer-shared/src/main/java/nl/overheid/aerius/shared/exception/ImaerExceptionReason.java b/source/imaer-shared/src/main/java/nl/overheid/aerius/shared/exception/ImaerExceptionReason.java index 64873e93..2a52ff1a 100644 --- a/source/imaer-shared/src/main/java/nl/overheid/aerius/shared/exception/ImaerExceptionReason.java +++ b/source/imaer-shared/src/main/java/nl/overheid/aerius/shared/exception/ImaerExceptionReason.java @@ -613,6 +613,13 @@ public enum ImaerExceptionReason implements Reason { * @param 2 source name */ GML_SECTOR_OUT_OF_DATE(5266), + /** + * GML contains a source with a removed vehicle code that has been converted. + * + * @param 0 the label of the source. + * @param 1 the old code. + */ + GML_REMOVED_CODE_CONVERTED(5267), /** * Geometry contains too many vertices. *