--- /dev/null
+/**********************************************************************
+ *
+ * PostGIS - Spatial Types for PostgreSQL
+ * http://postgis.refractions.net
+ *
+ * Copyright (C) 2012 Sandro Santilli <strk@keybit.net>
+ *
+ * This is free software; you can redistribute and/or modify it under
+ * the terms of the GNU General Public Licence. See the COPYING file.
+ *
+ **********************************************************************/
+
+#include "CUnit/Basic.h"
+#include "cu_tester.h"
+
+#include "liblwgeom.h"
+#include "liblwgeom_internal.h"
+
+/*
+ * TODO: change lwgeom_same to lwgeom_equals
+ * (requires porting predicates to liblwgeom)
+ */
+#define check_geom_equal(gobt, gexp) do { \
+ char *obt, *exp; \
+ if ( ! lwgeom_same((gobt), (gexp)) ) { \
+ obt = lwgeom_to_wkt((gobt), WKT_ISO, 8, NULL); \
+ exp = lwgeom_to_wkt((gexp), WKT_ISO, 8, NULL); \
+ printf(" Failure at %s:%d\n", __FILE__, __LINE__); \
+ printf(" Exp: %s\n", exp); \
+ printf(" Obt: %s\n", obt); \
+ free(obt); free(exp); \
+ CU_ASSERT(0); \
+ } else CU_ASSERT(1); \
+} while (0)
+
+/*
+ +-----+
+ | |
+ +-----+-----+
+ | |
+ +-----+
+*/
+static void buildarea1(void)
+{
+ LWGEOM *gin, *gout, *gexp;
+
+ cu_error_msg_reset();
+
+ gin = lwgeom_from_wkt(
+"MULTILINESTRING((0 0, 10 0, 10 10, 0 10, 0 0),(10 10, 20 10, 20 20, 10 20, 10 10))",
+ LW_PARSER_CHECK_NONE);
+ CU_ASSERT( gin != NULL );
+
+ gexp = lwgeom_from_wkt(
+"MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((10 10,10 20,20 20,20 10,10 10)))",
+ LW_PARSER_CHECK_NONE);
+ CU_ASSERT( gexp != NULL );
+
+ gout = lwgeom_buildarea(gin);
+ CU_ASSERT(gout != NULL);
+
+ check_geom_equal(gout, gexp);
+
+ lwgeom_free(gout);
+ lwgeom_free(gexp);
+ lwgeom_free(gin);
+}
+
+/*
+ +-----+-----+
+ | | |
+ +-----+-----+
+*/
+static void buildarea2(void)
+{
+ LWGEOM *gin, *gout, *gexp;
+
+ /* because i don't trust that much prior tests... ;) */
+ cu_error_msg_reset();
+
+ gin = lwgeom_from_wkt(
+"MULTILINESTRING((0 0, 10 0, 10 10, 0 10, 0 0),(10 10, 20 10, 20 0, 10 0, 10 10))",
+ LW_PARSER_CHECK_NONE);
+ CU_ASSERT(gin != NULL);
+
+ gexp = lwgeom_from_wkt(
+"POLYGON((0 0,0 10,10 10,20 10,20 0,10 0,0 0))",
+ LW_PARSER_CHECK_NONE);
+ CU_ASSERT(gexp != NULL);
+
+ gout = lwgeom_buildarea(gin);
+ CU_ASSERT(gout != NULL);
+
+ check_geom_equal(gout, gexp);
+
+ lwgeom_free(gout);
+ lwgeom_free(gexp);
+ lwgeom_free(gin);
+
+}
+
+/*
+ +-----------+
+ | +-----+ |
+ | | | |
+ | +-----+ |
+ +-----------+
+*/
+static void buildarea3(void)
+{
+ LWGEOM *gin, *gout, *gexp;
+
+ cu_error_msg_reset();
+
+ gin = lwgeom_from_wkt(
+"MULTILINESTRING((0 0, 20 0, 20 20, 0 20, 0 0),(2 2, 18 2, 18 18, 2 18, 2 2))",
+ LW_PARSER_CHECK_NONE);
+ CU_ASSERT(gin != NULL);
+
+ gexp = lwgeom_from_wkt(
+"POLYGON((0 0,0 20,20 20,20 0,0 0),(2 2,18 2,18 18,2 18,2 2))",
+ LW_PARSER_CHECK_NONE);
+ CU_ASSERT(gexp != NULL);
+
+ gout = lwgeom_buildarea(gin);
+ CU_ASSERT(gout != NULL);
+
+ check_geom_equal(gout, gexp);
+
+ lwgeom_free(gout);
+ lwgeom_free(gexp);
+ lwgeom_free(gin);
+
+}
+
+/*
+ +-----------+
+ | +-----+ |
+ | | +-+ | |
+ | | | | | |
+ | | +-+ | |
+ | +-----+ |
+ +-----------+
+*/
+static void buildarea4(void)
+{
+ LWGEOM *gin, *gout, *gexp;
+
+ cu_error_msg_reset();
+
+ gin = lwgeom_from_wkt(
+"MULTILINESTRING((0 0, 20 0, 20 20, 0 20, 0 0),(2 2, 18 2, 18 18, 2 18, 2 2),(8 8, 8 12, 12 12, 12 8, 8 8))",
+ LW_PARSER_CHECK_NONE);
+ CU_ASSERT(gin != NULL);
+
+ gexp = lwgeom_from_wkt(
+"MULTIPOLYGON(((0 0,0 20,20 20,20 0,0 0),(2 2,18 2,18 18,2 18,2 2)),((8 8,8 12,12 12,12 8,8 8)))",
+ LW_PARSER_CHECK_NONE);
+ CU_ASSERT(gexp != NULL);
+
+ gout = lwgeom_buildarea(gin);
+ CU_ASSERT(gout != NULL);
+
+ check_geom_equal(gout, gexp);
+
+ lwgeom_free(gout);
+ lwgeom_free(gexp);
+ lwgeom_free(gin);
+
+}
+
+/*
+ +-----------+
+ | +-----+ | This time the innermost ring has
+ | | +-+ | | more points than the other (outer) two.
+ | | | | | |
+ | | +-+ | |
+ | +-----+ |
+ +-----------+
+*/
+static void buildarea4b(void)
+{
+ LWGEOM *gin, *gout, *gexp;
+
+ cu_error_msg_reset();
+
+ gin = lwgeom_from_wkt(
+"MULTILINESTRING((0 0, 20 0, 20 20, 0 20, 0 0),(2 2, 18 2, 18 18, 2 18, 2 2), (8 8, 8 9, 8 10, 8 11, 8 12, 9 12, 10 12, 11 12, 12 12, 12 11, 12 10, 12 9, 12 8, 11 8, 10 8, 9 8, 8 8))",
+ LW_PARSER_CHECK_NONE);
+ CU_ASSERT(gin != NULL);
+
+ gexp = lwgeom_from_wkt(
+"MULTIPOLYGON(((0 0,0 20,20 20,20 0,0 0),(2 2,18 2,18 18,2 18,2 2)),((8 8,8 9,8 10,8 11,8 12,9 12,10 12,11 12,12 12,12 11,12 10,12 9,12 8,11 8,10 8,9 8,8 8)))",
+ LW_PARSER_CHECK_NONE);
+ CU_ASSERT(gexp != NULL);
+
+ gout = lwgeom_buildarea(gin);
+ CU_ASSERT(gout != NULL);
+
+ check_geom_equal(gout, gexp);
+
+ lwgeom_free(gout);
+ lwgeom_free(gexp);
+ lwgeom_free(gin);
+
+}
+
+/*
+ +---------------+
+ | +---------+ |
+ | | +--+--+ | |
+ | | | | | | |
+ | | +--+--+ | |
+ | +---------+ |
+ +---------------+
+*/
+static void buildarea5(void)
+{
+ LWGEOM *gin, *gout, *gexp;
+
+ cu_error_msg_reset();
+
+ gin = lwgeom_from_wkt(
+"MULTILINESTRING((0 0, 20 0, 20 20, 0 20, 0 0),(2 2, 18 2, 18 18, 2 18, 2 2),(8 8, 8 12, 12 12, 12 8, 8 8),(10 8, 10 12))",
+ LW_PARSER_CHECK_NONE);
+ CU_ASSERT(gin != NULL);
+
+ gexp = lwgeom_from_wkt(
+"MULTIPOLYGON(((0 0,0 20,20 20,20 0,0 0),(2 2,18 2,18 18,2 18,2 2)),((8 8,8 12,12 12,12 8,8 8)))",
+ LW_PARSER_CHECK_NONE);
+ CU_ASSERT(gexp != NULL);
+
+ gout = lwgeom_buildarea(gin);
+ CU_ASSERT(gout != NULL);
+
+ check_geom_equal(gout, gexp);
+
+ lwgeom_free(gout);
+ lwgeom_free(gexp);
+ lwgeom_free(gin);
+
+}
+
+/*
+ +---------------+
+ | +----+----+ |
+ | | | | |
+ | | | | |
+ | | | | |
+ | +----+----+ |
+ +---------------+
+*/
+static void buildarea6(void)
+{
+ LWGEOM *gin, *gout, *gexp;
+
+ cu_error_msg_reset();
+
+ gin = lwgeom_from_wkt(
+"MULTILINESTRING((0 0, 20 0, 20 20, 0 20, 0 0),(2 2, 18 2, 18 18, 2 18, 2 2),(10 2, 10 18))",
+ LW_PARSER_CHECK_NONE);
+ CU_ASSERT(gin != NULL);
+
+ gexp = lwgeom_from_wkt(
+"POLYGON((0 0,0 20,20 20,20 0,0 0),(2 2,18 2,18 18,2 18,2 2))",
+ LW_PARSER_CHECK_NONE);
+ CU_ASSERT(gexp != NULL);
+
+ gout = lwgeom_buildarea(gin);
+ CU_ASSERT(gout != NULL);
+
+ check_geom_equal(gout, gexp);
+
+ lwgeom_free(gout);
+ lwgeom_free(gexp);
+ lwgeom_free(gin);
+
+}
+
+/*
+ +--------------------+ +-------+
+ | +-----+ +----+ | | +---+ |
+ | | +-+ | | | | | | | |
+ | | | | | +----+ | | +---+ |
+ | | +-+ | | | | | |
+ | | | | | | | | | |
+ | | +-+ | | | | | |
+ | +-----+ +----+ | | |
+ +--------------------+ +-------+
+*/
+static void buildarea7(void)
+{
+ LWGEOM *gin, *gout, *gexp;
+
+ cu_error_msg_reset();
+
+ gin = lwgeom_from_wkt(
+"MULTILINESTRING( (0 0, 70 0, 70 70, 0 70, 0 0), (10 10, 10 60, 40 60, 40 10, 10 10), (20 20, 20 30, 30 30, 30 20, 20 20), (20 30, 30 30, 30 50, 20 50, 20 30), (50 20, 60 20, 60 40, 50 40, 50 20), (50 40, 60 40, 60 60, 50 60, 50 40), (80 0, 110 0, 110 70, 80 70, 80 0), (90 60, 100 60, 100 50, 90 50, 90 60))",
+ LW_PARSER_CHECK_NONE);
+ CU_ASSERT(gin != NULL);
+
+ gexp = lwgeom_from_wkt(
+"MULTIPOLYGON(((80 0,80 70,110 70,110 0,80 0),(90 60,90 50,100 50,100 60,90 60)),((20 20,20 30,20 50,30 50,30 30,30 20,20 20)),((0 0,0 70,70 70,70 0,0 0),(50 20,60 20,60 40,60 60,50 60,50 40,50 20),(10 10,40 10,40 60,10 60,10 10)))",
+ LW_PARSER_CHECK_NONE);
+ CU_ASSERT(gexp != NULL);
+
+ gout = lwgeom_buildarea(gin);
+ CU_ASSERT(gout != NULL);
+
+ check_geom_equal(gout, gexp);
+
+ lwgeom_free(gout);
+ lwgeom_free(gexp);
+ lwgeom_free(gin);
+
+}
+
+
+/*
+** Used by test harness to register the tests in this file.
+*/
+static CU_TestInfo buildarea_tests[] =
+{
+ PG_TEST(buildarea1),
+ PG_TEST(buildarea2),
+ PG_TEST(buildarea3),
+ PG_TEST(buildarea4),
+ PG_TEST(buildarea4b),
+ PG_TEST(buildarea5),
+ PG_TEST(buildarea6),
+ PG_TEST(buildarea7),
+ CU_TEST_INFO_NULL
+};
+CU_SuiteInfo buildarea_suite = {"buildarea", NULL, NULL, buildarea_tests};