Skip to content

Commit

Permalink
AER-2975 Add error on too many buildings (#280)
Browse files Browse the repository at this point in the history
  • Loading branch information
wtenbosch authored Jun 11, 2024
1 parent 3455b03 commit 163a0c1
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -500,4 +500,9 @@ public double buildingDiameterMaximum() {
return Double.MAX_VALUE;
}


@Override
public int buildingMaximumPerSituation() {
return Integer.MAX_VALUE;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,6 @@ default boolean isBuildingUpperLimitWarning() {
double buildingDiameterMinimum();

double buildingDiameterMaximum();

int buildingMaximumPerSituation();
}
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ public final class ADMSLimits implements BuildingLimits {
public static final boolean SPATIALLY_VARYING_ROUGHNESS_DEFAULT = true;
public static final boolean ADMS_COMPLEX_TERRAIN_DEFAULT = false;

private static final int ADMS_MAX_BUILDINGS_PER_SITUATION = 50;

public static final ADMSLimits INSTANCE = new ADMSLimits();

private ADMSLimits() {
Expand Down Expand Up @@ -193,4 +195,9 @@ public double buildingDiameterMinimum() {
public double buildingDiameterMaximum() {
return BUILDING_DIAMETER_MAXIMUM;
}

@Override
public int buildingMaximumPerSituation() {
return ADMS_MAX_BUILDINGS_PER_SITUATION;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -648,6 +648,13 @@ public enum ImaerExceptionReason implements Reason {
*/
BUILDING_HEIGHT_TOO_HIGH(5244),

/**
* There are more buildings in a situation than the maximum
*
* @param 0 The maximum number of allowed buildings
*/
TOO_MANY_BUILDINGS_IN_SITUATION(5245),

/**
* Value is <= 0.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,20 @@ public static void validateBuildings(final List<BuildingFeature> buildings, fina

public static void validateBuildings(final List<BuildingFeature> buildings, final BuildingLimits buildingLimits,
final List<AeriusException> errors, final List<AeriusException> warnings) {
checkBuildingCount(buildings, buildingLimits, errors);
for (final BuildingFeature feature : buildings) {
checkBuildingGeometry(feature, buildingLimits, errors);
checkBuildingHeight(feature, buildingLimits, errors, warnings);
checkBuildingDiameter(feature, buildingLimits, errors, warnings);
}
}

private static void checkBuildingCount(final List<BuildingFeature> buildings, final BuildingLimits buildingLimits, final List<AeriusException> errors) {
if (buildings.size() > buildingLimits.buildingMaximumPerSituation()) {
errors.add(new AeriusException(ImaerExceptionReason.TOO_MANY_BUILDINGS_IN_SITUATION, String.valueOf(buildingLimits.buildingMaximumPerSituation())));
}
}

private static void checkBuildingGeometry(final BuildingFeature feature, final BuildingLimits buildingLimits,
final List<AeriusException> errors) {
// Only polygon and point geometries are supported.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;

import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -162,6 +163,23 @@ void testCircularBuildingNotAllowed() {
assertEquals(List.of(), warnings, "No warnings");
}

@Test
void testTooManyBuildings() {
final BuildingFeature building = createBuilding(1);
building.setGeometry(new Point(0, 0));
building.getProperties().setDiameter(1);

final List<AeriusException> errors = new ArrayList<>();
final List<AeriusException> warnings = new ArrayList<>();

BuildingValidator.validateBuildings(IntStream.range(1, 80).mapToObj(s -> building).toList(), limits(false), errors, warnings);

assertEquals(1, errors.size(), "Number of errors");
assertEquals(ImaerExceptionReason.TOO_MANY_BUILDINGS_IN_SITUATION, errors.get(0).getReason(), "Error reason");
assertArrayEquals(new Object[] {"50"}, errors.get(0).getArgs(), "Arguments");
assertEquals(List.of(), warnings, "No warnings");
}

private static BuildingLimits limits(final boolean upperLimitWarning) {
final BuildingLimits limits = mock(BuildingLimits.class);
lenient().when(limits.isCircularBuildingSupported()).thenReturn(true);
Expand All @@ -170,6 +188,7 @@ private static BuildingLimits limits(final boolean upperLimitWarning) {
lenient().when(limits.buildingDiameterMinimum()).thenReturn(0.0);
lenient().when(limits.buildingDiameterMaximum()).thenReturn(3.0);
lenient().when(limits.isBuildingUpperLimitWarning()).thenReturn(upperLimitWarning);
lenient().when(limits.buildingMaximumPerSituation()).thenReturn(50);
return limits;
}

Expand Down

0 comments on commit 163a0c1

Please sign in to comment.