PostGIS  3.4.0dev-r@@SVN_REVISION@@
cu_out_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 ** Global variable to hold WKT strings
22 */
23 static char *s = NULL;
24 
25 /*
26 ** The suite initialization function.
27 ** Create any re-used objects.
28 */
29 static int init_wkt_out_suite(void)
30 {
31  s = NULL;
32  return 0;
33 }
34 
35 /*
36 ** The suite cleanup function.
37 ** Frees any global objects.
38 */
39 static int clean_wkt_out_suite(void)
40 {
41  if ( s ) free(s);
42  s = NULL;
43  return 0;
44 }
45 
46 static char* cu_wkt(char *wkt, uint8_t variant)
47 {
49  if ( s ) free(s);
50  if ( ! g )
51  {
52  printf("error converting '%s' to lwgeom\n", wkt);
53  exit(0);
54  }
55  s = lwgeom_to_wkt(g, variant, 8, NULL);
56  lwgeom_free(g);
57  return s;
58 }
59 
60 static void test_wkt_out_point(void)
61 {
62  CU_ASSERT_STRING_EQUAL(cu_wkt("POINT(0.1111 0.1111 0.1111 0)",WKT_ISO), "POINT ZM (0.1111 0.1111 0.1111 0)");
63  CU_ASSERT_STRING_EQUAL(cu_wkt("POINT(0 0 0 0)",WKT_EXTENDED), "POINT(0 0 0 0)");
64  CU_ASSERT_STRING_EQUAL(cu_wkt("POINT(0 0 0 0)",WKT_SFSQL), "POINT(0 0)");
65 
66  CU_ASSERT_STRING_EQUAL(cu_wkt("POINTM(0 0 0)",WKT_ISO), "POINT M (0 0 0)");
67  CU_ASSERT_STRING_EQUAL(cu_wkt("POINTM(0 0 0)",WKT_EXTENDED), "POINTM(0 0 0)");
68  CU_ASSERT_STRING_EQUAL(cu_wkt("POINTM(0 0 0)",WKT_SFSQL), "POINT(0 0)");
69 
70  CU_ASSERT_STRING_EQUAL(cu_wkt("POINT(100 100)",WKT_ISO), "POINT(100 100)");
71  CU_ASSERT_STRING_EQUAL(cu_wkt("POINT(100 100)",WKT_EXTENDED), "POINT(100 100)");
72  CU_ASSERT_STRING_EQUAL(cu_wkt("POINT(100 100)",WKT_SFSQL), "POINT(100 100)");
73 
74  CU_ASSERT_STRING_EQUAL(cu_wkt("POINT(100.1 100 12 12)",WKT_ISO), "POINT ZM (100.1 100 12 12)");
75  CU_ASSERT_STRING_EQUAL(cu_wkt("POINT(100.1 100 12 12)",WKT_EXTENDED), "POINT(100.1 100 12 12)");
76  CU_ASSERT_STRING_EQUAL(cu_wkt("POINT(100.1 100 12 12)",WKT_SFSQL), "POINT(100.1 100)");
77 
78  CU_ASSERT_STRING_EQUAL(cu_wkt("SRID=100;POINT(100.1 100 12 12)",WKT_SFSQL), "POINT(100.1 100)");
79  CU_ASSERT_STRING_EQUAL(cu_wkt("SRID=100;POINT(100.1 100 12 12)",WKT_EXTENDED), "SRID=100;POINT(100.1 100 12 12)");
80 
81  /* Test big numbers */
82  ASSERT_STRING_EQUAL(cu_wkt("POINT(-123456789012345.12345678 -1234567890123458.12345678)", WKT_ISO),
83  "POINT(-123456789012345.12 -1.23456789e+15)");
85  cu_wkt(
86  "POINT( "
87  "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 "
88  "0.000000000000000000000000000001)",
89  WKT_ISO),
90  "POINT(1e+100 1e-30)");
91 }
92 
93 static void test_wkt_out_linestring(void)
94 {
95  CU_ASSERT_STRING_EQUAL(cu_wkt("LINESTRING(1 2 3 4,5 6 7 8)",WKT_ISO), "LINESTRING ZM (1 2 3 4,5 6 7 8)");
96  CU_ASSERT_STRING_EQUAL(cu_wkt("LINESTRING(1 2 3,5 6 7)",WKT_ISO), "LINESTRING Z (1 2 3,5 6 7)");
97  CU_ASSERT_STRING_EQUAL(cu_wkt("LINESTRINGM(1 2 3,5 6 7)",WKT_ISO), "LINESTRING M (1 2 3,5 6 7)");
98 }
99 
100 static void test_wkt_out_polygon(void)
101 {
102  CU_ASSERT_STRING_EQUAL(
103  cu_wkt("POLYGON((100 100 2, 100 200 2, 200 200 2, 200 100 2, 100 100 2))",WKT_ISO),
104  "POLYGON Z ((100 100 2,100 200 2,200 200 2,200 100 2,100 100 2))"
105  );
106  CU_ASSERT_STRING_EQUAL(
107  cu_wkt("POLYGON((100 100 2, 100 200 2, 200 200 2, 200 100 2, 100 100 2))",WKT_EXTENDED),
108  "POLYGON((100 100 2,100 200 2,200 200 2,200 100 2,100 100 2))"
109  );
110 }
111 static void test_wkt_out_multipoint(void)
112 {
113  CU_ASSERT_STRING_EQUAL(cu_wkt("MULTIPOINT(1 2 3 4,5 6 7 8)",WKT_ISO), "MULTIPOINT ZM ((1 2 3 4),(5 6 7 8))");
114  CU_ASSERT_STRING_EQUAL(cu_wkt("MULTIPOINT(1 2 3,5 6 7)",WKT_ISO), "MULTIPOINT Z ((1 2 3),(5 6 7))");
115  CU_ASSERT_STRING_EQUAL(cu_wkt("MULTIPOINTM(1 2 3,5 6 7)",WKT_ISO), "MULTIPOINT M ((1 2 3),(5 6 7))");
116 
117 }
118 
120 {
121  CU_ASSERT_STRING_EQUAL(
122  cu_wkt("MULTILINESTRING((1 2 3 4,5 6 7 8))",WKT_ISO),
123  "MULTILINESTRING ZM ((1 2 3 4,5 6 7 8))"
124  );
125  CU_ASSERT_STRING_EQUAL(
126  cu_wkt("MULTILINESTRING((1 2 3,5 6 7))",WKT_ISO),
127  "MULTILINESTRING Z ((1 2 3,5 6 7))"
128  );
129  CU_ASSERT_STRING_EQUAL(
130  cu_wkt("MULTILINESTRINGM((1 2 3,5 6 7))",WKT_ISO),
131  "MULTILINESTRING M ((1 2 3,5 6 7))"
132  );
133 }
134 
135 static void test_wkt_out_multipolygon(void)
136 {
137  CU_ASSERT_STRING_EQUAL(
138  cu_wkt("MULTIPOLYGON(((100 100 2, 100 200 2, 200 200 2, 200 100 2, 100 100 2)))",WKT_ISO),
139  "MULTIPOLYGON Z (((100 100 2,100 200 2,200 200 2,200 100 2,100 100 2)))"
140  );
141  CU_ASSERT_STRING_EQUAL(
142  cu_wkt("MULTIPOLYGON(((100 100 2, 100 200 2, 200 200 2, 200 100 2, 100 100 2)))",WKT_EXTENDED),
143  "MULTIPOLYGON(((100 100 2,100 200 2,200 200 2,200 100 2,100 100 2)))"
144  );
145 }
146 
147 static void test_wkt_out_collection(void)
148 {
149  //printf("%s\n",cu_wkt("GEOMETRYCOLLECTION(MULTIPOLYGON(((100 100 2, 100 200 2, 200 200 2, 200 100 2, 100 100 2))),MULTIPOINT(.5 .5 .5,1 1 1),CURVEPOLYGON((.8 .8 .8,.8 .8 .8,.8 .8 .8)))",WKT_ISO));
150  CU_ASSERT_STRING_EQUAL(
151  cu_wkt("GEOMETRYCOLLECTION(POLYGON((100 100 2, 100 200 2, 200 200 2, 200 100 2, 100 100 2)),POINT(.5 .5 .5),CIRCULARSTRING(.8 .8 .8,.8 .8 .8,.8 .8 .8))",WKT_ISO),
152  "GEOMETRYCOLLECTION Z (POLYGON Z ((100 100 2,100 200 2,200 200 2,200 100 2,100 100 2)),POINT Z (0.5 0.5 0.5),CIRCULARSTRING Z (0.8 0.8 0.8,0.8 0.8 0.8,0.8 0.8 0.8))"
153  );
154  CU_ASSERT_STRING_EQUAL(
155  cu_wkt("GEOMETRYCOLLECTION(MULTIPOLYGON(((100 100 2, 100 200 2, 200 200 2, 200 100 2, 100 100 2))),MULTIPOINT(.5 .5 .5,1 1 1),CURVEPOLYGON((.8 .8 .8,.8 .8 .8,.8 .8 .8)))",WKT_ISO),
156  "GEOMETRYCOLLECTION Z (MULTIPOLYGON Z (((100 100 2,100 200 2,200 200 2,200 100 2,100 100 2))),MULTIPOINT Z ((0.5 0.5 0.5),(1 1 1)),CURVEPOLYGON Z ((0.8 0.8 0.8,0.8 0.8 0.8,0.8 0.8 0.8)))"
157  );
158 
159  /* See http://trac.osgeo.org/postgis/ticket/724 */
160  CU_ASSERT_STRING_EQUAL(
161  cu_wkt("GEOMETRYCOLLECTIONM(MULTIPOINTM(0 0 0), POINTM(1 1 1))", WKT_EXTENDED),
162  "GEOMETRYCOLLECTIONM(MULTIPOINTM(0 0 0),POINTM(1 1 1))"
163  );
164 }
165 
167 {
168  CU_ASSERT_STRING_EQUAL(
169  cu_wkt("CIRCULARSTRING(1 2 3 4,4 5 6 7,7 8 9 0)",WKT_ISO),
170  "CIRCULARSTRING ZM (1 2 3 4,4 5 6 7,7 8 9 0)"
171  );
172  CU_ASSERT_STRING_EQUAL(
173  cu_wkt("CIRCULARSTRING(1 2 3 4,4 5 6 7,7 8 9 0)",WKT_EXTENDED),
174  "CIRCULARSTRING(1 2 3 4,4 5 6 7,7 8 9 0)"
175  );
176  //printf("%s\n",cu_wkt("GEOMETRYCOLLECTION(MULTIPOLYGON(((100 100 2, 100 200 2, 200 200 2, 200 100 2, 100 100 2))),MULTIPOINT(.5 .5 .5,1 1 1),CURVEPOLYGON((.8 .8 .8,.8 .8 .8,.8 .8 .8)))",WKT_ISO));
177 }
178 
179 static void test_wkt_out_compoundcurve(void)
180 {
181  CU_ASSERT_STRING_EQUAL(
182  cu_wkt("COMPOUNDCURVE((1 2 3 4,4 5 6 7,7 8 9 0),CIRCULARSTRING(7 8 9 0,4 3 2 1,1 2 3 4,4 5 6 7,7 8 9 0))",WKT_ISO),
183  "COMPOUNDCURVE ZM ((1 2 3 4,4 5 6 7,7 8 9 0),CIRCULARSTRING ZM (7 8 9 0,4 3 2 1,1 2 3 4,4 5 6 7,7 8 9 0))"
184  );
185 }
186 
187 static void test_wkt_out_curvpolygon(void)
188 {
189  CU_ASSERT_STRING_EQUAL(
190  cu_wkt("CURVEPOLYGON((1 2 3 4,4 5 6 7,7 8 9 0),CIRCULARSTRING(7 8 9 0,1 2 1 1,1 2 3 4,4 5 6 7,7 8 9 0))",WKT_ISO),
191  "CURVEPOLYGON ZM ((1 2 3 4,4 5 6 7,7 8 9 0),CIRCULARSTRING ZM (7 8 9 0,1 2 1 1,1 2 3 4,4 5 6 7,7 8 9 0))"
192  );
193 }
194 
195 static void test_wkt_out_multicurve(void)
196 {
197  CU_ASSERT_STRING_EQUAL(
198  cu_wkt("MULTICURVE((1 2 3 4,4 5 6 7,7 8 9 0),CIRCULARSTRING(1 2 3 4,4 5 6 7,7 8 9 0))",WKT_ISO),
199  "MULTICURVE ZM ((1 2 3 4,4 5 6 7,7 8 9 0),CIRCULARSTRING ZM (1 2 3 4,4 5 6 7,7 8 9 0))"
200  );
201  CU_ASSERT_STRING_EQUAL(
202  cu_wkt("MULTICURVE(COMPOUNDCURVE((1 2 3 4,4 5 6 7,7 8 9 0),CIRCULARSTRING(7 8 9 0,8 9 0 0,1 2 3 4,4 5 6 7,7 8 9 0)),(1 2 3 4,4 5 6 7,7 8 9 0),CIRCULARSTRING(1 2 3 4,4 5 6 7,7 8 9 0))",WKT_ISO),
203  "MULTICURVE ZM (COMPOUNDCURVE ZM ((1 2 3 4,4 5 6 7,7 8 9 0),CIRCULARSTRING ZM (7 8 9 0,8 9 0 0,1 2 3 4,4 5 6 7,7 8 9 0)),(1 2 3 4,4 5 6 7,7 8 9 0),CIRCULARSTRING ZM (1 2 3 4,4 5 6 7,7 8 9 0))"
204  );
205 }
206 
207 static void test_wkt_out_multisurface(void)
208 {
209  CU_ASSERT_STRING_EQUAL(
210  cu_wkt("MULTISURFACE(((1 2 3 4,4 5 6 7,7 8 9 0)),CURVEPOLYGON((1 2 3 4,4 5 6 7,7 8 9 0)))",WKT_ISO),
211  "MULTISURFACE ZM (((1 2 3 4,4 5 6 7,7 8 9 0)),CURVEPOLYGON ZM ((1 2 3 4,4 5 6 7,7 8 9 0)))"
212  );
213 
214 }
215 
216 /*
217 ** Used by test harness to register the tests in this file.
218 */
219 void wkt_out_suite_setup(void);
221 {
222  CU_pSuite suite = CU_add_suite("wkt_output", init_wkt_out_suite, clean_wkt_out_suite);
235 }
static uint8_t variant
Definition: cu_in_twkb.c:26
static int init_wkt_out_suite(void)
Definition: cu_out_wkt.c:29
void wkt_out_suite_setup(void)
Definition: cu_out_wkt.c:220
static int clean_wkt_out_suite(void)
Definition: cu_out_wkt.c:39
static void test_wkt_out_circularstring(void)
Definition: cu_out_wkt.c:166
static void test_wkt_out_polygon(void)
Definition: cu_out_wkt.c:100
static void test_wkt_out_linestring(void)
Definition: cu_out_wkt.c:93
static void test_wkt_out_collection(void)
Definition: cu_out_wkt.c:147
static void test_wkt_out_curvpolygon(void)
Definition: cu_out_wkt.c:187
static void test_wkt_out_multipolygon(void)
Definition: cu_out_wkt.c:135
static void test_wkt_out_multipoint(void)
Definition: cu_out_wkt.c:111
static void test_wkt_out_multisurface(void)
Definition: cu_out_wkt.c:207
static void test_wkt_out_compoundcurve(void)
Definition: cu_out_wkt.c:179
static char * s
Definition: cu_out_wkt.c:23
static void test_wkt_out_point(void)
Definition: cu_out_wkt.c:60
static void test_wkt_out_multilinestring(void)
Definition: cu_out_wkt.c:119
static char * cu_wkt(char *wkt, uint8_t variant)
Definition: cu_out_wkt.c:46
static void test_wkt_out_multicurve(void)
Definition: cu_out_wkt.c:195
#define PG_ADD_TEST(suite, testfunc)
#define ASSERT_STRING_EQUAL(o, e)
#define WKT_SFSQL
Definition: liblwgeom.h:2185
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1155
#define LW_PARSER_CHECK_NONE
Definition: liblwgeom.h:2114
#define WKT_EXTENDED
Definition: liblwgeom.h:2186
#define WKT_ISO
Definition: liblwgeom.h:2184
char * lwgeom_to_wkt(const LWGEOM *geom, uint8_t variant, int precision, size_t *size_out)
WKT emitter function.
Definition: lwout_wkt.c:708
LWGEOM * lwgeom_from_wkt(const char *wkt, const char check)
Definition: lwin_wkt.c:905
void free(void *)