Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AER-2975 Add error on too many buildings #280

Merged
merged 1 commit into from
Jun 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading