package nl.ipo.cds.etl;
import static org.junit.Assert.assertFalse;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.deegree.geometry.GeometryFactory;
import org.deegree.geometry.primitive.Point;
import org.deegree.geometry.primitive.Polygon;
import org.deegree.geometry.primitive.Ring;
import org.deegree.geometry.validation.GeometryValidationEventHandler;
import org.deegree.geometry.validation.GeometryValidator;
import org.junit.Before;
import org.junit.Test;
public class GeometryValidatorTest {
private GeometryValidator geometryValidator;
private GeometryFactory geometryFactory;
private List<String> validationResult;
@Before
public void setUp() {
GeometryValidationEventHandler handler = (GeometryValidationEventHandler)Proxy.newProxyInstance(
getClass().getClassLoader(),
new Class<?>[]{GeometryValidationEventHandler.class},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
StringBuilder builder = new StringBuilder(method.getName());
for(Object arg : args) {
builder.append(" ");
builder.append(arg);
}
validationResult.add(builder.toString());
return false;
}
});
geometryValidator = new GeometryValidator(handler);
geometryFactory = new GeometryFactory();
validationResult = new ArrayList<String>();
}
@Test
public void testSingleRing() {
Polygon polygon = createPolygon(
new double[] {
0, 0,
1000, 0,
1000, 1000,
750, 500,
500, 500,
1000, 1000,
0, 1000,
0, 0});
geometryValidator.validateGeometry(polygon);
assertFalse(validationResult.isEmpty());
}
@Test
public void testInteriorIntersectsExteriorOnce0() {
Polygon polygon = createPolygon(
new double[] {
0, 0,
1000, 0,
1000, 1000,
0, 1000,
0, 0},
new double[] {
1000, 1000,
750, 500,
500, 500,
1000, 1000
});
geometryValidator.validateGeometry(polygon);
assertFalse(validationResult.isEmpty());
}
@Test
public void testInteriorIntersectsExteriorOnce1() {
Polygon polygon = createPolygon(
new double[] {
0, 0,
1000, 0,
1000, 1000,
0, 1000,
0, 0},
new double[] {
900, 900,
750, 500,
0, 0,
900, 900
});
geometryValidator.validateGeometry(polygon);
assertFalse(validationResult.isEmpty());
}
@Test
public void testInteriorIntersectsExteriorTwice() {
Polygon polygon = createPolygon(
new double[] {
0, 0,
1000, 0,
1000, 1000,
0, 1000,
0, 0},
new double[] {
1000, 1000,
750, 500,
0, 0,
1000, 1000
});
geometryValidator.validateGeometry(polygon);
assertFalse(validationResult.isEmpty());
}
private Polygon createPolygon(double[] exterior) {
return geometryFactory.createPolygon(null, null,
createRing(exterior), Collections.<Ring>emptyList());
}
private Polygon createPolygon(double[] exterior, double[] interior) {
return geometryFactory.createPolygon(null, null,
createRing(exterior), Arrays.asList(createRing(interior)));
}
private Ring createRing(double[] points) {
ArrayList<Point> pointList = new ArrayList<Point>();
int i = 0;
while(i < points.length) {
pointList.add(geometryFactory.createPoint(null, new double[]{points[i++], points[i++]}, null));
}
return geometryFactory.createLinearRing(null, null, geometryFactory.createPoints(pointList));
}
}