Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r69254 - trunk/libs/geometry/test/algorithms
From: barend.gehrels_at_[hidden]
Date: 2011-02-24 17:32:03


Author: barendgehrels
Date: 2011-02-24 17:32:00 EST (Thu, 24 Feb 2011)
New Revision: 69254
URL: http://svn.boost.org/trac/boost/changeset/69254

Log:
Testcases for difference, assign, append
Text files modified:
   trunk/libs/geometry/test/algorithms/append.cpp | 30 ++++++++++++-
   trunk/libs/geometry/test/algorithms/assign.cpp | 84 +++++++++++++++++++++++----------------
   trunk/libs/geometry/test/algorithms/difference.cpp | 59 ++++++++++++++++++++++++++++
   trunk/libs/geometry/test/algorithms/test_difference.hpp | 13 +++++
   4 files changed, 146 insertions(+), 40 deletions(-)

Modified: trunk/libs/geometry/test/algorithms/append.cpp
==============================================================================
--- trunk/libs/geometry/test/algorithms/append.cpp (original)
+++ trunk/libs/geometry/test/algorithms/append.cpp 2011-02-24 17:32:00 EST (Thu, 24 Feb 2011)
@@ -26,22 +26,44 @@
 
 
 template <typename G>
-void test_geometry()
+void test_geometry(bool check = true)
 {
     G geometry;
     typedef typename bg::point_type<G>::type P;
 
     bg::append(geometry, bg::make_zero<P>());
- BOOST_CHECK_EQUAL(bg::num_points(geometry), 1u);
+ if (check)
+ {
+ BOOST_CHECK_EQUAL(bg::num_points(geometry), 1u);
+ }
+
+ // Append a range
+ std::vector<P> v;
+ v.push_back(bg::make_zero<P>());
+ v.push_back(bg::make_zero<P>());
+ bg::append(geometry, v);
+
+ if (check)
+ {
+ BOOST_CHECK_EQUAL(bg::num_points(geometry), 3u);
+ }
 
     bg::clear(geometry);
- BOOST_CHECK_EQUAL(bg::num_points(geometry), 0u);
+
+ if (check)
+ {
+ BOOST_CHECK_EQUAL(bg::num_points(geometry), 0u);
+ }
+
     //P p = boost::range::front(geometry);
 }
 
 template <typename P>
 void test_all()
 {
+ test_geometry<P>(false);
+ test_geometry<bg::model::box<P> >(false);
+ test_geometry<bg::model::segment<P> >(false);
     test_geometry<bg::model::linestring<P> >();
     test_geometry<bg::model::ring<P> >();
     test_geometry<bg::model::polygon<P> >();
@@ -50,7 +72,7 @@
     test_geometry<std::deque<P> >();
     //test_geometry<std::list<P> >();
 
- test_geometry<test::wrapped_boost_array<P, 2> >();
+ test_geometry<test::wrapped_boost_array<P, 3> >();
 }
 
 int test_main(int, char* [])

Modified: trunk/libs/geometry/test/algorithms/assign.cpp
==============================================================================
--- trunk/libs/geometry/test/algorithms/assign.cpp (original)
+++ trunk/libs/geometry/test/algorithms/assign.cpp 2011-02-24 17:32:00 EST (Thu, 24 Feb 2011)
@@ -17,13 +17,13 @@
 #include <test_common/test_point.hpp>
 
 
-template <typename L>
-void check_linestring_2d(const L& line)
+template <typename Linestring>
+void check_linestring_2d(Linestring const& line)
 {
     BOOST_CHECK((boost::size(line) == 3));
     BOOST_CHECK((bg::num_points(line) == 3));
 
- typedef typename bg::point_type<L>::type point_type;
+ typedef typename bg::point_type<Linestring>::type point_type;
     point_type const& p0 = line[0];
     BOOST_CHECK(bg::get<0>(p0) == 1);
     BOOST_CHECK(bg::get<1>(p0) == 2);
@@ -37,10 +37,10 @@
     BOOST_CHECK(bg::get<1>(p2) == 6);
 }
 
