PostGIS  3.0.6dev-r@@SVN_REVISION@@
cu_in_wkt.c
Go to the documentation of this file.
1 /**********************************************************************
2  *
3  * PostGIS - Spatial Types for PostgreSQL
4  * http://postgis.net
5  * Copyright 2010 Paul Ramsey <pramsey@cleverelephant.ca>
6  *
7  * This is free software; you can redistribute and/or modify it under
8  * the terms of the GNU General Public Licence. See the COPYING file.
9  *
10  **********************************************************************/
11 
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include "CUnit/Basic.h"
16 
17 #include "liblwgeom_internal.h"
18 #include "cu_tester.h"
19 
20 /*
21 ** Globals used by tests
22 */
23 char *s;
24 char *r;
25 
26 /*
27 ** The suite initialization function.
28 ** Create any re-used objects.
29 */
30 static int init_wkt_in_suite(void)
31 {
32  return 0;
33 }
34 
35 /*
36 ** The suite cleanup function.
37 ** Frees any global objects.
38 */
39 static int clean_wkt_in_suite(void)
40 {
41  return 0;
42 }
43 
44 /*
45 * Return a char* that results from taking the input
46 * WKT, creating an LWGEOM, then writing it back out
47 * as an output WKT using the supplied variant.
48 * If there is an error, return that.
49 */
50 static char* cu_wkt_in(char *wkt, uint8_t variant)
51 {
53  int rv = 0;
54  char *s = 0;
55 
56  rv = lwgeom_parse_wkt(&p, wkt, 0);
57  if (p.errcode)
58  {
59  CU_ASSERT_EQUAL(rv, LW_FAILURE);
60  CU_ASSERT(!p.geom);
61  return strdup(p.message);
62  }
63  CU_ASSERT_EQUAL(rv, LW_SUCCESS);
64  s = lwgeom_to_wkt(p.geom, variant, 8, NULL);
66  return s;
67 }
68 
69 
70 static void test_wkt_in_point(void)
71 {
72  s = "POINT(1 2) foobar";
73  r = cu_wkt_in(s, WKT_SFSQL);
74  CU_ASSERT_STRING_EQUAL("parse error - invalid geometry", r);
75  lwfree(r);
76 
77  s = "POINT(1e700 0)";
78  r = cu_wkt_in(s, WKT_SFSQL);
79  CU_TEST ( ! strcmp(r, "POINT(inf 0)") || ! strcmp(r, "POINT(1.#INF 0)") || ! strcmp(r, "POINT(Infinity 0)") );
80  lwfree(r);
81 
82  s = "POINT(0 0)";
83  r = cu_wkt_in(s, WKT_SFSQL);
84  CU_ASSERT_STRING_EQUAL(r,s);
85  lwfree(r);
86 
87  s = "POINT EMPTY";
88  r = cu_wkt_in(s, WKT_SFSQL);
89  CU_ASSERT_STRING_EQUAL(r,s);
90  lwfree(r);
91 
92  s = "POINT M EMPTY";
93  r = cu_wkt_in(s, WKT_ISO);
94  CU_ASSERT_STRING_EQUAL(r,s);
95  lwfree(r);
96 
97  //printf("\nIN: %s\nOUT: %s\n",s,r);
98 }
99 
100 static void test_wkt_in_linestring(void)
101 {
102  s = "LINESTRING EMPTY";
103  r = cu_wkt_in(s, WKT_SFSQL);
104  CU_ASSERT_STRING_EQUAL(r,s);
105  lwfree(r);
106 
107  s = "LINESTRING(0 0,1 1)";
108  r = cu_wkt_in(s, WKT_SFSQL);
109  CU_ASSERT_STRING_EQUAL(r,s);
110  lwfree(r);
111 
112  s = "LINESTRING(0 0 0,1 1 1)";
114  CU_ASSERT_STRING_EQUAL(r,s);
115  lwfree(r);
116 
117  s = "LINESTRING M (0 0 0,1 1 1)";
118  r = cu_wkt_in(s, WKT_ISO);
119  CU_ASSERT_STRING_EQUAL(r,s);
120  lwfree(r);
121 
122  s = "LINESTRING ZM (0 0 0 1,1 1 1 1,2 2 2 2,0.141231 4 5 4)";
123  r = cu_wkt_in(s, WKT_ISO);
124  CU_ASSERT_STRING_EQUAL(r,s);
125  lwfree(r);
126 
127  s = "LINESTRINGM(0 0 0,1 1 1)";
129  CU_ASSERT_STRING_EQUAL(r,s);
130  lwfree(r);
131 
132  s = "LINESTRING ZM EMPTY";
133  r = cu_wkt_in(s, WKT_ISO);
134  CU_ASSERT_STRING_EQUAL(r,s);
135  lwfree(r);
136 
137  s = "LINESTRING Z (0 0 0 1, 0 1 0 1)";
139  CU_ASSERT_STRING_EQUAL(r,"can not mix dimensionality in a geometry");
140  //printf("\nIN: %s\nOUT: %s\n",s,r);
141  lwfree(r);
142 
143 }
144 
145 static void test_wkt_in_polygon(void)
146 {
147  s = "POLYGON((0 0,0 1,1 1,0 0))";
148  r = cu_wkt_in(s, WKT_SFSQL);
149  CU_ASSERT_STRING_EQUAL(r,s);
150  lwfree(r);
151 
152  s = "POLYGON Z ((0 0,0 10,10 10,10 0,0 0),(1 1 1,1 2 1,2 2 1,2 1 1,1 1 1))";
153  r = cu_wkt_in(s, WKT_SFSQL);
154  CU_ASSERT_STRING_EQUAL(r,"can not mix dimensionality in a geometry");
155  lwfree(r);
156 
157  s = "POLYGON Z ((0 0,0 10,10 10,10 0,0 0),(1 1,1 2,2 2,2 1,1 1))";
158  r = cu_wkt_in(s, WKT_SFSQL);
159  CU_ASSERT_STRING_EQUAL(r,"can not mix dimensionality in a geometry");
160  //printf("\nIN: %s\nOUT: %s\n",s,r);
161  lwfree(r);
162 }
163 
164 static void test_wkt_in_multipoint(void)
165 {
170  // s = "MULTIPOINT(-1 -2 -3,5.4 6.6 7.77,-5.4 -6.6 -7.77,1000000 1e-06 -1000000,-1.3e-06 -1.4e-05 0)";
171  // r = cu_wkt_in(s, WKT_EXTENDED);
172  // CU_ASSERT_STRING_EQUAL(r,s);
173  // printf("\nIN: %s\nOUT: %s\n",s,r);
174  // lwfree(r);
175 
176  s = "MULTIPOINT(0 0)";
177  r = cu_wkt_in(s, WKT_SFSQL);
178  CU_ASSERT_STRING_EQUAL(r,s);
179  //printf("\nIN: %s\nOUT: %s\n",s,r);
180  lwfree(r);
181 
182  s = "MULTIPOINT(0 0,1 1)";
183  r = cu_wkt_in(s, WKT_SFSQL);
184  CU_ASSERT_STRING_EQUAL(r,s);
185  //printf("\nIN: %s\nOUT: %s\n",s,r);
186  lwfree(r);
187 }
188 
190 {
191  s = "MULTILINESTRING((0 0,1 1),(1 1,2 2),(3 3,3 3,3 3,2 2,2 1))";
192  r = cu_wkt_in(s, WKT_SFSQL);
193  CU_ASSERT_STRING_EQUAL(r,s);
194  //printf("\nIN: %s\nOUT: %s\n",s,r);
195  lwfree(r);
196 
197 }
198 
199 static void test_wkt_in_multipolygon(void)
200 {
201  s = "MULTIPOLYGON(((0 0,0 1,1 1,0 0)))";
202  r = cu_wkt_in(s, WKT_SFSQL);
203  CU_ASSERT_STRING_EQUAL(r,s);
204  //printf("\nIN: %s\nOUT: %s\n",s,r);
205  lwfree(r);
206 
207  s = "MULTIPOLYGON(((0 0,0 10,10 10,0 0),(1 1,1 2,2 2,1 1)),((-10 -10,-10 -5,-5 -5,-10 -10)))";
208  r = cu_wkt_in(s, WKT_SFSQL);
209  CU_ASSERT_STRING_EQUAL(r,s);
210  //printf("\nIN: %s\nOUT: %s\n",s,r);
211  lwfree(r);
212 
213  s = "SRID=4;MULTIPOLYGON(((0 0,0 1,1 1,0 0)))";
215  CU_ASSERT_STRING_EQUAL(r,s);
216  //printf("\nIN: %s\nOUT: %s\n",s,r);
217  lwfree(r);
218 
219 }
220 
221 static void test_wkt_in_collection(void)
222 {
223  s = "SRID=5;GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(1 0,0 0),CIRCULARSTRING(0 0,0 1,1 1,0 1,2 2))";
225  //printf("\nIN: %s\nOUT: %s\n",s,r);
226  CU_ASSERT_STRING_EQUAL(r,s);
227  lwfree(r);
228 
229  s = "GEOMETRYCOLLECTION(POINT(0 0),POINT EMPTY,LINESTRING(1 0,0 0),POLYGON EMPTY,CIRCULARSTRING(0 0,0 1,1 1,0 1,2 2))";
230  r = cu_wkt_in(s, WKT_SFSQL);
231  //printf("\nIN: %s\nOUT: %s\n",s,r);
232  CU_ASSERT_STRING_EQUAL(r,s);
233  lwfree(r);
234 
235  s = "GEOMETRYCOLLECTION Z (POINT Z (0 0 0))";
236  r = cu_wkt_in(s, WKT_ISO);
237  //printf("\nIN: %s\nOUT: %s\n",s,r);
238  CU_ASSERT_STRING_EQUAL(r,s);
239  lwfree(r);
240 
241  s = "GEOMETRYCOLLECTION M (MULTILINESTRING M ((0 0 5,2 0 5),(1 1 5,2 2 5)))";
242  r = cu_wkt_in(s, WKT_ISO);
243  //printf("\nIN: %s\nOUT: %s\n",s,r);
244  CU_ASSERT_STRING_EQUAL(r,s);
245  lwfree(r);
246 
247  /* See http://trac.osgeo.org/postgis/ticket/1455#comment:3 */
248  s = "GEOMETRYCOLLECTION Z (MULTILINESTRING Z ((0 0 5,2 0 5),(1 1 5,2 2 5)))";
249  r = cu_wkt_in(s, WKT_ISO);
250  //printf("\nIN: %s\nOUT: %s\n",s,r);
251  CU_ASSERT_STRING_EQUAL(r,s);
252  lwfree(r);
253 }
254 
255 static void test_wkt_in_circularstring(void)
256 {
257  s = "CIRCULARSTRING(0 0,0 1,1 1,0 1,2 2)";
258  r = cu_wkt_in(s, WKT_SFSQL);
259  //printf("\nIN: %s\nOUT: %s\n",s,r);
260  CU_ASSERT_STRING_EQUAL(r,s);
261  lwfree(r);
262 }
263 
264 static void test_wkt_in_compoundcurve(void)
265 {
266  s = "SRID=4326;COMPOUNDCURVEM(CIRCULARSTRINGM(0 0 2,1 1 2,1 0 2),(1 0 2,0 1 2))";
268  CU_ASSERT_STRING_EQUAL(r,s);
269  //printf("\nIN: %s\nOUT: %s\n",s,r);
270  lwfree(r);
271 
272  s = "COMPOUNDCURVE Z (CIRCULARSTRING Z (0 0 0,0 1 0,1 1 0,0 0 0,2 2 0),(2 2 0,0 0 1,1 1 1,2 2 1))";
273  r = cu_wkt_in(s, WKT_ISO);
274  CU_ASSERT_STRING_EQUAL(r,s);
275  //printf("\nIN: %s\nOUT: %s\n",s,r);
276  lwfree(r);
277 }
278 
279 static void test_wkt_in_curvpolygon(void)
280 {
281  s = "CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,0 1,1 1,2 2,0 0),(0 0,1 1,2 2)),CIRCULARSTRING(0 0,0 1,1 1,0 0,2 2),(0 0,1 1,2 1))";
282  r = cu_wkt_in(s, WKT_ISO);
283  CU_ASSERT_STRING_EQUAL(r,s);
284  //printf("\nIN: %s\nOUT: %s\n",s,r);
285  lwfree(r);
286 }
287 
288 static void test_wkt_in_multicurve(void)
289 {
290  s = "SRID=4326;MULTICURVE(COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,1 0),(1 0,0 1)))";
292  CU_ASSERT_STRING_EQUAL(r,s);
293  //printf("\nIN: %s\nOUT: %s\n",s,r);
294  lwfree(r);
295 }
296 
297 static void test_wkt_in_multisurface(void)
298 {
299  s = "SRID=4326;MULTICURVE(COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,1 0),(1 0,0 1)))";
301  CU_ASSERT_STRING_EQUAL(r,s);
302  //printf("\nIN: %s\nOUT: %s\n",s,r);
303  lwfree(r);
304 }
305 
306 static void test_wkt_in_tin(void)
307 {
308  s = "TIN(((0 1 2,3 4 5,6 7 8,0 1 2)),((0 1 2,3 4 5,6 7 8,9 10 11,0 1 2)))";
310  CU_ASSERT_STRING_EQUAL(r,"triangle must have exactly 4 points");
311  //printf("\nIN: %s\nOUT: %s\n",s,r);
312  lwfree(r);
313 }
314 
316 {
317  s = "POLYHEDRALSURFACE(((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 0 0,0 0 0)),((0 0 0,1 0 0,0 0 1,0 0 0)),((1 0 0,0 1 0,0 0 1,1 0 0)))";
319  CU_ASSERT_STRING_EQUAL(r,s);
320  //printf("\nIN: %s\nOUT: %s\n",s,r);
321  lwfree(r);
322 
323  s = "POLYHEDRALSURFACE Z (((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 0 0,0 0 0)),((0 0 0,1 0 0,0 0 1,0 0 0)),((1 0 0,0 1 0,0 0 1,1 0 0)))";
324  r = cu_wkt_in(s, WKT_ISO);
325  CU_ASSERT_STRING_EQUAL(r,s);
326  //printf("\nIN: %s\nOUT: %s\n",s,r);
327  lwfree(r);
328 
329  s = "POLYHEDRALSURFACE(((0 1 2,3 4 5,6 7,0 1 2)))";
330  r = cu_wkt_in(s, WKT_ISO);
331  CU_ASSERT_STRING_EQUAL(r,"can not mix dimensionality in a geometry");
332  //printf("\nIN: %s\nOUT: %s\n",s,r);
333  lwfree(r);
334 
335 }
336 
337 static void test_wkt_in_errlocation(void)
338 {
340  int rv = 0;
341  char *wkt = 0;
342 
343  wkt = "LINESTRING((0 0 0,1 1)";
345  rv = lwgeom_parse_wkt(&p, wkt, LW_PARSER_CHECK_ALL);
346  CU_ASSERT_EQUAL( rv, LW_FAILURE );
347  CU_ASSERT((12 - p.errlocation) < 1.5);
348 
349 // printf("errlocation %d\n", p.errlocation);
350 // printf("message %s\n", p.message);
351 
353 
354 }
355 
356 static void test_wkt_double(void)
357 {
359  int rv = 0;
360  char *wkt = 0;
361 
362  wkt = "LINESTRING(1.1.1, 2.2.2)";
364  rv = lwgeom_parse_wkt(&p, wkt, LW_PARSER_CHECK_ALL);
365  CU_ASSERT( LW_FAILURE == rv );
366  CU_ASSERT( p.errcode );
367  CU_ASSERT( ! p.geom );
369 
370  wkt = "LINESTRING(1.1 .1, 2.2 .2)";
372  rv = lwgeom_parse_wkt(&p, wkt, LW_PARSER_CHECK_ALL);
373  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
375 
376  wkt = "LINESTRING( 1.1 .1 , 2.2 .2 )";
378  rv = lwgeom_parse_wkt(&p, wkt, LW_PARSER_CHECK_ALL);
379  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
381 
382  wkt = "LINESTRING(\n1.1\n.1,\n2.2\n.2\n)";
384  rv = lwgeom_parse_wkt(&p, wkt, LW_PARSER_CHECK_ALL);
385  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
387 
388  wkt = "LINESTRING(1.1\t.1\t,\t2.2\t.2\t)";
390  rv = lwgeom_parse_wkt(&p, wkt, LW_PARSER_CHECK_ALL);
391  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
393 }
394 
395 static void test_wkt_leak(void)
396 {
397  char *wkt = "TINEMPTY,";
398  char *err = cu_wkt_in(wkt, WKT_EXTENDED);
399  CU_ASSERT_STRING_EQUAL(err, "parse error - invalid geometry");
400  lwfree(err);
401 }
402 
403 /*
404 ** Used by test harness to register the tests in this file.
405 */
406 void wkt_in_suite_setup(void);
408 {
409  CU_pSuite suite = CU_add_suite("wkt_input", init_wkt_in_suite, clean_wkt_in_suite);
426  PG_ADD_TEST(suite, test_wkt_leak);
427 }
static uint8_t variant
Definition: cu_in_twkb.c:26
static void test_wkt_in_tin(void)
Definition: cu_in_wkt.c:306
static void test_wkt_leak(void)
Definition: cu_in_wkt.c:395
static void test_wkt_in_linestring(void)
Definition: cu_in_wkt.c:100
static void test_wkt_in_point(void)
Definition: cu_in_wkt.c:70
static void test_wkt_in_multipoint(void)
Definition: cu_in_wkt.c:164
static int clean_wkt_in_suite(void)
Definition: cu_in_wkt.c:39
static void test_wkt_in_multisurface(void)
Definition: cu_in_wkt.c:297
static void test_wkt_in_polygon(void)
Definition: cu_in_wkt.c:145
static void test_wkt_in_multipolygon(void)
Definition: cu_in_wkt.c:199
static void test_wkt_in_collection(void)
Definition: cu_in_wkt.c:221
static void test_wkt_in_curvpolygon(void)
Definition: cu_in_wkt.c:279
static void test_wkt_double(void)
Definition: cu_in_wkt.c:356
static void test_wkt_in_multicurve(void)
Definition: cu_in_wkt.c:288
static void test_wkt_in_errlocation(void)
Definition: cu_in_wkt.c:337
static void test_wkt_in_polyhedralsurface(void)
Definition: cu_in_wkt.c:315
char * s
Definition: cu_in_wkt.c:23
char * r
Definition: cu_in_wkt.c:24
static void test_wkt_in_multilinestring(void)
Definition: cu_in_wkt.c:189
void wkt_in_suite_setup(void)
Definition: cu_in_wkt.c:407
static void test_wkt_in_circularstring(void)
Definition: cu_in_wkt.c:255
static char * cu_wkt_in(char *wkt, uint8_t variant)
Definition: cu_in_wkt.c:50
static void test_wkt_in_compoundcurve(void)
Definition: cu_in_wkt.c:264
static int init_wkt_in_suite(void)
Definition: cu_in_wkt.c:30
#define PG_ADD_TEST(suite, testfunc)
#define LW_PARSER_CHECK_ALL
Definition: liblwgeom.h:2061
#define WKT_SFSQL
Definition: liblwgeom.h:2131
#define LW_FAILURE
Definition: liblwgeom.h:110
#define WKT_EXTENDED
Definition: liblwgeom.h:2132
#define LW_SUCCESS
Definition: liblwgeom.h:111
void lwgeom_parser_result_init(LWGEOM_PARSER_RESULT *parser_result)
Definition: lwin_wkt.c:880
int lwgeom_parse_wkt(LWGEOM_PARSER_RESULT *parser_result, char *wktstr, int parse_flags)
Parse a WKT geometry string into an LWGEOM structure.
void lwfree(void *mem)
Definition: lwutil.c:242
#define WKT_ISO
Definition: liblwgeom.h:2130
char * lwgeom_to_wkt(const LWGEOM *geom, uint8_t variant, int precision, size_t *size_out)
WKT emitter function.
Definition: lwout_wkt.c:676
void lwgeom_parser_result_free(LWGEOM_PARSER_RESULT *parser_result)
Definition: lwin_wkt.c:886
Parser result structure: returns the result of attempting to convert (E)WKT/(E)WKB to LWGEOM.
Definition: liblwgeom.h:2068