From 483eb2f56657e8e7f419ab1a4fab8dce9ade8609 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 27 Apr 2024 20:24:20 +0200 Subject: Adding upstream version 14.2.21. Signed-off-by: Daniel Baumann --- src/boost/libs/geometry/test/io/wkt/Jamfile.v2 | 17 ++ src/boost/libs/geometry/test/io/wkt/wkt.cpp | 299 ++++++++++++++++++++++ src/boost/libs/geometry/test/io/wkt/wkt_multi.cpp | 126 +++++++++ 3 files changed, 442 insertions(+) create mode 100644 src/boost/libs/geometry/test/io/wkt/Jamfile.v2 create mode 100644 src/boost/libs/geometry/test/io/wkt/wkt.cpp create mode 100644 src/boost/libs/geometry/test/io/wkt/wkt_multi.cpp (limited to 'src/boost/libs/geometry/test/io/wkt') diff --git a/src/boost/libs/geometry/test/io/wkt/Jamfile.v2 b/src/boost/libs/geometry/test/io/wkt/Jamfile.v2 new file mode 100644 index 00000000..898e8e94 --- /dev/null +++ b/src/boost/libs/geometry/test/io/wkt/Jamfile.v2 @@ -0,0 +1,17 @@ +# Boost.Geometry (aka GGL, Generic Geometry Library) +# +# Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands. +# Copyright (c) 2008-2015 Bruno Lalande, Paris, France. +# Copyright (c) 2009-2015 Mateusz Loskot, London, UK. +# Copyright (c) 2015 Adam Wulkiewicz, Lodz, Poland. +# +# Use, modification and distribution is subject to the Boost Software License, +# Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +test-suite boost-geometry-io-wkt + : + [ run wkt.cpp : : : : io_wkt ] + [ run wkt_multi.cpp : : : : io_wkt_multi ] + ; + diff --git a/src/boost/libs/geometry/test/io/wkt/wkt.cpp b/src/boost/libs/geometry/test/io/wkt/wkt.cpp new file mode 100644 index 00000000..2955fbba --- /dev/null +++ b/src/boost/libs/geometry/test/io/wkt/wkt.cpp @@ -0,0 +1,299 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) +// Unit Test + +// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. +// Copyright (c) 2008-2012 Bruno Lalande, Paris, France. +// Copyright (c) 2009-2012 Mateusz Loskot, London, UK. + +// This file was modified by Oracle on 2014. +// Modifications copyright (c) 2014 Oracle and/or its affiliates. + +// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle + +// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library +// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. + +// Use, modification and distribution is subject to the Boost Software License, +// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#include +#include + +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +template +void check_wkt(G const& geometry, std::string const& expected) +{ + std::ostringstream out; + out << bg::wkt(geometry); + BOOST_CHECK_EQUAL(boost::to_upper_copy(out.str()), + boost::to_upper_copy(expected)); +} + +template +void test_wkt(std::string const& wkt, std::string const& expected, + std::size_t n, double len = 0, double ar = 0, double peri = 0) +{ + G geometry; + + bg::read_wkt(wkt, geometry); + + /* + std::cout << "n=" << bg::num_points(geometry) + << " dim=" << bg::topological_dimension::value + << " length=" << bg::length(geometry) + << " area=" << bg::area(geometry) + << " perimeter=" << bg::perimeter(geometry) + << std::endl << "\t\tgeometry=" << dsv(geometry) + << std::endl; + */ + + BOOST_CHECK_EQUAL(bg::num_points(geometry), n); + if (n > 0) + { + BOOST_CHECK_CLOSE(double(bg::length(geometry)), len, 0.0001); + BOOST_CHECK_CLOSE(double(bg::area(geometry)), ar, 0.0001); + BOOST_CHECK_CLOSE(double(bg::perimeter(geometry)), peri, 0.0001); + } + + check_wkt(geometry, expected); + check_wkt(boost::variant(geometry), expected); +} + +template +void test_wkt(std::string const& wkt, + std::size_t n, double len = 0, double ar = 0, double peri = 0) +{ + test_wkt(wkt, wkt, n, len, ar, peri); +} + +template +void test_relaxed_wkt(std::string const& wkt, std::string const& expected) +{ + std::string e; + G geometry; + bg::read_wkt(wkt, geometry); + std::ostringstream out; + out << bg::wkt(geometry); + + BOOST_CHECK_EQUAL(boost::to_upper_copy(out.str()), boost::to_upper_copy(expected)); +} + + + + +template +void test_wrong_wkt(std::string const& wkt, std::string const& start) +{ + std::string e("no exception"); + G geometry; + try + { + bg::read_wkt(wkt, geometry); + } + catch(bg::read_wkt_exception const& ex) + { + e = ex.what(); + boost::to_lower(e); + } + catch(...) + { + e = "other exception"; + } + + bool check = true; + +#if defined(HAVE_TTMATH) + // For ttmath we skip bad lexical casts + typedef typename bg::coordinate_type::type ct; + + if (boost::is_same::type::value + && boost::starts_with(start, "bad lexical cast")) + { + check = false; + } +#endif + + if (check) + { + BOOST_CHECK_MESSAGE(boost::starts_with(e, start), " Expected:" + << start << " Got:" << e << " with WKT: " << wkt); + } +} + +template +void test_wkt_output_iterator(std::string const& wkt) +{ + G geometry; + bg::read_wkt(wkt, std::back_inserter(geometry)); +} + + + +#ifndef GEOMETRY_TEST_MULTI +template +void test_order_closure() +{ + using namespace boost::geometry; + typedef bg::model::point Pt; + typedef bg::model::polygon PCWC; + typedef bg::model::polygon PCWO; + typedef bg::model::polygon PCCWC; + typedef bg::model::polygon PCCWO; + + { + std::string wkt_cwc = "POLYGON((0 0,0 2,2 2,2 0,0 0))"; + std::string wkt_cwo = "POLYGON((0 0,0 2,2 2,2 0))"; + std::string wkt_ccwc = "POLYGON((0 0,2 0,2 2,0 2,0 0))"; + std::string wkt_ccwo = "POLYGON((0 0,2 0,2 2,0 2))"; + + test_wkt(wkt_cwc, 5, 0, 4, 8); + test_wkt(wkt_cwc, 4, 0, 4, 8); + test_wkt(wkt_cwo, wkt_cwc, 4, 0, 4, 8); + test_wkt(wkt_ccwc, 5, 0, 4, 8); + test_wkt(wkt_ccwc, 4, 0, 4, 8); + test_wkt(wkt_ccwo, wkt_ccwc, 4, 0, 4, 8); + } + { + std::string wkt_cwc = "POLYGON((0 0,0 3,3 3,3 0,0 0),(1 1,2 1,2 2,1 2,1 1))"; + std::string wkt_cwo = "POLYGON((0 0,0 3,3 3,3 0),(1 1,2 1,2 2,1 2))"; + std::string wkt_ccwc = "POLYGON((0 0,3 0,3 3,0 3,0 0),(1 1,1 2,2 2,2 1,1 1))"; + std::string wkt_ccwo = "POLYGON((0 0,3 0,3 3,0 3),(1 1,1 2,2 2,2 1,1 1))"; + + test_wkt(wkt_cwc, 10, 0, 8, 16); + test_wkt(wkt_cwc, 8, 0, 8, 16); + test_wkt(wkt_cwo, wkt_cwc, 8, 0, 8, 16); + test_wkt(wkt_ccwc, 10, 0, 8, 16); + test_wkt(wkt_ccwc, 8, 0, 8, 16); + test_wkt(wkt_ccwo, wkt_ccwc, 8, 0, 8, 16); + } +} + +template +void test_all() +{ + using namespace boost::geometry; + typedef bg::model::point P; + + test_wkt