-template <typename P>
+template <typename Point>
 void test_assign_linestring_2d()
 {
- bg::model::linestring<P> line;
+ bg::model::linestring<Point> line;
 
     // Test assignment of plain array (note that this is only possible if adapted c-array is included!
     const double coors[3][2] = { {1, 2}, {3, 4}, {5, 6} };
@@ -48,7 +48,7 @@
     check_linestring_2d(line);
 
     // Test assignment of point array
- P points[3];
+ Point points[3];
     bg::assign(points[0], 1, 2);
     bg::assign(points[1], 3, 4);
     bg::assign(points[2], 5, 6);
@@ -64,36 +64,50 @@
     check_linestring_2d(line);
 }
 
-template <typename P>
-void test_assign_box_2d()
+namespace detail
 {
+ template <typename BoxOrSegment>
+ void test_assign_box_or_segment_2d()
+ {
+ BoxOrSegment geometry;
+ bg::assign(geometry, 1, 2, 3, 4);
+ BOOST_CHECK((bg::get<bg::min_corner, 0>(geometry) == 1));
+ BOOST_CHECK((bg::get<bg::min_corner, 1>(geometry) == 2));
+ BOOST_CHECK((bg::get<bg::max_corner, 0>(geometry) == 3));
+ BOOST_CHECK((bg::get<bg::max_corner, 1>(geometry) == 4));
+
+ bg::assign_zero(geometry);
+ BOOST_CHECK((bg::get<bg::min_corner, 0>(geometry) == 0));
+ BOOST_CHECK((bg::get<bg::min_corner, 1>(geometry) == 0));
+ BOOST_CHECK((bg::get<bg::max_corner, 0>(geometry) == 0));
+ BOOST_CHECK((bg::get<bg::max_corner, 1>(geometry) == 0));
+
+ bg::assign_inverse(geometry);
+ BOOST_CHECK((bg::get<bg::min_corner, 0>(geometry) > 9999));
+ BOOST_CHECK((bg::get<bg::min_corner, 1>(geometry) > 9999));
+ BOOST_CHECK((bg::get<bg::max_corner, 0>(geometry) < 9999));
+ BOOST_CHECK((bg::get<bg::max_corner, 1>(geometry) < 9999));
+ }
+}
 
- typedef bg::model::box<P> B;
- B b;
- bg::assign(b, 1, 2, 3, 4);
- BOOST_CHECK((bg::get<bg::min_corner, 0>(b) == 1));
- BOOST_CHECK((bg::get<bg::min_corner, 1>(b) == 2));
- BOOST_CHECK((bg::get<bg::max_corner, 0>(b) == 3));
- BOOST_CHECK((bg::get<bg::max_corner, 1>(b) == 4));
-
- bg::assign_zero(b);
- BOOST_CHECK((bg::get<bg::min_corner, 0>(b) == 0));
- BOOST_CHECK((bg::get<bg::min_corner, 1>(b) == 0));
- BOOST_CHECK((bg::get<bg::max_corner, 0>(b) == 0));
- BOOST_CHECK((bg::get<bg::max_corner, 1>(b) == 0));
-
- bg::assign_inverse(b);
- BOOST_CHECK((bg::get<bg::min_corner, 0>(b) > 9999));
- BOOST_CHECK((bg::get<bg::min_corner, 1>(b) > 9999));
- BOOST_CHECK((bg::get<bg::max_corner, 0>(b) < 9999));
- BOOST_CHECK((bg::get<bg::max_corner, 1>(b) < 9999));
+template <typename Point>
+void test_assign_box_or_segment_2d()
+{
+ detail::test_assign_box_or_segment_2d<bg::model::box<Point> >();
+ detail::test_assign_box_or_segment_2d<bg::model::segment<Point> >();
+}
 
