PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches
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*/
23char *s;
24char *r;
25
26/*
27** The suite initialization function.
28** Create any re-used objects.
29*/
30static int init_wkt_in_suite(void)
31{
32 return 0;
33}
34
35/*
36** The suite cleanup function.
37** Frees any global objects.
38*/
39static 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*/
50static 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
70static void test_wkt_in_point(void)
71{
72 s = "POINT(1 2) foobar";
74 CU_ASSERT_STRING_EQUAL("parse error - invalid geometry", r);
75 lwfree(r);
76
77 s = "POINT(1e700 0)";
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)";
84 CU_ASSERT_STRING_EQUAL(r,s);
85 lwfree(r);
86
87 s = "POINT EMPTY";
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
100static void test_wkt_in_linestring(void)
101{
102 s = "LINESTRING EMPTY";
104 CU_ASSERT_STRING_EQUAL(r,s);
105 lwfree(r);
106
107 s = "LINESTRING(0 0,1 1)";
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
145static void test_wkt_in_polygon(void)
146{
147 s = "POLYGON((0 0,0 1,1 1,0 0))";
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))";
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))";
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
164static 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)";
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)";
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))";
193 CU_ASSERT_STRING_EQUAL(r,s);
194 //printf("\nIN: %s\nOUT: %s\n",s,r);
195 lwfree(r);
196
197}
198
200{
201 s = "MULTIPOLYGON(((0 0,0 1,1 1,0 0)))";
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)))";
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
221static 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))";
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
256{
257 s = "CIRCULARSTRING(0 0,0 1,1 1,0 1,2 2)";
259 //printf("\nIN: %s\nOUT: %s\n",s,r);
260 CU_ASSERT_STRING_EQUAL(r,s);
261 lwfree(r);
262}
263
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
279static 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
288static 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
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
306static 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
337static void test_wkt_in_errlocation(void)
338{
340 int rv = 0;
341 char *wkt = 0;
342
343 wkt = "LINESTRING((0 0 0,1 1)";
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
356static void test_wkt_double(void)
357{
359 int rv = 0;
360 char *wkt = 0;
361
362 wkt = "LINESTRING(1.1.1, 2.2.2)";
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)";
373 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
375
376 wkt = "LINESTRING( 1.1 .1 , 2.2 .2 )";
379 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
381
382 wkt = "LINESTRING(\n1.1\n.1,\n2.2\n.2\n)";
385 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
387
388 wkt = "LINESTRING(1.1\t.1\t,\t2.2\t.2\t)";
391 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
393}
394
395static 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*/
406void wkt_in_suite_setup(void);
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
static char * cu_wkt_in(char *wkt, uint8_t variant)
Definition cu_in_wkt.c:50
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 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
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_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
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