From 773dd56ad77bd761310211f9bdc0e14a1f5501d8 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Wed, 9 May 2012 12:08:06 +0000 Subject: [PATCH] Add unit test for lwgeom_buildarea (useful for #1806) git-svn-id: http://svn.osgeo.org/postgis/trunk@9730 b70326c6-7e19-0410-871a-916f4a2858ee --- liblwgeom/cunit/Makefile.in | 1 + liblwgeom/cunit/cu_buildarea.c | 334 +++++++++++++++++++++++++++++++++ liblwgeom/cunit/cu_tester.c | 2 + 3 files changed, 337 insertions(+) create mode 100644 liblwgeom/cunit/cu_buildarea.c diff --git a/liblwgeom/cunit/Makefile.in b/liblwgeom/cunit/Makefile.in index 36d4d4833..0cc1df3e1 100644 --- a/liblwgeom/cunit/Makefile.in +++ b/liblwgeom/cunit/Makefile.in @@ -23,6 +23,7 @@ CUNIT_CPPFLAGS=@CUNIT_CPPFLAGS@ -I.. # ADD YOUR NEW TEST FILE HERE (1/1) OBJS= \ cu_algorithm.o \ + cu_buildarea.o \ cu_clean.o \ cu_print.o \ cu_misc.o \ diff --git a/liblwgeom/cunit/cu_buildarea.c b/liblwgeom/cunit/cu_buildarea.c new file mode 100644 index 000000000..eefbf98fe --- /dev/null +++ b/liblwgeom/cunit/cu_buildarea.c @@ -0,0 +1,334 @@ +/********************************************************************** + * + * PostGIS - Spatial Types for PostgreSQL + * http://postgis.refractions.net + * + * Copyright (C) 2012 Sandro Santilli + * + * 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}; diff --git a/liblwgeom/cunit/cu_tester.c b/liblwgeom/cunit/cu_tester.c index 49816443e..43301bed6 100644 --- a/liblwgeom/cunit/cu_tester.c +++ b/liblwgeom/cunit/cu_tester.c @@ -19,6 +19,7 @@ /* ADD YOUR SUITE HERE (1 of 2) */ extern CU_SuiteInfo print_suite; extern CU_SuiteInfo algorithms_suite; +extern CU_SuiteInfo buildarea_suite; extern CU_SuiteInfo clean_suite; extern CU_SuiteInfo misc_suite; extern CU_SuiteInfo ptarray_suite; @@ -55,6 +56,7 @@ int main(int argc, char *argv[]) misc_suite, ptarray_suite, algorithms_suite, + buildarea_suite, clean_suite, measures_suite, node_suite, -- 2.40.0