diff --git a/test/algorithms/Jamfile.v2 b/test/algorithms/Jamfile.v2 index cb01090ef..70d9688b0 100644 --- a/test/algorithms/Jamfile.v2 +++ b/test/algorithms/Jamfile.v2 @@ -33,6 +33,7 @@ test-suite boost-geometry-algorithms [ run is_convex.cpp : : : : algorithms_is_convex ] [ run is_empty.cpp : : : : algorithms_is_empty ] [ run is_simple.cpp : : : : algorithms_is_simple ] + [ run is_simple_geo.cpp : : : : algorithms_is_simple_geo ] [ run is_valid.cpp : : : : algorithms_is_valid ] [ run is_valid_failure.cpp : : : : algorithms_is_valid_failure ] [ run make.cpp : : : : algorithms_make ] diff --git a/test/algorithms/is_simple.cpp b/test/algorithms/is_simple.cpp index a61ba6216..41cef5ed5 100644 --- a/test/algorithms/is_simple.cpp +++ b/test/algorithms/is_simple.cpp @@ -13,36 +13,7 @@ #define BOOST_TEST_MODULE test_is_simple #endif -#include -#include - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include -#include - -#include - -#ifdef BOOST_GEOMETRY_TEST_DEBUG -#include "pretty_print_geometry.hpp" -#endif +#include "test_is_simple.hpp" namespace bg = ::boost::geometry; @@ -61,71 +32,6 @@ typedef bg::model::multi_polygon multi_polygon_type; typedef bg::model::box box_type; -//---------------------------------------------------------------------------- - - -template -void test_simple(Geometry const& geometry, bool expected_result, - bool check_validity = true) -{ -#ifdef BOOST_GEOMETRY_TEST_DEBUG - std::cout << "=======" << std::endl; -#endif - - bool simple = bg::is_simple(geometry); - - BOOST_ASSERT( ! check_validity || bg::is_valid(geometry) ); - BOOST_CHECK_MESSAGE( simple == expected_result, - "Expected: " << expected_result - << " detected: " << simple - << " wkt: " << bg::wkt(geometry) ); - - typedef typename bg::strategy::intersection::services::default_strategy - < - CSTag - >::type strategy_type; - - bool simple_s = bg::is_simple(geometry, strategy_type()); - - BOOST_CHECK_EQUAL(simple, simple_s); - -#ifdef BOOST_GEOMETRY_TEST_DEBUG - std::cout << "Geometry: "; - pretty_print_geometry::apply(std::cout, geometry); - std::cout << std::endl; - std::cout << std::boolalpha; - std::cout << "is simple: " << simple << std::endl; - std::cout << "expected result: " << expected_result << std::endl; - std::cout << "=======" << std::endl; - std::cout << std::endl << std::endl; - std::cout << std::noboolalpha; -#endif -} - - -template -void test_simple(Geometry const& geometry, - bool expected_result, - bool check_validity = true) -{ - typedef typename bg::cs_tag::type cs_tag; - test_simple(geometry, expected_result, check_validity); -} - -template -void test_simple(boost::variant const& variant_geometry, - bool expected_result, - bool check_validity = true) -{ - typedef typename bg::cs_tag::type cs_tag; - test_simple(variant_geometry, expected_result, check_validity); -} - - - -//---------------------------------------------------------------------------- - - BOOST_AUTO_TEST_CASE( test_is_simple_point ) { #ifdef BOOST_GEOMETRY_TEST_DEBUG diff --git a/test/algorithms/is_simple_geo.cpp b/test/algorithms/is_simple_geo.cpp new file mode 100644 index 000000000..30a01a30c --- /dev/null +++ b/test/algorithms/is_simple_geo.cpp @@ -0,0 +1,59 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) +// Unit Test + +// Copyright (c) 2014-2017, Oracle and/or its affiliates. + +// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle + +// Licensed under the Boost Software License version 1.0. +// http://www.boost.org/users/license.html + +#ifndef BOOST_TEST_MODULE +#define BOOST_TEST_MODULE test_is_simple_geo +#endif + +#include "test_is_simple.hpp" + + +typedef bg::model::point > point_type; +typedef bg::model::segment segment_type; +typedef bg::model::linestring linestring_type; +typedef bg::model::multi_linestring multi_linestring_type; +// ccw open and closed polygons +typedef bg::model::polygon open_ccw_polygon_type; +typedef bg::model::polygon closed_ccw_polygon_type; +// multi-geometries +typedef bg::model::multi_point multi_point_type; +typedef bg::model::multi_polygon multi_polygon_type; +// box +typedef bg::model::box box_type; + + +BOOST_AUTO_TEST_CASE( test_is_simple_geo_linestring ) +{ + typedef linestring_type G; + + bg::strategy::intersection::geographic_segments<> s; + + test_simple_s(from_wkt("LINESTRING(0 0, -90 0, 90 0)"), s, true); + test_simple_s(from_wkt("LINESTRING(0 90, -90 0, 90 0)"), s, false); + test_simple_s(from_wkt("LINESTRING(0 90, -90 50, 90 0)"), s, false); + test_simple_s(from_wkt("LINESTRING(0 90, -90 -50, 90 0)"), s, true); + + test_simple_s(from_wkt("LINESTRING(35 0, 110 36, 159 0, 82 30)"), s, false); + test_simple_s(from_wkt("LINESTRING(135 0, -150 36, -101 0, -178 30)"), s, false); + test_simple_s(from_wkt("LINESTRING(45 0, 120 36, 169 0, 92 30)"), s, false); + test_simple_s(from_wkt("LINESTRING(179 0, -179 1, -179 0, 179 1)"), s, false); +} + +BOOST_AUTO_TEST_CASE( test_is_simple_geo_multilinestring ) +{ + typedef multi_linestring_type G; + + bg::strategy::intersection::geographic_segments<> s; + + test_simple_s(from_wkt("MULTILINESTRING((35 0, 110 36),(159 0, 82 30))"), s, false); + test_simple_s(from_wkt("MULTILINESTRING((135 0, -150 36),(-101 0, -178 30))"), s, false); + test_simple_s(from_wkt("MULTILINESTRING((45 0, 120 36),(169 0, 92 30))"), s, false); + test_simple_s(from_wkt("MULTILINESTRING((179 0, -179 1),(-179 0, 179 1))"), s, false); +} diff --git a/test/algorithms/test_is_simple.hpp b/test/algorithms/test_is_simple.hpp new file mode 100644 index 000000000..d4162d04b --- /dev/null +++ b/test/algorithms/test_is_simple.hpp @@ -0,0 +1,121 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) +// Unit Test + +// Copyright (c) 2014-2017, Oracle and/or its affiliates. + +// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle +// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle + +// Licensed under the Boost Software License version 1.0. +// http://www.boost.org/users/license.html + + +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include + +#include + +#ifdef BOOST_GEOMETRY_TEST_DEBUG +#include "pretty_print_geometry.hpp" +#endif + +namespace bg = ::boost::geometry; + +template +void test_simple_s(Geometry const& geometry, + Strategy const& strategy, + bool expected_result, + bool check_validity = true) +{ + bool simple = bg::is_simple(geometry, strategy); + bool valid = ! check_validity || bg::is_valid(geometry, strategy); + + BOOST_CHECK_MESSAGE( valid == true, + "Expected valid geometry, " + << " wkt: " << bg::wkt(geometry) ); + + BOOST_CHECK_MESSAGE( simple == expected_result, + "Expected: " << expected_result + << " detected: " << simple + << " wkt: " << bg::wkt(geometry) ); +} + +template +void test_simple(Geometry const& geometry, bool expected_result, + bool check_validity = true) +{ +#ifdef BOOST_GEOMETRY_TEST_DEBUG + std::cout << "=======" << std::endl; +#endif + + bool simple = bg::is_simple(geometry); + bool valid = ! check_validity || bg::is_valid(geometry); + + BOOST_CHECK_MESSAGE( valid == true, + "Expected valid geometry, " + << " wkt: " << bg::wkt(geometry) ); + + BOOST_CHECK_MESSAGE( simple == expected_result, + "Expected: " << expected_result + << " detected: " << simple + << " wkt: " << bg::wkt(geometry) ); + + typedef typename bg::strategy::intersection::services::default_strategy + < + CSTag + >::type strategy_type; + + test_simple_s(geometry, strategy_type(), expected_result, check_validity); + +#ifdef BOOST_GEOMETRY_TEST_DEBUG + std::cout << "Geometry: "; + pretty_print_geometry::apply(std::cout, geometry); + std::cout << std::endl; + std::cout << std::boolalpha; + std::cout << "is simple: " << simple << std::endl; + std::cout << "expected result: " << expected_result << std::endl; + std::cout << "=======" << std::endl; + std::cout << std::endl << std::endl; + std::cout << std::noboolalpha; +#endif +} + +template +void test_simple(Geometry const& geometry, + bool expected_result, + bool check_validity = true) +{ + typedef typename bg::cs_tag::type cs_tag; + test_simple(geometry, expected_result, check_validity); +} + +template +void test_simple(boost::variant const& variant_geometry, + bool expected_result, + bool check_validity = true) +{ + typedef typename bg::cs_tag::type cs_tag; + test_simple(variant_geometry, expected_result, check_validity); +}