package com.revolsys.gis.model.coordinates; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import org.junit.Assert; import org.junit.Test; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import com.revolsys.io.FileUtil; import com.revolsys.io.IoFactoryRegistry; import com.revolsys.io.MapReaderFactory; import com.revolsys.io.Reader; import com.revolsys.spring.InputStreamResource; public class LineSegmentUtilTest { @Test public void intersection() throws Throwable { Resource resource = new ClassPathResource(getClass().getName().replaceAll( "\\.", "/") + ".intersection.csv"); final IoFactoryRegistry registry = IoFactoryRegistry.INSTANCE; final String filename = resource.getFilename(); final String extension = FileUtil.getFileNameExtension(filename); final MapReaderFactory factory = registry.getFactoryByFileExtension( MapReaderFactory.class, extension); final Reader<Map<String, Object>> reader = factory.createMapReader(new InputStreamResource(filename, resource.getInputStream())); for (Map<String, Object> testCase : reader) { String name = (String)testCase.get("name"); Point line1C1 = getCoordinates(testCase, "line1", "1"); Point line1C2 = getCoordinates(testCase, "line1", "2"); Point line2C1 = getCoordinates(testCase, "line2", "1"); Point line2C2 = getCoordinates(testCase, "line2", "2"); final GeometryFactory precisionModel = new SimpleGeometryFactory( 1, 1); List<Point> expectedResult = getResults(testCase); List<Point> reverseExpectedResult = new ArrayList<Point>(expectedResult); Collections.reverse(reverseExpectedResult); // Start -> Start List<Point> result1 = LineSegmentUtil.intersection(precisionModel, line1C1, line1C2, line2C1, line2C2); Assert.assertEquals(name + " start -> start", expectedResult, result1); // Start -> End List<Point> result2 = LineSegmentUtil.intersection(precisionModel, line1C1, line1C2, line2C2, line2C1); Assert.assertEquals(name + " start -> end", expectedResult, result2); // End -> Start List<Point> result3 = LineSegmentUtil.intersection(precisionModel, line1C2, line1C1, line2C1, line2C2); Assert.assertEquals(name + " end -> start", reverseExpectedResult, result3); // End -> End List<Point> result4 = LineSegmentUtil.intersection(precisionModel, line1C2, line1C1, line2C2, line2C1); Assert.assertEquals(name + " end -> end", reverseExpectedResult, result4); } } private List<Point> getResults( Map<String, Object> testCase) { List<Point> results = new ArrayList<Point>(); Point resultC1 = getCoordinates(testCase, "result", "1"); if (resultC1 != null) { results.add(resultC1); } Point resultC2 = getCoordinates(testCase, "result", "2"); if (resultC2 != null) { results.add(resultC2); } return results; } private Point getCoordinates( Map<String, Object> testCase, String prefix, String suffix) { double x1 = getDouble(testCase, prefix + "X" + suffix); if (Double.isNaN(x1)) { return null; } else { double y1 = getDouble(testCase, prefix + "Y" + suffix); return new DoubleCoordinates(x1, y1); } } private double getDouble( Map<String, Object> object, String name) { final String value = (String)object.get(name); if (value == null || value.equals("")) { return Double.NaN; } else { return Double.valueOf(value); } } }