// Boost.Geometry (aka GGL, Generic Geometry Library) // Unit Test // Copyright (c) 2014, Oracle and/or its affiliates. // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle // Licensed under the Boost Software License version 1.0. // http://www.boost.org/users/license.html #include #ifndef BOOST_TEST_MODULE #define BOOST_TEST_MODULE test_point_iterator #endif #include #include #include #include #include #include #include #include #include #include #include "../algorithms/from_wkt.hpp" #include namespace bg = ::boost::geometry; typedef bg::model::point point_type; typedef bg::model::linestring linestring_type; typedef bg::model::polygon polygon_type; //ccw, open // multi geometries typedef bg::model::multi_point multi_point_type; typedef bg::model::multi_linestring multi_linestring_type; typedef bg::model::multi_polygon multi_polygon_type; struct equals { template static inline std::size_t number_of_elements(Iterator begin, Iterator end) { std::size_t num_elems(0); for (Iterator it = begin; it != end; ++it) { ++num_elems; } return num_elems; } template static inline bool apply(Iterator1 begin1, Iterator1 end1, Iterator2 begin2, Iterator2 end2) { std::size_t num_points1 = number_of_elements(begin1, end1); std::size_t num_points2 = number_of_elements(begin2, end2); if ( num_points1 != num_points2 ) { return false; } Iterator1 it1 = begin1; Iterator2 it2 = begin2; for (; it1 != end1; ++it1, ++it2) { if ( !bg::equals(*it1, *it2) ) { return false; } } return true; } }; template struct test_point_iterator_of_geometry { template static inline void base_test(G& geometry, PointRange const& point_range, std::string const& header) { typedef typename bg::point_iterator_type < G >::type point_iterator_type; point_iterator_type begin = bg::points_begin(geometry); point_iterator_type end = bg::points_end(geometry); BOOST_CHECK( equals::apply(begin, end, boost::begin(point_range), boost::end(point_range)) ); #ifdef GEOMETRY_TEST_DEBUG std::cout << header << " geometry: " << bg::wkt(geometry) << std::endl; std::cout << "point range: ("; for (point_iterator_type pit = begin; pit != end; ++pit) { std::cout << " " << bg::dsv(*pit); } std::cout << " )" << std::endl; std::cout << "expected point range: " << bg::wkt(point_range) << std::endl; #endif } static inline void apply(Geometry geometry, PointRange const& point_range) { base_test(geometry, point_range, "non-const"); #ifdef GEOMETRY_TEST_DEBUG std::cout << std::endl; #endif base_test(geometry, point_range, "const"); #ifdef GEOMETRY_TEST_DEBUG std::cout << std::endl << std::endl; #endif } }; //====================================================================== //====================================================================== BOOST_AUTO_TEST_CASE( test_linestring_point_iterator ) { #ifdef GEOMETRY_TEST_DEBUG std::cout << "*** LINESTRING ***" << std::endl; #endif typedef multi_point_type MP; typedef linestring_type L; typedef test_point_iterator_of_geometry tester; tester::apply(from_wkt("LINESTRING()"), from_wkt("MULTIPOINT()") ); tester::apply(from_wkt("LINESTRING(3 3,4 4,5 5)"), from_wkt("MULTIPOINT(3 3,4 4,5 5)") ); #ifdef GEOMETRY_TEST_DEBUG std::cout << std::endl << std::endl << std::endl; #endif } //====================================================================== //====================================================================== BOOST_AUTO_TEST_CASE( test_polygon_point_iterator ) { #ifdef GEOMETRY_TEST_DEBUG std::cout << "*** POLYGON ***" << std::endl; #endif typedef multi_point_type MP; typedef polygon_type P; typedef test_point_iterator_of_geometry tester; tester::apply(from_wkt

