1 /* 2 * Copyright (c) 2016 Vivid Solutions. 3 * 4 * All rights reserved. This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License 2.0 6 * and Eclipse Distribution License v. 1.0 which accompanies this distribution. 7 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v20.html 8 * and the Eclipse Distribution License is available at 9 * 10 * http://www.eclipse.org/org/documents/edl-v10.php. 11 */ 12 package org.locationtech.jts.io.oracle; 13 14 import java.sql.SQLException; 15 16 import org.locationtech.jts.generator.*; 17 import org.locationtech.jts.geom.*; 18 import org.locationtech.jts.io.oracle.OraReader; 19 import org.locationtech.jts.io.oracle.OraWriter; 20 21 import oracle.sql.STRUCT; 22 23 24 /** 25 * 26 * Does round trip testing by creating the oracle object, then decoding it. 27 * 28 * These tests do not include insert / delete / select operations. 29 * 30 * NOTE: This test does require a precision to be used during the comparison, 31 * as points are rounded somewhat when creating the oracle struct. 32 * (One less decimal than a java double). 33 * 34 * NOTE: The points may be re-ordered during these tests. 35 * 36 * @author David Zwiers, Vivid Solutions. 37 */ 38 public class StaticMultiPolygonTest extends ConnectedTestCase { 39 40 /** 41 * @param arg 42 */ StaticMultiPolygonTest(String arg)43 public StaticMultiPolygonTest(String arg) { 44 super(arg); 45 } 46 47 /** 48 * Round Trip test for a single MultiPolygon 49 * @throws SQLException 50 */ testSingleMultiPolygonNoHoleRoundTrip()51 public void testSingleMultiPolygonNoHoleRoundTrip() throws SQLException{ 52 PolygonGenerator pgc = new PolygonGenerator(); 53 pgc.setGeometryFactory(geometryFactory); 54 pgc.setNumberPoints(10); 55 MultiGenerator pg = new MultiGenerator(pgc); 56 pg.setBoundingBox(new Envelope(0,10,0,10)); 57 pg.setNumberGeometries(3); 58 pg.setGeometryFactory(geometryFactory); 59 60 MultiPolygon pt = (MultiPolygon) pg.create(); 61 62 OraWriter ow = new OraWriter(); 63 STRUCT st = ow.write(pt, getConnection()); 64 65 OraReader or = new OraReader(); 66 MultiPolygon pt2 = (MultiPolygon) or.read(st); 67 68 // System.out.println((pt==null?"NULL":pt.toString())); 69 // System.out.println((pt2==null?"NULL":pt2.toString())); 70 assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt.equals(pt2)); 71 } 72 73 /** 74 * Round Trip test for a 100 non overlapping MultiPolygon 75 * @throws SQLException 76 */ testGridMultiPolygonsNoHoleRoundTrip()77 public void testGridMultiPolygonsNoHoleRoundTrip() throws SQLException{ 78 GridGenerator grid = new GridGenerator(); 79 grid.setGeometryFactory(geometryFactory); 80 grid.setBoundingBox(new Envelope(0,10,0,10)); 81 grid.setNumberColumns(10); 82 grid.setNumberRows(10); 83 84 MultiPolygon[] pt = new MultiPolygon[100]; 85 STRUCT[] st = new STRUCT[100]; 86 87 PolygonGenerator pgc = new PolygonGenerator(); 88 pgc.setGeometryFactory(geometryFactory); 89 pgc.setNumberPoints(10); 90 MultiGenerator pg = new MultiGenerator(pgc); 91 pg.setBoundingBox(new Envelope(0,10,0,10)); 92 pg.setNumberGeometries(3); 93 pg.setGeometryFactory(geometryFactory); 94 95 OraWriter ow = new OraWriter(); 96 97 int i=0; 98 while(grid.canCreate() && i<100){ 99 pg.setBoundingBox(grid.createEnv()); 100 pt[i] = (MultiPolygon) pg.create(); 101 st[i] = ow.write(pt[i], getConnection()); 102 i++; 103 } 104 105 OraReader or = new OraReader(); 106 i=0; 107 while(i<100 && pt[i] != null){ 108 MultiPolygon pt2 = (MultiPolygon) or.read(st[i]); 109 // System.out.println((pt[i]==null?"NULL":pt[i].toString())); 110 // System.out.println((pt2==null?"NULL":pt2.toString())); 111 assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt[i].equals(pt2)); 112 i++; 113 } 114 } 115 116 /** 117 * Round Trip test for a 8 overlapping line MultiPolygons (4 distinct MultiPolygons) 118 * @throws SQLException 119 */ testOverlappingMultiPolygonsNoHoleRoundTrip()120 public void testOverlappingMultiPolygonsNoHoleRoundTrip() throws SQLException{ 121 GridGenerator grid = new GridGenerator(); 122 grid.setGeometryFactory(geometryFactory); 123 grid.setBoundingBox(new Envelope(0,10,0,10)); 124 grid.setNumberColumns(2); 125 grid.setNumberRows(2); 126 127 MultiPolygon[] pt = new MultiPolygon[4]; 128 STRUCT[] st = new STRUCT[8]; 129 130 PolygonGenerator pgc = new PolygonGenerator(); 131 pgc.setGeometryFactory(geometryFactory); 132 pgc.setNumberPoints(10); 133 MultiGenerator pg = new MultiGenerator(pgc); 134 pg.setBoundingBox(new Envelope(0,10,0,10)); 135 pg.setNumberGeometries(3); 136 pg.setGeometryFactory(geometryFactory); 137 138 OraWriter ow = new OraWriter(); 139 140 int i=0; 141 while(grid.canCreate() && i<8){ 142 pg.setBoundingBox(grid.createEnv()); 143 pt[i] = (MultiPolygon) pg.create(); 144 st[i] = ow.write(pt[i], getConnection()); 145 i++; 146 } 147 for(int j=0;j<4;j++){ 148 if(pt[j]!=null) 149 st[i++] = ow.write(pt[j], getConnection()); 150 } 151 152 OraReader or = new OraReader(); 153 i=0; 154 while(i<8 && pt[i%4] != null){ 155 MultiPolygon pt2 = (MultiPolygon) or.read(st[i]); 156 // System.out.println((pt==null?"NULL":pt[i%4].toString())); 157 // System.out.println((pt2==null?"NULL":pt2.toString())); 158 assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt[i%4].equals(pt2)); 159 i++; 160 } 161 } 162 163 /** 164 * Round Trip test for a single MultiPolygon with lotsa points 165 * @throws SQLException 166 */ testSingleMultiPolygonManyPointsNoHoleRoundTrip()167 public void testSingleMultiPolygonManyPointsNoHoleRoundTrip() throws SQLException{ 168 169 PolygonGenerator pgc = new PolygonGenerator(); 170 pgc.setGeometryFactory(geometryFactory); 171 pgc.setGenerationAlgorithm(PolygonGenerator.BOX); 172 pgc.setNumberPoints(1000); 173 MultiGenerator pg = new MultiGenerator(pgc); 174 pg.setBoundingBox(new Envelope(0,10,0,10)); 175 pg.setNumberGeometries(3); 176 pg.setGeometryFactory(geometryFactory); 177 178 MultiPolygon pt = (MultiPolygon) pg.create(); 179 // System.out.println((pt==null?"NULL":pt.toString())); 180 181 OraWriter ow = new OraWriter(); 182 STRUCT st = ow.write(pt, getConnection()); 183 184 OraReader or = new OraReader(); 185 MultiPolygon pt2 = (MultiPolygon) or.read(st); 186 187 // System.out.println((pt==null?"NULL":pt.toString())); 188 // System.out.println((pt2==null?"NULL":pt2.toString())); 189 assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt.equals(pt2)); 190 } 191 192 /** 193 * Round Trip test for a single MultiPolygon 194 * @throws SQLException 195 */ testSingleMultiPolygonHolesRoundTrip()196 public void testSingleMultiPolygonHolesRoundTrip() throws SQLException{ 197 198 PolygonGenerator pgc = new PolygonGenerator(); 199 pgc.setGeometryFactory(geometryFactory); 200 pgc.setGenerationAlgorithm(PolygonGenerator.BOX); 201 pgc.setNumberPoints(10); 202 pgc.setNumberHoles(4); 203 MultiGenerator pg = new MultiGenerator(pgc); 204 pg.setBoundingBox(new Envelope(0,10,0,10)); 205 pg.setNumberGeometries(3); 206 pg.setGeometryFactory(geometryFactory); 207 208 MultiPolygon pt = (MultiPolygon) pg.create(); 209 210 OraWriter ow = new OraWriter(); 211 STRUCT st = ow.write(pt, getConnection()); 212 213 OraReader or = new OraReader(); 214 MultiPolygon pt2 = (MultiPolygon) or.read(st); 215 216 // System.out.println((pt==null?"NULL":pt.toString())); 217 // System.out.println((pt2==null?"NULL":pt2.toString())); 218 assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt.equals(pt2)); 219 } 220 221 /** 222 * Round Trip test for a 100 non overlapping MultiPolygon 223 * @throws SQLException 224 */ testGridMultiPolygonsHolesRoundTrip()225 public void testGridMultiPolygonsHolesRoundTrip() throws SQLException{ 226 GridGenerator grid = new GridGenerator(); 227 grid.setGeometryFactory(geometryFactory); 228 grid.setBoundingBox(new Envelope(0,10,0,10)); 229 grid.setNumberColumns(10); 230 grid.setNumberRows(10); 231 232 MultiPolygon[] pt = new MultiPolygon[100]; 233 STRUCT[] st = new STRUCT[100]; 234 235 236 PolygonGenerator pgc = new PolygonGenerator(); 237 pgc.setGeometryFactory(geometryFactory); 238 pgc.setGenerationAlgorithm(PolygonGenerator.BOX); 239 pgc.setNumberPoints(10); 240 pgc.setNumberHoles(4); 241 MultiGenerator pg = new MultiGenerator(pgc); 242 pg.setBoundingBox(new Envelope(0,10,0,10)); 243 pg.setNumberGeometries(3); 244 pg.setGeometryFactory(geometryFactory); 245 246 OraWriter ow = new OraWriter(); 247 248 int i=0; 249 while(grid.canCreate() && i<100){ 250 pg.setBoundingBox(grid.createEnv()); 251 pt[i] = (MultiPolygon) pg.create(); 252 st[i] = ow.write(pt[i], getConnection()); 253 i++; 254 } 255 256 OraReader or = new OraReader(); 257 i=0; 258 while(i<100 && pt[i] != null){ 259 MultiPolygon pt2 = (MultiPolygon) or.read(st[i]); 260 // System.out.println((pt[i]==null?"NULL":pt[i].toString())); 261 // System.out.println((pt2==null?"NULL":pt2.toString())); 262 assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt[i].equals(pt2)); 263 i++; 264 } 265 } 266 267 /** 268 * Round Trip test for a 8 overlapping line MultiPolygons (4 distinct MultiPolygons) 269 * @throws SQLException 270 */ testOverlappingMultiPolygonsHolesRoundTrip()271 public void testOverlappingMultiPolygonsHolesRoundTrip() throws SQLException{ 272 GridGenerator grid = new GridGenerator(); 273 grid.setGeometryFactory(geometryFactory); 274 grid.setBoundingBox(new Envelope(0,10,0,10)); 275 grid.setNumberColumns(2); 276 grid.setNumberRows(2); 277 278 MultiPolygon[] pt = new MultiPolygon[4]; 279 STRUCT[] st = new STRUCT[8]; 280 281 282 PolygonGenerator pgc = new PolygonGenerator(); 283 pgc.setGeometryFactory(geometryFactory); 284 pgc.setGenerationAlgorithm(PolygonGenerator.BOX); 285 pgc.setNumberPoints(10); 286 pgc.setNumberHoles(4); 287 MultiGenerator pg = new MultiGenerator(pgc); 288 pg.setBoundingBox(new Envelope(0,10,0,10)); 289 pg.setNumberGeometries(3); 290 pg.setGeometryFactory(geometryFactory); 291 292 OraWriter ow = new OraWriter(); 293 294 int i=0; 295 while(grid.canCreate() && i<8){ 296 pg.setBoundingBox(grid.createEnv()); 297 pt[i] = (MultiPolygon) pg.create(); 298 st[i] = ow.write(pt[i], getConnection()); 299 i++; 300 } 301 for(int j=0;j<4;j++){ 302 if(pt[j]!=null) 303 st[i++] = ow.write(pt[j], getConnection()); 304 } 305 306 OraReader or = new OraReader(); 307 i=0; 308 while(i<8 && pt[i%4] != null){ 309 MultiPolygon pt2 = (MultiPolygon) or.read(st[i]); 310 // System.out.println((pt==null?"NULL":pt[i%4].toString())); 311 // System.out.println((pt2==null?"NULL":pt2.toString())); 312 assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt[i%4].equals(pt2)); 313 i++; 314 } 315 } 316 317 /** 318 * Round Trip test for a single MultiPolygon with lotsa points 319 * @throws SQLException 320 */ testSingleMultiPolygonManyPointsHolesRoundTrip()321 public void testSingleMultiPolygonManyPointsHolesRoundTrip() throws SQLException{ 322 323 PolygonGenerator pgc = new PolygonGenerator(); 324 pgc.setGeometryFactory(geometryFactory); 325 pgc.setGenerationAlgorithm(PolygonGenerator.BOX); 326 pgc.setNumberPoints(1000); 327 pgc.setNumberHoles(4); 328 MultiGenerator pg = new MultiGenerator(pgc); 329 pg.setBoundingBox(new Envelope(0,10,0,10)); 330 pg.setNumberGeometries(3); 331 pg.setGeometryFactory(geometryFactory); 332 333 MultiPolygon pt = (MultiPolygon) pg.create(); 334 // System.out.println((pt==null?"NULL":pt.toString())); 335 336 OraWriter ow = new OraWriter(); 337 STRUCT st = ow.write(pt, getConnection()); 338 339 OraReader or = new OraReader(); 340 MultiPolygon pt2 = (MultiPolygon) or.read(st); 341 342 // System.out.println((pt==null?"NULL":pt.toString())); 343 // System.out.println((pt2==null?"NULL":pt2.toString())); 344 assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt.equals(pt2)); 345 } 346 347 /** 348 * Round Trip test for a single MultiPolygon with lotsa points 349 * @throws SQLException 350 */ testSingleMultiPolygonManyPointsManyHolesRoundTrip()351 public void testSingleMultiPolygonManyPointsManyHolesRoundTrip() throws SQLException{ 352 353 PolygonGenerator pgc = new PolygonGenerator(); 354 pgc.setGeometryFactory(geometryFactory); 355 pgc.setGenerationAlgorithm(PolygonGenerator.BOX); 356 pgc.setNumberPoints(100); 357 pgc.setNumberHoles(100); 358 MultiGenerator pg = new MultiGenerator(pgc); 359 pg.setBoundingBox(new Envelope(0,10,0,10)); 360 pg.setNumberGeometries(3); 361 pg.setGeometryFactory(geometryFactory); 362 363 MultiPolygon pt = (MultiPolygon) pg.create(); 364 // System.out.println((pt==null?"NULL":pt.toString())); 365 366 OraWriter ow = new OraWriter(); 367 STRUCT st = ow.write(pt, getConnection()); 368 369 OraReader or = new OraReader(); 370 MultiPolygon pt2 = (MultiPolygon) or.read(st); 371 372 // System.out.println((pt==null?"NULL":pt.toString())); 373 // System.out.println((pt2==null?"NULL":pt2.toString())); 374 assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt.equals(pt2)); 375 } 376 } 377