PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ test_ptarray_append_ptarray()

static void test_ptarray_append_ptarray ( void  )
static

Definition at line 104 of file cu_ptarray.c.

105{
106 LWLINE *line1, *line2;
107 int ret;
108 char *wkt;
109
110 /* Empty first line */
111 line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING EMPTY"));
112 line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 0,0 10,5 5)"));
113 ret = ptarray_append_ptarray(line1->points, line2->points, -1);
114 CU_ASSERT(ret == LW_SUCCESS);
115 wkt = lwgeom_to_text(lwline_as_lwgeom(line1));
116 ASSERT_STRING_EQUAL(wkt, "LINESTRING(0 0,0 10,5 5)");
117 lwfree(wkt);
118 lwline_free(line2);
119 lwline_free(line1);
120
121 /* Empty second line */
122 line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 0, 5 5, 6 3)"));
123 line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING EMPTY"));
124 ret = ptarray_append_ptarray(line1->points, line2->points, -1);
125 CU_ASSERT(ret == LW_SUCCESS);
126 wkt = lwgeom_to_text(lwline_as_lwgeom(line1));
127 ASSERT_STRING_EQUAL(wkt, "LINESTRING(0 0,5 5,6 3)");
128 lwfree(wkt);
129 lwline_free(line2);
130 lwline_free(line1);
131
132 /* Both lines empty */
133 line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING EMPTY"));
134 line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING EMPTY"));
135 ret = ptarray_append_ptarray(line1->points, line2->points, -1);
136 CU_ASSERT(ret == LW_SUCCESS);
137 wkt = lwgeom_to_text(lwline_as_lwgeom(line1));
138 ASSERT_STRING_EQUAL(wkt, "LINESTRING EMPTY");
139 lwfree(wkt);
140 lwline_free(line2);
141 lwline_free(line1);
142
143 /* Sane sewing */
144 line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(10 4, 0 0,5 7)"));
145 line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(5 7,12 43, 42 15)"));
146 ret = ptarray_append_ptarray(line1->points, line2->points, 0);
147 CU_ASSERT(ret == LW_SUCCESS);
148 wkt = lwgeom_to_text(lwline_as_lwgeom(line1));
149 ASSERT_STRING_EQUAL(wkt, "LINESTRING(10 4,0 0,5 7,12 43,42 15)");
150 lwfree(wkt);
151 lwline_free(line2);
152 lwline_free(line1);
153
154 /* Untolerated sewing */
155 line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(10 4, 0 0,5 7)"));
156 line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(5.5 7,12 43, 42 15)"));
157 ret = ptarray_append_ptarray(line1->points, line2->points, 0);
158 CU_ASSERT(ret == LW_FAILURE);
159 lwline_free(line2);
160 lwline_free(line1);
161
162 /* Tolerated sewing */
163 line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(10 4, 0 0,5 7)"));
164 line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(5.5 7,12 43, 42 15)"));
165 ret = ptarray_append_ptarray(line1->points, line2->points, .7);
166 CU_ASSERT(ret == LW_SUCCESS);
167 wkt = lwgeom_to_text(lwline_as_lwgeom(line1));
168 ASSERT_STRING_EQUAL(wkt, "LINESTRING(10 4,0 0,5 7,5.5 7,12 43,42 15)");
169 lwfree(wkt);
170 lwline_free(line2);
171 lwline_free(line1);
172
173 /* Check user input trust (creates non-simple line */
174 line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 0,0 10)"));
175 line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 0,0 10)"));
176 ret = ptarray_append_ptarray(line1->points, line2->points, -1);
177 CU_ASSERT(ret == LW_SUCCESS);
178 wkt = lwgeom_to_text(lwline_as_lwgeom(line1));
179 ASSERT_STRING_EQUAL(wkt, "LINESTRING(0 0,0 10,0 0,0 10)");
180 lwfree(wkt);
181 lwline_free(line2);
182 lwline_free(line1);
183
184 /* Mixed dimensionality is not allowed */
185 line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 10 0, 10 0 0)"));
186 line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(10 0,11 0)"));
187 ret = ptarray_append_ptarray(line1->points, line2->points, -1);
188 CU_ASSERT(ret == LW_FAILURE);
189 lwline_free(line2);
190 lwline_free(line1);
191
192 /* Appending a read-only pointarray is allowed */
193 line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 10, 10 0)"));
194 line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(10 0,11 0)"));
195 FLAGS_SET_READONLY(line2->points->flags, 1);
196 ret = ptarray_append_ptarray(line1->points, line2->points, -1);
197 CU_ASSERT(ret == LW_SUCCESS);
198 wkt = lwgeom_to_text(lwline_as_lwgeom(line1));
199 ASSERT_STRING_EQUAL(wkt, "LINESTRING(0 10,10 0,11 0)");
200 lwfree(wkt);
201 FLAGS_SET_READONLY(line2->points->flags, 0); /* for lwline_free */
202 lwline_free(line2);
203 lwline_free(line1);
204
205 /* Appending to a read-only pointarray is forbidden */
206 line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 10, 10 0)"));
207 line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(10 0,11 0)"));
208 FLAGS_SET_READONLY(line1->points->flags, 1);
209 ret = ptarray_append_ptarray(line1->points, line2->points, -1);
210 CU_ASSERT(ret == LW_FAILURE);
211 lwline_free(line2);
212 FLAGS_SET_READONLY(line1->points->flags, 0); /* for lwline_free */
213 lwline_free(line1);
214
215}
static char * lwgeom_to_text(const LWGEOM *geom)
Definition cu_ptarray.c:32
static LWGEOM * lwgeom_from_text(const char *str)
Definition cu_ptarray.c:24
#define ASSERT_STRING_EQUAL(o, e)
int ptarray_append_ptarray(POINTARRAY *pa1, POINTARRAY *pa2, double gap_tolerance)
Append a POINTARRAY, pa2 to the end of an existing POINTARRAY, pa1.
Definition ptarray.c:177
#define LW_FAILURE
Definition liblwgeom.h:96
#define LW_SUCCESS
Definition liblwgeom.h:97
void lwfree(void *mem)
Definition lwutil.c:248
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition lwgeom.c:367
LWLINE * lwgeom_as_lwline(const LWGEOM *lwgeom)
Definition lwgeom.c:207
#define FLAGS_SET_READONLY(flags, value)
Definition liblwgeom.h:176
void lwline_free(LWLINE *line)
Definition lwline.c:67
POINTARRAY * points
Definition liblwgeom.h:483
lwflags_t flags
Definition liblwgeom.h:431

References ASSERT_STRING_EQUAL, POINTARRAY::flags, FLAGS_SET_READONLY, LW_FAILURE, LW_SUCCESS, lwfree(), lwgeom_as_lwline(), lwgeom_from_text(), lwgeom_to_text(), lwline_as_lwgeom(), lwline_free(), LWLINE::points, and ptarray_append_ptarray().

Referenced by ptarray_suite_setup().

Here is the call graph for this function:
Here is the caller graph for this function: