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