/******************************************************************************* * Copyright (c) 2015 VoyagerSearch * All rights reserved. This program and the accompanying materials * are made available under the terms of the Apache License, Version 2.0 which * accompanies this distribution and is available at * http://www.apache.org/licenses/LICENSE-2.0.txt ******************************************************************************/ package org.locationtech.spatial4j.io; import org.locationtech.spatial4j.context.SpatialContext; import org.locationtech.spatial4j.context.jts.JtsSpatialContext; import org.locationtech.spatial4j.exception.InvalidShapeException; import org.locationtech.spatial4j.shape.Shape; import org.junit.Test; import java.io.*; import java.text.ParseException; import java.util.Arrays; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; /** * Tests for {@link ShapeFormat} */ public class ShapeFormatTest { public Shape testReadAndWriteTheSame(Shape shape, ShapeReader reader,ShapeWriter writer) throws IOException, ParseException { assertNotNull(shape); StringWriter str = new StringWriter(); writer.write(str, shape); // System.out.println( "OUT: "+str.toString()); Shape out = reader.read(new StringReader(str.toString())); StringWriter copy = new StringWriter(); writer.write(copy, out); assertEquals(str.toString(), copy.toString()); return out; } public void testCommon(SpatialContext ctx, String name) throws Exception { ShapeReader reader = ctx.getFormats().getReader(name); ShapeWriter writer = ctx.getFormats().getWriter(name); assertNotNull(reader); assertNotNull(writer); testReadAndWriteTheSame(ctx.makePoint(10, 20),reader,writer); testReadAndWriteTheSame(ctx.makeLineString( Arrays.asList( ctx.makePoint(1, 2), ctx.makePoint(3, 4), ctx.makePoint(5, 6) )),reader,writer); // testReadAndWriteTheSame(ctx.makeRectangle(10, 20, 30, 40),format); } public void testJTS(JtsSpatialContext ctx, String name) throws Exception { ShapeReader reader = ctx.getFormats().getReader(name); ShapeWriter writer = ctx.getFormats().getWriter(name); Shape shape; // // wkt = readFirstLineFromRsrc("/russia.wkt.txt"); // shape = ctx.readShape(wkt); // // testReadAndWriteTheSame(shape,format); // Examples from Wikipedia shape = wkt(ctx,"LINESTRING (30 10, 10 30, 40 40)"); // testReadAndWriteTheSame(shape,format); shape = wkt(ctx,"POLYGON ((35 10, 45 45, 15 40, 10 20, 35 10))"); testReadAndWriteTheSame(shape,reader,writer); shape = wkt(ctx,"POLYGON ((35 10, 45 45, 15 40, 10 20, 35 10),(20 30, 35 35, 30 20, 20 30))"); testReadAndWriteTheSame(shape,reader,writer); shape = wkt(ctx,"MULTIPOINT ((10 40), (40 30), (20 20), (30 10))"); testReadAndWriteTheSame(shape,reader,writer); shape = wkt(ctx,"MULTIPOINT (10 40, 40 30, 20 20, 30 10)"); testReadAndWriteTheSame(shape,reader,writer); shape = wkt(ctx,"MULTILINESTRING ((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10))"); testReadAndWriteTheSame(shape,reader,writer); shape = wkt(ctx,"MULTIPOLYGON (((30 20, 45 40, 10 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5)))"); testReadAndWriteTheSame(shape,reader,writer); } @Test public void testReadAndWriteTheSame() throws Exception { // GeoJSON String format = ShapeIO.GeoJSON; testCommon(SpatialContext.GEO, format); testCommon(JtsSpatialContext.GEO, format); testJTS(JtsSpatialContext.GEO, format); // WKT format = ShapeIO.WKT; testCommon(SpatialContext.GEO, format); testCommon(JtsSpatialContext.GEO, format); testJTS(JtsSpatialContext.GEO, format); } public void testParseVsInvalidExceptions(ShapeReader reader, boolean supportsPolygon) throws Exception { String txt = null; try { txt = "garbage"; reader.read(txt); fail("should throw invalid exception"); } catch(ParseException ex) { //expected } try { txt = "POINT(-1000 1000)"; reader.read(txt); fail("should throw invalid shape"); } catch(InvalidShapeException ex) { //expected } if(supportsPolygon) { try { txt = readFirstLineFromRsrc("/fiji.wkt.txt"); reader.read(txt); fail("should throw invalid exception"); } catch(InvalidShapeException ex) { //expected } } } @Test public void testParseVsInvalidExceptions() throws Exception { testParseVsInvalidExceptions(SpatialContext.GEO.getFormats().getWktReader(), false); testParseVsInvalidExceptions(JtsSpatialContext.GEO.getFormats().getWktReader(), true); } private String readFirstLineFromRsrc(String wktRsrcPath) throws IOException { InputStream is = getClass().getResourceAsStream(wktRsrcPath); assertNotNull(is); try { BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")); return br.readLine(); } finally { is.close(); } } /** Convenience to read static data. */ protected Shape wkt(SpatialContext ctx, String wkt) throws IOException, ParseException { return ctx.getFormats().getWktReader().read(wkt); } }