PostGIS  2.2.7dev-r@@SVN_REVISION@@
cu_clean.c
Go to the documentation of this file.
1 /**********************************************************************
2  *
3  * PostGIS - Spatial Types for PostgreSQL
4  * http://postgis.net
5  *
6  * Copyright (C) 2012 Sandro Santilli <strk@keybit.net>
7  *
8  * This is free software; you can redistribute and/or modify it under
9  * the terms of the GNU General Public Licence. See the COPYING file.
10  *
11  **********************************************************************/
12 
13 #include "CUnit/Basic.h"
14 #include "cu_tester.h"
15 
16 #include "liblwgeom.h"
17 #include "liblwgeom_internal.h"
18 /*
19  * TODO: change lwgeom_same to lwgeom_equals
20  * (requires porting predicates to liblwgeom)
21  */
22 #define check_geom_equal(gobt, gexp) do { \
23  char *obt, *exp; \
24  LWGEOM *ngobt, *ngexp; \
25  ngobt = lwgeom_normalize(gobt); \
26  ngexp = lwgeom_normalize(gexp); \
27  if ( ! lwgeom_same((ngobt), (ngexp)) ) { \
28  obt = lwgeom_to_wkt((ngobt), WKT_ISO, 8, NULL); \
29  exp = lwgeom_to_wkt((ngexp), WKT_ISO, 8, NULL); \
30  printf(" Failure at %s:%d\n", __FILE__, __LINE__); \
31  printf(" Exp: %s\n", exp); \
32  printf(" Obt: %s\n", obt); \
33  free(obt); free(exp); \
34  lwgeom_free(ngobt); lwgeom_free(ngexp); \
35  CU_ASSERT(0); \
36  } else { \
37  lwgeom_free(ngobt); lwgeom_free(ngexp); \
38  CU_ASSERT(1); \
39  } \
40 } while (0)
41 
42 static void test_lwgeom_make_valid(void)
43 {
44 #if POSTGIS_GEOS_VERSION >= 33
45  LWGEOM *gin, *gout, *gexp;
46  char *ewkt;
47 
48  /* Because i don't trust that much prior tests... ;) */
50 
51  gin = lwgeom_from_wkt(
52 "MULTIPOLYGON(((1725063 4819121, 1725104 4819067, 1725060 4819087, 1725064.14183882 4819094.70208557,1725064.13656044 4819094.70235069,1725064.14210359 4819094.70227252,1725064.14210362 4819094.70227252,1725064.13656043 4819094.70235069,1725055. 4819094, 1725055 4819094, 1725055 4819094, 1725063 4819121)))",
54  CU_ASSERT(gin != NULL);
55 
56  gout = lwgeom_make_valid(gin);
57 
58  /* We're really only interested in avoiding a crash in here.
59  * See http://trac.osgeo.org/postgis/ticket/1738
60  * TODO: enhance the test if we find a workaround
61  * to the excepion:
62  * See http://trac.osgeo.org/postgis/ticket/1735
63  */
64 
65  lwgeom_free(gout);
66  lwgeom_free(gin);
67 
68  /* Test for http://trac.osgeo.org/postgis/ticket/2307 */
69 
70  gin = lwgeom_from_hexwkb("0106000020E6100000010000000103000000010000000A0000004B7DA956B99844C0DB0790FE8B4D1DC010BA74A9AF9444C049AFFC5B8C4D1DC03FC6CC690D9844C0DD67E5628C4D1DC07117B56B0D9844C0C80ABA67C45E1DC0839166ABAF9444C0387D4568C45E1DC010BA74A9AF9444C049AFFC5B8C4D1DC040C3CD74169444C0362EC0608C4D1DC07C1A3B77169444C0DC3ADB40B2641DC03AAE5F68B99844C0242948DEB1641DC04B7DA956B99844C0DB0790FE8B4D1DC0", LW_PARSER_CHECK_NONE);
71  CU_ASSERT(gin != NULL);
72 
73  gout = lwgeom_make_valid(gin);
74  CU_ASSERT(gout != NULL);
75  lwgeom_free(gin);
76 
77  /* We're really only interested in avoiding memory problems.
78  * Convertion to ewkt ensures full scan of coordinates thus
79  * triggering the error, if any
80  */
81  ewkt = lwgeom_to_ewkt(gout);
82  lwgeom_free(gout);
83  lwfree(ewkt);
84 
85 
86  /* Test collection */
87 
88  gin = lwgeom_from_wkt(
89 "GEOMETRYCOLLECTION(LINESTRING(0 0, 0 0), POLYGON((0 0, 10 10, 10 0, 0 10, 0 0)), LINESTRING(10 0, 10 10))",
91  CU_ASSERT(gin != NULL);
92 
93  gout = lwgeom_make_valid(gin);
94  CU_ASSERT(gout != NULL);
95 
96  ewkt = lwgeom_to_ewkt(gout);
97  /* printf("c = %s\n", ewkt); */
98  /*
99  TODO: This doesn't work on windows returns in different order.
100  strk figure out why. For now will replace with normalized version
101  */
102 /* CU_ASSERT_STRING_EQUAL(ewkt,
103 "GEOMETRYCOLLECTION(POINT(0 0),MULTIPOLYGON(((5 5,0 0,0 10,5 5)),((5 5,10 10,10 0,5 5))),LINESTRING(10 0,10 10))");*/
104  gexp = lwgeom_from_wkt(
105 "GEOMETRYCOLLECTION(POINT(0 0),MULTIPOLYGON(((5 5,0 0,0 10,5 5)),((5 5,10 10,10 0,5 5))),LINESTRING(10 0,10 10))",
107  check_geom_equal(gout, gexp);
108  lwfree(ewkt);
109 
110  lwgeom_free(gout);
111  lwgeom_free(gin);
112  lwgeom_free(gexp);
113 
114  /* Test multipoint */
115 
116  gin = lwgeom_from_wkt(
117 "MULTIPOINT(0 0,1 1,2 2)",
119  CU_ASSERT(gin != NULL);
120 
121  gout = lwgeom_make_valid(gin);
122  CU_ASSERT(gout != NULL);
123 
124  ewkt = lwgeom_to_ewkt(gout);
125  /* printf("c = %s\n", ewkt); */
126  CU_ASSERT_STRING_EQUAL(ewkt,
127 "MULTIPOINT(0 0,1 1,2 2)");
128  lwfree(ewkt);
129 
130  lwgeom_free(gout);
131  lwgeom_free(gin);
132 
133  /* Test unclosed polygon */
134 
135  gin = lwgeom_from_hexwkb(
136 "0103000000010000000400000000000000000024400000000000003640000000000000244000000000000040400000000000003440000000000000404000000000000034400000000000003640",
138  CU_ASSERT(gin != NULL);
139 
140  gout = lwgeom_make_valid(gin);
141  CU_ASSERT(gout != NULL);
142 
143  ewkt = lwgeom_to_ewkt(gout);
144  /* printf("c = %s\n", ewkt); */
145  CU_ASSERT_STRING_EQUAL(ewkt,
146 "POLYGON((10 22,10 32,20 32,20 22,10 22))");
147  lwfree(ewkt);
148 
149  lwgeom_free(gout);
150  lwgeom_free(gin);
151 
152 #endif /* POSTGIS_GEOS_VERSION >= 33 */
153 }
154 
155 /* TODO: add more tests ! */
156 
157 
158 /*
159 ** Used by test harness to register the tests in this file.
160 */
161 void clean_suite_setup(void);
163 {
164  CU_pSuite suite = CU_add_suite("geometry_clean", NULL, NULL);
166 }
void lwfree(void *mem)
Definition: lwutil.c:214
char * lwgeom_to_ewkt(const LWGEOM *lwgeom)
Return an alloced string.
Definition: lwgeom.c:469
#define check_geom_equal(gobt, gexp)
Definition: cu_clean.c:22
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1050
static void test_lwgeom_make_valid(void)
Definition: cu_clean.c:42
LWGEOM * lwgeom_from_wkt(const char *wkt, const char check)
Definition: lwin_wkt.c:890
#define LW_PARSER_CHECK_NONE
Definition: liblwgeom.h:1869
LWGEOM * lwgeom_make_valid(LWGEOM *geom)
Attempts to make an invalid geometries valid w/out losing points.
void cu_error_msg_reset()
#define PG_ADD_TEST(suite, testfunc)
LWGEOM * lwgeom_from_hexwkb(const char *hexwkb, const char check)
Definition: lwin_wkb.c:779
void clean_suite_setup(void)
Definition: cu_clean.c:162
This library is the generic geometry handling section of PostGIS.