("POINT(1 2)", 1); + test_wkt >("LINESTRING(1 1,2 2,3 3)", 3, 2 * sqrt(2.0)); + test_wkt >("POLYGON((0 0,0 4,4 4,4 0,0 0)" + ",(1 1,1 2,2 2,2 1,1 1),(1 1,1 2,2 2,2 1,1 1))", 15, 0, 18, 24); + + // Non OGC: a box defined by a polygon + //test_wkt >("POLYGON((0 0,0 1,1 1,1 0,0 0))", 4, 0, 1, 4); + test_wkt >("POLYGON((0 0,0 1,1 1,1 0,0 0))", 5, 0, 1, 4); + + // We accept empty sequences as well (much better than EMPTY)... + // ...or even POINT() (see below) + test_wkt >("LINESTRING()", 0, 0); + test_wkt >("POLYGON(())", 0); + // ... or even with empty holes + test_wkt >("POLYGON((),(),())", 0); + // which all make no valid geometries, but they can exist. + + // These WKT's are incomplete or abnormal but they are considered OK + test_relaxed_wkt

("POINT(1)", "POINT(1 0)"); + test_relaxed_wkt

("POINT()", "POINT(0 0)"); + test_relaxed_wkt >("LINESTRING(1,2,3)", + "LINESTRING(1 0,2 0,3 0)"); + test_relaxed_wkt

