1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 // Unit Test
3 
4 // Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
5 // Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
6 // Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
7 // Copyright (c) 2013-2017 Adam Wulkiewicz, Lodz, Poland.
8 
9 // This file was modified by Oracle on 2014, 2015.
10 // Modifications copyright (c) 2014-2015 Oracle and/or its affiliates.
11 
12 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
13 
14 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
15 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
16 
17 // Use, modification and distribution is subject to the Boost Software License,
18 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
19 // http://www.boost.org/LICENSE_1_0.txt)
20 
21 // Instead of having a separate (and nearly similar) unit test to test multipolygons,
22 // we now include them here and compile them by default. Only undefining the next line
23 // will avoid testing multi-geometries
24 #define BOOST_GEOMETRY_UNIT_TEST_MULTI
25 
26 #include <geometry_test_common.hpp>
27 
28 // The include to test
29 #include <boost/geometry/algorithms/point_on_surface.hpp>
30 
31 // Helper includes
32 #include <boost/geometry/algorithms/correct.hpp>
33 #include <boost/geometry/algorithms/within.hpp>
34 #include <boost/geometry/io/wkt/wkt.hpp>
35 #include <boost/geometry/strategies/strategies.hpp>
36 
37 #include <boost/geometry/geometries/geometries.hpp>
38 #include <boost/geometry/geometries/point_xy.hpp>
39 
40 // Include from unit tests
41 #include <algorithms/test_overlay.hpp>
42 #include <algorithms/predef_relop.hpp>
43 #include <algorithms/overlay/overlay_cases.hpp>
44 
45 #if defined(BOOST_GEOMETRY_UNIT_TEST_MULTI)
46 #  include <boost/geometry/algorithms/detail/extreme_points.hpp>
47 #endif
48 
49 
50 #if defined(TEST_WITH_SVG)
51 #  include <boost/geometry/io/svg/svg_mapper.hpp>
52 #endif
53 
54 template <typename Geometry>
test_geometry(std::string const & case_id,Geometry const & geometry,double=0,double=0)55 void test_geometry(std::string const& case_id, Geometry const& geometry, double /*expected_x*/ = 0, double /*expected_y*/ = 0)
56 {
57 //std::cout << case_id << std::endl;
58     typedef typename bg::point_type<Geometry>::type point_type;
59 
60     point_type point;
61     bg::point_on_surface(geometry, point);
62 
63     BOOST_CHECK_MESSAGE(bg::within(point, geometry),
64         case_id << " generated point_on_surface (dim 1) is not within geometry");
65 
66 #ifdef BOOST_GEOMETRY_POINT_ON_SURFACE_COMPLETE
67     // For the algorithm we also check generation in the other dimension
68     point_type right_point;
69     bg::detail::point_on_surface::calculate_point_on_surface<0>(geometry, right_point);
70 
71     BOOST_CHECK_MESSAGE(bg::within(right_point, geometry),
72         case_id << " generated point_on_surface (dim 0) is not within geometry");
73 
74     point_type returned_point = bg::return_point_on_surface(geometry);
75 #endif
76 
77 #if defined(TEST_WITH_SVG)
78     {
79         std::ostringstream filename;
80         filename << "point_on_surface_" << case_id << "_"
81             << string_from_type<typename bg::coordinate_type<Geometry>::type>::name()
82             << ".svg";
83 
84         std::ofstream svg(filename.str().c_str());
85 
86         // To map the intermediate products:
87         bg::model::linestring<point_type> top_points;
88         typedef bg::model::linestring<point_type> intruder_type;
89         std::vector<intruder_type> top_intruders;
90         bg::extreme_points<1>(geometry, top_points, top_intruders);
91 
92 #ifdef BOOST_GEOMETRY_POINT_ON_SURFACE_COMPLETE
93         bg::model::linestring<point_type> right_points;
94         std::vector<bg::model::linestring<point_type> > right_intruders;
95         bg::extreme_points<0>(geometry, right_points, right_intruders);
96 #endif
97 
98         bg::svg_mapper<point_type> mapper(svg, 500, 500);
99         mapper.add(geometry);
100         mapper.map(geometry, "fill-opacity:0.5;fill:rgb(153,204,0);stroke:rgb(153,204,0);stroke-width:1");
101 
102         // Top (red/magenta)
103         mapper.map(top_points, "stroke:rgb(255,0,0);stroke-width:2");
104         BOOST_FOREACH(intruder_type const& intruder, top_intruders)
105         {
106             mapper.map(intruder, "stroke:rgb(255,0,255);stroke-width:2");
107         }
108         mapper.map(point, "opacity:0.8;fill:rgb(255,128,0);stroke:rgb(0,0,100);stroke-width:1", 3);
109 
110 #ifdef BOOST_GEOMETRY_POINT_ON_SURFACE_COMPLETE
111         //// Right (blue/cyan)
112         // (mostly commented, makes the picture less clear)
113         //mapper.map(right_points, "stroke:rgb(0,0,255);stroke-width:2");
114         //BOOST_FOREACH(intruder_type const& intruder, right_intruders)
115         //{
116         //    mapper.map(intruder, "stroke:rgb(0,255,255);stroke-width:2");
117         //}
118         mapper.map(right_point, "opacity:0.8;fill:rgb(0,128,255);stroke:rgb(0,0,100);stroke-width:1", 3);
119 #endif
120     }
121 #endif
122 
123 }
124 
125 template <typename Geometry>
test_geometry(std::string const & case_id,std::string const & wkt,double expected_x=0,double expected_y=0)126 void test_geometry(std::string const& case_id, std::string const& wkt, double expected_x = 0, double expected_y = 0)
127 {
128     Geometry geometry;
129     bg::read_wkt(wkt, geometry);
130     bg::correct(geometry);
131     test_geometry(case_id, geometry, expected_x, expected_y);
132 }
133 
134 template <typename Point>
test_point_order_and_type()135 void test_point_order_and_type()
136 {
137     typedef bg::model::polygon<Point, false, false> ccw_open_polygon;
138     typedef bg::model::polygon<Point,  true, false> cw_open_polygon;
139     typedef bg::model::polygon<Point, false,  true> ccw_closed_polygon;
140     typedef bg::model::polygon<Point,  true,  true> cw_closed_polygon;
141 
142     test_geometry<ccw_open_polygon>("with_hole_ccw_open", "POLYGON((0 0,9 0,9 9,0 9),(2 2,2 7,7 7,7 2))", 0, 0);
143     test_geometry<cw_open_polygon>("with_hole_cw_open", "POLYGON((0 0,0 9,9 9,9 0),(2 2,7 2,7 7,2 7))", 0, 0);
144     test_geometry<ccw_closed_polygon>("with_hole_ccw_closed", "POLYGON((0 0,9 0,9 9,0 9,0 0),(2 2,2 7,7 7,7 2,2 2))", 0, 0);
145     test_geometry<cw_closed_polygon>("with_hole_cw_closed", "POLYGON((0 0,0 9,9 9,9 0,0 0),(2 2,7 2,7 7,2 7,2 2))", 0, 0);
146 
147     test_geometry<cw_closed_polygon>("t1", "POLYGON((0 0,0 10,10 0,0 0))", 0, 0);
148     test_geometry<cw_closed_polygon>("t2", "POLYGON((0 0,10 0,0 -10,0 0))", 0, 0);
149     test_geometry<cw_closed_polygon>("t3", "POLYGON((0 0,0 -10,-10 0,0 0))", 0, 0);
150     test_geometry<cw_closed_polygon>("t4", "POLYGON((0 0,-10 0,0 10,0 0))", 0, 0);
151 }
152 
153 template <typename Point>
test_all()154 void test_all()
155 {
156     typedef bg::model::polygon<Point> polygon;
157 
158     // Specific test-cases for point-on-surface:
159     test_geometry<polygon>("ice", "polygon((5 0,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0))", 0, 0);
160     test_geometry<polygon>("intruding", "polygon((5 0,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,7 2,4 7,6 1,5 0))", 0, 0);
161     test_geometry<polygon>("intruding2", "polygon((5 0,3 2,4 6,2 3,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,7 2,4 7,6 1,5 0))", 0, 0);
162     test_geometry<polygon>("intruding3", "polygon((5 0,3 2,3 6,2 3,0 5,1 6,3 7,2 5,4 8,6 5,5 7,7 6,8 5,9 6,10 5,7 2,5 6,6 1,5 0))", 0, 0);
163     test_geometry<polygon>("intruding4", "polygon((5 0,3 2,3 6,2 3,0 5,1 6,3 7,2 5,4 8,6 5,5 8,7 6,8 5,9 6,10 5,7 2,5 6,6 1,5 0))", 0, 0);
164     test_geometry<polygon>("intruding5", "polygon((5 0,3 2,3 6,2 3,0 5,1 6,3 8,2 5,4 8,6 5,5 8,7 6,8 5,9 6,10 5,7 2,5 6,6 1,5 0))", 0, 0);
165     test_geometry<polygon>("ice_int", "polygon((5 0,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0),(3 4,4 3,5 4,4 7,3 4))", 0, 0);
166     test_geometry<polygon>("ice_int2", "polygon((5 0,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0),(4 7,3 4,4 3,5 4,4 7))", 0, 0);
167     test_geometry<polygon>("ice_in3", "polygon((5 0,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0),(3 4,5 4,5 6,3 6,3 4))", 0, 0);
168     test_geometry<polygon>("simplex_normal", simplex_normal[0], 0, 0);
169     test_geometry<polygon>("sqr", "polygon((0 0,0 5,0 10,5 10,10 10,10 5,10 0,5 0,0 0))", 0, 0);
170     test_geometry<polygon>("self_tangent", "polygon((0 0,5 10,10 0,9 0,7 4,8 0,7 0,5 10,3 0,2 0,3 4,1 0,0 0))", 0, 0);
171     test_geometry<polygon>("self_tangent2", "polygon((5 0,2 3,4 8,1.5 3.5,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0))", 0, 0);
172     test_geometry<polygon>("self_tangent_int", "polygon((5 0,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0),(3 4,4 3,5 4,4 8,3 4))", 0, 0);
173     test_geometry<polygon>("self_tangent_int2", "polygon((5 0,2 3,3.5 7,1.5 3.5,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0),(3 4,4 3,5 4,4 8,3 4))", 0, 0);
174     test_geometry<polygon>("self_tangent_int3", "polygon((5 0,2 3,4 8,1.5 3.5,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0),(3 4,4 3,5 4,4 8,3 4))", 0, 0);
175 
176     test_geometry<polygon>("self_tangent_int3", "polygon((5 0,2 3,4 8,1.5 3.5,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0),(3 4,4 3,5 4,4 8,3 4))", 0, 0);
177     test_geometry<polygon>("disjoint_simplex0", disjoint_simplex[0], 0, 0);
178     test_geometry<polygon>("disjoint_simplex1", disjoint_simplex[1], 0, 0);
179 
180     test_geometry<polygon>("ticket_10643", "POLYGON((1074699.93 703064.65, 1074703.90 703064.58, 1074704.53 703061.40, 1074702.10 703054.62, 1074699.93 703064.65))");
181     test_geometry<polygon>("ticket_10643_2", "POLYGON((699.93 64.65, 703.90 64.58, 704.53 61.40, 702.10 54.62, 699.93 64.65))");
182 
183 #if defined(BOOST_GEOMETRY_UNIT_TEST_MULTI)
184     {
185         typedef bg::model::multi_polygon<polygon> multi_polygon;
186         test_geometry<multi_polygon>("mp_simplex", "multipolygon(((0 0,0 5,5 0, 0 0)),((7 1,7 6,10 1,7 1)))", 0, 0);
187         // Wrapped polygon in two orders
188         test_geometry<multi_polygon>("mp_wrapped1",
189                 "multipolygon("
190                 "((4 10,9 11,10 16,11 11,16 10,11 9,10 4,9 9,4 10))"
191                 ","
192                 "((0 10,10 20,20 10,10 0,0 10),(10 2,18 10,10 18,2 10,10 2))"
193                 ")",
194                 0, 0);
195         test_geometry<multi_polygon>("mp_wrapped2",
196                 "multipolygon("
197                 "((0 10,10 20,20 10,10 0,0 10),(10 2,18 10,10 18,2 10,10 2))"
198                 ","
199                 "((4 10,9 11,10 16,11 11,16 10,11 9,10 4,9 9,4 10))"
200                 ")",
201                 0, 0);
202     }
203 #endif
204 
205 
206     // Overlay testcases
207     test_geometry<polygon>("buffer_mp1", buffer_mp1[0],  0, 0);
208     test_geometry<polygon>("buffer_mp2", buffer_mp2[0],  0, 0);
209     test_geometry<polygon>("buffer_rt_a", buffer_rt_a[0],  0, 0);
210     test_geometry<polygon>("buffer_rt_f", buffer_rt_f[0],  0, 0);
211     test_geometry<polygon>("buffer_rt_g", buffer_rt_g[0],  0, 0);
212     test_geometry<polygon>("buffer_rt_i", buffer_rt_i[0],  0, 0);
213     test_geometry<polygon>("buffer_rt_j", buffer_rt_j[0],  0, 0);
214     test_geometry<polygon>("buffer_rt_l", buffer_rt_l[0],  0, 0);
215     test_geometry<polygon>("buffer_rt_m1", buffer_rt_m1[0],  0, 0);
216     test_geometry<polygon>("buffer_rt_m2", buffer_rt_m2[0],  0, 0);
217     test_geometry<polygon>("buffer_rt_n", buffer_rt_n[0],  0, 0);
218     test_geometry<polygon>("buffer_rt_q", buffer_rt_q[0],  0, 0);
219     test_geometry<polygon>("buffer_rt_r", buffer_rt_r[0],  0, 0);
220     test_geometry<polygon>("buffer_rt_t", buffer_rt_t[0],  0, 0);
221     test_geometry<polygon>("case_10", case_10[0],  0, 0);
222     test_geometry<polygon>("case_11", case_11[0],  0, 0);
223     test_geometry<polygon>("case_12", case_12[0],  0, 0);
224     test_geometry<polygon>("case_13", case_13[0],  0, 0);
225     test_geometry<polygon>("case_14", case_14[0],  0, 0);
226     test_geometry<polygon>("case_15", case_15[0],  0, 0);
227     test_geometry<polygon>("case_16", case_16[0],  0, 0);
228     test_geometry<polygon>("case_17", case_17[0],  0, 0);
229     test_geometry<polygon>("case_18", case_18[0],  0, 0);
230     test_geometry<polygon>("case_19", case_19[0],  0, 0);
231     test_geometry<polygon>("case_1", case_1[0],  0, 0);
232     test_geometry<polygon>("case_20", case_20[0],  0, 0);
233     test_geometry<polygon>("case_21", case_21[0],  0, 0);
234     test_geometry<polygon>("case_22", case_22[0],  0, 0);
235     test_geometry<polygon>("case_23", case_23[0],  0, 0);
236     test_geometry<polygon>("case_24", case_24[0],  0, 0);
237     test_geometry<polygon>("case_25", case_25[0],  0, 0);
238     test_geometry<polygon>("case_26", case_26[0],  0, 0);
239     test_geometry<polygon>("case_27", case_27[0],  0, 0);
240     test_geometry<polygon>("case_28", case_28[0],  0, 0);
241     test_geometry<polygon>("case_29", case_29[0],  0, 0);
242     test_geometry<polygon>("case_2", case_2[0],  0, 0);
243     test_geometry<polygon>("case_30", case_30[0],  0, 0);
244     test_geometry<polygon>("case_31", case_31[0],  0, 0);
245     test_geometry<polygon>("case_32", case_32[0],  0, 0);
246     test_geometry<polygon>("case_33", case_33[0],  0, 0);
247     test_geometry<polygon>("case_34", case_34[0],  0, 0);
248     test_geometry<polygon>("case_35", case_35[0],  0, 0);
249     test_geometry<polygon>("case_36", case_36[0],  0, 0);
250     test_geometry<polygon>("case_37", case_37[0],  0, 0);
251     test_geometry<polygon>("case_38", case_38[0],  0, 0);
252     test_geometry<polygon>("case_39", case_39[0],  0, 0);
253     test_geometry<polygon>("case_3", case_3[0],  0, 0);
254     test_geometry<polygon>("case_40", case_40[0],  0, 0);
255     test_geometry<polygon>("case_41", case_41[0],  0, 0);
256     test_geometry<polygon>("case_42", case_42[0],  0, 0);
257     test_geometry<polygon>("case_43", case_43[0],  0, 0);
258     test_geometry<polygon>("case_44", case_44[0],  0, 0);
259     test_geometry<polygon>("case_45", case_45[0],  0, 0);
260     test_geometry<polygon>("case_46", case_46[0],  0, 0);
261     test_geometry<polygon>("case_47", case_47[0],  0, 0);
262     test_geometry<polygon>("case_49", case_49[0],  0, 0);
263     test_geometry<polygon>("case_4", case_4[0],  0, 0);
264     test_geometry<polygon>("case_50", case_50[0],  0, 0);
265     test_geometry<polygon>("case_51", case_51[0],  0, 0);
266     test_geometry<polygon>("case_52", case_52[0],  0, 0);
267     test_geometry<polygon>("case_53", case_53[0],  0, 0);
268     test_geometry<polygon>("case_54", case_54[0],  0, 0);
269     test_geometry<polygon>("case_55", case_55[0],  0, 0);
270     test_geometry<polygon>("case_56", case_56[0],  0, 0);
271     test_geometry<polygon>("case_57", case_57[0],  0, 0);
272     test_geometry<polygon>("case_58", case_58[0],  0, 0);
273     test_geometry<polygon>("case_59", case_59[0],  0, 0);
274     test_geometry<polygon>("case_5", case_5[0],  0, 0);
275     test_geometry<polygon>("case_60", case_60[0],  0, 0);
276     test_geometry<polygon>("case_61", case_61[0],  0, 0);
277     test_geometry<polygon>("case_6", case_6[0],  0, 0);
278     test_geometry<polygon>("case_70", case_70[0],  0, 0);
279     test_geometry<polygon>("case_71", case_71[0],  0, 0);
280     test_geometry<polygon>("case_72", case_72[0],  0, 0);
281     test_geometry<polygon>("case_79", case_79[0],  0, 0);
282     test_geometry<polygon>("case_7", case_7[0],  0, 0);
283     test_geometry<polygon>("case_8", case_8[0],  0, 0);
284     test_geometry<polygon>("case_9", case_9[0],  0, 0);
285     test_geometry<polygon>("case_many_situations", case_many_situations[0],  0, 0);
286     test_geometry<polygon>("ccw_case_1", ccw_case_1[0],  0, 0);
287     test_geometry<polygon>("ccw_case_9", ccw_case_9[0],  0, 0);
288     test_geometry<polygon>("collinear_opposite_left", collinear_opposite_left[0],  0, 0);
289     test_geometry<polygon>("collinear_opposite_right", collinear_opposite_right[0],  0, 0);
290     test_geometry<polygon>("collinear_opposite_straight", collinear_opposite_straight[0],  0, 0);
291     test_geometry<polygon>("collinear_overlaps", collinear_overlaps[0],  0, 0);
292     test_geometry<polygon>("dz_1", dz_1[0],  0, 0);
293     test_geometry<polygon>("dz_2", dz_2[0],  0, 0);
294     test_geometry<polygon>("dz_3", dz_3[0],  0, 0);
295     test_geometry<polygon>("dz_4", dz_4[0],  0, 0);
296     test_geometry<polygon>("geos_1", geos_1[0],  0, 0);
297     test_geometry<polygon>("geos_2", geos_2[0],  0, 0);
298     test_geometry<polygon>("geos_3", geos_3[0],  0, 0);
299     test_geometry<polygon>("geos_4", geos_4[0],  0, 0);
300     test_geometry<polygon>("ggl_list_20110306_javier", ggl_list_20110306_javier[0],  0, 0);
301     test_geometry<polygon>("ggl_list_20110307_javier", ggl_list_20110307_javier[0],  0, 0);
302     test_geometry<polygon>("ggl_list_20110627_phillip", ggl_list_20110627_phillip[0],  0, 0);
303     test_geometry<polygon>("ggl_list_20110716_enrico", ggl_list_20110716_enrico[0],  0, 0);
304     test_geometry<polygon>("ggl_list_20110820_christophe ", ggl_list_20110820_christophe [0],  0, 0);
305     test_geometry<polygon>("ggl_list_20120717_volker", ggl_list_20120717_volker[0],  0, 0);
306     test_geometry<polygon>("hv_1", hv_1[0],  0, 0);
307     test_geometry<polygon>("hv_2", hv_2[0],  0, 0);
308     test_geometry<polygon>("hv_3", hv_3[0],  0, 0);
309     test_geometry<polygon>("hv_4", hv_4[0],  0, 0);
310     test_geometry<polygon>("hv_5", hv_5[0],  0, 0);
311     test_geometry<polygon>("hv_6", hv_6[0],  0, 0);
312     test_geometry<polygon>("hv_7", hv_7[0],  0, 0);
313     test_geometry<polygon>("isovist", isovist[0],  0, 0);
314     test_geometry<polygon>("open_case_1", open_case_1[0],  0, 0);
315     test_geometry<polygon>("open_case_9", open_case_9[0],  0, 0);
316     test_geometry<polygon>("pie_16_2_15_0", pie_16_2_15_0[0],  0, 0);
317     test_geometry<polygon>("pie_16_4_12", pie_16_4_12[0],  0, 0);
318     test_geometry<polygon>("pie_20_20_7_100", pie_20_20_7_100[0],  0, 0);
319     test_geometry<polygon>("pie_23_16_16", pie_23_16_16[0],  0, 0);
320     test_geometry<polygon>("pie_23_21_12_500", pie_23_21_12_500[0],  0, 0);
321     test_geometry<polygon>("pie_23_23_3_2000", pie_23_23_3_2000[0],  0, 0);
322     test_geometry<polygon>("pie_4_13_15", pie_4_13_15[0],  0, 0);
323     test_geometry<polygon>("pie_5_12_12_0_7s", pie_5_12_12_0_7s[0],  0, 0);
324     test_geometry<polygon>("snl_1", snl_1[0],  0, 0);
325     test_geometry<polygon>("ticket_17", ticket_17[0],  0, 0);
326     test_geometry<polygon>("ticket_5103", ticket_5103[0],  0, 0);
327     test_geometry<polygon>("ticket_7462", ticket_7462[0],  0, 0);
328     test_geometry<polygon>("ticket_8310a", ticket_8310a[0],  0, 0);
329     test_geometry<polygon>("ticket_8310b", ticket_8310b[0],  0, 0);
330     test_geometry<polygon>("ticket_8310c", ticket_8310c[0],  0, 0);
331     test_geometry<polygon>("ticket_8254", ticket_8254[0],  0, 0);
332 }
333 
334 template <typename Point>
test_dense(std::string const & case_id,double size)335 void test_dense(std::string const& case_id, double size)
336 {
337     typedef bg::model::polygon<Point> polygon;
338     polygon poly;
339 
340     bg::append(poly, Point(-size, 0));
341 
342     double thres = 3.14158 / 8;
343     for ( double a = thres ; a > -thres ; a -= 0.01 )
344     {
345         bg::append(poly, Point(size * ::cos(a), size * ::sin(a)));
346     }
347 
348     bg::append(poly, Point(-size, 0));
349 
350     test_geometry(case_id, poly);
351 }
352 
353 
test_main(int,char * [])354 int test_main(int, char* [])
355 {
356     test_all<bg::model::d2::point_xy<double> >();
357     test_point_order_and_type<bg::model::d2::point_xy<double> >();
358     test_point_order_and_type<bg::model::d2::point_xy<int> >();
359 
360     test_dense<bg::model::d2::point_xy<double> >("dense1", 100);
361     test_dense<bg::model::d2::point_xy<double> >("dense2", 1000000);
362 
363     return 0;
364 }
365 
366