+template <typename Point>
+void test_assign_box_2d()
+{
+ detail::test_assign_box_or_segment_2d<bg::model::box<Point> >();
 }
 
-template <typename P>
+
+template <typename Point>
 void test_assign_point_3d()
 {
- P p;
+ Point p;
     bg::assign(p, 1, 2, 3);
     BOOST_CHECK(bg::get<0>(p) == 1);
     BOOST_CHECK(bg::get<1>(p) == 2);
@@ -111,10 +125,10 @@
 
 }
 
-template <typename P>
+template <typename Point>
 void test_assign_point_2d()
 {
- P p;
+ Point p;
     bg::assign(p, 1, 2);
     BOOST_CHECK(bg::get<0>(p) == 1);
     BOOST_CHECK(bg::get<1>(p) == 2);
@@ -145,12 +159,14 @@
     test_assign_point_2d<bg::model::point<float, 2, bg::cs::cartesian> >();
     test_assign_point_2d<bg::model::point<double, 2, bg::cs::cartesian> >();
 
+ // Segment (currently) cannot handle array's because derived from std::pair
     test_assign_box_2d<int[2]>();
     test_assign_box_2d<float[2]>();
     test_assign_box_2d<double[2]>();
- test_assign_box_2d<bg::model::point<int, 2, bg::cs::cartesian> >();
- test_assign_box_2d<bg::model::point<float, 2, bg::cs::cartesian> >();
- test_assign_box_2d<bg::model::point<double, 2, bg::cs::cartesian> >();
+
+ test_assign_box_or_segment_2d<bg::model::point<int, 2, bg::cs::cartesian> >();
+ test_assign_box_or_segment_2d<bg::model::point<float, 2, bg::cs::cartesian> >();
+ test_assign_box_or_segment_2d<bg::model::point<double, 2, bg::cs::cartesian> >();
 
     test_assign_linestring_2d<bg::model::point<int, 2, bg::cs::cartesian> >();
     test_assign_linestring_2d<bg::model::point<float, 2, bg::cs::cartesian> >();

Modified: trunk/libs/geometry/test/algorithms/difference.cpp
==============================================================================
--- trunk/libs/geometry/test/algorithms/difference.cpp (original)
+++ trunk/libs/geometry/test/algorithms/difference.cpp 2011-02-24 17:32:00 EST (Thu, 24 Feb 2011)
@@ -17,9 +17,11 @@
 #include <algorithms/test_difference.hpp>
 #include <algorithms/test_overlay.hpp>
 #include <algorithms/overlay/overlay_cases.hpp>
+#include <multi/algorithms/overlay/multi_overlay_cases.hpp>
 
 #include <boost/geometry/algorithms/correct.hpp>
 #include <boost/geometry/algorithms/perimeter.hpp>
+#include <boost/geometry/multi/algorithms/correct.hpp>
 #include <boost/geometry/extensions/gis/io/wkb/read_wkb.hpp>
 #include <boost/geometry/extensions/gis/io/wkb/utility.hpp>
 
@@ -32,7 +34,9 @@
 template <typename P>
 void test_all()
 {
+ typedef bg::model::box<P> box;
     typedef bg::model::polygon<P> polygon;
+ typedef bg::model::ring<P> ring;
 
     test_one<polygon, polygon, polygon>(
             "star_ring", example_star, example_ring,
@@ -93,6 +97,61 @@
             8, 22, 2.43452380952381,
             7, 27, 3.18452380952381);
 
+ // Other combi's
+ {
+ test_one<polygon, polygon, ring>(
+ "star_ring_ring", example_star, example_ring,
+ 5, 22, 1.1901714, 5, 27, 1.6701714);
+
+ test_one<polygon, ring, polygon>(
+ "ring_star_ring", example_ring, example_star,
+ 5, 22, 1.6701714, 5, 27, 1.1901714);
+
+ static std::string const clip = "POLYGON((2.5 0.5,5.5 2.5))";
+
+ test_one<polygon, box, ring>("star_box",
+ clip, example_star,
+ 4, 11, 2.833333, 4, 11, 0.833333);
+
+ test_one<polygon, ring, box>("box_star",
+ example_star, clip,
+ 4, 11, 0.833333, 4, 11, 2.833333);
+ }
+
+ // Counter clockwise
+ {
+ typedef bg::model::polygon<P, false> polygon_ccw;
+ test_one<polygon, polygon_ccw, polygon_ccw>(
+ "star_ring_ccw", example_star, example_ring,
+ 5, 22, 1.1901714, 5, 27, 1.6701714);
+ test_one<polygon, polygon, polygon_ccw>(
+ "star_ring_ccw1", example_star, example_ring,
+ 5, 22, 1.1901714, 5, 27, 1.6701714);
+ test_one<polygon, polygon_ccw, polygon>(
+ "star_ring_ccw2", example_star, example_ring,
+ 5, 22, 1.1901714, 5, 27, 1.6701714);
+ }
+
+
+
+ // Multi
+ {
+ typedef bg::model::multi_polygon<polygon> mp;
+
+ test_one<polygon, mp, mp>("simplex_multi",
+ case_multi_simplex[0], case_multi_simplex[1],
+ 5, 12, 5.58, 4, 12, 2.58);
+
+ static std::string const clip = "POLYGON((2 2,4 4))";
+
+ test_one<polygon, box, mp>("simplex_multi_box_mp",
+ clip, case_multi_simplex[0],
+ 3, 11, 4.53333, 3, 11, 8.53333);
+ test_one<polygon, mp, box>("simplex_multi_mp_box",
+ case_multi_simplex[0], clip,
+ 3, 11, 8.53333, 3, 11, 4.53333);
+ }
+
     /***
     Experimental (cut), does not work:
     test_one<polygon, polygon, polygon>(

Modified: trunk/libs/geometry/test/algorithms/test_difference.hpp
==============================================================================
--- trunk/libs/geometry/test/algorithms/test_difference.hpp (original)
+++ trunk/libs/geometry/test/algorithms/test_difference.hpp 2011-02-24 17:32:00 EST (Thu, 24 Feb 2011)
@@ -16,6 +16,7 @@
 
 #include <boost/geometry/algorithms/difference.hpp>
 #include <boost/geometry/algorithms/sym_difference.hpp>
+#include <boost/geometry/multi/algorithms/difference.hpp>
 
 #include <boost/geometry/algorithms/area.hpp>
 #include <boost/geometry/algorithms/num_points.hpp>
@@ -23,6 +24,11 @@
 
 #include <boost/geometry/geometries/geometries.hpp>
 
+
+#include <boost/geometry/multi/geometries/multi_point.hpp>
+#include <boost/geometry/multi/geometries/multi_linestring.hpp>
+#include <boost/geometry/multi/geometries/multi_polygon.hpp>
+
 #include <boost/geometry/strategies/strategies.hpp>
 
 #include <boost/geometry/extensions/gis/io/wkt/wkt.hpp>
@@ -49,11 +55,11 @@
 
     if (sym)
     {
- bg::sym_difference<OutputType>(g1, g2, clip);
+ bg::sym_difference(g1, g2, clip);
     }
     else
     {
- bg::difference<OutputType>(g1, g2, clip);
+ bg::difference(g1, g2, clip);
     }
 
     double area = 0;
@@ -154,6 +160,9 @@
     G2 g2;
     bg::read_wkt(wkt2, g2);
 
+ bg::correct(g1);
+ bg::correct(g2);
+
     test_difference<OutputType, void>(caseid + "_a", g1, g2,
         expected_count1, expected_point_count1,
         expected_area1, percentage);


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk