/* * Copyright (c) 2016 Vivid Solutions. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v. 1.0 which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * * http://www.eclipse.org/org/documents/edl-v10.php. */ package org.locationtech.jts.geom; import org.locationtech.jts.geom.impl.CoordinateArraySequenceFactory; import org.locationtech.jts.geom.impl.PackedCoordinateSequenceFactory; import org.locationtech.jts.io.ParseException; import org.locationtech.jts.io.WKTReader; import junit.framework.TestCase; import junit.textui.TestRunner; /** * Tests for {@link GeometryFactory}. * * @version 1.13 */ public class GeometryFactoryTest extends TestCase { PrecisionModel precisionModel = new PrecisionModel(); GeometryFactory geometryFactory = new GeometryFactory(precisionModel, 0); WKTReader reader = new WKTReader(geometryFactory); public static void main(String args[]) { TestRunner.run(GeometryFactoryTest.class); } public GeometryFactoryTest(String name) { super(name); } public void testCreateGeometry() throws ParseException { checkCreateGeometryExact("POINT EMPTY"); checkCreateGeometryExact("POINT ( 10 20 )"); checkCreateGeometryExact("LINESTRING EMPTY"); checkCreateGeometryExact("LINESTRING(0 0, 10 10)"); checkCreateGeometryExact("MULTILINESTRING ((50 100, 100 200), (100 100, 150 200))"); checkCreateGeometryExact("POLYGON ((100 200, 200 200, 200 100, 100 100, 100 200))"); checkCreateGeometryExact("MULTIPOLYGON (((100 200, 200 200, 200 100, 100 100, 100 200)), ((300 200, 400 200, 400 100, 300 100, 300 200)))"); checkCreateGeometryExact("GEOMETRYCOLLECTION (POLYGON ((100 200, 200 200, 200 100, 100 100, 100 200)), LINESTRING (250 100, 350 200), POINT (350 150))"); } public void testDeepCopy() throws ParseException { Point g = (Point) read("POINT ( 10 10) "); Geometry g2 = geometryFactory.createGeometry(g); g.getCoordinateSequence().setOrdinate(0, 0, 99); assertTrue(! g.equalsExact(g2)); } public void testMultiPointCS() { GeometryFactory gf = new GeometryFactory(new PackedCoordinateSequenceFactory()); CoordinateSequence mpSeq = gf.getCoordinateSequenceFactory().create(1, 4); mpSeq.setOrdinate(0, 0, 50); mpSeq.setOrdinate(0, 1, -2); mpSeq.setOrdinate(0, 2, 10); mpSeq.setOrdinate(0, 3, 20); MultiPoint mp = gf.createMultiPoint(mpSeq); CoordinateSequence pSeq = ((Point)mp.getGeometryN(0)).getCoordinateSequence(); assertEquals(4, pSeq.getDimension()); for (int i = 0; i < 4; i++) assertEquals(mpSeq.getOrdinate(0, i), pSeq.getOrdinate(0, i)); } /** * CoordinateArraySequences default their dimension to 3 unless explicitly told otherwise. * This test ensures that GeometryFactory.createGeometry() recreates the input dimension properly. * * @throws ParseException */ public void testCopyGeometryWithNonDefaultDimension() throws ParseException { GeometryFactory gf = new GeometryFactory(CoordinateArraySequenceFactory.instance()); CoordinateSequence mpSeq = gf.getCoordinateSequenceFactory().create(1, 2); mpSeq.setOrdinate(0, 0, 50); mpSeq.setOrdinate(0, 1, -2); Point g = gf.createPoint(mpSeq); CoordinateSequence pSeq = ((Point) g.getGeometryN(0)).getCoordinateSequence(); assertEquals(2, pSeq.getDimension()); Point g2 = (Point) geometryFactory.createGeometry(g); assertEquals(2, g2.getCoordinateSequence().getDimension()); } private void checkCreateGeometryExact(String wkt) throws ParseException { Geometry g = read(wkt); Geometry g2 = geometryFactory.createGeometry(g); assertTrue(g.equalsExact(g2)); } private Geometry read(String wkt) throws ParseException { return reader.read(wkt); } }