("POLYGON()"), from_wkt("MULTIPOINT()") ); tester::apply(from_wkt

("POLYGON(())"), from_wkt("MULTIPOINT()") ); tester::apply(from_wkt

("POLYGON((3 3,4 4,5 5),(),(),(),\ (6 6,7 7,8 8),(),(),(9 9),())"), from_wkt("MULTIPOINT(3 3,4 4,5 5,6 6,7 7,8 8,9 9)") ); tester::apply(from_wkt

("POLYGON((),(3 3,4 4,5 5),(),(),\ (6 6,7 7,8 8),(),(),(9 9),())"), from_wkt("MULTIPOINT(3 3,4 4,5 5,6 6,7 7,8 8,9 9)") ); #ifdef GEOMETRY_TEST_DEBUG std::cout << std::endl << std::endl; #endif } //====================================================================== //====================================================================== BOOST_AUTO_TEST_CASE( test_multipoint_point_iterator ) { #ifdef GEOMETRY_TEST_DEBUG std::cout << "*** MULTIPOINT ***" << std::endl; #endif typedef multi_point_type MP; typedef test_point_iterator_of_geometry tester; tester::apply(from_wkt("MULTIPOINT()"), from_wkt("MULTIPOINT()") ); tester::apply(from_wkt("MULTIPOINT(3 3,4 4,5 5)"), from_wkt("MULTIPOINT(3 3,4 4,5 5)") ); #ifdef GEOMETRY_TEST_DEBUG std::cout << std::endl << std::endl << std::endl; #endif } //====================================================================== //====================================================================== BOOST_AUTO_TEST_CASE( test_multilinestring_point_iterator ) { #ifdef GEOMETRY_TEST_DEBUG std::cout << "*** MULTILINESTRING ***" << std::endl; #endif typedef multi_point_type MP; typedef linestring_type L; typedef multi_linestring_type ML; typedef test_point_iterator_of_geometry tester; tester::apply(from_wkt("MULTILINESTRING()"), from_wkt("MULTIPOINT()") ); tester::apply(from_wkt("MULTILINESTRING(())"), from_wkt("MULTIPOINT()") ); tester::apply(from_wkt("MULTILINESTRING((),(),())"), from_wkt("MULTIPOINT()") ); tester::apply(from_wkt("MULTILINESTRING((),(),(0 0,1 1,2 2),(),(),\ (3 3,4 4,5 5),(),(6 6),(),(),())"), from_wkt("MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5,6 6)") ); #ifdef GEOMETRY_TEST_DEBUG std::cout << std::endl << std::endl; #endif } //====================================================================== //====================================================================== BOOST_AUTO_TEST_CASE( test_multipolygon_point_iterator ) { #ifdef GEOMETRY_TEST_DEBUG std::cout << "*** MULTIPOLYGON ***" << std::endl; #endif typedef multi_point_type MP; typedef multi_polygon_type MPL; typedef test_point_iterator_of_geometry tester; tester::apply(from_wkt("MULTIPOLYGON()"), from_wkt("MULTIPOINT()") ); tester::apply(from_wkt("MULTIPOLYGON( () )"), from_wkt("MULTIPOINT()") ); tester::apply(from_wkt("MULTIPOLYGON( (()) )"), from_wkt("MULTIPOINT()") ); tester::apply(from_wkt("MULTIPOLYGON( ((),()) )"), from_wkt("MULTIPOINT()") ); tester::apply(from_wkt("MULTIPOLYGON(\ ((3 3,4 4,5 5),(),(),(),\ (6 6,7 7,8 8),(),(),(9 9),())\ \ ((),(1 1,2 2,10 10),(),(),(),\ (11 11,12 12),(),(),(13 13),())\ )"), from_wkt("MULTIPOINT(3 3,4 4,5 5,6 6,7 7,8 8,9 9,\ 1 1,2 2,10 10,11 11,12 12,13 13)") ); tester::apply(from_wkt("MULTIPOLYGON(\ (),\ \ ((3 3,4 4,5 5),(),(),(),\ (6 6,7 7,8 8),(),(),(9 9),())\ \ ((),(1 1,2 2,10 10),(),(),(),\ (11 11,12 12),(),(),(13 13),())\ \ ((),(),()),\ )"), from_wkt("MULTIPOINT(3 3,4 4,5 5,6 6,7 7,8 8,9 9,\ 1 1,2 2,10 10,11 11,12 12,13 13)") ); #ifdef GEOMETRY_TEST_DEBUG std::cout << std::endl << std::endl; #endif }