PostGIS  3.0.6dev-r@@SVN_REVISION@@

◆ test_lwgeom_from_gserialized2()

static void test_lwgeom_from_gserialized2 ( void  )
static

Definition at line 179 of file cu_gserialized2.c.

180 {
181  LWGEOM *geom1, *geom2;
182  GSERIALIZED *g1, *g2;
183  char *in_ewkt, *out_ewkt;
184  size_t i = 0;
185 
186  char *ewkt[] =
187  {
188  "POINT EMPTY",
189  "POINT(0 0.2)",
190  "LINESTRING EMPTY",
191  "LINESTRING(-1 -1,-1 2.5,2 2,2 -1)",
192  "MULTIPOINT EMPTY",
193  "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)",
194  "MULTIPOINT(0.9 0.9,0.9 0.9,EMPTY,0.9 0.9,0.9 0.9,0.9 0.9)",
195  "SRID=1;MULTILINESTRING EMPTY",
196  "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))",
197  "POLYGON((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0))",
198  "POLYGON EMPTY",
199  "SRID=4326;POLYGON((-1 -1,-1 2.5,2 2,2 -1,-1 -1),(0 0,0 1,1 1,1 0,0 0))",
200  "SRID=4326;POLYGON EMPTY",
201  "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))",
202  "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))",
203  "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)))",
204  "SRID=4326;MULTIPOLYGON EMPTY",
205  "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))))",
206  "SRID=4326;GEOMETRYCOLLECTION EMPTY",
207  "SRID=4326;GEOMETRYCOLLECTION(POINT EMPTY,MULTIPOLYGON EMPTY)",
208  "SRID=4326;GEOMETRYCOLLECTION(POINT(0 0.2),POINT EMPTY,POINT(0 0.2))",
209  "MULTICURVE((5 5 1 3,3 5 2 2,3 3 3 1,0 3 1 1),CIRCULARSTRING(0 0 0 0,0.26794 1 3 -2,0.5857864 1.414213 1 2))",
210  "MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(-2 0,-1 -1,0 0,1 -1,2 0,0 2,-2 0),(-1 0,0 0.5,1 0,0 1,-1 0)),((7 8,10 10,6 14,4 11,7 8)))",
211  "MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING EMPTY))",
212  "POLYHEDRALSURFACE(((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)),((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)),((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)),((1 0 0,1 1 0,1 1 1,1 0 1,1 0 0)),((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)))",
213  };
214 
215  for ( i = 0; i < (sizeof ewkt/sizeof(char*)); i++ )
216  {
217  size_t size1, size2;
218 
219  in_ewkt = ewkt[i];
220  geom1 = lwgeom_from_wkt(in_ewkt, LW_PARSER_CHECK_NONE);
221  lwgeom_add_bbox(geom1);
222  if (geom1->bbox) gbox_float_round(geom1->bbox);
223  size1 = gserialized2_from_lwgeom_size(geom1);
224  g1 = gserialized2_from_lwgeom(geom1, &size2);
225  CU_ASSERT_EQUAL(size1, size2);
226 
227  geom2 = lwgeom_from_gserialized2(g1);
228  out_ewkt = lwgeom_to_ewkt(geom2);
229 
230  /* printf("\n in = %s\nout = %s\n", in_ewkt, out_ewkt); */
231  CU_ASSERT_STRING_EQUAL(in_ewkt, out_ewkt);
232  g2 = gserialized2_from_lwgeom(geom2, &size2);
233  CU_ASSERT_EQUAL(g1->gflags, g2->gflags);
234 
235  /* either both or none of the bboxes are null */
236  CU_ASSERT(geom1->bbox != NULL || geom2->bbox == NULL);
237 
238  /* either both are null or they are the same */
239  CU_ASSERT(geom1->bbox == NULL || gbox_same(geom1->bbox, geom2->bbox));
240 
241  lwfree(out_ewkt);
242  lwfree(g1);
243  lwfree(g2);
244  lwgeom_free(geom1);
245  lwgeom_free(geom2);
246 
247  /* SOLID / BOX INTERACTION */
248  geom1 = lwgeom_from_wkt(in_ewkt, LW_PARSER_CHECK_NONE);
249  lwgeom_add_bbox(geom1);
250  FLAGS_SET_SOLID(geom1->flags, 1);
251  size1 = gserialized2_from_lwgeom_size(geom1);
252  g1 = gserialized2_from_lwgeom(geom1, &size2);
253  CU_ASSERT_EQUAL(size1, size2);
254  CU_ASSERT_EQUAL(SIZE_GET(g1->size), size2);
255  geom2 = lwgeom_from_gserialized2(g1);
256  CU_ASSERT_EQUAL(geom1->flags, geom2->flags);
257  g2 = gserialized2_from_lwgeom(geom2, &size2);
258  CU_ASSERT_EQUAL(SIZE_GET(g2->size), size2);
259  CU_ASSERT_EQUAL(g1->gflags, g2->gflags);
260  CU_ASSERT_EQUAL(FLAGS_GET_SOLID(geom2->flags), 1);
261  lwfree(g1);
262  lwfree(g2);
263  lwgeom_free(geom1);
264  lwgeom_free(geom2);
265  }
266 
267 }
int gbox_same(const GBOX *g1, const GBOX *g2)
Check if 2 given Gbox are the same.
Definition: gbox.c:164
void gbox_float_round(GBOX *gbox)
Round given GBOX to float boundaries.
Definition: gbox.c:774
LWGEOM * lwgeom_from_gserialized2(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
size_t gserialized2_from_lwgeom_size(const LWGEOM *geom)
Return the memory size a GSERIALIZED will occupy for a given LWGEOM.
Definition: gserialized2.c:774
GSERIALIZED * gserialized2_from_lwgeom(LWGEOM *geom, size_t *size)
Allocate a new GSERIALIZED from an LWGEOM.
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1138
#define LW_PARSER_CHECK_NONE
Definition: liblwgeom.h:2060
char * lwgeom_to_ewkt(const LWGEOM *lwgeom)
Return an alloced string.
Definition: lwgeom.c:547
void lwfree(void *mem)
Definition: lwutil.c:242
#define FLAGS_GET_SOLID(flags)
Definition: liblwgeom.h:184
LWGEOM * lwgeom_from_wkt(const char *wkt, const char check)
Definition: lwin_wkt.c:905
#define FLAGS_SET_SOLID(flags, value)
Definition: liblwgeom.h:191
void lwgeom_add_bbox(LWGEOM *lwgeom)
Compute a bbox if not already computed.
Definition: lwgeom.c:677
#define SIZE_GET(varsize)
Macro for reading the size from the GSERIALIZED size attribute.
uint32_t size
Definition: liblwgeom.h:430
uint8_t gflags
Definition: liblwgeom.h:432
GBOX * bbox
Definition: liblwgeom.h:444
lwflags_t flags
Definition: liblwgeom.h:447

References LWGEOM::bbox, LWGEOM::flags, FLAGS_GET_SOLID, FLAGS_SET_SOLID, gbox_float_round(), gbox_same(), GSERIALIZED::gflags, gserialized2_from_lwgeom(), gserialized2_from_lwgeom_size(), LW_PARSER_CHECK_NONE, lwfree(), lwgeom_add_bbox(), lwgeom_free(), lwgeom_from_gserialized2(), lwgeom_from_wkt(), lwgeom_to_ewkt(), GSERIALIZED::size, and SIZE_GET.

Referenced by gserialized2_suite_setup().

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