PostGIS  3.7.0dev-r@@SVN_REVISION@@
cu_sfcgal.c
Go to the documentation of this file.
1 /**********************************************************************
2  *
3  * PostGIS - Spatial Types for PostgreSQL
4  * http://postgis.net
5  *
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 "cu_tester.h"
18 #include "liblwgeom.h"
19 
20 extern LWGEOM *lwgeom_sfcgal_noop(const LWGEOM *geom_in);
21 
22 static void
24 {
25  size_t i;
26 
27  char *ewkt[] = {
28  "POINT(0 0.2)",
29  "LINESTRING(-1 -1,-1 2.5,2 2,2 -1)",
30  "TRIANGLE((0 0,-1 1,0 -1,0 0))",
31  "MULTIPOINT(0.9 0.9,0.9 0.9,0.9 0.9,0.9 0.9,0.9 0.9,0.9 0.9)",
32  "SRID=1;MULTILINESTRING((-1 -1,-1 2.5,2 2,2 -1),(-1 -1,-1 2.5,2 2,2 -1),(-1 -1,-1 2.5,2 2,2 -1),(-1 -1,-1 2.5,2 2,2 -1))",
33  "SRID=1;MULTILINESTRING((-1 -1,-1 2.5,2 2,2 -1),(-1 -1,-1 2.5,2 2,2 -1),(-1 -1,-1 2.5,2 2,2 -1),(-1 -1,-1 2.5,2 2,2 -1))",
34  "POLYGON((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0))",
35  "SRID=4326;POLYGON((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0))",
36  "SRID=4326;POLYGON((-1 -1 1,-1 2.5 1,2 2 2,2 -1 2,-1 -1 2),(0 0 1,0 1 1,1 1 1,1 0 2,0 0 2))",
37  "SRID=4326;POLYGON((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0),(-0.5 -0.5,-0.5 -0.4,-0.4 -0.4,-0.4 -0.5,-0.5 -0.5))",
38  "SRID=100000;POLYGON((-1 -1 3,-1 2.5 3,2 2 3,2 -1 3,-1 -1 3),(0 0 3,0 1 3,1 1 3,1 0 3,0 0 3),(-0.5 -0.5 3,-0.5 -0.4 3,-0.4 -0.4 3,-0.4 -0.5 3,-0.5 -0.5 3))",
39  "SRID=4326;MULTIPOLYGON(((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0),(-0.5 -0.5,-0.5 -0.4,-0.4 -0.4,-0.4 -0.5,-0.5 -0.5)),((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0),(-0.5 -0.5,-0.5 -0.4,-0.4 -0.4,-0.4 -0.5,-0.5 -0.5)))",
40  "SRID=4326;GEOMETRYCOLLECTION(POINT(0 1),POLYGON((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0)),MULTIPOLYGON(((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0),(-0.5 -0.5,-0.5 -0.4,-0.4 -0.4,-0.4 -0.5,-0.5 -0.5))))",
41  "POLYHEDRALSURFACE(((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0),(-0.5 -0.5,-0.5 -0.4,-0.4 -0.4,-0.4 -0.5,-0.5 -0.5)),((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0),(-0.5 -0.5,-0.5 -0.4,-0.4 -0.4,-0.4 -0.5,-0.5 -0.5)))",
42  "POLYHEDRALSURFACE(((-1 -1 1,-1 2.5 1,2 2 1,2 -1 1,-1 -1 1),(0 0 1,0 1 1,1 1 1,1 0 1,0 0 1),(-0.5 -0.5 1,-0.5 -0.4 1,-0.4 -0.4 1,-0.4 -0.5 1,-0.5 -0.5 1)),((-1 -1 1,-1 2.5 1,2 2 1,2 -1 1,-1 -1 1),(0 0 1,0 1 1,1 1 1,1 0 1,0 0 1),(-0.5 -0.5 1,-0.5 -0.4 1,-0.4 -0.4 1,-0.4 -0.5 1,-0.5 -0.5 1)))",
43  "TIN(((0 0,0 -1,-1 1,0 0)),((0 0,1 0,0 -1,0 0)))",
44 #if POSTGIS_SFCGAL_VERSION >= 10500
45  // Z/M Support
46  "POINTZM(1 2 3 4)",
47  "LINESTRINGM(0 0 1, 1 1 2, 2 2 3)",
48  "LINESTRINGZM(0 0 1 10, 1 1 2 20, 2 2 3 30)",
49  "TRIANGLEM((0 0 1, 1 1 2, 2 0 3, 0 0 1))",
50  "TRIANGLEZM((0 0 1 10, 1 1 2 20, 2 0 3 30, 0 0 1 10))",
51  "POLYGONM((0 0 1, 0 1 2, 1 1 3, 1 0 4, 0 0 1))",
52  "POLYGONZM((0 0 1 10, 0 1 2 20, 1 1 3 30, 1 0 4 40, 0 0 1 10))",
53  "MULTIPOINTM(0 0 1, 1 1 2, 2 2 3)",
54  "MULTIPOINTZM(0 0 1 10, 1 1 2 20, 2 2 3 30)",
55  "MULTILINESTRINGM((0 0 1, 1 1 2),(2 2 3, 3 3 4))",
56  "MULTILINESTRINGZM((0 0 1 10, 1 1 2 20),(2 2 3 30, 3 3 4 40))",
57  "MULTIPOLYGONM(((0 0 1, 0 1 2, 1 1 3, 1 0 4, 0 0 1)),((2 2 5, 2 3 6, 3 3 7, 3 2 8, 2 2 5)))",
58  "MULTIPOLYGONZM(((0 0 1 10, 0 1 2 20, 1 1 3 30, 1 0 4 40, 0 0 1 10)),((2 2 5 50, 2 3 6 60, 3 3 7 70, 3 2 8 80, 2 2 5 50)))",
59  "TINM(((0 0 1, 0 1 2, 1 0 3, 0 0 1)),((0 0 1, 1 0 3, 1 1 4, 0 0 1)))",
60  "TINZM(((0 0 1 10, 0 1 2 20, 1 0 3 30, 0 0 1 10)),((0 0 1 10, 1 0 3 30, 1 1 4 40, 0 0 1 10)))",
61  "POLYHEDRALSURFACEM(((0 0 1, 0 1 2, 1 1 3, 1 0 4, 0 0 1)),((0 0 1, 1 0 4, 1 -1 5, 0 -1 6, 0 0 1)))",
62  "POLYHEDRALSURFACEZM(((0 0 1 10, 0 1 2 20, 1 1 3 30, 1 0 4 40, 0 0 1 10)),((0 0 1 10, 1 0 4 40, 1 -1 5 50, 0 -1 6 60, 0 0 1 10)))",
63  "GEOMETRYCOLLECTIONM(LINESTRING M(-1 -1 3, 2 19 25, -4 20 15),POLYGONM((0 0 10, 2 19 25, -4 20 15, 0 0 10)))",
64  "GEOMETRYCOLLECTIONZM(LINESTRING ZM(-1 -1 3 4, 2 19 25 250, -4 20 15 150),POLYGONZM((0 0 10 100, 2 19 25 250, -4 20 15 150, 0 0 10 100)))",
65 #endif
66  };
67  char *expected_ewkt[] = {
68  "POINT(0 0.2)",
69  "LINESTRING(-1 -1,-1 2.5,2 2,2 -1)",
70  "TRIANGLE((0 0,-1 1,0 -1,0 0))",
71  "MULTIPOINT(0.9 0.9,0.9 0.9,0.9 0.9,0.9 0.9,0.9 0.9,0.9 0.9)",
72  "SRID=1;MULTILINESTRING((-1 -1,-1 2.5,2 2,2 -1),(-1 -1,-1 2.5,2 2,2 -1),(-1 -1,-1 2.5,2 2,2 -1),(-1 -1,-1 2.5,2 2,2 -1))",
73  "SRID=1;MULTILINESTRING((-1 -1,-1 2.5,2 2,2 -1),(-1 -1,-1 2.5,2 2,2 -1),(-1 -1,-1 2.5,2 2,2 -1),(-1 -1,-1 2.5,2 2,2 -1))",
74  "POLYGON((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0))",
75  "SRID=4326;POLYGON((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0))",
76  "SRID=4326;POLYGON((-1 -1 1,-1 2.5 1,2 2 2,2 -1 2,-1 -1 2),(0 0 1,0 1 1,1 1 1,1 0 2,0 0 2))",
77  "SRID=4326;POLYGON((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0),(-0.5 -0.5,-0.5 -0.4,-0.4 -0.4,-0.4 -0.5,-0.5 -0.5))",
78  "SRID=100000;POLYGON((-1 -1 3,-1 2.5 3,2 2 3,2 -1 3,-1 -1 3),(0 0 3,0 1 3,1 1 3,1 0 3,0 0 3),(-0.5 -0.5 3,-0.5 -0.4 3,-0.4 -0.4 3,-0.4 -0.5 3,-0.5 -0.5 3))",
79  "SRID=4326;MULTIPOLYGON(((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0),(-0.5 -0.5,-0.5 -0.4,-0.4 -0.4,-0.4 -0.5,-0.5 -0.5)),((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0),(-0.5 -0.5,-0.5 -0.4,-0.4 -0.4,-0.4 -0.5,-0.5 -0.5)))",
80  "SRID=4326;GEOMETRYCOLLECTION(POINT(0 1),POLYGON((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0)),MULTIPOLYGON(((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0),(-0.5 -0.5,-0.5 -0.4,-0.4 -0.4,-0.4 -0.5,-0.5 -0.5))))",
81  "POLYHEDRALSURFACE(((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0),(-0.5 -0.5,-0.5 -0.4,-0.4 -0.4,-0.4 -0.5,-0.5 -0.5)),((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0),(-0.5 -0.5,-0.5 -0.4,-0.4 -0.4,-0.4 -0.5,-0.5 -0.5)))",
82  "POLYHEDRALSURFACE(((-1 -1 1,-1 2.5 1,2 2 1,2 -1 1,-1 -1 1),(0 0 1,0 1 1,1 1 1,1 0 1,0 0 1),(-0.5 -0.5 1,-0.5 -0.4 1,-0.4 -0.4 1,-0.4 -0.5 1,-0.5 -0.5 1)),((-1 -1 1,-1 2.5 1,2 2 1,2 -1 1,-1 -1 1),(0 0 1,0 1 1,1 1 1,1 0 1,0 0 1),(-0.5 -0.5 1,-0.5 -0.4 1,-0.4 -0.4 1,-0.4 -0.5 1,-0.5 -0.5 1)))",
83  "TIN(((0 0,0 -1,-1 1,0 0)),((0 0,1 0,0 -1,0 0)))",
84 #if POSTGIS_SFCGAL_VERSION >= 10500
85  // Z/M Support
86  "POINT(1 2 3 4)",
87  "LINESTRINGM(0 0 1,1 1 2,2 2 3)",
88  "LINESTRING(0 0 1 10,1 1 2 20,2 2 3 30)",
89  "TRIANGLEM((0 0 1,1 1 2,2 0 3,0 0 1))",
90  "TRIANGLE((0 0 1 10,1 1 2 20,2 0 3 30,0 0 1 10))",
91  "POLYGONM((0 0 1,0 1 2,1 1 3,1 0 4,0 0 1))",
92  "POLYGON((0 0 1 10,0 1 2 20,1 1 3 30,1 0 4 40,0 0 1 10))",
93  "MULTIPOINTM(0 0 1,1 1 2,2 2 3)",
94  "MULTIPOINT(0 0 1 10,1 1 2 20,2 2 3 30)",
95  "MULTILINESTRINGM((0 0 1,1 1 2),(2 2 3,3 3 4))",
96  "MULTILINESTRING((0 0 1 10,1 1 2 20),(2 2 3 30,3 3 4 40))",
97  "MULTIPOLYGONM(((0 0 1,0 1 2,1 1 3,1 0 4,0 0 1)),((2 2 5,2 3 6,3 3 7,3 2 8,2 2 5)))",
98  "MULTIPOLYGON(((0 0 1 10,0 1 2 20,1 1 3 30,1 0 4 40,0 0 1 10)),((2 2 5 50,2 3 6 60,3 3 7 70,3 2 8 80,2 2 5 50)))",
99  "TINM(((0 0 1,0 1 2,1 0 3,0 0 1)),((0 0 1,1 0 3,1 1 4,0 0 1)))",
100  "TIN(((0 0 1 10,0 1 2 20,1 0 3 30,0 0 1 10)),((0 0 1 10,1 0 3 30,1 1 4 40,0 0 1 10)))",
101  "POLYHEDRALSURFACEM(((0 0 1,0 1 2,1 1 3,1 0 4,0 0 1)),((0 0 1,1 0 4,1 -1 5,0 -1 6,0 0 1)))",
102  "POLYHEDRALSURFACE(((0 0 1 10,0 1 2 20,1 1 3 30,1 0 4 40,0 0 1 10)),((0 0 1 10,1 0 4 40,1 -1 5 50,0 -1 6 60,0 0 1 10)))",
103  "GEOMETRYCOLLECTIONM(LINESTRINGM(-1 -1 3,2 19 25,-4 20 15),POLYGONM((0 0 10,2 19 25,-4 20 15,0 0 10)))",
104  "GEOMETRYCOLLECTION(LINESTRING(-1 -1 3 4,2 19 25 250,-4 20 15 150),POLYGON((0 0 10 100,2 19 25 250,-4 20 15 150,0 0 10 100)))",
105 #endif
106  };
107 
108  for (i = 0; i < (sizeof ewkt / sizeof(char *)); i++)
109  {
110  LWGEOM *geom_in, *geom_out;
111  char *in_ewkt;
112  char *out_ewkt;
113 
114  in_ewkt = ewkt[i];
115  geom_in = lwgeom_from_wkt(in_ewkt, LW_PARSER_CHECK_NONE);
116  geom_out = lwgeom_sfcgal_noop(geom_in);
117  if (!geom_out)
118  {
119  fprintf(stderr, "\nNull return from lwgeom_sfcgal_noop with wkt: %s\n", in_ewkt);
120  lwgeom_free(geom_in);
121  continue;
122  }
123  out_ewkt = lwgeom_to_ewkt(geom_out);
124  if (strcmp(expected_ewkt[i], out_ewkt))
125  fprintf(stderr, "\nTest case %zu failed:\nExp:\t%s\nObt:\t%s\n", i, expected_ewkt[i], out_ewkt);
126  ASSERT_STRING_EQUAL(expected_ewkt[i], out_ewkt);
127  lwfree(out_ewkt);
128  lwgeom_free(geom_out);
129  lwgeom_free(geom_in);
130  }
131 }
132 
133 /*
134 ** Used by test harness to register the tests in this file.
135 */
136 void sfcgal_suite_setup(void);
137 void
139 {
140  CU_pSuite suite = CU_add_suite("sfcgal", NULL, NULL);
142 }
static void test_sfcgal_noop(void)
Definition: cu_sfcgal.c:23
LWGEOM * lwgeom_sfcgal_noop(const LWGEOM *geom_in)
void sfcgal_suite_setup(void)
Definition: cu_sfcgal.c:138
#define PG_ADD_TEST(suite, testfunc)
#define ASSERT_STRING_EQUAL(o, e)
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1218
#define LW_PARSER_CHECK_NONE
Definition: liblwgeom.h:2146
char * lwgeom_to_ewkt(const LWGEOM *lwgeom)
Return an allocated string.
Definition: lwgeom.c:565
void lwfree(void *mem)
Definition: lwutil.c:248
LWGEOM * lwgeom_from_wkt(const char *wkt, const char check)
Definition: lwin_wkt.c:940
This library is the generic geometry handling section of PostGIS.