• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  // Boost.Geometry (aka GGL, Generic Geometry Library)
2  
3  // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
4  // Copyright (c) 2018 Adam Wulkiewicz, Lodz, Poland.
5  
6  // This file was modified by Oracle on 2013, 2014, 2015.
7  // Modifications copyright (c) 2013-2015 Oracle and/or its affiliates.
8  
9  // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
10  
11  // Use, modification and distribution is subject to the Boost Software License,
12  // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
13  // http://www.boost.org/LICENSE_1_0.txt)
14  
15  #include "test_relate.hpp"
16  #include "nan_cases.hpp"
17  
18  //TEST
19  //#include <to_svg.hpp>
20  
21  template <typename P>
test_linestring_polygon()22  void test_linestring_polygon()
23  {
24      typedef bg::model::linestring<P> ls;
25      typedef bg::model::polygon<P> poly;
26      typedef bg::model::ring<P> ring;
27  
28      // LS disjoint
29      test_geometry<ls, poly>("LINESTRING(11 0,11 10)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "FF1FF0212");
30      test_geometry<ls, ring>("LINESTRING(11 0,11 10)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "FF1FF0212");
31  
32      // II BB
33      test_geometry<ls, poly>("LINESTRING(0 0,10 10)", "POLYGON((0 0,0 10,10 10,10 0,0 0))",    "1FFF0F212");
34      test_geometry<ls, poly>("LINESTRING(5 0,5 5,10 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "1FFF0F212");
35      test_geometry<ls, poly>("LINESTRING(5 1,5 5,9 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))",  "1FF0FF212");
36  
37      // IE
38      test_geometry<ls, poly>("LINESTRING(11 1,11 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "FF1FF0212");
39      // IE IB0
40      test_geometry<ls, poly>("LINESTRING(11 1,10 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "FF1F00212");
41      // IE IB1
42      test_geometry<ls, poly>("LINESTRING(11 1,10 5,10 10)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "F11F00212");
43      test_geometry<ls, poly>("LINESTRING(11 1,10 10,0 10)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "F11F00212");
44      test_geometry<ls, poly>("LINESTRING(11 1,10 0,0 0)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "F11F00212");
45      test_geometry<ls, poly>("LINESTRING(0 -1,1 0,2 0)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "F11F00212");
46      // IE IB0 II
47      test_geometry<ls, poly>("LINESTRING(11 1,10 5,5 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "1010F0212");
48      // IE IB0 lring
49      test_geometry<ls, poly>("LINESTRING(11 1,10 5,11 5,11 1)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "F01FFF212");
50      // IE IB1 lring
51      test_geometry<ls, poly>("LINESTRING(11 1,10 5,10 10,11 5,11 1)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "F11FFF212");
52  
53      // IB1 II
54      test_geometry<ls, poly>("LINESTRING(0 0,5 0,5 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "11F00F212");
55      // BI0 II IB1
56      test_geometry<ls, poly>("LINESTRING(5 0,5 5,10 5,10 10)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "11FF0F212");
57  
58      // IB1 II IB1
59      test_geometry<ls, poly>("LINESTRING(1 0,2 0,3 1,4 0,5 0)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "11FF0F212");
60      // IB1 IE IB1
61      test_geometry<ls, poly>("LINESTRING(1 0,2 0,3 -1,4 0,5 0)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "F11F0F212");
62  
63      // II IB1
64      test_geometry<ls, poly>("LINESTRING(5 5,10 5,10 10)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "11F00F212");
65      // IB1 II
66      test_geometry<ls, poly>("LINESTRING(10 10,10 5,5 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "11F00F212");
67      // IE IB1
68      test_geometry<ls, poly>("LINESTRING(15 5,10 5,10 10)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "F11F00212");
69      // IB1 IE
70      test_geometry<ls, poly>("LINESTRING(10 10,10 5,15 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "F11F00212");
71  
72      // duplicated points
73      {
74          // II IB0 IE
75          test_geometry<ls, poly>("LINESTRING(5 5,10 5,15 10)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "1010F0212");
76          test_geometry<ls, poly>("LINESTRING(5 5,5 5,5 5,10 5,10 5,10 5,15 10,15 10,15 10)",
77              "POLYGON((0 0,0 0,0 0,0 10,0 10,0 10,10 10,10 10,10 10,10 0,10 0,10 0,0 0,0 0,0 0))",
78              "1010F0212");
79          test_geometry<ls, poly>("LINESTRING(5 5,5 5,5 5,10 0,10 0,10 0,15 10,15 10,15 10)",
80              "POLYGON((0 0,0 0,0 0,0 10,0 10,0 10,10 10,10 10,10 10,10 0,10 0,10 0,0 0,0 0,0 0))",
81              "1010F0212");
82          // IE IB0 II
83          test_geometry<ls, poly>("LINESTRING(15 10,15 10,15 10,10 5,10 5,10 5,5 5,5 5,5 5)",
84              "POLYGON((0 0,0 0,0 0,0 10,0 10,0 10,10 10,10 10,10 10,10 0,10 0,10 0,0 0,0 0,0 0))",
85              "1010F0212");
86          test_geometry<ls, poly>("LINESTRING(15 10,15 10,15 10,10 0,10 0,10 0,5 5,5 5,5 5)",
87              "POLYGON((0 0,0 0,0 0,0 10,0 10,0 10,10 10,10 10,10 10,10 0,10 0,10 0,0 0,0 0,0 0))",
88              "1010F0212");
89  
90          // TEST
91          //test_geometry<ls, poly>("LINESTRING(5 5,5 5,5 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "1010F0212");
92          test_geometry<ls, poly>("LINESTRING(5 5,5 5,5 5,15 5,15 5,15 5)", "POLYGON((0 0,0 10,10 10,10 0,0 0))", "1010F0212");
93      }
94  
95      // non-simple polygon with hole
96      test_geometry<ls, poly>("LINESTRING(9 1,10 5,9 9)",
97                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,2 8,2 2,10 5))",
98                              "10F0FF212");
99      test_geometry<ls, poly>("LINESTRING(10 1,10 5,10 9)",
100                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,2 8,2 2,10 5))",
101                              "F1FF0F212");
102      test_geometry<ls, poly>("LINESTRING(2 8,10 5,2 2)",
103                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,2 8,2 2,10 5))",
104                              "F1FF0F212");
105      test_geometry<ls, poly>("LINESTRING(10 1,10 5,2 2)",
106                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,2 8,2 2,10 5))",
107                              "F1FF0F212");
108      test_geometry<ls, poly>("LINESTRING(10 1,10 5,2 8)",
109                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,2 8,2 2,10 5))",
110                              "F1FF0F212");
111  
112      // non-simple polygon with hole, linear ring
113      test_geometry<ls, poly>("LINESTRING(9 1,10 5,9 9,1 9,1 1,9 1)",
114                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,2 8,2 2,10 5))",
115                              "10FFFF212");
116      test_geometry<ls, poly>("LINESTRING(10 5,10 9,11 5,10 1,10 5)",
117                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,2 8,2 2,10 5))",
118                              "F11FFF212");
119      test_geometry<ls, poly>("LINESTRING(11 5,10 1,10 5,10 9,11 5)",
120                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,2 8,2 2,10 5))",
121                              "F11FFF212");
122  
123      // non-simple polygon with self-touching holes
124      test_geometry<ls, poly>("LINESTRING(7 1,8 5,7 9)",
125                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(8 1,9 1,9 9,8 9,8 1),(2 2,8 5,2 8,2 2))",
126                              "10F0FF212");
127      test_geometry<ls, poly>("LINESTRING(8 2,8 5,8 8)",
128                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(8 1,9 1,9 9,8 9,8 1),(2 2,8 5,2 8,2 2))",
129                              "F1FF0F212");
130      test_geometry<ls, poly>("LINESTRING(2 8,8 5,2 2)",
131                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(8 1,9 1,9 9,8 9,8 1),(2 2,8 5,2 8,2 2))",
132                              "F1FF0F212");
133  
134      // non-simple polygon self-touching
135      test_geometry<ls, poly>("LINESTRING(9 1,10 5,9 9)",
136                              "POLYGON((0 0,0 10,10 10,10 5,2 8,2 2,10 5,10 0,0 0))",
137                              "10F0FF212");
138      test_geometry<ls, poly>("LINESTRING(10 1,10 5,10 9)",
139                              "POLYGON((0 0,0 10,10 10,10 5,2 8,2 2,10 5,10 0,0 0))",
140                              "F1FF0F212");
141      test_geometry<ls, poly>("LINESTRING(2 8,10 5,2 2)",
142                              "POLYGON((0 0,0 10,10 10,10 5,2 8,2 2,10 5,10 0,0 0))",
143                              "F1FF0F212");
144  
145      // non-simple polygon self-touching, linear ring
146      test_geometry<ls, poly>("LINESTRING(9 1,10 5,9 9,1 9,1 1,9 1)",
147                              "POLYGON((0 0,0 10,10 10,10 5,2 8,2 2,10 5,10 0,0 0))",
148                              "10FFFF212");
149      test_geometry<ls, poly>("LINESTRING(10 5,10 9,11 5,10 1,10 5)",
150                              "POLYGON((0 0,0 10,10 10,10 5,2 8,2 2,10 5,10 0,0 0))",
151                              "F11FFF212");
152      test_geometry<ls, poly>("LINESTRING(11 5,10 1,10 5,10 9,11 5)",
153                              "POLYGON((0 0,0 10,10 10,10 5,2 8,2 2,10 5,10 0,0 0))",
154                              "F11FFF212");
155  
156      // polygons with some ring equal to the linestring
157      test_geometry<ls, poly>("LINESTRING(0 0,10 0,10 10,0 10,0 0)",
158                              "POLYGON((0 0,0 10,10 10,10 0,0 0))",
159                              "F1FFFF2F2");
160      test_geometry<ls, poly>("LINESTRING(0 0,10 0,10 10,0 10,0 0)",
161                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,5 5,2 8,2 2))",
162                              "F1FFFF212");
163      test_geometry<ls, poly>("LINESTRING(2 2,5 5,2 8,2 2)",
164                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,5 5,2 8,2 2))",
165                              "F1FFFF212");
166  
167      // self-IP going on the boundary then into the exterior and to the boundary again
168      test_geometry<ls, poly>("LINESTRING(2 10,5 10,5 15,6 15,5 10,8 10)", "POLYGON((0 0,0 10,10 10,10 0,0 0))",
169                              "F11F0F212");
170      // self-IP going on the boundary then into the interior and to the boundary again
171      test_geometry<ls, poly>("LINESTRING(2 10,5 10,5 5,6 5,5 10,8 10)", "POLYGON((0 0,0 10,10 10,10 0,0 0))",
172                              "11FF0F212");
173  
174      // self-IP with a hole -> B to I to B to E
175      test_geometry<ls, poly>("LINESTRING(0 0,3 3)", "POLYGON((0 0,0 10,10 10,10 0,0 0),(0 0,9 1,9 9,1 9,0 0))",
176                              "FF1F00212");
177  
178      // ccw
179      {
180          typedef bg::model::polygon<P, false> ccwpoly;
181  
182          // IE IB0 II
183          test_geometry<ls, ccwpoly>("LINESTRING(11 1,10 5,5 5)", "POLYGON((0 0,10 0,10 10,0 10,0 0))", "1010F0212");
184          // IE IB1 II
185          test_geometry<ls, ccwpoly>("LINESTRING(11 1,10 1,10 5,5 5)", "POLYGON((0 0,10 0,10 10,0 10,0 0))", "1110F0212");
186          test_geometry<ls, ccwpoly>("LINESTRING(11 1,10 5,10 1,5 5)", "POLYGON((0 0,10 0,10 10,0 10,0 0))", "1110F0212");
187          // II IB0 IE
188          test_geometry<ls, ccwpoly>("LINESTRING(5 1,10 5,11 1)", "POLYGON((0 0,10 0,10 10,0 10,0 0))", "1010F0212");
189          // IE IB1 II
190          test_geometry<ls, ccwpoly>("LINESTRING(5 5,10 1,10 5,11 5)", "POLYGON((0 0,10 0,10 10,0 10,0 0))", "1110F0212");
191          test_geometry<ls, ccwpoly>("LINESTRING(5 5,10 5,10 1,11 5)", "POLYGON((0 0,10 0,10 10,0 10,0 0))", "1110F0212");
192  
193      }
194  
195      {
196          // SPIKES
197  
198          test_geometry<ls, poly>("LINESTRING(0 0,2 2,3 3,1 1)", "POLYGON((0 0,3 3,3 0,0 0))", "F1FF0F212");
199          test_geometry<ls, poly>("LINESTRING(0 0,3 3,1 1)", "POLYGON((0 0,3 3,3 0,0 0))", "F1FF0F212");
200          test_geometry<ls, poly>("LINESTRING(0 0,2 2,1 1)", "POLYGON((0 0,3 3,3 0,0 0))", "F1FF0F212");
201          test_geometry<ls, poly>("LINESTRING(1 1,3 3,2 2)", "POLYGON((0 0,3 3,3 0,0 0))", "F1FF0F212");
202          test_geometry<ls, poly>("LINESTRING(1 1,2 2,1 1)", "POLYGON((0 0,3 3,3 0,0 0))", "F1FFFF212");
203  
204          test_geometry<ls, poly>("LINESTRING(3 3,1 1,0 0,2 2)", "POLYGON((0 0,3 3,3 0,0 0))", "F1FF0F212");
205          test_geometry<ls, poly>("LINESTRING(3 3,0 0,2 2)", "POLYGON((0 0,3 3,3 0,0 0))", "F1FF0F212");
206          test_geometry<ls, poly>("LINESTRING(2 2,0 0,1 1)", "POLYGON((0 0,3 3,3 0,0 0))", "F1FF0F212");
207          test_geometry<ls, poly>("LINESTRING(3 3,1 1,2 2)", "POLYGON((0 0,3 3,3 0,0 0))", "F1FF0F212");
208          test_geometry<ls, poly>("LINESTRING(2 2,1 1,2 2)", "POLYGON((0 0,3 3,3 0,0 0))", "F1FFFF212");
209  
210          test_geometry<ls, poly>("LINESTRING(0 0,2 2,4 4,1 1)", "POLYGON((0 0,3 3,3 0,0 0))", "F11F0F212");
211  
212          test_geometry<ls, poly>("LINESTRING(0 1,1 1,0 1)", "POLYGON((0 0,3 3,3 0,0 0))", "F01FFF212");
213          test_geometry<ls, poly>("LINESTRING(0 1,3 3,0 1)", "POLYGON((0 0,3 3,3 0,0 0))", "F01FFF212");
214          test_geometry<ls, poly>("LINESTRING(0 1,0 0,0 1)", "POLYGON((0 0,3 3,3 0,0 0))", "F01FFF212");
215  
216          test_geometry<ls, poly>("LINESTRING(0 1,1 1,-1 1)", "POLYGON((0 0,3 3,3 0,0 0))", "F01FF0212");
217      }
218  
219      {
220          // POLYGON SPIKES
221          // note that those are invalid Polygons and in general the result is undefined
222  
223          // MySQL bug 15.12.2014 (assertion for invalid polygon)
224          test_geometry<ls, poly>("LINESTRING(6 3,9 0)",
225                                  "POLYGON((0 0,5 8,6 1,6 3,8 1,5 4,9 6,2 5,7 4,1 7,0 0))",
226                                  "F11F00212");
227          test_geometry<ls, poly>("LINESTRING(9 0,2 7)",
228                                  "POLYGON((4 1,3 2,5 9,8 4,4 5,3 6,8 1,6 2,2 4,6 0,4 1))",
229                                  "F11FF0212");
230  
231          test_geometry<ls, poly>("LINESTRING(6 3,9 0)",
232                                  "POLYGON((6 1,6 3,8 1,5 4,6 1))",
233                                  "F11F00212");
234          test_geometry<ls, poly>("LINESTRING(6 3,8 1,9 0)",
235                                  "POLYGON((6 1,6 3,8 1,5 4,6 1))",
236                                  "F11F00212");
237  
238          // entry-point spikes are not handled
239          test_geometry<ls, poly>("LINESTRING(9 0,6 3)",
240                                  "POLYGON((6 1,6 3,8 1,5 4,6 1))",
241                                  "**1*00212");
242          test_geometry<ls, poly>("LINESTRING(9 0,8 1,6 3)",
243                                  "POLYGON((6 1,6 3,8 1,5 4,6 1))",
244                                  "F11F00212");
245  
246          // Ls going out-in on 2 collinear spikes touching each other
247          //  this works partially, other invalid effect is noticeable here,
248          //  the bottom of a spike shouldn't be there so the algorithm
249          //  thinks the linestring is going into the interior
250          test_geometry<ls, poly>("LINESTRING(2 2,6 6)",
251                                  "POLYGON((0 0,0 2,2 2,4 4,3 3,5 3,5 5,4 4,7 7,7 0,0 0))",
252                                  "*1FF0F212");
253          // Ls going out-in on 2 collinear spikes NOT touching each other
254          // This is not supported, plus the same as above
255          test_geometry<ls, poly>("LINESTRING(2 2,6 6)",
256                                  "POLYGON((0 0,0 2,2 2,3 3,2 2,5 3,5 5,4 4,7 7,7 0,0 0))",
257                                  "*1*F0*212");
258      }
259  
260      // 21.01.2015
261      test_geometry<ls, poly>("LINESTRING(3 7, 9 1)",
262                              "POLYGON((0 0,0 10,10 10,10 0,5 5,0 0))",
263                              "11F00F212");
264  
265      // inspired by the bug for mls/poly
266      test_geometry<ls, poly>("LINESTRING(0 0, 7 7)",
267                              "POLYGON((5 5,5 15,15 15,15 5,5 5))",
268                              "1010F0212");
269  
270      // 25.01.2015
271      test_geometry<ls, poly>("LINESTRING(4 5, 0 6, 5 6)",
272                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(4 4,6 4,6 6,4 6,4 4))",
273                              "11FF0F212");
274      test_geometry<ls, poly>("LINESTRING(2 3, 4 5, 0 6, 5 6)",
275                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(4 4,6 4,6 6,4 6,4 4))",
276                              "11F00F212");
277      test_geometry<ls, poly>("LINESTRING(2 9, 1 1, 10 1, 10 10, 1 10, 0 6, 5 6)",
278                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(4 4,4 6,6 6,6 4,4 4))",
279                              "11F00F212");
280  }
281  
282  template <typename P>
test_linestring_multi_polygon()283  void test_linestring_multi_polygon()
284  {
285      typedef bg::model::linestring<P> ls;
286      typedef bg::model::polygon<P> poly;
287      typedef bg::model::multi_polygon<poly> mpoly;
288  
289      test_geometry<ls, mpoly>("LINESTRING(10 1,10 5,10 9)",
290                              "MULTIPOLYGON(((0 20,0 30,10 30,10 20,0 20)),((0 0,0 10,10 10,10 0,0 0),(10 5,2 8,2 2,10 5)))",
291                              "F1FF0F212");
292      test_geometry<ls, mpoly>("LINESTRING(10 1,10 5,10 9)",
293                              "MULTIPOLYGON(((0 20,0 30,10 30,10 20,0 20)),((0 0,0 10,10 10,10 0,0 0)))",
294                              "F1FF0F212");
295  
296      test_geometry<ls, mpoly>("LINESTRING(10 1,10 5,2 2)",
297                              "MULTIPOLYGON(((0 20,0 30,10 30,10 20,0 20)),((0 0,0 10,10 10,10 0,0 0),(10 5,2 8,2 2,10 5)))",
298                              "F1FF0F212");
299      test_geometry<ls, mpoly>("LINESTRING(10 1,10 5,2 2)",
300                              "MULTIPOLYGON(((0 20,0 30,10 30,10 20,0 20)),((0 0,0 10,10 10,10 0,0 0)))",
301                              "11F00F212");
302  
303      test_geometry<ls, mpoly>("LINESTRING(10 1,10 5,2 2)",
304                              "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(10 5,2 8,2 2,10 5)),((10 5,3 3,3 7,10 5)))",
305                              "F1FF0F212");
306      test_geometry<ls, mpoly>("LINESTRING(10 1,10 5,2 8)",
307                              "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(10 5,2 8,2 2,10 5)),((10 5,3 3,3 7,10 5)))",
308                              "F1FF0F212");
309      test_geometry<ls, mpoly>("LINESTRING(10 1,10 5,3 3)",
310                              "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(10 5,2 8,2 2,10 5)),((10 5,3 3,3 7,10 5)))",
311                              "F1FF0F212");
312      test_geometry<ls, mpoly>("LINESTRING(10 1,10 5,3 7)",
313                              "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(10 5,2 8,2 2,10 5)),((10 5,3 3,3 7,10 5)))",
314                              "F1FF0F212");
315      test_geometry<ls, mpoly>("LINESTRING(10 1,10 5,5 5)",
316                              "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(10 5,2 8,2 2,10 5)),((10 5,3 3,3 7,10 5)))",
317                              "11F00F212");
318  
319      test_geometry<ls, mpoly>("LINESTRING(0 0,10 0,10 10,0 10,0 0)",
320                               "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((20 0,20 10,30 20,20 0)))",
321                               "F1FFFF212");
322  
323      // degenerated points
324      test_geometry<ls, mpoly>("LINESTRING(5 5,10 10,10 10,10 10,15 15)",
325                               "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((10 10,10 20,20 20,20 10,10 10)))",
326                               "10F0FF212");
327  
328      // self-IP polygon with a hole and second polygon with a hole -> B to I to B to B to I to B to E
329      test_geometry<ls, mpoly>("LINESTRING(0 0,3 3)",
330                               "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(0 0,9 1,9 9,1 9,0 0)),((0 0,2 8,8 8,8 2,0 0),(0 0,7 3,7 7,3 7,0 0)))",
331                               "FF1F00212");
332      // self-IP polygon with a hole and second polygon -> B to I to B to B to I
333      test_geometry<ls, mpoly>("LINESTRING(0 0,3 3)",
334                               "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(0 0,9 1,9 9,1 9,0 0)),((0 0,2 8,8 8,8 2,0 0)))",
335                               "1FF00F212");
336      test_geometry<ls, mpoly>("LINESTRING(0 0,3 3)",
337                               "MULTIPOLYGON(((0 0,2 8,8 8,8 2,0 0)),((0 0,0 10,10 10,10 0,0 0),(0 0,9 1,9 9,1 9,0 0)))",
338                               "1FF00F212");
339  
340      // MySQL report 18.12.2014 (https://svn.boost.org/trac/boost/ticket/10887)
341      test_geometry<ls, mpoly>("LINESTRING(5 -2,5 2)",
342                               "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))",
343                               "10F0FF212");
344      test_geometry<ls, mpoly>("LINESTRING(5 -2,5 5)",
345                               "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))",
346                               "10F00F212");
347      test_geometry<ls, mpoly>("LINESTRING(5 -2,5 0)",
348                               "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))",
349                               "1FF00F212");
350      // MySQL report 18.12.2014 - extended
351      test_geometry<ls, mpoly>("LINESTRING(5 -2,5 0)",
352                               "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)),((5 0,7 1,7 -1,5 0)))",
353                               "1FF00F212");
354      test_geometry<ls, mpoly>("LINESTRING(0 0,5 0)",
355                               "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)),((5 0,7 1,7 -1,5 0)))",
356                               "FF1F00212");
357  
358      // 22.01.2015
359      test_geometry<ls, mpoly>("LINESTRING(5 5,0 0,10 0)",
360                               "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 0,0 -10,-10 -10,-10 0,0 0)))",
361                               "11F00F212");
362      test_geometry<ls, mpoly>("LINESTRING(5 5,0 0,0 10)",
363                               "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 0,0 -10,-10 -10,-10 0,0 0)))",
364                               "11F00F212");
365      // extended
366      test_geometry<ls, mpoly>("LINESTRING(5 5,0 0,2 1)",
367                               "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 0,0 -10,-10 -10,-10 0,0 0)))",
368                               "10F0FF212");
369      test_geometry<ls, mpoly>("LINESTRING(5 5,0 0,5 -5)",
370                               "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 0,0 -10,-10 -10,-10 0,0 0)))",
371                               "1010F0212");
372      test_geometry<ls, mpoly>("LINESTRING(5 5,0 0,5 -5,5 1)",
373                               "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 0,0 -10,-10 -10,-10 0,0 0)))",
374                               "1010FF212");
375      test_geometry<ls, mpoly>("LINESTRING(-5 5,0 0,5 -5)",
376                               "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 0,0 -10,-10 -10,-10 0,0 0)))",
377                               "F01FF0212");
378  }
379  
380  template <typename P>
test_multi_linestring_polygon()381  void test_multi_linestring_polygon()
382  {
383      typedef bg::model::linestring<P> ls;
384      typedef bg::model::multi_linestring<ls> mls;
385      typedef bg::model::polygon<P> poly;
386      typedef typename bg::coordinate_type<P>::type coord_t;
387  
388      test_geometry<mls, poly>("MULTILINESTRING((11 11, 20 20),(5 7, 4 1))",
389                               "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,4 2,4 4,2 4,2 2))",
390                               "1F10F0212");
391      test_geometry<mls, poly>("MULTILINESTRING((10 0, 18 12),(2 2,2 1))",
392                               "POLYGON((5 0,0 -5,-5 0,0 5,5 0))",
393                               "1F10F0212");
394  
395      if ( BOOST_GEOMETRY_CONDITION((
396              boost::is_same<coord_t, double>::value )) )
397      {
398          // assertion failure in 1.57
399          test_geometry<mls, poly>("MULTILINESTRING((-0.59322033898305082 -8.0508474576271194,-2.882352941176471 -7.7647058823529411,-2.8823529411764706 -7.7647058823529411,-3.7361111111111112 -6.5694444444444446,-3.4404145077720205 -5.766839378238342,-4.1864406779661012 -3.6779661016949152,-7.5252525252525251 -5.5858585858585865,-7.5862068965517242 -5.1896551724137936,-4.47887323943662 -2.859154929577465,-4.5789473684210531 -2.5789473684210527,-3 -1,-2.9310344827586206 -0.86206896551724144,-3.1764705882352944 -0.70588235294117663,-4.7401960784313726 -2.1274509803921577,-5.3255813953488369 -0.48837209302325502,-4.7872340425531918 0.31914893617021284,-5.8571428571428577 1.0000000000000007,-5.3255813953488369 -0.48837209302325502,-5.9473684210526319 -1.4210526315789465,-8 2,-7.7333333333333334 2.1939393939393939,-8.8294573643410867 2.891472868217055,-8.8556701030927822 3.061855670103093,-7.5999999999999996 3.6000000000000001,-7.7999999999999998 3.7999999999999998,-7.75 3.7916666666666665,-7.5471698113207548 3.6226415094339623,-7.3200000000000003 3.7200000000000002,-3.473684210526315 3.0789473684210527,-3.2549019607843133 3.2156862745098036,-2.9999999999999982 3.1428571428571423,-3.1733333333333325 3.2666666666666666,-2.9180327868852456 3.4262295081967209,-2.8723404255319145 3.1063829787234041,-2.1111111111111112 2.8888888888888888,-2.1428571428571428 2.8571428571428572,-1.8433734939759043 2.8072289156626509,-1.8396226415094346 2.8113207547169816,-1.6486486486486487 2.756756756756757,-1.76510067114094 2.8926174496644301,-0.53846153846153855 4.2307692307692308,1.8148148148148147 5.4074074074074074,1.588235294117647 2.2352941176470589,1.819672131147541 2.1967213114754101,2 4,2 2.1666666666666665,2.3538461538461544 2.1076923076923078,2 1.6875000000000004,2 -2,1.2173913043478262 -3.8260869565217392,1.7375886524822697 1.3758865248226959,1.5073170731707317 1.1024390243902444,1.1428571428571428 -4,-0.59322033898305082 -8.0508474576271194),(1.666666666666667 1.5999999999999988,1.5675675675675675 1.8378378378378377,1.4374999999999991 1.8750000000000002,1.0487804878048776 2.3414634146341466,0.46666666666666712 2.6060606060606055,0.086956521739131043 2.2608695652173911,1.4374999999999991 1.8750000000000002,1.666666666666667 1.5999999999999988))",
400                                   "POLYGON((-2.333333333333333 -8.6666666666666661,-4.3253012048192767 -8.168674698795181,-4.1194968553459113 -7.6100628930817606,-2.8823529411764706 -7.7647058823529411,-2.882352941176471 -7.7647058823529411,-2.263157894736842 -8.6315789473684212,-2.333333333333333 -8.6666666666666661))",
401                                   "*********");
402          test_geometry<mls, poly>("MULTILINESTRING((-2.333333333333333 -8.6666666666666661,-4.3253012048192767 -8.168674698795181,-4.1194968553459113 -7.6100628930817606,-2.8823529411764706 -7.7647058823529411,-2.882352941176471 -7.7647058823529411,-2.263157894736842 -8.6315789473684212,-2.333333333333333 -8.6666666666666661))",
403                                   "POLYGON((-0.59322033898305082 -8.0508474576271194,-2.882352941176471 -7.7647058823529411,-2.8823529411764706 -7.7647058823529411,-3.7361111111111112 -6.5694444444444446,-3.4404145077720205 -5.766839378238342,-4.1864406779661012 -3.6779661016949152,-7.5252525252525251 -5.5858585858585865,-7.5862068965517242 -5.1896551724137936,-4.47887323943662 -2.859154929577465,-4.5789473684210531 -2.5789473684210527,-3 -1,-2.9310344827586206 -0.86206896551724144,-3.1764705882352944 -0.70588235294117663,-4.7401960784313726 -2.1274509803921577,-5.3255813953488369 -0.48837209302325502,-4.7872340425531918 0.31914893617021284,-5.8571428571428577 1.0000000000000007,-5.3255813953488369 -0.48837209302325502,-5.9473684210526319 -1.4210526315789465,-8 2,-7.7333333333333334 2.1939393939393939,-8.8294573643410867 2.891472868217055,-8.8556701030927822 3.061855670103093,-7.5999999999999996 3.6000000000000001,-7.7999999999999998 3.7999999999999998,-7.75 3.7916666666666665,-7.5471698113207548 3.6226415094339623,-7.3200000000000003 3.7200000000000002,-3.473684210526315 3.0789473684210527,-3.2549019607843133 3.2156862745098036,-2.9999999999999982 3.1428571428571423,-3.1733333333333325 3.2666666666666666,-2.9180327868852456 3.4262295081967209,-2.8723404255319145 3.1063829787234041,-2.1111111111111112 2.8888888888888888,-2.1428571428571428 2.8571428571428572,-1.8433734939759043 2.8072289156626509,-1.8396226415094346 2.8113207547169816,-1.6486486486486487 2.756756756756757,-1.76510067114094 2.8926174496644301,-0.53846153846153855 4.2307692307692308,1.8148148148148147 5.4074074074074074,1.588235294117647 2.2352941176470589,1.819672131147541 2.1967213114754101,2 4,2 2.1666666666666665,2.3538461538461544 2.1076923076923078,2 1.6875000000000004,2 -2,1.2173913043478262 -3.8260869565217392,1.7375886524822697 1.3758865248226959,1.5073170731707317 1.1024390243902444,1.1428571428571428 -4,-0.59322033898305082 -8.0508474576271194),(1.666666666666667 1.5999999999999988,1.5675675675675675 1.8378378378378377,1.4374999999999991 1.8750000000000002,1.0487804878048776 2.3414634146341466,0.46666666666666712 2.6060606060606055,0.086956521739131043 2.2608695652173911,1.4374999999999991 1.8750000000000002,1.666666666666667 1.5999999999999988))",
404                                   "*********");
405      }
406  
407      // 21.01.2015
408      test_geometry<mls, poly>("MULTILINESTRING((6 6,15 15),(0 0, 7 7))",
409                               "POLYGON((5 5,5 15,15 15,15 5,5 5))",
410                               "101000212");
411      test_geometry<mls, poly>("MULTILINESTRING((15 15,6 6),(0 0, 7 7))",
412                               "POLYGON((5 5,5 15,15 15,15 5,5 5))",
413                               "101000212");
414      // extended
415      test_geometry<mls, poly>("MULTILINESTRING((15 15,6 6),(4 14,6 16))",
416                               "POLYGON((5 5,5 15,15 15,15 5,5 5))",
417                               "101000212");
418  
419      // 23.01.2015
420      test_geometry<mls, poly>("MULTILINESTRING((4 10, 3 10, 10 6),(5 0, 7 5, 9 10))",
421                               "POLYGON((0 0,0 10,10 10,10 0,5 5,0 0))",
422                               "111F00212");
423  
424      // 23.01.2015
425      test_geometry<mls, poly>("MULTILINESTRING((3 10, 1 5, 1 10, 3 4, 7 8, 6 10, 10 2))",
426                               "POLYGON((0 0,0 10,10 10,10 0,0 0))",
427                               "10FF0F212");
428  
429      // mysql bug
430      // assertion failure in relate->boundary_checker->std::equal_range with msvc
431      if (BOOST_GEOMETRY_CONDITION(is_nan_case_supported<mls>::value))
432      {
433          mls g1;
434          std::string wkt1;
435          nan_case(g1, wkt1);
436  
437          std::string wkt2 = "POLYGON((1.1e+308 1.2e+308,-1 -9,1 1e+12,1.1e+308 7.8e+307,1.1e+308 1.2e+308),(3 2,1 1,8e+307 1e+308,3 2),(258 2049,1 -3,1 1,-6 9,258 2049))";
438          poly g2;
439          bg::read_wkt(wkt2, g2);
440  
441          check_geometry(g1, g2, wkt1, wkt2, "*********");
442      }
443  }
444  
445  template <typename P>
test_multi_linestring_multi_polygon()446  void test_multi_linestring_multi_polygon()
447  {
448      typedef bg::model::linestring<P> ls;
449      typedef bg::model::polygon<P> poly;
450      typedef bg::model::multi_linestring<ls> mls;
451      typedef bg::model::multi_polygon<poly> mpoly;
452  
453      // polygons with some ring equal to the linestrings
454      test_geometry<mls, mpoly>("MULTILINESTRING((0 0,10 0,10 10,0 10,0 0),(20 20,50 50,20 80,20 20))",
455                                "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)))",
456                                "F11FFF2F2");
457  
458      test_geometry<mls, mpoly>("MULTILINESTRING((0 0,10 0,10 10,0 10,0 0),(2 2,5 5,2 8,2 2))",
459                                "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(2 2,5 5,2 8,2 2)))",
460                                "F1FFFF2F2");
461  
462  
463      test_geometry<mls, mpoly>("MULTILINESTRING((0 0,10 0,10 10),(10 10,0 10,0 0))",
464                                "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)))",
465                                "F1FFFF2F2");
466      test_geometry<mls, mpoly>("MULTILINESTRING((0 0,10 0,10 10),(10 10,0 10,0 0),(20 20,50 50,20 80,20 20))",
467                                "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)))",
468                                "F11FFF2F2");
469  
470      // disjoint
471      test_geometry<mls, mpoly>("MULTILINESTRING((20 20,30 30),(30 30,40 40))",
472                                "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)))",
473                                "FF1FF0212");
474  
475      test_geometry<mls, mpoly>("MULTILINESTRING((5 5,0 5),(5 5,5 0),(10 10,10 5,5 5,5 10,10 10))",
476                                "MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5)),((5 5,10 1,10 0,5 5)))",
477                                "F1FF0F212");
478      test_geometry<mls, mpoly>("MULTILINESTRING((5 5,0 5),(5 5,5 0),(0 5,0 0,5 0),(10 10,10 5,5 5,5 10,10 10))",
479                                "MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5)),((5 5,10 1,10 0,5 5)))",
480                                "F1FFFF212");
481      test_geometry<mls, mpoly>("MULTILINESTRING((5 5,0 0),(5 5,5 0),(10 10,10 5,5 5,5 10,10 10))",
482                                "MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5)),((5 5,10 1,10 0,5 5)))",
483                                "11FF0F212");
484  
485      // MySQL report 18.12.2014 - extended
486      test_geometry<mls, mpoly>("MULTILINESTRING((5 -2,4 -2,5 0),(5 -2,6 -2,5 0))",
487                                "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))",
488                                "10FFFF212");
489      test_geometry<mls, mpoly>("MULTILINESTRING((0 0,0 1,5 0),(0 0,0 -1,5 0))",
490                                "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))",
491                                "F01FFF212");
492      test_geometry<mls, mpoly>("MULTILINESTRING((5 -2,4 -2,5 0),(6 -2,5 0))",
493                                "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))",
494                                "10F0FF212");
495      test_geometry<mls, mpoly>("MULTILINESTRING((0 0,0 1,5 0),(0 -1,5 0))",
496                                "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))",
497                                "F01FF0212");
498      test_geometry<mls, mpoly>("MULTILINESTRING((0 0,5 0),(5 -2,5 0))",
499                                "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))",
500                                "1010F0212");
501      test_geometry<mls, mpoly>("MULTILINESTRING((5 -2,5 0),(0 0,5 0))",
502                                "MULTIPOLYGON(((5 0,0 5,10 5,5 0)),((5 0,10 -5,0 -5,5 0)))",
503                                "1010F0212");
504  
505      // 22.01.2015 - extended
506      test_geometry<mls, mpoly>("MULTILINESTRING((10 10,0 10),(5 5,0 0,10 0))",
507                                "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 0,0 -10,-10 -10,-10 0,0 0)))",
508                                "11F00F212");
509      test_geometry<mls, mpoly>("MULTILINESTRING((5 5,0 0,5 -5),(0 0,9 1))",
510                                "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 0,0 -10,-10 -10,-10 0,0 0)))",
511                                "101000212");
512      test_geometry<mls, mpoly>("MULTILINESTRING((5 -5,0 0,5 5),(0 0,5 -1))",
513                                "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 0,0 -10,-10 -10,-10 0,0 0)))",
514                                "101000212");
515  }
516  
517  template <typename P>
test_all()518  void test_all()
519  {
520      test_linestring_polygon<P>();
521      test_linestring_multi_polygon<P>();
522      test_multi_linestring_polygon<P>();
523      test_multi_linestring_multi_polygon<P>();
524  }
525  
test_main(int,char * [])526  int test_main( int , char* [] )
527  {
528      test_all<bg::model::d2::point_xy<int> >();
529      test_all<bg::model::d2::point_xy<double> >();
530  
531  #if defined(HAVE_TTMATH)
532      test_all<bg::model::d2::point_xy<ttmath_big> >();
533  #endif
534  
535      return 0;
536  }
537