package org.geotools.process.jts; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import junit.framework.TestCase; import org.geotools.data.Parameter; import org.geotools.feature.NameImpl; import org.geotools.process.ProcessException; import org.geotools.process.ProcessFactory; import org.geotools.process.Processors; import org.opengis.feature.type.Name; import org.opengis.util.InternationalString; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.io.WKTReader; import com.vividsolutions.jts.operation.buffer.BufferParameters; /** * * * @source $URL$ */ public class GeometryProcessFactoryTest extends TestCase { GeometryProcessFactory factory; @Override protected void setUp() throws Exception { factory = new GeometryProcessFactory(); } public void testNames() { Set<Name> names = factory.getNames(); assertTrue(names.size() > 0); // System.out.println(names); assertTrue(names.contains(new NameImpl("JTS", "buffer"))); assertTrue(names.contains(new NameImpl("JTS", "union"))); } public void testDescribeBuffer() { NameImpl bufferName = new NameImpl("JTS", "buffer"); InternationalString desc = factory.getDescription(bufferName); assertNotNull(desc); Map<String, Parameter<?>> params = factory.getParameterInfo(bufferName); assertEquals(4, params.size()); Parameter<?> geom = params.get("geom"); assertEquals(Geometry.class, geom.type); assertTrue(geom.required); Parameter<?> distance = params.get("distance"); assertEquals(double.class, distance.type); assertTrue(distance.required); Parameter<?> quadrants = params.get("quadrantSegments"); assertEquals(Integer.class, quadrants.type); assertFalse(quadrants.required); assertEquals(0, quadrants.minOccurs); assertEquals(1, quadrants.maxOccurs); Parameter<?> capStyle = params.get("capStyle"); assertEquals(GeometryFunctions.BufferCapStyle.class, capStyle.type); assertFalse(capStyle.required); assertEquals(0, capStyle.minOccurs); assertEquals(1, capStyle.maxOccurs); } public void testExecuteBuffer() throws Exception { org.geotools.process.Process buffer = factory.create(new NameImpl("JTS", "Buffer")); // try less than the required params Map<String, Object> inputs = new HashMap<String, Object>(); try { buffer.execute(inputs, null); fail("What!!! Should have failed big time!"); } catch(ProcessException e) { // fine } // try out only the required params Geometry geom = new WKTReader().read("POINT(0 0)"); inputs.put("geom", geom); inputs.put("distance", 1d); Map<String, Object> result = buffer.execute(inputs, null); assertEquals(1, result.size()); Geometry buffered = (Geometry) result.get("result"); assertNotNull(buffered); assertTrue(buffered.equals(geom.buffer(1d))); // pass in all params inputs.put("quadrantSegments", 12); inputs.put("capStyle", GeometryFunctions.BufferCapStyle.Square); result = buffer.execute(inputs, null); assertEquals(1, result.size()); buffered = (Geometry) result.get("result"); assertNotNull(buffered); assertTrue(buffered.equals(geom.buffer(1d, 12, BufferParameters.CAP_SQUARE))); } public void testSPI() throws Exception { NameImpl bufferName = new NameImpl("JTS", "buffer"); ProcessFactory factory = Processors.createProcessFactory(bufferName); assertNotNull(factory); assertTrue(factory instanceof GeometryProcessFactory); org.geotools.process.Process buffer = Processors.createProcess(bufferName); assertNotNull(buffer); } public void testDescribeUnion() { NameImpl unionName = new NameImpl("JTS", "union"); InternationalString desc = factory.getDescription(unionName); assertNotNull(desc); Map<String, Parameter<?>> params = factory.getParameterInfo(unionName); assertEquals(1, params.size()); Parameter<?> geom = params.get("geom"); assertEquals(Geometry.class, geom.type); assertTrue(geom.required); assertEquals(2, geom.minOccurs); assertEquals(Integer.MAX_VALUE, geom.maxOccurs); } public void testExecuteUnion() throws Exception { org.geotools.process.Process union = factory.create(new NameImpl("JTS", "union")); // try less than the required params Map<String, Object> inputs = new HashMap<String, Object>(); try { union.execute(inputs, null); fail("What!!! Should have failed big time!"); } catch(ProcessException e) { // fine } // try again with less Geometry geom1 = new WKTReader().read("POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))"); Geometry geom2 = new WKTReader().read("POLYGON((0 1, 0 2, 1 2, 1 1, 0 1))"); List<Geometry> geometries = new ArrayList<Geometry>(); geometries.add(geom1); inputs.put("geom", geometries); try { union.execute(inputs, null); fail("What!!! Should have failed big time!"); } catch(ProcessException e) { // fine } // now with just enough geometries.add(geom2); Map<String, Object> result = union.execute(inputs, null); assertEquals(1, result.size()); Geometry united = (Geometry) result.get("result"); assertNotNull(united); assertTrue(united.equals(geom1.union(geom2))); } public void testExecuteHull() throws Exception { NameImpl hullName = new NameImpl("JTS", "convexHull"); org.geotools.process.Process hull = factory.create(hullName); Map<String, Object> inputs = new HashMap<String, Object>(); Geometry geom = new WKTReader().read("LINESTRING(0 0, 0 1, 1 1)"); inputs.put("geom", geom); Map<String, Object> output = hull.execute(inputs, null); assertEquals(1, output.size()); // there is no output annotation, check there is consistency between what is declared // and what is returned Geometry result = (Geometry) output.get(factory.getResultInfo(hullName, null).keySet().iterator().next()); assertTrue(result.equals(geom.convexHull())); } }