package uk.ac.ox.zoo.seeg.abraid.mp.dataacquisition.qc;
import org.junit.Test;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.AdminUnitQC;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.Location;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.LocationPrecision;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static com.googlecode.catchexception.CatchException.catchException;
import static com.googlecode.catchexception.CatchException.caughtException;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests the AdminUnitFinder class.
*
* Copyright (c) 2014 University of Oxford
*/
public class AdminUnitFinderTest {
@Test
public void findsNoAdminUnitIfNoneProvided() {
// Arrange
Location location = new Location("Hampshire", -1.25, 51, LocationPrecision.ADMIN2);
List<AdminUnitQC> adminUnits = new ArrayList<>();
AdminUnitFinder adminUnitFinder = new AdminUnitFinder();
// Act
adminUnitFinder.findClosestAdminUnit(location, adminUnits);
// Assert
assertThat(adminUnitFinder.getClosestAdminUnit()).isNull();
assertThat(adminUnitFinder.getMessage()).isNull();
}
@Test
public void throwsExceptionIfLocationNotAnAdmin1OrAdmin2() {
// Arrange
Location location = new Location("United States", -97.5561, 39.96693, LocationPrecision.COUNTRY);
List<AdminUnitQC> adminUnits = createAdminUnits();
AdminUnitFinder adminUnitFinder = new AdminUnitFinder();
// Act
catchException(adminUnitFinder).findClosestAdminUnit(location, adminUnits);
// Assert
assertThat(caughtException()).isInstanceOf(IllegalArgumentException.class);
}
@Test
public void throwsExceptionIfLocationHasNoGeometry() {
// Arrange
Location location = new Location();
location.setPrecision(LocationPrecision.ADMIN2);
List<AdminUnitQC> adminUnits = createAdminUnits();
AdminUnitFinder adminUnitFinder = new AdminUnitFinder();
// Act
catchException(adminUnitFinder).findClosestAdminUnit(location, adminUnits);
// Assert
assertThat(caughtException()).isInstanceOf(IllegalArgumentException.class);
}
@Test
public void findsClosestAdminUnitIfSingleAdminUnitInList() {
// Arrange
Location location = new Location("Hampshire", -1.25, 51, LocationPrecision.ADMIN2);
AdminUnitQC hampshire = new AdminUnitQC(40112, '2', "Hampshire", -1.28383, 51.06529, 3747.35320108);
List<AdminUnitQC> adminUnits = Arrays.asList(hampshire);
AdminUnitFinder adminUnitFinder = new AdminUnitFinder();
// Act
adminUnitFinder.findClosestAdminUnit(location, adminUnits);
// Assert
assertThat(adminUnitFinder.getClosestAdminUnit()).isSameAs(hampshire);
assertThat(adminUnitFinder.getMessage()).isEqualTo("closest distance is 12.48% of the square root of the area");
assertThat(adminUnitFinder.hasPassed()).isTrue();
}
@Test
public void findsNoAdminUnitIfSingleAdminUnitInListIsNotCloseEnough() {
// Arrange
Location location = new Location("Hampshire", -1.25, 51, LocationPrecision.ADMIN2);
AdminUnitQC berkshire = new AdminUnitQC(40096, '2', "Berkshire", -1.07313, 51.44574, 1222.48602795);
List<AdminUnitQC> adminUnits = Arrays.asList(berkshire);
AdminUnitFinder adminUnitFinder = new AdminUnitFinder();
// Act
adminUnitFinder.findClosestAdminUnit(location, adminUnits);
// Assert
assertThat(adminUnitFinder.getClosestAdminUnit()).isNull();
assertThat(adminUnitFinder.getMessage()).isEqualTo("closest distance is 146.17% of the square root of the " +
"area (GAUL code 40096: \"Berkshire\")");
assertThat(adminUnitFinder.hasPassed()).isFalse();
}
@Test
public void findsClosestAdminUnitForAnAdmin2() {
// Arrange
Location location = new Location("Hampshire", -1.25, 51, LocationPrecision.ADMIN2);
List<AdminUnitQC> adminUnits = createAdminUnits();
AdminUnitFinder adminUnitFinder = new AdminUnitFinder();
// Act
adminUnitFinder.findClosestAdminUnit(location, adminUnits);
// Assert
assertThat(adminUnitFinder.getClosestAdminUnit()).isNotNull();
assertThat(adminUnitFinder.getClosestAdminUnit().getName()).isEqualTo("Hampshire");
assertThat(adminUnitFinder.getMessage()).isEqualTo("closest distance is 12.48% of the square root of the area");
assertThat(adminUnitFinder.hasPassed()).isTrue();
}
@Test
public void findsClosestAdminUnitForAnAdmin1() {
// Arrange
Location location = new Location("West Virginia, United States", -80.5079, 38.5137, LocationPrecision.ADMIN1);
List<AdminUnitQC> adminUnits = createAdminUnits();
AdminUnitFinder adminUnitFinder = new AdminUnitFinder();
// Act
adminUnitFinder.findClosestAdminUnit(location, adminUnits);
// Assert
assertThat(adminUnitFinder.getClosestAdminUnit()).isNotNull();
assertThat(adminUnitFinder.getClosestAdminUnit().getName()).isEqualTo("West Virginia");
assertThat(adminUnitFinder.getMessage()).isEqualTo("closest distance is 6.79% of the square root of the area");
assertThat(adminUnitFinder.hasPassed()).isTrue();
}
@Test
public void findsNoAdminUnitIfNoneCloseEnough() {
// Arrange
Location location = new Location("Oxfordshire", -1.25, 51.833333, LocationPrecision.ADMIN2);
List<AdminUnitQC> adminUnits = createAdminUnits();
AdminUnitFinder adminUnitFinder = new AdminUnitFinder();
// Act
adminUnitFinder.findClosestAdminUnit(location, adminUnits);
// Assert
assertThat(adminUnitFinder.getClosestAdminUnit()).isNull();
assertThat(adminUnitFinder.getMessage()).isEqualTo("closest distance is 128.21% of the square root of the " +
"area (GAUL code 40096: \"Berkshire\")");
assertThat(adminUnitFinder.hasPassed()).isFalse();
}
private List<AdminUnitQC> createAdminUnits() {
// Five US states and five English counties
return Arrays.asList(
new AdminUnitQC(3227, '1', "Illinois", -89.19754, 40.06572, 146172.656559),
new AdminUnitQC(3260, '1', "Virginia", -78.83583, 37.51577, 104188.680259),
new AdminUnitQC(3261, '1', "Washington", -120.43996, 47.38034, 174921.174796),
new AdminUnitQC(3262, '1', "West Virginia", -80.61382, 38.64252, 62845.4130703),
new AdminUnitQC(3263, '1', "Wisconsin", -90.00856, 44.63645, 145538.410907),
new AdminUnitQC(40096, '2', "Berkshire", -1.07313, 51.44574, 1222.48602795),
new AdminUnitQC(40112, '2', "Hampshire", -1.28383, 51.06529, 3747.35320108),
new AdminUnitQC(40116, '2', "Isle of Wight", -1.30334, 50.67887, 373.855675662),
new AdminUnitQC(40137, '2', "West Sussex", -0.48444, 50.95776, 1945.02141568),
new AdminUnitQC(40139, '2', "Wiltshire", -1.92657, 51.31608, 3428.74012362));
}
}