mirror of
https://git.osgeo.org/gitea/postgis/postgis
synced 2024-10-25 01:22:47 +00:00
192c2b35d0
Also sets touched suite names to match filename (with "cu_" prefix stripped out) git-svn-id: http://svn.osgeo.org/postgis/trunk@12839 b70326c6-7e19-0410-871a-916f4a2858ee
374 lines
9.7 KiB
C
374 lines
9.7 KiB
C
/**********************************************************************
|
|
* $Id: cu_out_wkt.c 6036 2010-10-03 18:14:35Z pramsey $
|
|
*
|
|
* PostGIS - Spatial Types for PostgreSQL
|
|
* http://postgis.net
|
|
* Copyright 2010 Paul Ramsey <pramsey@cleverelephant.ca>
|
|
*
|
|
* 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 <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "CUnit/Basic.h"
|
|
|
|
#include "liblwgeom_internal.h"
|
|
#include "cu_tester.h"
|
|
|
|
/*
|
|
** Globals used by tests
|
|
*/
|
|
char *s;
|
|
char *r;
|
|
|
|
/*
|
|
** The suite initialization function.
|
|
** Create any re-used objects.
|
|
*/
|
|
static int init_wkt_in_suite(void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
** The suite cleanup function.
|
|
** Frees any global objects.
|
|
*/
|
|
static int clean_wkt_in_suite(void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* Return a char* that results from taking the input
|
|
* WKT, creating an LWGEOM, then writing it back out
|
|
* as an output WKT using the supplied variant.
|
|
* If there is an error, return that.
|
|
*/
|
|
static char* cu_wkt_in(char *wkt, uint8_t variant)
|
|
{
|
|
LWGEOM_PARSER_RESULT p;
|
|
int rv = 0;
|
|
char *s = 0;
|
|
|
|
rv = lwgeom_parse_wkt(&p, wkt, 0);
|
|
if( p.errcode ) {
|
|
CU_ASSERT_EQUAL( rv, LW_FAILURE );
|
|
return strdup(p.message);
|
|
}
|
|
CU_ASSERT_EQUAL( rv, LW_SUCCESS );
|
|
s = lwgeom_to_wkt(p.geom, variant, 8, NULL);
|
|
lwgeom_parser_result_free(&p);
|
|
return s;
|
|
}
|
|
|
|
|
|
static void test_wkt_in_point(void)
|
|
{
|
|
s = "POINT(1e700 0)";
|
|
r = cu_wkt_in(s, WKT_SFSQL);
|
|
CU_TEST ( ! strcmp(r, "POINT(inf 0)") || ! strcmp(r, "POINT(1.#INF 0)") );
|
|
lwfree(r);
|
|
|
|
s = "POINT(0 0)";
|
|
r = cu_wkt_in(s, WKT_SFSQL);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
|
|
s = "POINT EMPTY";
|
|
r = cu_wkt_in(s, WKT_SFSQL);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
|
|
s = "POINT M EMPTY";
|
|
r = cu_wkt_in(s, WKT_ISO);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
}
|
|
|
|
static void test_wkt_in_linestring(void)
|
|
{
|
|
s = "LINESTRING EMPTY";
|
|
r = cu_wkt_in(s, WKT_SFSQL);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
|
|
s = "LINESTRING(0 0,1 1)";
|
|
r = cu_wkt_in(s, WKT_SFSQL);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
|
|
s = "LINESTRING(0 0 0,1 1 1)";
|
|
r = cu_wkt_in(s, WKT_EXTENDED);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
|
|
s = "LINESTRING M (0 0 0,1 1 1)";
|
|
r = cu_wkt_in(s, WKT_ISO);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
|
|
s = "LINESTRING ZM (0 0 0 1,1 1 1 1,2 2 2 2,0.141231 4 5 4)";
|
|
r = cu_wkt_in(s, WKT_ISO);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
|
|
s = "LINESTRINGM(0 0 0,1 1 1)";
|
|
r = cu_wkt_in(s, WKT_EXTENDED);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
|
|
s = "LINESTRING ZM EMPTY";
|
|
r = cu_wkt_in(s, WKT_ISO);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
|
|
s = "LINESTRING Z (0 0 0 1, 0 1 0 1)";
|
|
r = cu_wkt_in(s, WKT_EXTENDED);
|
|
CU_ASSERT_STRING_EQUAL(r,"can not mix dimensionality in a geometry");
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
|
|
}
|
|
|
|
static void test_wkt_in_polygon(void)
|
|
{
|
|
s = "POLYGON((0 0,0 1,1 1,0 0))";
|
|
r = cu_wkt_in(s, WKT_SFSQL);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
|
|
s = "POLYGON Z ((0 0,0 10,10 10,10 0,0 0),(1 1 1,1 2 1,2 2 1,2 1 1,1 1 1))";
|
|
r = cu_wkt_in(s, WKT_SFSQL);
|
|
CU_ASSERT_STRING_EQUAL(r,"can not mix dimensionality in a geometry");
|
|
lwfree(r);
|
|
|
|
s = "POLYGON Z ((0 0,0 10,10 10,10 0,0 0),(1 1,1 2,2 2,2 1,1 1))";
|
|
r = cu_wkt_in(s, WKT_SFSQL);
|
|
CU_ASSERT_STRING_EQUAL(r,"can not mix dimensionality in a geometry");
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
}
|
|
|
|
static void test_wkt_in_multipoint(void)
|
|
{
|
|
/**I'm remarking this out since it fails on windows because windows returns
|
|
MULTIPOINT(-1 -2 -3,5.4 6.6 7.77,-5.4 -6.6 -7.77,1000000 1e-006 -1000000,-1.3e-006 -1.4e-005 0) **/
|
|
/** @todo TODO: Paul put back in if you care after you do replace mumbo jumbo to replace the extra 0s in Windows
|
|
*/
|
|
// s = "MULTIPOINT(-1 -2 -3,5.4 6.6 7.77,-5.4 -6.6 -7.77,1000000 1e-06 -1000000,-1.3e-06 -1.4e-05 0)";
|
|
// r = cu_wkt_in(s, WKT_EXTENDED);
|
|
// CU_ASSERT_STRING_EQUAL(r,s);
|
|
// printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
// lwfree(r);
|
|
|
|
s = "MULTIPOINT(0 0)";
|
|
r = cu_wkt_in(s, WKT_SFSQL);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
|
|
s = "MULTIPOINT(0 0,1 1)";
|
|
r = cu_wkt_in(s, WKT_SFSQL);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
}
|
|
|
|
static void test_wkt_in_multilinestring(void)
|
|
{
|
|
s = "MULTILINESTRING((0 0,1 1),(1 1,2 2),(3 3,3 3,3 3,2 2,2 1))";
|
|
r = cu_wkt_in(s, WKT_SFSQL);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
|
|
}
|
|
|
|
static void test_wkt_in_multipolygon(void)
|
|
{
|
|
s = "MULTIPOLYGON(((0 0,0 1,1 1,0 0)))";
|
|
r = cu_wkt_in(s, WKT_SFSQL);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
|
|
s = "MULTIPOLYGON(((0 0,0 10,10 10,0 0),(1 1,1 2,2 2,1 1)),((-10 -10,-10 -5,-5 -5,-10 -10)))";
|
|
r = cu_wkt_in(s, WKT_SFSQL);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
|
|
s = "SRID=4;MULTIPOLYGON(((0 0,0 1,1 1,0 0)))";
|
|
r = cu_wkt_in(s, WKT_EXTENDED);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
|
|
}
|
|
|
|
static void test_wkt_in_collection(void)
|
|
{
|
|
s = "SRID=5;GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(1 0,0 0),CIRCULARSTRING(0 0,0 1,1 1,0 1,2 2))";
|
|
r = cu_wkt_in(s, WKT_EXTENDED);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
|
|
s = "GEOMETRYCOLLECTION(POINT(0 0),POINT EMPTY,LINESTRING(1 0,0 0),POLYGON EMPTY,CIRCULARSTRING(0 0,0 1,1 1,0 1,2 2))";
|
|
r = cu_wkt_in(s, WKT_SFSQL);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
|
|
s = "GEOMETRYCOLLECTION Z (POINT Z (0 0 0))";
|
|
r = cu_wkt_in(s, WKT_ISO);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
|
|
s = "GEOMETRYCOLLECTION M (MULTILINESTRING M ((0 0 5,2 0 5),(1 1 5,2 2 5)))";
|
|
r = cu_wkt_in(s, WKT_ISO);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
|
|
/* See http://trac.osgeo.org/postgis/ticket/1455#comment:3 */
|
|
s = "GEOMETRYCOLLECTION Z (MULTILINESTRING Z ((0 0 5,2 0 5),(1 1 5,2 2 5)))";
|
|
r = cu_wkt_in(s, WKT_ISO);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
}
|
|
|
|
static void test_wkt_in_circularstring(void)
|
|
{
|
|
s = "CIRCULARSTRING(0 0,0 1,1 1,0 1,2 2)";
|
|
r = cu_wkt_in(s, WKT_SFSQL);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
lwfree(r);
|
|
}
|
|
|
|
static void test_wkt_in_compoundcurve(void)
|
|
{
|
|
s = "SRID=4326;COMPOUNDCURVEM(CIRCULARSTRINGM(0 0 2,1 1 2,1 0 2),(1 0 2,0 1 2))";
|
|
r = cu_wkt_in(s, WKT_EXTENDED);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
|
|
s = "COMPOUNDCURVE Z (CIRCULARSTRING Z (0 0 0,0 1 0,1 1 0,0 0 0,2 2 0),(2 2 0,0 0 1,1 1 1,2 2 1))";
|
|
r = cu_wkt_in(s, WKT_ISO);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
}
|
|
|
|
static void test_wkt_in_curvpolygon(void)
|
|
{
|
|
s = "CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,0 1,1 1,2 2,0 0),(0 0,1 1,2 2)),CIRCULARSTRING(0 0,0 1,1 1,0 0,2 2),(0 0,1 1,2 1))";
|
|
r = cu_wkt_in(s, WKT_ISO);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
}
|
|
|
|
static void test_wkt_in_multicurve(void)
|
|
{
|
|
s = "SRID=4326;MULTICURVE(COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,1 0),(1 0,0 1)))";
|
|
r = cu_wkt_in(s, WKT_EXTENDED);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
}
|
|
|
|
static void test_wkt_in_multisurface(void)
|
|
{
|
|
s = "SRID=4326;MULTICURVE(COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,1 0),(1 0,0 1)))";
|
|
r = cu_wkt_in(s, WKT_EXTENDED);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
}
|
|
|
|
static void test_wkt_in_tin(void)
|
|
{
|
|
s = "TIN(((0 1 2,3 4 5,6 7 8,0 1 2)),((0 1 2,3 4 5,6 7 8,9 10 11,0 1 2)))";
|
|
r = cu_wkt_in(s, WKT_EXTENDED);
|
|
CU_ASSERT_STRING_EQUAL(r,"triangle must have exactly 4 points");
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
}
|
|
|
|
static void test_wkt_in_polyhedralsurface(void)
|
|
{
|
|
s = "POLYHEDRALSURFACE(((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 0 0,0 0 0)),((0 0 0,1 0 0,0 0 1,0 0 0)),((1 0 0,0 1 0,0 0 1,1 0 0)))";
|
|
r = cu_wkt_in(s, WKT_EXTENDED);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
|
|
s = "POLYHEDRALSURFACE Z (((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 0 0,0 0 0)),((0 0 0,1 0 0,0 0 1,0 0 0)),((1 0 0,0 1 0,0 0 1,1 0 0)))";
|
|
r = cu_wkt_in(s, WKT_ISO);
|
|
CU_ASSERT_STRING_EQUAL(r,s);
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
|
|
s = "POLYHEDRALSURFACE(((0 1 2,3 4 5,6 7,0 1 2)))";
|
|
r = cu_wkt_in(s, WKT_ISO);
|
|
CU_ASSERT_STRING_EQUAL(r,"can not mix dimensionality in a geometry");
|
|
//printf("\nIN: %s\nOUT: %s\n",s,r);
|
|
lwfree(r);
|
|
|
|
}
|
|
|
|
static void test_wkt_in_errlocation(void)
|
|
{
|
|
LWGEOM_PARSER_RESULT p;
|
|
int rv = 0;
|
|
char *wkt = 0;
|
|
|
|
wkt = "LINESTRING((0 0 0,1 1)";
|
|
lwgeom_parser_result_init(&p);
|
|
rv = lwgeom_parse_wkt(&p, wkt, LW_PARSER_CHECK_ALL);
|
|
CU_ASSERT_EQUAL( rv, LW_FAILURE );
|
|
CU_ASSERT(fabs(12 - p.errlocation) < 1.5);
|
|
|
|
// printf("errlocation %d\n", p.errlocation);
|
|
// printf("message %s\n", p.message);
|
|
|
|
lwgeom_parser_result_free(&p);
|
|
|
|
}
|
|
|
|
/*
|
|
** Used by test harness to register the tests in this file.
|
|
*/
|
|
|
|
CU_TestInfo wkt_in_tests[] =
|
|
{
|
|
PG_TEST(test_wkt_in_point),
|
|
PG_TEST(test_wkt_in_linestring),
|
|
PG_TEST(test_wkt_in_polygon),
|
|
PG_TEST(test_wkt_in_multipoint),
|
|
PG_TEST(test_wkt_in_multilinestring),
|
|
PG_TEST(test_wkt_in_multipolygon),
|
|
PG_TEST(test_wkt_in_collection),
|
|
PG_TEST(test_wkt_in_circularstring),
|
|
PG_TEST(test_wkt_in_compoundcurve),
|
|
PG_TEST(test_wkt_in_curvpolygon),
|
|
PG_TEST(test_wkt_in_multicurve),
|
|
PG_TEST(test_wkt_in_multisurface),
|
|
PG_TEST(test_wkt_in_tin),
|
|
PG_TEST(test_wkt_in_polyhedralsurface),
|
|
PG_TEST(test_wkt_in_errlocation),
|
|
CU_TEST_INFO_NULL
|
|
};
|
|
CU_SuiteInfo wkt_in_suite = {"in_wkt", init_wkt_in_suite, clean_wkt_in_suite, wkt_in_tests};
|