]>
Commit | Line | Data |
---|---|---|
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 | // This file was modified by Oracle on 2016. | |
7 | // Modifications copyright (c) 2016, Oracle and/or its affiliates. | |
8 | // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle | |
9 | ||
10 | // Use, modification and distribution is subject to the Boost Software License, | |
11 | // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at | |
12 | // http://www.boost.org/LICENSE_1_0.txt) | |
13 | ||
14 | #include <iostream> | |
15 | #include <string> | |
16 | ||
17 | #include "test_union.hpp" | |
18 | #include <algorithms/test_overlay.hpp> | |
19 | #include <algorithms/overlay/multi_overlay_cases.hpp> | |
20 | ||
21 | #include <boost/geometry/algorithms/correct.hpp> | |
22 | #include <boost/geometry/algorithms/intersection.hpp> | |
23 | #include <boost/geometry/algorithms/within.hpp> | |
24 | ||
25 | #include <boost/geometry/geometries/point_xy.hpp> | |
26 | #include <boost/geometry/geometries/multi_linestring.hpp> | |
27 | #include <boost/geometry/geometries/multi_polygon.hpp> | |
28 | ||
29 | #include <boost/geometry/io/wkt/read.hpp> | |
30 | ||
31 | ||
b32b8144 FG |
32 | #define TEST_UNION(caseid, clips, holes, points, area) \ |
33 | (test_one<Polygon, MultiPolygon, MultiPolygon>) \ | |
34 | ( #caseid, caseid[0], caseid[1], clips, holes, points, area) | |
35 | ||
36 | #define TEST_UNION_IGNORE(caseid, clips, holes, points, area) \ | |
37 | { ut_settings ignore_validity; ignore_validity.test_validity = false; \ | |
38 | test_one<Polygon, MultiPolygon, MultiPolygon> \ | |
39 | (#caseid, caseid[0], caseid[1], \ | |
40 | clips, holes, points, area, ignore_validity); } | |
41 | ||
42 | ||
7c673cae FG |
43 | template <typename Ring, typename Polygon, typename MultiPolygon> |
44 | void test_areal() | |
45 | { | |
7c673cae FG |
46 | test_one<Polygon, MultiPolygon, MultiPolygon>("simplex_multi", |
47 | case_multi_simplex[0], case_multi_simplex[1], | |
48 | 1, 0, 20, 14.58); | |
49 | ||
50 | test_one<Polygon, Polygon, MultiPolygon>("simplex_multi_p_mp", | |
51 | case_single_simplex, case_multi_simplex[0], | |
52 | 1, 0, 20, 14.58); | |
53 | test_one<Polygon, MultiPolygon, Polygon>("simplex_multi_mp_p", | |
54 | case_multi_simplex[0], case_single_simplex, | |
55 | 1, 0, 20, 14.58); | |
56 | ||
57 | test_one<Polygon, Ring, MultiPolygon>("simplex_multi_r_mp", | |
58 | case_single_simplex, case_multi_simplex[0], | |
59 | 1, 0, 20, 14.58); | |
60 | test_one<Ring, MultiPolygon, Polygon>("simplex_multi_mp_r", | |
61 | case_multi_simplex[0], case_single_simplex, | |
62 | 1, 0, 20, 14.58); | |
63 | ||
64 | ||
65 | // Normal test cases | |
66 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_multi_no_ip", | |
67 | case_multi_no_ip[0], case_multi_no_ip[1], | |
68 | 4, 0, 16, 66.5); | |
69 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_multi_2", | |
70 | case_multi_2[0], case_multi_2[1], | |
71 | 3, 0, 16, 59.1); | |
72 | ||
73 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_58_multi_a", | |
74 | case_58_multi[0], case_58_multi[3], | |
75 | 2, 0, 21, 19.83333333); | |
7c673cae FG |
76 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_58_multi_b", |
77 | case_58_multi[1], case_58_multi[2], | |
78 | 1, 3, 17, 48.333333); | |
79 | ||
80 | // Constructed cases for multi/touch/equal/etc | |
81 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_61_multi", | |
82 | case_61_multi[0], case_61_multi[1], | |
83 | 1, 0, 11, 4.0); | |
84 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_62_multi", | |
85 | case_62_multi[0], case_62_multi[1], | |
86 | 2, 0, 10, 2.0); | |
87 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_63_multi", | |
88 | case_63_multi[0], case_63_multi[1], | |
89 | 2, 0, 10, 2.0); | |
90 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_64_multi", | |
91 | case_64_multi[0], case_64_multi[1], | |
92 | 1, 0, 9, 3.0); | |
93 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_65_multi", | |
94 | case_65_multi[0], case_65_multi[1], | |
95 | 3, 0, 15, 4.0); | |
96 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_66_multi", | |
97 | case_66_multi[0], case_66_multi[1], | |
98 | 3, 0, 23, 7.0); | |
99 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_72_multi", | |
100 | case_72_multi[0], case_72_multi[1], | |
101 | 1, 0, 13, 10.65); | |
102 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_75_multi", | |
103 | case_75_multi[0], case_75_multi[1], | |
104 | 5, 0, 25, 5.0); | |
105 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_76_multi", | |
106 | case_76_multi[0], case_76_multi[1], | |
107 | 5, 0, 31, 8.0); | |
108 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_89_multi", | |
109 | case_89_multi[0], case_89_multi[1], | |
110 | 1, 0, 13, 6); | |
111 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_101_multi", | |
112 | case_101_multi[0], case_101_multi[1], | |
11fdf7f2 | 113 | 1, 3, 32, 22.25); |
7c673cae FG |
114 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_103_multi", |
115 | case_103_multi[0], case_103_multi[1], | |
116 | 1, 0, 7, 25); | |
117 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_104_multi", | |
118 | case_104_multi[0], case_104_multi[1], | |
119 | 1, 0, 8, 25); | |
120 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_105_multi", | |
121 | case_105_multi[0], case_105_multi[1], | |
122 | 1, 0, 5, 25); | |
123 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_106_multi", | |
124 | case_106_multi[0], case_106_multi[1], | |
11fdf7f2 | 125 | 1, 0, 5, 25); |
7c673cae FG |
126 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_107_multi", |
127 | case_107_multi[0], case_107_multi[1], | |
128 | 1, 0, 15, 6.75); | |
129 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_108_multi", | |
130 | case_108_multi[0], case_108_multi[1], | |
131 | 1, 1, 20, 22.75); | |
132 | ||
b32b8144 | 133 | TEST_UNION(case_109_multi, 1, 2, 14, 1400); |
7c673cae FG |
134 | |
135 | // Should have 9 holes, they are all separate and touching | |
136 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_110_multi", | |
137 | case_110_multi[0], case_110_multi[1], | |
138 | 1, 9, 45, 1250); | |
139 | ||
140 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_111_multi", | |
141 | case_111_multi[0], case_111_multi[1], | |
142 | 2, 0, 10, 16); | |
143 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_112_multi", | |
144 | case_112_multi[0], case_112_multi[1], | |
145 | 2, 0, 16, 48); | |
146 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_113_multi", | |
147 | case_113_multi[0], case_113_multi[1], | |
148 | 2, 0, 13, 162.5); | |
149 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_114_multi", | |
150 | case_114_multi[0], case_114_multi[1], | |
151 | 1, 1, 13, 187.5); | |
152 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_115_multi", | |
153 | case_115_multi[0], case_115_multi[1], | |
154 | 1, 1, 18, 26.7036); | |
155 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_116_multi", | |
156 | case_116_multi[0], case_116_multi[1], | |
157 | 1, 2, 27, 51); | |
158 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_117_multi", | |
159 | case_117_multi[0], case_117_multi[1], | |
160 | 2, 0, 18, 22); | |
161 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_118_multi", | |
162 | case_118_multi[0], case_118_multi[1], | |
163 | 3, 0, 27, 46); | |
164 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_119_multi", | |
165 | case_119_multi[0], case_119_multi[1], | |
166 | 2, 0, 26, 44); | |
167 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_120_multi", | |
168 | case_120_multi[0], case_120_multi[1], | |
11fdf7f2 | 169 | 1, 1, 17, 35); |
7c673cae FG |
170 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_121_multi", |
171 | case_121_multi[0], case_121_multi[1], | |
11fdf7f2 | 172 | 1, 1, 14, 25.5); |
7c673cae FG |
173 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_122_multi", |
174 | case_122_multi[0], case_122_multi[1], | |
11fdf7f2 | 175 | 1, 1, 14, 29.5); |
7c673cae | 176 | |
b32b8144 FG |
177 | TEST_UNION(case_123_multi, 1, 0, 11, 2.75); |
178 | TEST_UNION(case_124_multi, 1, 0, 9, 2.75); | |
179 | TEST_UNION(case_125_multi, 1, 0, 9, 2.75); | |
180 | TEST_UNION(case_126_multi, 1, 2, 27, 52.0); | |
181 | ||
b32b8144 | 182 | TEST_UNION(case_131_multi, 1, 2, 15, 14.0); |
b32b8144 FG |
183 | |
184 | // SQL Server returns: MULTIPOLYGON (((4 4, 5.5 4.5, 6 6, 4.5 5.5, 4 4)), ((2 2, 3.5 2.5, 4 4, 2.5 3.5, 2 2)), ((0 0, 8 0, 8 8, 0 8, 0 0), (2 2, 2 4, 4 4, 4 6, 6 6, 6 4, 4 4, 4 2, 2 2))) | |
185 | // Which is one self-connected hole with two island polygons in both parts, basically identical to what Boost.Geometry delivers | |
186 | ||
187 | // PostGIS returns: MULTIPOLYGON(((0 0,0 8,8 8,8 0,0 0),(4 6,4 4,6 4,6 6,4 6)),((2 2,2.5 3.5,4 4,3.5 2.5,2 2),(4 4,2 4,2 2,4 2,4 4)),((4 4,4.5 5.5,6 6,5.5 4.5,4 4))) | |
188 | // Which seems wrong because the second hole is part of a smaller polygon (?) | |
189 | // ("POSTGIS="2.1.7 r13414" GEOS="3.5.0dev-CAPI-1.9.0 r4057") | |
190 | TEST_UNION(case_132_multi, 3, 2, 26, 60.0); | |
191 | ||
192 | TEST_UNION(case_133_multi, 2, 1, -1, 64.625); | |
193 | TEST_UNION(case_134_multi, 1, 2, -1, 66.0); | |
194 | TEST_UNION(case_135_multi, 1, 2, -1, 22.0); | |
195 | TEST_UNION(case_136_multi, 1, 2, -1, 22.0); | |
196 | TEST_UNION(case_137_multi, 1, 2, -1, 22.0); | |
197 | TEST_UNION(case_138_multi, 2, 1, -1, 65.225); | |
198 | TEST_UNION(case_139_multi, 2, 1, -1, 64.953); | |
199 | TEST_UNION(case_140_multi, 2, 1, -1, 64.953); | |
200 | TEST_UNION(case_141_multi, 1, 0, -1, 100.0); | |
201 | ||
7c673cae FG |
202 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_1", |
203 | case_recursive_boxes_1[0], case_recursive_boxes_1[1], | |
11fdf7f2 | 204 | 1, 1, 16, 97.0); |
7c673cae FG |
205 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_2", |
206 | case_recursive_boxes_2[0], case_recursive_boxes_2[1], | |
11fdf7f2 | 207 | 1, 0, 5, 100.0); // Area from SQL Server |
7c673cae FG |
208 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_3", |
209 | case_recursive_boxes_3[0], case_recursive_boxes_3[1], | |
11fdf7f2 | 210 | 17, 6, 154, 56.5); // Area from SQL Server |
7c673cae FG |
211 | |
212 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_4", | |
213 | case_recursive_boxes_4[0], case_recursive_boxes_4[1], | |
11fdf7f2 | 214 | 1, 2, 26, 96.75); |
7c673cae | 215 | |
11fdf7f2 | 216 | TEST_UNION(case_recursive_boxes_5, 3, 10, 98, 70.0); |
7c673cae FG |
217 | |
218 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_6", | |
219 | case_recursive_boxes_6[0], case_recursive_boxes_6[1], | |
11fdf7f2 | 220 | 1, 3, 17, 24.0); |
7c673cae FG |
221 | |
222 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_7", | |
223 | case_recursive_boxes_7[0], case_recursive_boxes_7[1], | |
224 | 2, 0, 20, 7.0); | |
225 | ||
226 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_8", | |
227 | case_recursive_boxes_8[0], case_recursive_boxes_8[1], | |
228 | 1, 0, 13, 12.0); | |
229 | ||
230 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_9", | |
231 | case_recursive_boxes_9[0], case_recursive_boxes_9[1], | |
11fdf7f2 | 232 | 1, 1, 11, 8.25); |
7c673cae FG |
233 | |
234 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_10", | |
235 | case_recursive_boxes_10[0], case_recursive_boxes_10[1], | |
236 | 1, 0, -1, 2.75); | |
237 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_11", | |
238 | case_recursive_boxes_11[0], case_recursive_boxes_11[1], | |
239 | 1, 0, -1, 8.0); | |
240 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_12", | |
241 | case_recursive_boxes_12[0], case_recursive_boxes_12[1], | |
242 | 6, 0, -1, 6.0); | |
243 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_13", | |
244 | case_recursive_boxes_13[0], case_recursive_boxes_13[1], | |
245 | 3, 0, -1, 10.25); | |
246 | ||
247 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_14", | |
248 | case_recursive_boxes_14[0], case_recursive_boxes_14[1], | |
249 | 5, 0, -1, 4.5); | |
250 | ||
b32b8144 FG |
251 | // 12, 13, 14 with invalid input. To make then valid it is necessary |
252 | // to break regions at self-intersection points (postponed) | |
7c673cae | 253 | |
b32b8144 | 254 | TEST_UNION_IGNORE(case_recursive_boxes_12_invalid, 5, 0, -1, 6.0); |
b32b8144 | 255 | TEST_UNION_IGNORE(case_recursive_boxes_13_invalid, 2, 0, -1, 10.25); |
b32b8144 | 256 | TEST_UNION_IGNORE(case_recursive_boxes_14_invalid, 4, 0, -1, 4.5); |
7c673cae FG |
257 | |
258 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_15", | |
259 | case_recursive_boxes_15[0], case_recursive_boxes_15[1], | |
260 | 3, 0, -1, 6.0); | |
261 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_16", | |
262 | case_recursive_boxes_16[0], case_recursive_boxes_16[1], | |
263 | 1, 4, -1, 22.0); | |
264 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_17", | |
265 | case_recursive_boxes_17[0], case_recursive_boxes_17[1], | |
266 | 5, 2, -1, 21.0); | |
267 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_18", | |
268 | case_recursive_boxes_18[0], case_recursive_boxes_18[1], | |
269 | 3, 0, -1, 2.5); | |
270 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_19", | |
271 | case_recursive_boxes_19[0], case_recursive_boxes_19[1], | |
272 | 3, 0, -1, 2.5); | |
273 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_20", | |
274 | case_recursive_boxes_20[0], case_recursive_boxes_20[1], | |
275 | 2, 0, -1, 2.0); | |
276 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_21", | |
277 | case_recursive_boxes_21[0], case_recursive_boxes_21[1], | |
278 | 1, 0, -1, 2.5); | |
279 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_22", | |
280 | case_recursive_boxes_22[0], case_recursive_boxes_22[1], | |
281 | 2, 0, -1, 3.25); | |
282 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_23", | |
283 | case_recursive_boxes_23[0], case_recursive_boxes_23[1], | |
284 | 3, 0, -1, 1.75); | |
285 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_24", | |
286 | case_recursive_boxes_24[0], case_recursive_boxes_24[1], | |
287 | 5, 0, -1, 5.0); | |
288 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_25", | |
289 | case_recursive_boxes_25[0], case_recursive_boxes_25[1], | |
290 | 2, 0, -1, 5.5); | |
291 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_26", | |
292 | case_recursive_boxes_26[0], case_recursive_boxes_26[1], | |
293 | 3, 0, -1, 6.0); | |
294 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_27", | |
295 | case_recursive_boxes_27[0], case_recursive_boxes_27[1], | |
296 | 4, 0, -1, 4.5); | |
297 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_28", | |
298 | case_recursive_boxes_28[0], case_recursive_boxes_28[1], | |
299 | 2, 0, -1, 6.5); | |
300 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_29", | |
301 | case_recursive_boxes_29[0], case_recursive_boxes_29[1], | |
302 | 2, 2, -1, 15.5); | |
303 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_30", | |
304 | case_recursive_boxes_30[0], case_recursive_boxes_30[1], | |
305 | 1, 3, -1, 17.5); | |
306 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_31", | |
307 | case_recursive_boxes_31[0], case_recursive_boxes_31[1], | |
308 | 3, 0, -1, 5.0); | |
309 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_32", | |
310 | case_recursive_boxes_32[0], case_recursive_boxes_32[1], | |
311 | 2, 0, -1, 5.75); | |
312 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_33", | |
313 | case_recursive_boxes_33[0], case_recursive_boxes_33[1], | |
314 | 1, 1, -1, 11.0); | |
315 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_34", | |
316 | case_recursive_boxes_34[0], case_recursive_boxes_34[1], | |
317 | 1, 0, -1, 25.0); | |
318 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_35", | |
319 | case_recursive_boxes_35[0], case_recursive_boxes_35[1], | |
320 | 1, 1, -1, 24.5); | |
321 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_36", | |
322 | case_recursive_boxes_36[0], case_recursive_boxes_36[1], | |
323 | 3, 0, -1, 3.0); | |
324 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_37", | |
325 | case_recursive_boxes_37[0], case_recursive_boxes_37[1], | |
326 | 2, 1, -1, 7.75); | |
327 | test_one<Polygon, MultiPolygon, MultiPolygon>("case_recursive_boxes_38", | |
328 | case_recursive_boxes_38[0], case_recursive_boxes_38[1], | |
329 | 2, 1, -1, 14.0); | |
330 | ||
b32b8144 FG |
331 | TEST_UNION(case_recursive_boxes_46, 1, 4, 51, 33.0); |
332 | TEST_UNION(case_recursive_boxes_47, 1, 0, -1, 22.0); | |
333 | TEST_UNION(case_recursive_boxes_48, 1, 1, -1, 10.0); | |
b32b8144 | 334 | TEST_UNION(case_recursive_boxes_49, 1, 3, -1, 59.0); |
b32b8144 | 335 | TEST_UNION(case_recursive_boxes_50, 7, 4, -1, 68.0); |
b32b8144 | 336 | TEST_UNION(case_recursive_boxes_51, 2, 6, -1, 75.0); |
b32b8144 FG |
337 | TEST_UNION(case_recursive_boxes_52, 2, 6, -1, 77.0); |
338 | TEST_UNION(case_recursive_boxes_53, 1, 1, -1, 24.75); | |
b32b8144 | 339 | TEST_UNION(case_recursive_boxes_54, 1, 2, -1, 22.5); |
b32b8144 | 340 | TEST_UNION(case_recursive_boxes_55, 3, 1, -1, 15.5); |
b32b8144 | 341 | TEST_UNION(case_recursive_boxes_56, 5, 1, -1, 7.75); |
b32b8144 FG |
342 | TEST_UNION(case_recursive_boxes_57, 3, 4, -1, 19.75); |
343 | TEST_UNION(case_recursive_boxes_58, 6, 1, -1, 6.25); | |
b32b8144 | 344 | TEST_UNION(case_recursive_boxes_59, 1, 3, -1, 21.75); |
b32b8144 FG |
345 | TEST_UNION(case_recursive_boxes_60, 3, 0, -1, 20.5); |
346 | TEST_UNION(case_recursive_boxes_61, 1, 1, -1, 23.5); | |
347 | TEST_UNION(case_recursive_boxes_62, 2, 3, -1, 21.25); | |
348 | TEST_UNION(case_recursive_boxes_63, 2, 3, -1, 44.0); | |
349 | TEST_UNION(case_recursive_boxes_64, 1, 2, -1, 24.5); | |
350 | TEST_UNION(case_recursive_boxes_65, 1, 1, -1, 24.5); | |
351 | TEST_UNION(case_recursive_boxes_66, 1, 1, -1, 24.75); | |
352 | TEST_UNION(case_recursive_boxes_67, 4, 0, -1, 14.75); | |
353 | TEST_UNION(case_recursive_boxes_68, 1, 4, -1, 22.5); | |
354 | TEST_UNION(case_recursive_boxes_69, 4, 0, -1, 16.25); | |
355 | TEST_UNION(case_recursive_boxes_70, 1, 0, -1, 25.0); | |
356 | TEST_UNION(case_recursive_boxes_71, 4, 2, -1, 15.75); | |
357 | TEST_UNION(case_recursive_boxes_72, 10, 0, -1, 15.0); | |
358 | TEST_UNION(case_recursive_boxes_73, 1, 2, -1, 24.25); | |
359 | TEST_UNION(case_recursive_boxes_74, 1, 1, -1, 24.75); | |
360 | TEST_UNION(case_recursive_boxes_75, 1, 2, -1, 23.25); | |
361 | TEST_UNION(case_recursive_boxes_76, 1, 0, -1, 24.5); | |
362 | TEST_UNION(case_recursive_boxes_77, 8, 1, -1, 13.5); | |
363 | TEST_UNION(case_recursive_boxes_78, 2, 5, -1, 18.0); | |
364 | TEST_UNION(case_recursive_boxes_79, 1, 2, -1, 14.75); | |
365 | ||
92f5a8d4 TL |
366 | // No hole should be generated (but rescaling generates one hole) |
367 | TEST_UNION(case_recursive_boxes_80, 2, BG_IF_RESCALED(1, 0), -1, 1.5); | |
b32b8144 | 368 | |
11fdf7f2 TL |
369 | TEST_UNION(case_recursive_boxes_81, 5, 0, -1, 15.5); |
370 | TEST_UNION(case_recursive_boxes_82, 2, 2, -1, 20.25); | |
371 | TEST_UNION(case_recursive_boxes_83, 3, 1, -1, 20.75); | |
372 | TEST_UNION(case_recursive_boxes_84, 4, 1, -1, 17.5); | |
373 | TEST_UNION(case_recursive_boxes_85, 9, 0, -1, 8.0); | |
374 | TEST_UNION(case_recursive_boxes_86, 3, 0, -1, 3.0); | |
375 | TEST_UNION(case_recursive_boxes_87, 8, 0, -1, 4.5); | |
376 | TEST_UNION(case_recursive_boxes_88, 5, 1, -1, 15.0); | |
377 | ||
7c673cae FG |
378 | test_one<Polygon, MultiPolygon, MultiPolygon>("ggl_list_20120915_h2_a", |
379 | ggl_list_20120915_h2[0], ggl_list_20120915_h2[1], | |
380 | 1, 0, 12, 23.0); // Area from SQL Server | |
381 | test_one<Polygon, MultiPolygon, MultiPolygon>("ggl_list_20120915_h2_b", | |
382 | ggl_list_20120915_h2[0], ggl_list_20120915_h2[2], | |
383 | 1, 0, 12, 23.0); // Area from SQL Server | |
384 | ||
385 | test_one<Polygon, MultiPolygon, MultiPolygon>("ggl_list_20140212_sybren", | |
386 | ggl_list_20140212_sybren[0], ggl_list_20140212_sybren[1], | |
387 | 2, 0, 16, 0.002471626); | |
388 | ||
92f5a8d4 TL |
389 | { |
390 | // Generates either 4 or 3 output polygons | |
391 | // With rescaling the result is invalid. | |
392 | ut_settings settings; | |
393 | settings.test_validity = BG_IF_RESCALED(false, true); | |
394 | test_one<Polygon, MultiPolygon, MultiPolygon>("ticket_9081", | |
395 | ticket_9081[0], ticket_9081[1], | |
396 | BG_IF_RESCALED(4, 3), 0, 31, 0.2187385, | |
397 | settings); | |
398 | } | |
7c673cae FG |
399 | |
400 | test_one<Polygon, MultiPolygon, MultiPolygon>("ticket_10803", | |
401 | ticket_10803[0], ticket_10803[1], | |
402 | 1, 0, 9, 2663736.07038); | |
403 | test_one<Polygon, MultiPolygon, MultiPolygon>("ticket_11984", | |
404 | ticket_11984[0], ticket_11984[1], | |
405 | 1, 2, 134, 60071.08077); | |
7c673cae FG |
406 | test_one<Polygon, MultiPolygon, MultiPolygon>("ticket_12118", |
407 | ticket_12118[0], ticket_12118[1], | |
92f5a8d4 | 408 | 1, -1, 27, 2221.38713); |
7c673cae | 409 | |
92f5a8d4 | 410 | #if defined(BOOST_GEOMETRY_TEST_FAILURES) || ! defined(BOOST_GEOMETRY_USE_RESCALING) |
7c673cae FG |
411 | // No output if rescaling is done |
412 | test_one<Polygon, MultiPolygon, MultiPolygon>("ticket_12125", | |
413 | ticket_12125[0], ticket_12125[1], | |
414 | 1, 0, -1, 575.831180350007); | |
415 | #endif | |
416 | ||
b32b8144 FG |
417 | TEST_UNION(ticket_12503, 42, 1, -1, 945.625); |
418 | ||
92f5a8d4 TL |
419 | #if ! defined(BOOST_GEOMETRY_USE_RESCALING) || defined(BOOST_GEOMETRY_TEST_FAILURES) |
420 | // Failure with rescaling | |
421 | TEST_UNION(issue_630_a, 1, 0, -1, 2.200326); | |
422 | #endif | |
423 | TEST_UNION(issue_630_b, 1, 0, -1, 1.675976); | |
424 | #if ! defined(BOOST_GEOMETRY_USE_KRAMER_RULE) || defined(BOOST_GEOMETRY_TEST_FAILURES) | |
425 | // Failure with Kramer rule | |
426 | TEST_UNION(issue_630_c, 1, 0, -1, 1.670367); | |
b32b8144 FG |
427 | #endif |
428 | ||
92f5a8d4 TL |
429 | #if ! defined(BOOST_GEOMETRY_USE_RESCALING) || defined(BOOST_GEOMETRY_TEST_FAILURES) |
430 | // With rescaling the small polygon is added on top of the outer polygon | |
431 | TEST_UNION(issue_643, 1, 0, -1, 80.0); | |
432 | #endif | |
433 | ||
434 | #if defined(BOOST_GEOMETRY_USE_KRAMER_RULE) | |
435 | // Two polygons, should ideally be merged | |
436 | TEST_UNION(mail_2019_01_21_johan, 2, 0, -1, 0.00058896); | |
b32b8144 | 437 | #else |
92f5a8d4 TL |
438 | // Correct: one polygon |
439 | TEST_UNION(mail_2019_01_21_johan, 1, 0, -1, 0.00058896); | |
b32b8144 | 440 | #endif |
7c673cae | 441 | |
92f5a8d4 TL |
442 | TEST_UNION(mysql_23023665_7, 1, 1, -1, 99.19494); |
443 | TEST_UNION(mysql_23023665_8, 1, 2, -1, 1400.0); | |
444 | ||
7c673cae FG |
445 | test_one<Polygon, MultiPolygon, MultiPolygon>("mysql_23023665_9", |
446 | mysql_23023665_9[0], mysql_23023665_9[1], | |
447 | 1, 9, -1, 1250.0); | |
b32b8144 FG |
448 | |
449 | TEST_UNION(mysql_regression_1_65_2017_08_31, 3, 0, -1, 181.966397646608); | |
7c673cae FG |
450 | } |
451 | ||
452 | // Test cases (generic) | |
453 | template <typename Point, bool ClockWise, bool Closed> | |
454 | void test_all() | |
455 | { | |
456 | ||
457 | typedef bg::model::ring<Point, ClockWise, Closed> ring; | |
458 | typedef bg::model::polygon<Point, ClockWise, Closed> polygon; | |
459 | typedef bg::model::multi_polygon<polygon> multi_polygon; | |
460 | test_areal<ring, polygon, multi_polygon>(); | |
461 | } | |
462 | ||
463 | // Test cases for integer coordinates / ccw / open | |
464 | template <typename Point, bool ClockWise, bool Closed> | |
465 | void test_specific() | |
466 | { | |
467 | typedef bg::model::polygon<Point, ClockWise, Closed> polygon; | |
468 | typedef bg::model::multi_polygon<polygon> multi_polygon; | |
469 | ||
470 | ut_settings settings; | |
471 | settings.test_validity = true; | |
472 | ||
473 | test_one<polygon, multi_polygon, multi_polygon>("ticket_10803", | |
474 | ticket_10803[0], ticket_10803[1], | |
475 | 1, 0, 9, 2664270, settings); | |
476 | } | |
477 | ||
478 | ||
479 | int test_main(int, char* []) | |
480 | { | |
92f5a8d4 TL |
481 | BoostGeometryWriteTestConfiguration(); |
482 | test_all<bg::model::d2::point_xy<default_test_type>, true, true>(); | |
483 | ||
b32b8144 | 484 | #if ! defined(BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE) |
7c673cae FG |
485 | test_all<bg::model::d2::point_xy<double>, false, false>(); |
486 | ||
487 | test_specific<bg::model::d2::point_xy<int>, false, false>(); | |
488 | ||
7c673cae FG |
489 | test_all<bg::model::d2::point_xy<float>, true, true>(); |
490 | ||
491 | #if defined(HAVE_TTMATH) | |
492 | std::cout << "Testing TTMATH" << std::endl; | |
493 | test_all<bg::model::d2::point_xy<ttmath_big> >(); | |
494 | #endif | |
495 | ||
496 | #endif | |
497 | ||
498 | return 0; | |
499 | } |