]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/geometry/test/algorithms/set_operations/difference/difference_multi.cpp
Add patch for failing prerm scripts
[ceph.git] / ceph / src / boost / libs / geometry / test / algorithms / set_operations / difference / difference_multi.cpp
CommitLineData
7c673cae
FG
1// Boost.Geometry (aka GGL, Generic Geometry Library)
2// Unit Test
3
4// Copyright (c) 2010-2015 Barend Gehrels, Amsterdam, the Netherlands.
5
6// Use, modification and distribution is subject to the Boost Software License,
7// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8// http://www.boost.org/LICENSE_1_0.txt)
9
10#include <iostream>
11#include <string>
12
13#include "test_difference.hpp"
14#include <algorithms/test_overlay.hpp>
15#include <algorithms/overlay/multi_overlay_cases.hpp>
16
17#include <boost/geometry/algorithms/correct.hpp>
18#include <boost/geometry/algorithms/intersection.hpp>
19
20#include <boost/geometry/geometries/point_xy.hpp>
21#include <boost/geometry/geometries/multi_point.hpp>
22#include <boost/geometry/geometries/multi_polygon.hpp>
23
24#include <boost/geometry/io/wkt/read.hpp>
25
b32b8144
FG
26// Convenience macros (points are not checked)
27#define TEST_DIFFERENCE(caseid, clips1, area1, clips2, area2, clips3) \
28 (test_one<Polygon, MultiPolygon, MultiPolygon>) \
29 ( #caseid, caseid[0], caseid[1], clips1, -1, area1, clips2, -1, area2, \
30 clips3, -1, area1 + area2)
31
32#define TEST_DIFFERENCE_IGNORE(caseid, clips1, area1, clips2, area2, clips3) \
33 { ut_settings ignore_validity; ignore_validity.test_validity = false; \
34 (test_one<Polygon, MultiPolygon, MultiPolygon>) \
35 ( #caseid, caseid[0], caseid[1], clips1, -1, area1, clips2, -1, area2, \
36 clips3, -1, area1 + area2, ignore_validity); }
37
38#define TEST_DIFFERENCE_WITH(index1, index2, caseid, clips1, area1, \
39 clips2, area2, clips3) \
40 (test_one<Polygon, MultiPolygon, MultiPolygon>) \
41 ( #caseid "_" #index1 "_" #index2, caseid[index1], caseid[index2], \
42 clips1, -1, area1, \
43 clips2, -1, area2, \
44 clips3, -1, area1 + area2, settings)
45
46
7c673cae
FG
47template <typename Ring, typename Polygon, typename MultiPolygon>
48void test_areal()
49{
7c673cae
FG
50 test_one<Polygon, MultiPolygon, MultiPolygon>("simplex_multi",
51 case_multi_simplex[0], case_multi_simplex[1],
52 5, 21, 5.58, 4, 17, 2.58);
53
54 test_one<Polygon, MultiPolygon, MultiPolygon>("case_multi_no_ip",
55 case_multi_no_ip[0], case_multi_no_ip[1],
56 2, 12, 24.0, 2, 12, 34.0);
57 test_one<Polygon, MultiPolygon, MultiPolygon>("case_multi_2",
58 case_multi_2[0], case_multi_2[1],
59 2, 15, 19.6, 2, 13, 33.6);
60
61 test_one<Polygon, MultiPolygon, Polygon>("simplex_multi_mp_p",
62 case_multi_simplex[0], case_single_simplex,
63 5, 21, 5.58, 4, 17, 2.58);
64 test_one<Polygon, Ring, MultiPolygon>("simplex_multi_r_mp",
65 case_single_simplex, case_multi_simplex[0],
66 4, 17, 2.58, 5, 21, 5.58);
67 test_one<Polygon, MultiPolygon, Ring>("simplex_multi_mp_r",
68 case_multi_simplex[0], case_single_simplex,
69 5, 21, 5.58, 4, 17, 2.58);
70
71 // Constructed cases for multi/touch/equal/etc
72 test_one<Polygon, MultiPolygon, MultiPolygon>("case_61_multi",
73 case_61_multi[0], case_61_multi[1],
74 2, 10, 2, 2, 10, 2, 1, 10, 4);
75 test_one<Polygon, MultiPolygon, MultiPolygon>("case_62_multi",
76 case_62_multi[0], case_62_multi[1],
77 0, 0, 0, 1, 5, 1);
78 test_one<Polygon, MultiPolygon, MultiPolygon>("case_63_multi",
79 case_63_multi[0], case_63_multi[1],
80 0, 0, 0, 1, 5, 1);
81 test_one<Polygon, MultiPolygon, MultiPolygon>("case_64_multi",
82 case_64_multi[0], case_64_multi[1],
83 1, 5, 1, 1, 5, 1, 1, 7, 2);
84 test_one<Polygon, MultiPolygon, MultiPolygon>("case_65_multi",
85 case_65_multi[0], case_65_multi[1],
86 0, 0, 0, 2, 10, 3);
87
88 test_one<Polygon, MultiPolygon, MultiPolygon>("case_72_multi",
89 case_72_multi[0], case_72_multi[1],
b32b8144 90 3, 13, 1.65, 3, 17, 6.15);
7c673cae
FG
91
92 test_one<Polygon, MultiPolygon, MultiPolygon>("case_77_multi",
93 case_77_multi[0], case_77_multi[1],
94 6, 31, 7.0,
11fdf7f2
TL
95 5, 33, 13.0,
96 5, 38, 7.0 + 13.0);
7c673cae
FG
97
98 test_one<Polygon, MultiPolygon, MultiPolygon>("case_78_multi",
99 case_78_multi[0], case_78_multi[1],
100 1, 5, 1.0, 1, 5, 1.0);
101
b32b8144
FG
102 TEST_DIFFERENCE(case_123_multi, 1, 0.25, 2, 0.625, 3);
103 TEST_DIFFERENCE(case_124_multi, 1, 0.25, 2, 0.4375, 3);
104 TEST_DIFFERENCE(case_125_multi, 1, 0.25, 2, 0.400, 3);
105
106 // A should have 3 clips, B should have 5 clips
11fdf7f2 107#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
108 TEST_DIFFERENCE(case_126_multi, 4, 16.0, 5, 27.0, 9);
109#else
110 TEST_DIFFERENCE_IGNORE(case_126_multi, 3, 16.0, 4, 27.0, 7);
111#endif
112
7c673cae
FG
113 {
114 ut_settings settings;
115
116#if !defined(BOOST_GEOMETRY_NO_ROBUSTNESS)
117 settings.sym_difference = false;
118#endif
119
120 test_one<Polygon, MultiPolygon, MultiPolygon>("case_108_multi",
121 case_108_multi[0], case_108_multi[1],
122 7, 32, 5.5,
11fdf7f2 123 4, 24, 9.75,
7c673cae
FG
124 7, 45, 15.25,
125 settings);
126 }
127
128 // Ticket on GGL list 2011/10/25
129 // to mix polygon/multipolygon in call to difference
130 test_one<Polygon, Polygon, Polygon>("ggl_list_20111025_vd_pp",
131 ggl_list_20111025_vd[0], ggl_list_20111025_vd[1],
132 1, 4, 8.0, 1, 4, 12.5);
133 test_one<Polygon, Polygon, MultiPolygon>("ggl_list_20111025_vd_pm",
134 ggl_list_20111025_vd[0], ggl_list_20111025_vd[3],
135 1, 4, 8.0, 1, 4, 12.5);
136 test_one<Polygon, MultiPolygon, Polygon>("ggl_list_20111025_vd_mp",
137 ggl_list_20111025_vd[2], ggl_list_20111025_vd[1],
138 1, 4, 8.0, 1, 4, 12.5);
139 test_one<Polygon, MultiPolygon, MultiPolygon>("ggl_list_20111025_vd_mm",
140 ggl_list_20111025_vd[2], ggl_list_20111025_vd[3],
141 1, 4, 8.0, 1, 4, 12.5);
142
143 test_one<Polygon, Polygon, MultiPolygon>("ggl_list_20111025_vd_2",
144 ggl_list_20111025_vd_2[0], ggl_list_20111025_vd_2[1],
145 1, 7, 10.0, 2, 10, 6.0);
146
147 test_one<Polygon, MultiPolygon, MultiPolygon>("ggl_list_20120915_h2_a",
148 ggl_list_20120915_h2[0], ggl_list_20120915_h2[1],
149 2, 13, 17.0, 0, 0, 0.0);
150 test_one<Polygon, MultiPolygon, MultiPolygon>("ggl_list_20120915_h2_b",
151 ggl_list_20120915_h2[0], ggl_list_20120915_h2[2],
152 2, 13, 17.0, 0, 0, 0.0);
153
154 {
155 ut_settings settings;
156 settings.percentage = 0.001;
b32b8144
FG
157
158 // This testcase is actually different for all combinations
11fdf7f2 159#if defined(BOOST_GEOMETRY_NO_SELF_TURNS) || defined(BOOST_GEOMETRY_NO_ROBUSTNESS)
7c673cae 160 settings.test_validity = false;
b32b8144 161#endif
7c673cae 162
11fdf7f2 163#if ! defined(BOOST_GEOMETRY_NO_SELF_TURNS) || defined(BOOST_GEOMETRY_NO_ROBUSTNESS)
b32b8144
FG
164 TEST_DIFFERENCE_WITH(0, 1, ggl_list_20120221_volker, 2, 7962.66, 2, 2775258.93, 4);
165#else
166 TEST_DIFFERENCE_WITH(0, 1, ggl_list_20120221_volker, 2, 7962.66, 1, 2775258.93, 3);
167#endif
7c673cae
FG
168 }
169
11fdf7f2
TL
170#if defined(BOOST_GEOMETRY_NO_ROBUSTNESS)
171 {
172 ut_settings settings;
173 settings.sym_difference = false; // Validity problem in sym difference
174 // POSTGIS areas: 3.75893745345145, 2.5810000723917e-15
175 TEST_DIFFERENCE_WITH(0, 1, bug_21155501, 1, 3.758937, 1, 1.7763568394002505e-15, 2);
176 }
177#else
178 // With no-robustness this one misses one of the outputs
7c673cae
FG
179 test_one<Polygon, MultiPolygon, MultiPolygon>("ticket_9081",
180 ticket_9081[0], ticket_9081[1],
181 2, 28, 0.0907392476356186, 4, 25, 0.126018011439877,
182 4, 42, 0.0907392476356186 + 0.126018011439877,
183 tolerance(0.001));
184
11fdf7f2
TL
185 // With rescaling, A is invalid (this is a robustness problem) and the other
186 // output is discarded because of zero (rescaled) area
b32b8144
FG
187 TEST_DIFFERENCE_IGNORE(bug_21155501, 1, 3.758937, 0, 0.0, 1);
188#endif
189
11fdf7f2
TL
190#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
191 TEST_DIFFERENCE(ticket_12503, 46, 920.625, 4, 7.625, 50);
b32b8144
FG
192#else
193 TEST_DIFFERENCE_IGNORE(ticket_12503, 45, 920.625, 3, 7.625, 48);
7c673cae
FG
194#endif
195
196 // Areas and #clips correspond with POSTGIS (except sym case)
197 test_one<Polygon, MultiPolygon, MultiPolygon>("case_101_multi",
198 case_101_multi[0], case_101_multi[1],
199 5, 23, 4.75,
200 5, 40, 12.75,
201 5, 48, 4.75 + 12.75);
202
203 // Areas and #clips correspond with POSTGIS
204 test_one<Polygon, MultiPolygon, MultiPolygon>("case_102_multi",
205 case_102_multi[0], case_102_multi[1],
206 2, 8, 0.75,
207 6, 25, 3.75,
208 6, 27, 0.75 + 3.75);
209
210 // Areas and #clips correspond with POSTGIS
211 test_one<Polygon, MultiPolygon, MultiPolygon>("case_107_multi",
212 case_107_multi[0], case_107_multi[1],
213 2, 11, 2.25,
214 3, 14, 3.0,
215 4, 21, 5.25);
216
b32b8144
FG
217 TEST_DIFFERENCE(case_133_multi, 3, 16.0, 2, 8.0, 5);
218 TEST_DIFFERENCE(case_134_multi, 3, 16.0, 2, 8.0, 5);
219 TEST_DIFFERENCE(case_135_multi, 2, 2.0, 2, 13.0, 2);
220 TEST_DIFFERENCE(case_136_multi, 2, 2.0, 3, 13.5, 3);
221 TEST_DIFFERENCE(case_137_multi, 2, 2.5, 2, 13.0, 2);
222 TEST_DIFFERENCE(case_138_multi, 5, 16.6, 3, 8.225, 8);
223 TEST_DIFFERENCE(case_139_multi, 4, 16.328125, 3, 8.078125, 7);
224 TEST_DIFFERENCE(case_140_multi, 4, 16.328125, 3, 8.078125, 7);
225 TEST_DIFFERENCE(case_141_multi, 5, 15.5, 5, 10.0, 10);
226
7c673cae
FG
227 // Areas correspond with POSTGIS,
228 // #clips in PostGIS is 11,11,5 but should most probably be be 12,12,6
11fdf7f2 229#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
230 TEST_DIFFERENCE(case_recursive_boxes_1, 12, 26.0, 12, 24.0, 6);
231#else
232 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_1, 11, 26.0, 12, 24.0, 5);
233#endif
7c673cae
FG
234
235 // Areas and #clips correspond with POSTGIS
236 test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_2",
237 case_recursive_boxes_2[0], case_recursive_boxes_2[1],
238 3, 15, 3.0,
239 7, 33, 7.0,
240 10, 48, 10.0);
241
242 // Areas and #clips by POSTGIS (except sym case)
243 test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_3",
244 case_recursive_boxes_3[0], case_recursive_boxes_3[1],
245 24, -1, 21.5,
246 25, -1, 22.5,
247 37, -1, 44.0);
248
249 // 4, input is not valid
250
11fdf7f2 251#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
252 TEST_DIFFERENCE(case_recursive_boxes_5, 16, 22.0, 12, 27.0, 10);
253#else
254 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_5, 15, 22.0, 11, 27.0, 8);
255#endif
7c673cae 256
11fdf7f2 257#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
258 TEST_DIFFERENCE(case_recursive_boxes_6, 7, 3.5, 3, 1.5, 9);
259#else
260 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_6, 6, 3.5, 3, 1.5, 8);
261#endif
7c673cae
FG
262
263 test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_7",
264 case_recursive_boxes_7[0], case_recursive_boxes_7[1],
265 3, 15, 2.75,
266 4, 19, 2.75,
267 3, 22, 5.5);
268
269 test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_8",
270 case_recursive_boxes_8[0], case_recursive_boxes_8[1],
271 2, -1, 2.50,
272 4, -1, 5.75,
273 4, -1, 8.25);
274
275 test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_9",
276 case_recursive_boxes_9[0], case_recursive_boxes_9[1],
277 3, -1, 1.5,
278 4, -1, 2.5,
279 6, -1, 4.0);
280
281 test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_10",
282 case_recursive_boxes_10[0], case_recursive_boxes_10[1],
283 2, -1, 1.25,
284 2, -1, 0.75,
285 4, -1, 2.00);
286
287 test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_11",
288 case_recursive_boxes_11[0], case_recursive_boxes_11[1],
289 3, -1, 2.5,
290 3, -1, 4.5,
291 3, -1, 7.0);
292
b32b8144
FG
293 TEST_DIFFERENCE(case_recursive_boxes_12, 4, 2.75, 3, 2.75, 6);
294 TEST_DIFFERENCE(case_recursive_boxes_13, 4, 4.75, 3, 5.5, 3);
295 TEST_DIFFERENCE(case_recursive_boxes_14, 3, 2.0, 4, 2.5, 5);
296 TEST_DIFFERENCE(case_recursive_boxes_15, 3, 3.0, 2, 2.5, 3);
11fdf7f2 297#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
298 TEST_DIFFERENCE(case_recursive_boxes_16, 8, 6.5, 3, 5.5, 9);
299 TEST_DIFFERENCE(case_recursive_boxes_17, 10, 7.75, 7, 5.5, 13);
300#else
301 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_16, 7, 6.5, 3, 5.5, 8);
302 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_17, 9, 7.75, 6, 5.5, 11);
303#endif
304 TEST_DIFFERENCE(case_recursive_boxes_18, 2, 1.0, 1, 1.5, 3);
305 TEST_DIFFERENCE(case_recursive_boxes_19, 2, 1.0, 2, 1.5, 3);
306 TEST_DIFFERENCE(case_recursive_boxes_20, 2, 1.0, 0, 0.0, 2);
307
308 TEST_DIFFERENCE(case_recursive_boxes_21, 2, 1.0, 1, 1.0, 1);
309 TEST_DIFFERENCE(case_recursive_boxes_22, 2, 1.25, 2, 2.0, 2);
310 TEST_DIFFERENCE(case_recursive_boxes_23, 2, 0.75, 1, 0.5, 3);
311 TEST_DIFFERENCE(case_recursive_boxes_24, 3, 2.5, 2, 2.0, 5);
312 TEST_DIFFERENCE(case_recursive_boxes_25, 2, 2.5, 3, 2.5, 2);
313 TEST_DIFFERENCE(case_recursive_boxes_26, 2, 1.5, 3, 2.0, 4);
314 TEST_DIFFERENCE(case_recursive_boxes_27, 1, 1.5, 3, 2.5, 3);
315 TEST_DIFFERENCE(case_recursive_boxes_28, 3, 2.5, 2, 3.0, 4);
316 TEST_DIFFERENCE(case_recursive_boxes_29, 5, 7.25, 5, 4.5, 5);
317 TEST_DIFFERENCE(case_recursive_boxes_30, 6, 4.25, 3, 7.25, 7);
318
319 TEST_DIFFERENCE(case_recursive_boxes_31, 2, 2.0, 1, 0.5, 2);
320 TEST_DIFFERENCE(case_recursive_boxes_32, 2, 2.75, 2, 1.25, 2);
321 TEST_DIFFERENCE(case_recursive_boxes_33, 4, 3.0, 3, 6.0, 4);
11fdf7f2 322#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
323 TEST_DIFFERENCE(case_recursive_boxes_34, 7, 7.25, 1, 0.5, 8);
324#else
325 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_34, 5, 7.25, 1, 0.5, 6);
326#endif
327 TEST_DIFFERENCE(case_recursive_boxes_35, 5, 1.75, 5, 2.75, 10);
328 TEST_DIFFERENCE(case_recursive_boxes_36, 2, 1.0, 2, 1.5, 3);
329 TEST_DIFFERENCE(case_recursive_boxes_37, 3, 2.5, 2, 4.25, 2);
330 TEST_DIFFERENCE(case_recursive_boxes_38, 5, 7.75, 4, 3.5, 3);
331 TEST_DIFFERENCE(case_recursive_boxes_39, 3, 6.0, 3, 3.0, 4);
332 TEST_DIFFERENCE(case_recursive_boxes_40, 11, 14.0, 9, 13.0, 11);
333
334 TEST_DIFFERENCE(case_recursive_boxes_41, 1, 0.5, 1, 0.5, 2);
11fdf7f2 335#ifdef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
336 // 42.a Fails with self-turns
337 TEST_DIFFERENCE(case_recursive_boxes_42, 1, 1.0, 4, 4.0, 5);
338#endif
339 TEST_DIFFERENCE(case_recursive_boxes_43, 1, 0.5, 3, 2.0, 4);
340 TEST_DIFFERENCE(case_recursive_boxes_44, 3, 5.0, 0, 0.0, 3);
341 TEST_DIFFERENCE(case_recursive_boxes_45, 6, 20.0, 7, 20.0, 3);
342 TEST_DIFFERENCE(case_recursive_boxes_46, 4, 14.0, 5, 12.0, 5);
343 TEST_DIFFERENCE(case_recursive_boxes_47, 4, 10.0, 7, 11.0, 1);
344 TEST_DIFFERENCE(case_recursive_boxes_48, 0, 0.0, 1, 9.0, 1);
11fdf7f2 345#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
346 TEST_DIFFERENCE(case_recursive_boxes_49, 10, 22.0, 10, 17.0, 11);
347#else
348 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_49, 9, 22.0, 10, 17.0, 10);
349#endif
350 TEST_DIFFERENCE(case_recursive_boxes_50, 14, 21.0, 16, 21.0, 14);
351 TEST_DIFFERENCE(case_recursive_boxes_51, 14, 25.0, 12, 31.0, 7);
352
11fdf7f2 353#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
354 TEST_DIFFERENCE(case_recursive_boxes_52, 13, 30.0, 15, 25.0, 8);
355#else
356 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_52, 13, 30.0, 15, 25.0, 8);
357#endif
358 TEST_DIFFERENCE(case_recursive_boxes_53, 6, 3.5, 4, 1.5, 9);
359 TEST_DIFFERENCE(case_recursive_boxes_54, 6, 6.5, 8, 6.0, 7);
360 TEST_DIFFERENCE(case_recursive_boxes_55, 4, 5.5, 6, 7.75, 4);
11fdf7f2 361#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
362 TEST_DIFFERENCE(case_recursive_boxes_56, 4, 4.5, 5, 2.75, 6);
363#else
364 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_56, 4, 4.5, 5, 2.75, 6);
365#endif
366 TEST_DIFFERENCE(case_recursive_boxes_57, 5, 3.75, 9, 6.5, 10);
367 TEST_DIFFERENCE(case_recursive_boxes_58, 4, 2.25, 6, 3.75, 7);
11fdf7f2 368#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
369 TEST_DIFFERENCE(case_recursive_boxes_59, 8, 6.5, 7, 7.0, 12);
370#else
371 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_59, 8, 6.5, 6, 7.0, 11);
372#endif
373
11fdf7f2 374#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
375 TEST_DIFFERENCE(case_recursive_boxes_60, 6, 5.25, 7, 5.25, 11);
376#else
377 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_60, 5, 5.25, 5, 5.25, 8);
378#endif
379 TEST_DIFFERENCE(case_recursive_boxes_61, 2, 1.5, 6, 2.0, 7);
380#if defined(BOOST_GEOMETRY_TEST_INCLUDE_FAILING_TESTS)
381 // Misses one triangle
382 TEST_DIFFERENCE(case_recursive_boxes_62, 5, 5.0, 11, 5.75, 12);
383#endif
384
11fdf7f2 385#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
386 TEST_DIFFERENCE(case_recursive_boxes_63, 9, 10.5, 5, 27.75, 4);
387#else
388 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_63, 6, 10.5, 5, 27.75, 2);
389#endif
390
391 TEST_DIFFERENCE(case_recursive_boxes_64, 6, 2.75, 7, 4.5, 11);
392
11fdf7f2 393#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
394 TEST_DIFFERENCE(case_recursive_boxes_65, 6, 4.25, 7, 3.0, 13);
395#else
396 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_65, 4, 4.25, 7, 3.0, 11);
397#endif
398
399 TEST_DIFFERENCE(case_recursive_boxes_66, 5, 4.75, 7, 4.0, 9);
400 TEST_DIFFERENCE(case_recursive_boxes_67, 7, 6.25, 9, 6.0, 10);
401 TEST_DIFFERENCE(case_recursive_boxes_68, 10, 6.5, 9, 6.5, 7);
402 TEST_DIFFERENCE(case_recursive_boxes_69, 5, 6.25, 5, 6.75, 8);
11fdf7f2 403#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
404 TEST_DIFFERENCE(case_recursive_boxes_70, 5, 2.0, 8, 4.5, 11);
405#else
406 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_70, 5, 2.0, 6, 4.5, 9);
407#endif
408
11fdf7f2 409#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
410 TEST_DIFFERENCE(case_recursive_boxes_71, 7, 8.25, 7, 5.75, 8);
411#else
412 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_71, 6, 8.25, 7, 5.75, 7);
413#endif
414
415 TEST_DIFFERENCE(case_recursive_boxes_72, 6, 6.5, 7, 4.0, 10);
416 TEST_DIFFERENCE(case_recursive_boxes_73, 4, 1.75, 5, 4.0, 8);
417
418 TEST_DIFFERENCE(case_recursive_boxes_74, 3, 3.00, 3, 1.5, 5);
11fdf7f2 419#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
420 TEST_DIFFERENCE(case_recursive_boxes_75, 7, 4.5, 4, 2.0, 11);
421#else
422 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_75, 5, 4.5, 4, 2.0, 9);
423#endif
424
425 TEST_DIFFERENCE(case_recursive_boxes_76, 7, 3.75, 4, 2.5, 9);
426 TEST_DIFFERENCE(case_recursive_boxes_77, 4, 3.75, 7, 6.25, 8);
427 TEST_DIFFERENCE(case_recursive_boxes_78, 11, 5.5, 8, 4.5, 14);
11fdf7f2 428#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
429 TEST_DIFFERENCE(case_recursive_boxes_79, 2, 1.25, 6, 4.5, 8);
430#else
431 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_79, 2, 1.25, 5, 4.5, 7);
432#endif
433
434#if defined(BOOST_GEOMETRY_NO_ROBUSTNESS)
435 TEST_DIFFERENCE(case_recursive_boxes_80, 1, 0.5, 2, 0.75, 2);
436#else
437 // one polygon is divided into two, for same reason as union creates a small
438 // interior ring there
439 TEST_DIFFERENCE(case_recursive_boxes_80, 1, 0.5, 2, 0.75, 3);
440#endif
441
11fdf7f2
TL
442 TEST_DIFFERENCE(case_recursive_boxes_81, 3, 5.0, 6, 6.75, 6);
443
444#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
445 TEST_DIFFERENCE(case_recursive_boxes_82, 5, 7.25, 7, 4.5, 8);
446#else
447 TEST_DIFFERENCE_IGNORE(case_recursive_boxes_82, 5, 7.25, 6, 4.5, 7);
448#endif
449 TEST_DIFFERENCE(case_recursive_boxes_83, 9, 5.25, 8, 5.25, 12);
450 TEST_DIFFERENCE(case_recursive_boxes_84, 4, 8.0, 7, 9.0, 4);
451#ifdef BOOST_GEOMETRY_NO_ROBUSTNESS
452 TEST_DIFFERENCE(case_recursive_boxes_85, 4, 4.0, 7, 3.75, 9);
453#endif
454
455 TEST_DIFFERENCE(case_recursive_boxes_86, 1, 1.5, 2, 1.5, 3);
456 TEST_DIFFERENCE(case_recursive_boxes_87, 4, 2.0, 4, 2.5, 8);
457 TEST_DIFFERENCE(case_recursive_boxes_88, 3, 4.75, 5, 6.75, 4);
458
b32b8144
FG
459 {
460 ut_settings sym_settings;
461 #if defined(BOOST_GEOMETRY_NO_ROBUSTNESS)
462 sym_settings.sym_difference = false;
463 #endif
464 test_one<Polygon, MultiPolygon, MultiPolygon>("mysql_21965285_b",
465 mysql_21965285_b[0],
466 mysql_21965285_b[1],
467 2, -1, 183.71376870369406,
468 2, -1, 131.21376870369406,
469 sym_settings);
470 }
471
11fdf7f2
TL
472#ifdef BOOST_GEOMETRY_NO_ROBUSTNESS
473 TEST_DIFFERENCE(mysql_regression_1_65_2017_08_31, 0, 0.0, 3, 152.0642, 3);
b32b8144 474#else
11fdf7f2 475 TEST_DIFFERENCE(mysql_regression_1_65_2017_08_31, 1, 4.30697514e-7, 3, 152.0642, 4);
b32b8144 476#endif
7c673cae
FG
477}
478
479
480template <typename P>
481void test_all()
482{
483 typedef bg::model::ring<P> ring;
484 typedef bg::model::polygon<P> polygon;
485 typedef bg::model::multi_polygon<polygon> multi_polygon;
486 test_areal<ring, polygon, multi_polygon>();
487}
488
489
490// Test cases for integer coordinates / ccw / open
b32b8144
FG
491template <typename Polygon, typename MultiPolygon>
492void test_specific_areal()
7c673cae 493{
7c673cae
FG
494 {
495 // Spikes in a-b and b-a, failure in symmetric difference
496
497 ut_settings settings;
b32b8144 498#if !defined(BOOST_GEOMETRY_TEST_INCLUDE_FAILING_TESTS)
7c673cae
FG
499 settings.sym_difference = false;
500 settings.test_validity = false;
7c673cae
FG
501#endif
502
b32b8144 503 TEST_DIFFERENCE_WITH(0, 1, ticket_11674, 3, 9105781.5, 5, 119059.5, -1);
7c673cae
FG
504 }
505
506 {
b32b8144
FG
507 // Ticket 12751 (Volker)
508 // Spikes in a-b and b-a, failure in symmetric difference
509
7c673cae 510 ut_settings settings;
b32b8144 511 settings.remove_spikes = true;
11fdf7f2 512#if defined(BOOST_GEOMETRY_NO_SELF_TURNS)
b32b8144
FG
513 settings.sym_difference = false;
514 settings.test_validity = false;
515#endif
7c673cae
FG
516
517 std::string a_min_b =
b32b8144
FG
518 TEST_DIFFERENCE_WITH(0, 1, ticket_12751, 1, 2781965.0, 1, 597.0, 2);
519
11fdf7f2 520#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
521 TEST_DIFFERENCE_WITH(2, 3, ticket_12751, 2, 2537992.5, 2, 294963.5, 3);
522#else
523
524 // Testing consistency of testcase itself
525 boost::ignore_unused(a_min_b);
526 // BOOST_CHECK_EQUAL(a_min_b, ticket_12751[2]);
527
528 TEST_DIFFERENCE_WITH(2, 3, ticket_12751, 1, 2537992.5, 2, 294963.5, 3);
529#endif
530
531 }
7c673cae 532
b32b8144
FG
533 {
534 // Ticket 12752 (Volker)
535 // Spikes in a-b and b-a, failure in symmetric difference
536 ut_settings settings;
537 settings.remove_spikes = true;
538 settings.sym_difference = false;
11fdf7f2 539#ifndef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
540 TEST_DIFFERENCE_WITH(0, 1, ticket_12752, 3, 2776692.0, 3, 7893.0, 2);
541#else
542 // If self-intersections are not tested, result is not valid
7c673cae 543 settings.test_validity = false;
b32b8144 544 TEST_DIFFERENCE_WITH(0, 1, ticket_12752, 3, 2776692.0, 3, 7893.0, 6);
7c673cae 545#endif
b32b8144
FG
546 }
547
548 {
549 std::string a_min_b =
550 TEST_DIFFERENCE(ticket_10661, 2, 1441632.5, 2, 13167454, 4);
551
552 test_one<Polygon, MultiPolygon, MultiPolygon>("ticket_10661_2",
7c673cae
FG
553 a_min_b, ticket_10661[2],
554 1, 8, 825192.0,
555 1, 10, 27226370.5,
b32b8144 556 1, -1, 825192.0 + 27226370.5);
7c673cae 557 }
b32b8144
FG
558
559 {
560 ut_settings settings;
561 settings.sym_difference = false;
11fdf7f2 562#ifdef BOOST_GEOMETRY_NO_SELF_TURNS
b32b8144
FG
563 settings.test_validity = false;
564 TEST_DIFFERENCE_WITH(0, 1, ticket_9942, 3, 7427491.5, 4, 131506, 4);
565#else
566 TEST_DIFFERENCE_WITH(0, 1, ticket_9942, 4, 7427727.5, 4, 131506, 4);
567#endif
568 TEST_DIFFERENCE_WITH(0, 1, ticket_9942a, 2, 412676.5, 2, 76779.5, 4);
569 }
570}
571
572template <typename Point, bool ClockWise, bool Closed>
573void test_specific()
574{
575 typedef bg::model::polygon<Point, ClockWise, Closed> polygon;
576 typedef bg::model::multi_polygon<polygon> multi_polygon;
577 test_specific_areal<polygon, multi_polygon>();
7c673cae
FG
578}
579
580
581int test_main(int, char* [])
582{
583 test_all<bg::model::d2::point_xy<double > >();
584
585 test_specific<bg::model::d2::point_xy<int>, false, false>();
586
587#if ! defined(BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE)
588 test_all<bg::model::d2::point_xy<float> >();
589
590#if defined(HAVE_TTMATH)
591 std::cout << "Testing TTMATH" << std::endl;
592 test_all<bg::model::d2::point_xy<ttmath_big> >();
593#endif
594
595#endif
596
597 return 0;
598}