#include #ifndef BOOST_TEST_MODULE #define BOOST_TEST_MODULE test_is_simple #endif #include #include #include #include #include #include #include #include #include namespace bg = ::boost::geometry; 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_polygon_type; typedef bg::model::polygon closed_polygon_type; // multi-geometries typedef bg::model::multi_point multi_point_type; typedef bg::model::multi_polygon multi_polygon_type; template Geometry from_wkt(std::string const& wkt) { Geometry g; bg::read_wkt(wkt, g); return g; } template Segment make_segment(double x1, double y1, double x2, double y2) { typename boost::geometry::point_type::type p(x1, y1), q(x2, y2); return Segment(p, q); } template void test_simple(Geometry const& g, bool simple_geometry) { #ifdef GEOMETRY_TEST_DEBUG std::cout << "======================================" << std::endl; #endif bool simple = bg::ogc::is_simple(g); BOOST_CHECK(simple == simple_geometry); #ifdef GEOMETRY_TEST_DEBUG std::cout << "Geometry: " << bg::wkt(g) << std::endl; std::cout << std::boolalpha; std::cout << "is simple: " << simple << std::endl; std::cout << "expected result: " << simple_geometry << std::endl; std::cout << "======================================" << std::endl; std::cout << std::endl << std::endl; std::cout << std::noboolalpha; #endif } //=========================================================================== //=========================================================================== //=========================================================================== BOOST_AUTO_TEST_CASE( test_is_simple_point ) { #ifdef GEOMETRY_TEST_DEBUG std::cout << std::endl << std::endl; std::cout << "************************************" << std::endl; std::cout << " is_simple: POINT " << std::endl; std::cout << "************************************" << std::endl; #endif typedef point_type G; test_simple(from_wkt("POINT(0 0)"), true); } BOOST_AUTO_TEST_CASE( test_is_simple_segment ) { #ifdef GEOMETRY_TEST_DEBUG std::cout << std::endl << std::endl; std::cout << "************************************" << std::endl; std::cout << " is_simple: SEGMENT " << std::endl; std::cout << "************************************" << std::endl; #endif typedef segment_type G; test_simple(make_segment(0, 0, 0, 0), true); test_simple(make_segment(0, 0, 1, 0), true); } BOOST_AUTO_TEST_CASE( test_is_simple_linestring ) { #ifdef GEOMETRY_TEST_DEBUG std::cout << std::endl << std::endl; std::cout << "************************************" << std::endl; std::cout << " is_simple: LINESTRING " << std::endl; std::cout << "************************************" << std::endl; #endif typedef linestring_type G; test_simple(from_wkt("LINESTRING()"), true); test_simple(from_wkt("LINESTRING(0 0)"), false); test_simple(from_wkt("LINESTRING(0 0,0 0)"), true); test_simple(from_wkt("LINESTRING(0 0,1 2)"), true); test_simple(from_wkt("LINESTRING(0 0,1 0,2 10,0.5 -1)"), false); test_simple(from_wkt("LINESTRING(0 0,1 0,2 1,1 0)"), false); test_simple(from_wkt("LINESTRING(0 0,1 0,2 1,0.5 0)"), false); test_simple(from_wkt("LINESTRING(0 0,1 0,0.5 0)"), false); test_simple(from_wkt("LINESTRING(0 0,1 0,2 0,0.5 0)"), false); test_simple(from_wkt("LINESTRING(0 0,1 0,2 0,1.5 0)"), false); test_simple(from_wkt("LINESTRING(0 0,1 0,2 0,1.5 0,0.5 0)"), false); test_simple(from_wkt("LINESTRING(0 0,1 0,0.5 0,2 0)"), false); test_simple(from_wkt("LINESTRING(0 0,1 0,1 1,0.5 0,0 0)"), false); test_simple(from_wkt("LINESTRING(0 0,1 0,1 1,0 0)"), true); test_simple(from_wkt("LINESTRING(0 0,0 0,1 0,1 0,1 1,0 0)"), true); } BOOST_AUTO_TEST_CASE( test_is_simple_multilinestring ) { #ifdef GEOMETRY_TEST_DEBUG std::cout << std::endl << std::endl; std::cout << "************************************" << std::endl; std::cout << " is_simple: MULTILINESTRING " << std::endl; std::cout << "************************************" << std::endl; #endif typedef multi_linestring_type G; test_simple(from_wkt("MULTILINESTRING()"), true); test_simple(from_wkt("MULTILINESTRING(())"), true); test_simple(from_wkt("MULTILINESTRING((),(),())"), true); test_simple(from_wkt("MULTILINESTRING((),(0 1,1 0))"), true); test_simple(from_wkt("MULTILINESTRING((0 0),(0 1,1 0))"), false); test_simple(from_wkt("MULTILINESTRING((0 0,0 0),(0 1,1 0))"), true); test_simple(from_wkt("MULTILINESTRING((0 0),(1 0))"), false); test_simple(from_wkt("MULTILINESTRING((0 0,0 0),(1 0,1 0))"), true); test_simple(from_wkt("MULTILINESTRING((0 0),(0 0))"), false); test_simple(from_wkt("MULTILINESTRING((0 0,1 0,0 0),(5 0))"), false); test_simple(from_wkt("MULTILINESTRING((0 0,1 0,0 0),\ (5 0,1 0,4 1))"), false); test_simple(from_wkt("MULTILINESTRING((0 0,1 0,0 0),\ (5 0,1 0,4 0))"), false); test_simple(from_wkt("MULTILINESTRING((0 0,1 0,0 0),(1 0,2 0))"), false); test_simple(from_wkt("MULTILINESTRING((0 0,1 1),(0 1,1 0))"), false); test_simple(from_wkt("MULTILINESTRING((0 0,1 1),(1 1,1 0))"), true); test_simple(from_wkt("MULTILINESTRING((0 0,2 0),(1 0,0 1))"), false); test_simple(from_wkt("MULTILINESTRING((0 0,1 1),(1 1,1 0),(0 1,1 1))"), true); test_simple(from_wkt("MULTILINESTRING((0 0,1 1),(1 1,1 0),\ (1 1,0 1,0.5,0.5))"), false); } #if 0 BOOST_AUTO_TEST_CASE( test_is_simple_rest ) { typedef multi_linestring_type mls; typedef open_polygon_type op; typedef closed_polygon_type cp; typedef multi_point_type mpt; typedef multi_polygon_type mpl; test_simple(from_wkt("MULTILINESTRING()"), true); test_simple(from_wkt("MULTILINESTRING(())"), true); test_simple(from_wkt("MULTILINESTRING((),(),())"), true); test_simple(from_wkt("MULTILINESTRING((),(0 1,1 0))"), true); test_simple(from_wkt("MULTILINESTRING((0 0),(0 1,1 0))"), true); test_simple(from_wkt("MULTILINESTRING((0 0),(1 0))"), true); #ifdef GEOMETRY_TEST_INCLUDE_FAILING_TESTS // test_simple(from_wkt("MULTILINESTRING((0 0),(0 0))"), false); #endif test_simple(from_wkt("MULTILINESTRING((0 0,1 0,0 0),(5 0))"), false); test_simple(from_wkt("MULTILINESTRING((0 0,1 0,0 0),\ (5 0,1 0,4 1))"), false); test_simple(from_wkt("MULTILINESTRING((0 0,1 0,0 0),\ (5 0,1 0,4 0))"), false); test_simple(from_wkt("MULTILINESTRING((0 0,1 0,0 0),(1 0,2 0))"), false); test_simple(from_wkt("MULTILINESTRING((0 0,1 1),(0 1,1 0))"), false); test_simple(from_wkt("MULTILINESTRING((0 0,1 1),(1 1,1 0))"), false); test_simple(from_wkt("MULTILINESTRING((0 0,2 0),(1 0,0 1))"), false); test_simple(from_wkt("POLYGON(())"), true); test_simple(from_wkt("POLYGON((),())"), true); test_simple(from_wkt("POLYGON((0 0,1 0,1 1),())"), true); test_simple(from_wkt("POLYGON((0 0,1 0,1 0,1 1),())"), true); test_simple(from_wkt("POLYGON((0 0,1 0))"), false); test_simple(from_wkt("POLYGON((0 0,2 0,0.5 0,0.5 1))"), false); test_simple(from_wkt("POLYGON((0 0,2 0,0.5 0,0.5 0))"), false); test_simple(from_wkt("POLYGON((0 0,1 0,1 1,1 0.5))"), false); test_simple(from_wkt("POLYGON((0 0,1 0,1 1))"), true); test_simple(from_wkt("POLYGON((0 0,1 0,2 1,2 2,1 3))"), true); test_simple(from_wkt("POLYGON((0 0,2 0,4 1,1 0))"), false); test_simple(from_wkt("POLYGON((0 0,1 0,3 1,-1 2,3 3,3 4,0 4))"), false); test_simple(from_wkt("POLYGON((0 0,1 0,3 1,0 2,3 3,3 4,0 4))"), false); test_simple(from_wkt("POLYGON((0 0,10 0,10 10,0 10),\ (1 1,1 2,2 2,2 1))"), false); test_simple(from_wkt("POLYGON(())"), true); test_simple(from_wkt("POLYGON((),())"), true); test_simple(from_wkt("POLYGON((0 0,1 0,1 1,0 0),())"), true); test_simple(from_wkt("POLYGON((0 0,1 0,1 0,1 1,0 0),())"), true); test_simple(from_wkt("POLYGON((0 0,1 0,0 0))"), false); test_simple(from_wkt("POLYGON((0 0,2 0,0.5 0,0.5 1,0 0))"), false); test_simple(from_wkt("POLYGON((0 0,2 0,0.5 0,0.5 0,0 0))"), false); test_simple(from_wkt("POLYGON((0 0,1 0,1 1,1 0.5,0 0))"), false); test_simple(from_wkt("POLYGON((0 0,1 0,1 1,0 0))"), true); test_simple(from_wkt("POLYGON((0 0,1 0,2 1,2 2,1 3,0 0))"), true); test_simple(from_wkt("POLYGON((0 0,2 0,4 1,1 0,0 0))"), false); test_simple(from_wkt("POLYGON((0 0,1 0,3 1,-1 2,3 3,3 4,0 4,0 0))"), false); test_simple(from_wkt("POLYGON((0 0,1 0,3 1,0 2,3 3,3 4,0 4,0 0))"), false); test_simple(from_wkt("POLYGON((0 0,10 0,10 10,0 10,0 0),\ (1 1,1 2,2 2,2 1,1 1))"), false); test_simple(from_wkt("MULTIPOINT()"), true); test_simple(from_wkt("MULTIPOINT(0 0,1 0,1 1,0 1)"), true); test_simple(from_wkt("MULTIPOINT(0 0,1 0,1 1,1 0,0 1)"), false); test_simple(from_wkt("MULTIPOLYGON()"), true); test_simple(from_wkt("MULTIPOLYGON( ((),()) )"), true); test_simple(from_wkt("MULTIPOLYGON( (()),(()) )"), true); test_simple(from_wkt("MULTIPOLYGON( ((),()),(()) )"), true); test_simple(from_wkt("MULTIPOLYGON( ((0 0),()),(()) )"), true); test_simple(from_wkt("MULTIPOLYGON( ((0 0),()),((1 1)) )"), true); #ifdef GEOMETRY_TEST_INCLUDE_FAILING_TESTS // test_simple(from_wkt("MULTIPOLYGON( ((0 0),()),((0 0)) )"), false); #endif test_simple(from_wkt("MULTIPOLYGON(((0 0,1 0,2 1,2 2,1 3)),\ ((10 0,11 0,11 1)))"), true); test_simple(from_wkt("MULTIPOLYGON(((0 0,1 0,1 0,2 1,2 2,1 3)),\ ((10 0,11 0,11 1,11 1)))"), true); test_simple(from_wkt("MULTIPOLYGON(((0 0,1 0,3 1,0 2,3 3,3 4,0 4)),\ ((10 0,11 0,11 1)))"), false); } #endif