From: Sandro Santilli Date: Wed, 11 Jan 2012 18:45:00 +0000 (+0000) Subject: Fix bug in gbox_same -> lwgeom_same -> ST_OrderingEquals (#1454) X-Git-Tag: 2.0.0alpha1~101 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8c6afecd8837719b8ca7eec3263cec164eb9e9b5;p=postgis Fix bug in gbox_same -> lwgeom_same -> ST_OrderingEquals (#1454) Adds regression test for lwgeom_same and ST_OrderingEquals git-svn-id: http://svn.osgeo.org/postgis/trunk@8779 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/liblwgeom/cunit/cu_libgeom.c b/liblwgeom/cunit/cu_libgeom.c index ad16ad8f1..8adb720ca 100644 --- a/liblwgeom/cunit/cu_libgeom.c +++ b/liblwgeom/cunit/cu_libgeom.c @@ -699,7 +699,6 @@ static void test_lwgeom_force_clockwise(void) static void test_lwgeom_is_empty(void) { LWGEOM *geom; - char *in_ewkt, *out_ewkt; geom = lwgeom_from_wkt("POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))", LW_PARSER_CHECK_NONE); CU_ASSERT( !lwgeom_is_empty(geom) ); @@ -735,6 +734,101 @@ static void test_lwgeom_is_empty(void) } +/* + * Test lwgeom_same + */ +static void test_lwgeom_same(void) +{ + LWGEOM *geom, *geom2; + + geom = lwgeom_from_wkt("POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_add_bbox(geom); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("MULTIPOLYGON(((0 0, 10 0, 10 10, 0 10, 0 0)))", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_add_bbox(geom); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("LINESTRING(0 0, 2 0)", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_add_bbox(geom); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("MULTILINESTRING((0 0, 2 0))", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_add_bbox(geom); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("POINT(0 0)", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_add_bbox(geom); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("MULTIPOINT((0 0),(4 5))", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_add_bbox(geom); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("POINT EMPTY", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_add_bbox(geom); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("LINESTRING EMPTY", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_add_bbox(geom); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("POLYGON EMPTY", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("MULTIPOINT EMPTY", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("MULTILINESTRING EMPTY", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("MULTIPOLYGON EMPTY", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("GEOMETRYCOLLECTION(GEOMETRYCOLLECTION EMPTY, POINT EMPTY, LINESTRING EMPTY, POLYGON EMPTY, MULTIPOINT EMPTY, MULTILINESTRING EMPTY, MULTIPOLYGON EMPTY, GEOMETRYCOLLECTION(MULTIPOLYGON EMPTY))", LW_PARSER_CHECK_NONE); + CU_ASSERT( lwgeom_same(geom, geom) ); + lwgeom_free(geom); + + geom = lwgeom_from_wkt("POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))", LW_PARSER_CHECK_NONE); + geom2 = lwgeom_from_wkt("GEOMETRYCOLLECTION(GEOMETRYCOLLECTION EMPTY, POINT EMPTY, LINESTRING EMPTY, POLYGON EMPTY, MULTIPOINT EMPTY, MULTILINESTRING EMPTY, MULTIPOLYGON EMPTY, GEOMETRYCOLLECTION(MULTIPOLYGON EMPTY))", LW_PARSER_CHECK_NONE); + CU_ASSERT( ! lwgeom_same(geom, geom2) ); + lwgeom_free(geom); + lwgeom_free(geom2); + + geom = lwgeom_from_wkt("POINT(0 0)", LW_PARSER_CHECK_NONE); + geom2 = lwgeom_from_wkt("MULTIPOINT((0 0))", LW_PARSER_CHECK_NONE); + CU_ASSERT( ! lwgeom_same(geom, geom2) ); + lwgeom_free(geom); + lwgeom_free(geom2); + + geom = lwgeom_from_wkt("POINT EMPTY", LW_PARSER_CHECK_NONE); + geom2 = lwgeom_from_wkt("POINT Z EMPTY", LW_PARSER_CHECK_NONE); + CU_ASSERT( ! lwgeom_same(geom, geom2) ); + lwgeom_free(geom); + lwgeom_free(geom2); + +} + /* ** Used by test harness to register the tests in this file. @@ -758,6 +852,7 @@ CU_TestInfo libgeom_tests[] = PG_TEST(test_lwgeom_force_clockwise), PG_TEST(test_lwgeom_calculate_gbox), PG_TEST(test_lwgeom_is_empty), + PG_TEST(test_lwgeom_same), CU_TEST_INFO_NULL }; CU_SuiteInfo libgeom_suite = {"libgeom", NULL, NULL, libgeom_tests}; diff --git a/liblwgeom/g_box.c b/liblwgeom/g_box.c index d65adc3af..fb6bcf521 100644 --- a/liblwgeom/g_box.c +++ b/liblwgeom/g_box.c @@ -126,7 +126,7 @@ int gbox_same(const GBOX *g1, const GBOX *g2) return LW_FALSE; if ( g1->xmin != g2->xmin || g1->ymin != g2->ymin || - g1->xmax != g2->ymax || g1->ymax != g2->ymax ) return LW_FALSE; + g1->xmax != g2->xmax || g1->ymax != g2->ymax ) return LW_FALSE; if (FLAGS_GET_Z(g1->flags) && (g1->zmin != g2->zmin || g1->zmax != g2->zmax)) return LW_FALSE; diff --git a/regress/tickets.sql b/regress/tickets.sql index 59d3ff057..8220682c7 100644 --- a/regress/tickets.sql +++ b/regress/tickets.sql @@ -507,6 +507,10 @@ SELECT '010C00004002000000010400004001000000010100004000000000000000000000000000 SELECT '#1453.1', ST_OrderingEquals('POINT EMPTY', 'POINT EMPTY'); SELECT '#1453.2', ST_OrderingEquals('POINT EMPTY', 'POINT Z EMPTY'); +-- #1454 +with inp as ( select 'MULTILINESTRING((0 0, 2 0))'::geometry as g ) +SELECT '#1454', st_orderingequals(g,g) from inp; + -- Clean up DELETE FROM spatial_ref_sys; diff --git a/regress/tickets_expected b/regress/tickets_expected index f148a6854..5df001be1 100644 --- a/regress/tickets_expected +++ b/regress/tickets_expected @@ -169,3 +169,4 @@ ERROR: MultiCurve cannot contain MultiPoint element ERROR: MultiSurface cannot contain MultiPoint element #1453.1|t #1453.2|f +#1454|t