("POINT ( 1 2) ", "POINT(1 2)"); + test_relaxed_wkt

("POINT M ( 1 2)", "POINT(1 2)"); + test_relaxed_wkt >("BOX(1 1,2 2)", "POLYGON((1 1,1 2,2 2,2 1,1 1))"); + + test_relaxed_wkt >("LINESTRING EMPTY", "LINESTRING()"); + + test_relaxed_wkt >("POLYGON( ( ) , ( ) , ( ) )", + "POLYGON((),(),())"); + + // Wrong WKT's + test_wrong_wkt

("POINT(1 2", "expected ')'"); + test_wrong_wkt

("POINT 1 2)", "expected '('"); + test_wrong_wkt

("POINT(1 2,)", "expected ')'"); + test_wrong_wkt

("POINT(1 2)foo", "too many tokens at 'foo'"); + test_wrong_wkt

("POINT(1 2 3)", "expected ')'"); + test_wrong_wkt

("POINT(a 2 3)", "bad lexical cast"); + test_wrong_wkt

("POINT 2 3", "expected '('"); + test_wrong_wkt

("POINT Z (1 2 3)", "z only allowed"); + + test_wrong_wkt

("PIONT (1 2)", "should start with 'point'"); + + test_wrong_wkt >("LINESTRING())", "too many tokens"); + + test_wrong_wkt >("POLYGON((1 1,1 4,4 4,4 1,1 1)" + ",((2 2,2 3,3 3,3 2,2 2))", "bad lexical cast"); + + test_wrong_wkt >("BOX(1 1,2 2,3 3)", "box should have 2"); + test_wrong_wkt >("BOX(1 1,2 2) )", "too many tokens"); + + if ( BOOST_GEOMETRY_CONDITION(boost::is_floating_point::type::value + || ! boost::is_fundamental::type::value ) ) + { + test_wkt

("POINT(1.1 2.1)", 1); + } + + // Deprecated: + // test_wkt_output_iterator >("LINESTRING(1 1,2 2,3 3)"); + // test_wkt_output_iterator >("POLYGON((1 1,2 2,3 3))"); + + test_order_closure(); +} +#endif + +int test_main(int, char* []) +{ + test_all(); + test_all(); + +#if defined(HAVE_TTMATH) + test_all(); +#endif + + return 0; +} + +/* + +Results can be checked in PostGIS by query below, +or by MySQL (but replace length by glength and remove the perimeter) + +Note: +- PostGIS gives "3" for a numpoints of a multi-linestring of 6 points in total (!) + --> "npoints" should be taken for all geometries +- SQL Server 2008 gives "6" + select geometry::STGeomFromText('MULTILINESTRING((1 1,2 2,3 3),(4 4,5 5,6 6))',0).STNumPoints() +- MySQL gives "NULL" + +select 1 as code,'np p' as header,npoints(geomfromtext('POINT(1 2)')) as contents +union select 2,'length point', length(geomfromtext('POINT(1 2)')) +union select 3,'peri point', perimeter(geomfromtext('POINT(1 2)')) +union select 4,'area point',area(geomfromtext('POINT(1 2)')) + + +union select 5,'# ls',npoints(geomfromtext('LINESTRING(1 1,2 2,3 3)')) +union select 6,'length ls',length(geomfromtext('LINESTRING(1 1,2 2,3 3)')) +union select 7,'peri ls',perimeter(geomfromtext('LINESTRING(1 1,2 2,3 3)')) +union select 8,'aera ls',area(geomfromtext('LINESTRING(1 1,2 2,3 3)')) + +union select 9,'# poly',npoints(geomfromtext('POLYGON((0 0,0 4,4 4,4 0,0 0),(1 1,1 2,2 2,2 1,1 1),(1 1,1 2,2 2,2 1,1 1))')) +union select 10,'length poly',length(geomfromtext('POLYGON((0 0,0 4,4 4,4 0,0 0),(1 1,1 2,2 2,2 1,1 1),(1 1,1 2,2 2,2 1,1 1))')) +union select 11,'peri poly',perimeter(geomfromtext('POLYGON((0 0,0 4,4 4,4 0,0 0),(1 1,1 2,2 2,2 1,1 1),(1 1,1 2,2 2,2 1,1 1))')) +union select 12,'area poly',area(geomfromtext('POLYGON((0 0,0 4,4 4,4 0,0 0),(1 1,1 2,2 2,2 1,1 1),(1 1,1 2,2 2,2 1,1 1))')) + +*/ diff --git a/src/boost/libs/geometry/test/io/wkt/wkt_multi.cpp b/src/boost/libs/geometry/test/io/wkt/wkt_multi.cpp new file mode 100644 index 00000000..81471745 --- /dev/null +++ b/src/boost/libs/geometry/test/io/wkt/wkt_multi.cpp @@ -0,0 +1,126 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) +// Unit Test + +// Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands. +// Copyright (c) 2008-2015 Bruno Lalande, Paris, France. +// Copyright (c) 2009-2015 Mateusz Loskot, London, UK. + +// This file was modified by Oracle on 2014, 2015. +// Modifications copyright (c) 2014-2015 Oracle and/or its affiliates. + +// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle + +// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library +// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. + +// Use, modification and distribution is subject to the Boost Software License, +// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +//#include +#include +#include + +#include +#include + +#include +#include + +#include + +#include + +template +void test_all(); + + +// Include the single test +#define GEOMETRY_TEST_MULTI +#include "io/wkt/wkt.cpp" + +template +void test_order_closure() +{ + using namespace boost::geometry; + typedef bg::model::point Pt; + typedef bg::model::polygon PCWC; + typedef bg::model::polygon PCWO; + typedef bg::model::polygon PCCWC; + typedef bg::model::polygon PCCWO; + typedef bg::model::multi_polygon MPCWC; + typedef bg::model::multi_polygon MPCWO; + typedef bg::model::multi_polygon MPCCWC; + typedef bg::model::multi_polygon MPCCWO; + + std::string wkt_cwc = "MULTIPOLYGON(((0 0,0 2,2 2,2 0,0 0)),((0 0,0 -3,-3 -3,-3 0,0 0),(-1 -1,-2 -1,-2 -2,-1 -2,-1 -1)))"; + std::string wkt_cwo = "MULTIPOLYGON(((0 0,0 2,2 2,2 0)),((0 0,0 -3,-3 -3,-3 0),(-1 -1,-2 -1,-2 -2,-1 -2)))"; + std::string wkt_ccwc = "MULTIPOLYGON(((0 0,2 0,2 2,0 2,0 0)),((0 0,-3 0,-3 -3,0 -3,0 0),(-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))"; + std::string wkt_ccwo = "MULTIPOLYGON(((0 0,2 0,2 2,0 2)),((0 0,-3 0,-3 -3,0 -3),(-1 -1,-1 -2,-2 -2,-2 -1)))"; + + test_wkt(wkt_cwc, wkt_cwc, 15, 0, 12, 24); + test_wkt(wkt_cwc, wkt_cwc, 12, 0, 12, 24); + test_wkt(wkt_cwo, wkt_cwc, 12, 0, 12, 24); + test_wkt(wkt_ccwc, wkt_ccwc, 15, 0, 12, 24); + test_wkt(wkt_ccwc, wkt_ccwc, 12, 0, 12, 24); + test_wkt(wkt_ccwo, wkt_ccwc, 12, 0, 12, 24); +} + +template +void test_all() +{ + using namespace boost::geometry; + typedef bg::model::point P; + + test_wkt >("multipoint((1 2),(3 4))", 2); + test_wkt > >("multilinestring((1 1,2 2,3 3),(4 4,5 5,6 6))", 6, 4 * sqrt(2.0)); + test_wkt > >("multipolygon(((0 0,0 2,2 2,2 0,0 0),(1 1,1 2,2 2,2 1,1 1)),((0 0,0 4,4 4,4 0,0 0)))", 15, 0, 21, 28); + + // Support for the official alternative syntax for multipoint + // (provided by Aleksey Tulinov): + test_relaxed_wkt >("multipoint(1 2,3 4)", "multipoint((1 2),(3 4))"); + + test_wrong_wkt > >( + "MULTIPOLYGON(((0 0,0 2,2 2,2 0,0 0),(1 1,1 2,2 2,2 1,1 1)),(0 0,0 4,4 4,4 0,0 0)))", + "expected '('"); + + test_wrong_wkt > >( + "MULTILINESTRING ((10 10, 20 20, 10 40), (40 40, 30 30, 40 20, 30 10)), (0 0, 1 1)", + "too many tokens at ','"); + + test_wrong_wkt >( + "MULTIPOINT((8 9), 10 11)", + "expected '(' at '10'"); + test_wrong_wkt >( + "MULTIPOINT(12 13, (14 15))", + "bad lexical cast: source type value could not be interpreted as target at '(' in 'multipoint(12 13, (14 15))'"); + test_wrong_wkt >( + "MULTIPOINT((16 17), (18 19)", + "expected ')' in 'multipoint((16 17), (18 19)'"); + test_wrong_wkt >( + "MULTIPOINT(16 17), (18 19)", + "too many tokens at ',' in 'multipoint(16 17), (18 19)'"); + + test_order_closure(); +} + +/* + +... see comments in "wkt.cpp" + +union select 13,'# mpoint',npoints(geomfromtext('MULTIPOINT((1 2),(3 4))')) +union select 14,'length mpoint',length(geomfromtext('MULTIPOINT((1 2),(3 4))')) +union select 15,'peri mpoint',perimeter(geomfromtext('MULTIPOINT((1 2),(3 4))')) +union select 16,'area mpoint',area(geomfromtext('MULTIPOINT((1 2),(3 4))')) + +union select 17,'# mls',npoints(geomfromtext('MULTILINESTRING((1 1,2 2,3 3),(4 4,5 5,6 6))')) +union select 18,'length mls',length(geomfromtext('MULTILINESTRING((1 1,2 2,3 3),(4 4,5 5,6 6))')) +union select 19,'peri mls',perimeter(geomfromtext('MULTILINESTRING((1 1,2 2,3 3),(4 4,5 5,6 6))')) +union select 20,'area mls',area(geomfromtext('MULTILINESTRING((1 1,2 2,3 3),(4 4,5 5,6 6))')) + +union select 21,'# mpoly',npoints(geomfromtext('MULTIPOLYGON(((0 0,0 2,2 2,2 0,0 0),(1 1,1 2,2 2,2 1,1 1)),((0 0,0 4,4 4,4 0,0 0)))')) +union select 22,'length mpoly',length(geomfromtext('MULTIPOLYGON(((0 0,0 2,2 2,2 0,0 0),(1 1,1 2,2 2,2 1,1 1)),((0 0,0 4,4 4,4 0,0 0)))')) +union select 23,'peri mpoly',perimeter(geomfromtext('MULTIPOLYGON(((0 0,0 2,2 2,2 0,0 0),(1 1,1 2,2 2,2 1,1 1)),((0 0,0 4,4 4,4 0,0 0)))')) +union select 24,'area mpoly',area(geomfromtext('MULTIPOLYGON(((0 0,0 2,2 2,2 0,0 0),(1 1,1 2,2 2,2 1,1 1)),((0 0,0 4,4 4,4 0,0 0)))')) + +*/ -- cgit v1.2.3