• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 
3 // Copyright (c) 2014-2015, Oracle and/or its affiliates.
4 
5 // Licensed under the Boost Software License version 1.0.
6 // http://www.boost.org/users/license.html
7 
8 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
9 
10 #include <iostream>
11 
12 #ifndef BOOST_TEST_MODULE
13 #define BOOST_TEST_MODULE test_union_linear_linear
14 #endif
15 
16 #ifdef BOOST_GEOMETRY_TEST_DEBUG
17 #define BOOST_GEOMETRY_DEBUG_TURNS
18 #define BOOST_GEOMETRY_DEBUG_SEGMENT_IDENTIFIER
19 #endif
20 
21 #include <boost/test/included/unit_test.hpp>
22 
23 #include "test_union_linear_linear.hpp"
24 
25 #include <boost/geometry/geometries/linestring.hpp>
26 #include <boost/geometry/geometries/multi_linestring.hpp>
27 #include <boost/geometry/algorithms/union.hpp>
28 
29 typedef bg::model::point<double,2,bg::cs::cartesian>  point_type;
30 typedef bg::model::segment<point_type>                segment_type;
31 typedef bg::model::linestring<point_type>             linestring_type;
32 typedef bg::model::multi_linestring<linestring_type>  multi_linestring_type;
33 
34 
35 
36 //===========================================================================
37 //===========================================================================
38 //===========================================================================
39 
40 
BOOST_AUTO_TEST_CASE(test_union_linestring_linestring)41 BOOST_AUTO_TEST_CASE( test_union_linestring_linestring )
42 {
43 #ifdef BOOST_GEOMETRY_TEST_DEBUG
44     std::cout << std::endl << std::endl << std::endl;
45     std::cout << "*** LINESTRING / LINESTRING UNION ***" << std::endl;
46     std::cout << std::endl;
47 #endif
48 
49     typedef linestring_type L;
50     typedef multi_linestring_type ML;
51 
52     typedef test_union_of_geometries<L, L, ML> tester;
53 
54     tester::apply
55         (from_wkt<L>("LINESTRING(0 0,1 1,2 1,3 2)"),
56          from_wkt<L>("LINESTRING(0 2,1 1,2 1,3 0)"),
57          from_wkt<ML>("MULTILINESTRING((0 0,1 1,2 1,3 2),\
58                       (0 2,1 1),(2 1,3 0))"),
59          from_wkt<ML>("MULTILINESTRING((0 2,1 1,2 1,3 0),\
60                       (0 0,1 1),(2 1,3 2))"),
61          "llu00");
62 
63     tester::apply
64         (from_wkt<L>("LINESTRING(0 0,5 0)"),
65          from_wkt<L>("LINESTRING(3 0,4 0)"),
66          from_wkt<ML>("MULTILINESTRING((0 0,5 0))"),
67          from_wkt<ML>("MULTILINESTRING((3 0,4 0),(0 0,3 0),(4 0,5 0))"),
68          "llu01");
69 
70     tester::apply
71         (from_wkt<L>("LINESTRING(3 0,4 0)"),
72          from_wkt<L>("LINESTRING(0 0,5 0)"),
73          from_wkt<ML>("MULTILINESTRING((3 0,4 0),(0 0,3 0),(4 0,5 0))"),
74          from_wkt<ML>("MULTILINESTRING((0 0,5 0))"),
75          "llu01-1");
76 
77     tester::apply
78         (from_wkt<L>("LINESTRING(0 0,4 0)"),
79          from_wkt<L>("LINESTRING(3 0,6 0)"),
80          from_wkt<ML>("MULTILINESTRING((0 0,4 0),(4 0,6 0))"),
81          from_wkt<ML>("MULTILINESTRING((3 0,6 0),(0 0,3 0))"),
82          "llu01-2");
83 
84     tester::apply
85         (from_wkt<L>("LINESTRING(3 0,6 0)"),
86          from_wkt<L>("LINESTRING(0 0,4 0)"),
87          from_wkt<ML>("MULTILINESTRING((3 0,6 0),(0 0,3 0))"),
88          from_wkt<ML>("MULTILINESTRING((0 0,4 0),(4 0,6 0))"),
89          "llu01-3");
90 
91     tester::apply
92         (from_wkt<L>("LINESTRING(0 0,6 0)"),
93          from_wkt<L>("LINESTRING(0 0,4 0)"),
94          from_wkt<ML>("MULTILINESTRING((0 0,6 0))"),
95          from_wkt<ML>("MULTILINESTRING((0 0,4 0),(4 0,6 0))"),
96          "llu01-4");
97 
98     tester::apply
99         (from_wkt<L>("LINESTRING(0 0,20 0)"),
100          from_wkt<L>("LINESTRING(0 0,1 1,2 0,3 1,4 0,5 0,6 1,7 -1,8 0)"),
101          from_wkt<ML>("MULTILINESTRING((0 0,20 0),\
102                       (0 0,1 1,2 0,3 1,4 0),\
103                       (5 0,6 1,7 -1,8 0))"),
104          from_wkt<ML>("MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 0,6 1,7 -1,8 0),\
105                       (0 0,4 0),(5 0,20 0))"),
106          "llu01-6");
107 
108     tester::apply
109         (from_wkt<L>("LINESTRING(-20 0,20 0)"),
110          from_wkt<L>("LINESTRING(0 0,1 1,2 0,3 1,4 0,5 0,6 1,7 -1,8 0)"),
111          from_wkt<ML>("MULTILINESTRING((-20 0,20 0),\
112                       (0 0,1 1,2 0,3 1,4 0),\
113                       (5 0,6 1,7 -1,8 0))"),
114          from_wkt<ML>("MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 0,6 1,7 -1,8 0),\
115                       (-20 0,4 0),(5 0,20 0))"),
116          "llu01-7");
117 
118     tester::apply
119         (from_wkt<L>("LINESTRING(0 0,4 0)"),
120          from_wkt<L>("LINESTRING(2 0,4 0)"),
121          from_wkt<ML>("MULTILINESTRING((0 0,4 0))"),
122          from_wkt<ML>("MULTILINESTRING((2 0,4 0),(0 0,2 0))"),
123          "llu01-8");
124 
125     tester::apply
126         (from_wkt<L>("LINESTRING(0 0,2 0)"),
127          from_wkt<L>("LINESTRING(4 0,5 0)"),
128          from_wkt<ML>("MULTILINESTRING((0 0,2 0),(4 0,5 0))"),
129          "llu01-10");
130 
131     tester::apply
132         (from_wkt<L>("LINESTRING(0 0,2 0)"),
133          from_wkt<L>("LINESTRING(2 0,5 0)"),
134          from_wkt<ML>("MULTILINESTRING((0 0,2 0),(2 0,5 0))"),
135          "llu01-11");
136 
137     tester::apply
138         (from_wkt<L>("LINESTRING(0 0,1 0,4 0)"),
139          from_wkt<L>("LINESTRING(3 0,5 0)"),
140          from_wkt<ML>("MULTILINESTRING((0 0,1 0,4 0),(4 0,5 0))"),
141          from_wkt<ML>("MULTILINESTRING((3 0,5 0),(0 0,1 0,3 0))"),
142          "llu01-11a");
143 
144     tester::apply
145         (from_wkt<L>("LINESTRING(0 0,1 0,4 0)"),
146          from_wkt<L>("LINESTRING(3 0,4 0,5 0)"),
147          from_wkt<ML>("MULTILINESTRING((0 0,1 0,4 0),(4 0,5 0))"),
148          from_wkt<ML>("MULTILINESTRING((3 0,4 0,5 0),(0 0,1 0,3 0))"),
149          "llu01-11b");
150 
151     tester::apply
152         (from_wkt<L>("LINESTRING(0 0,6 0)"),
153          from_wkt<L>("LINESTRING(2 0,4 0,5 0)"),
154          from_wkt<ML>("MULTILINESTRING((0 0,6 0))"),
155          from_wkt<ML>("MULTILINESTRING((2 0,4 0,5 0),(0 0,2 0),(5 0,6 0))"),
156          "llu01-12");
157 
158     tester::apply
159         (from_wkt<L>("LINESTRING(0 0,1 0,5 5,10 5,15 0)"),
160          from_wkt<L>("LINESTRING(-1 6,0 5,15 5)"),
161          from_wkt<ML>("MULTILINESTRING((0 0,1 0,5 5,10 5,15 0),\
162                       (-1 6,0 5,5 5),(10 5,15 5))"),
163          from_wkt<ML>("MULTILINESTRING((-1 6,0 5,15 5),\
164                       (0 0,1 0,5 5),(10 5,15 0))"),
165          "llu02");
166 
167     tester::apply
168         (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0)"),
169          from_wkt<L>("LINESTRING(-1 0,30 0)"),
170          from_wkt<ML>("MULTILINESTRING((-1 1,0 0,1 0,5 5,10 5,15 0,20 0),\
171                       (-1 0,0 0),(1 0,15 0),(20 0,30 0))"),
172          from_wkt<ML>("MULTILINESTRING((-1 0,30 0),(-1 1,0 0),\
173                       (1 0,5 5,10 5,15 0))"),
174          "llu03");
175 
176     tester::apply
177         (from_wkt<L>("LINESTRING(0 0,1 0,5 5,10 5,15 0,20 0)"),
178          from_wkt<L>("LINESTRING(-1 0,30 0)"),
179          from_wkt<ML>("MULTILINESTRING((0 0,1 0,5 5,10 5,15 0,20 0),\
180                       (-1 0,0 0),(1 0,15 0),(20 0,30 0))"),
181          from_wkt<ML>("MULTILINESTRING((-1 0,30 0),(1 0,5 5,10 5,15 0))"),
182          "llu04");
183 
184     tester::apply
185         (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,25 1)"),
186          from_wkt<L>("LINESTRING(-1 0,30 0)"),
187          from_wkt<ML>("MULTILINESTRING((-1 1,0 0,1 0,5 5,10 5,15 0,20 0,25 1),\
188                       (-1 0,0 0),(1 0,15 0),(20 0,30 0))"),
189          from_wkt<ML>("MULTILINESTRING((-1 0,30 0),(-1 1,0 0),\
190                       (1 0,5 5,10 5,15 0),(20 0,25 1))"),
191          "llu05");
192 
193     tester::apply
194         (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,30 0)"),
195          from_wkt<L>("LINESTRING(-1 0,30 0)"),
196          from_wkt<ML>("MULTILINESTRING((-1 1,0 0,1 0,5 5,10 5,15 0,20 0,30 0),\
197                       (-1 0,0 0),(1 0,15 0))"),
198          from_wkt<ML>("MULTILINESTRING((-1 0,30 0),(-1 1,0 0),\
199                       (1 0,5 5,10 5,15 0))"),
200          "llu05-1");
201 
202     tester::apply
203         (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,31 0)"),
204          from_wkt<L>("LINESTRING(-1 0,30 0)"),
205          from_wkt<ML>("MULTILINESTRING((-1 1,0 0,1 0,5 5,10 5,15 0,20 0,31 0),\
206                       (-1 0,0 0),(1 0,15 0))"),
207          from_wkt<ML>("MULTILINESTRING((-1 0,30 0),(-1 1,0 0),\
208                       (1 0,5 5,10 5,15 0),(30 0,31 0))"),
209          "llu06");
210 
211     tester::apply
212         (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,31 0)"),
213          from_wkt<L>("LINESTRING(-1 0,25 0,30 0)"),
214          from_wkt<ML>("MULTILINESTRING((-1 1,0 0,1 0,5 5,10 5,15 0,20 0,31 0),\
215                       (-1 0,0 0),(1 0,15 0))"),
216          from_wkt<ML>("MULTILINESTRING((-1 0,25 0,30 0),(-1 1,0 0),\
217                       (1 0,5 5,10 5,15 0),(30 0,31 0))"),
218          "llu07");
219 
220     tester::apply
221         (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,31 0)"),
222          from_wkt<L>("LINESTRING(-1 0,19 0,30 0)"),
223          from_wkt<ML>("MULTILINESTRING((-1 1,0 0,1 0,5 5,10 5,15 0,20 0,31 0),\
224                       (-1 0,0 0),(1 0,15 0))"),
225          from_wkt<ML>("MULTILINESTRING((-1 0,19 0,30 0),(-1 1,0 0),\
226                       (1 0,5 5,10 5,15 0),(30 0,31 0))"),
227          "llu08");
228 
229     tester::apply
230         (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,30 0,31 1)"),
231          from_wkt<L>("LINESTRING(-1 0,30 0)"),
232          from_wkt<ML>("MULTILINESTRING((-1 1,0 0,1 0,5 5,10 5,15 0,20 0,\
233                       30 0,31 1),(-1 0,0 0),(1 0,15 0))"),
234          from_wkt<ML>("MULTILINESTRING((-1 0,30 0),(-1 1,0 0),\
235                       (1 0,5 5,10 5,15 0),(30 0,31 1))"),
236          "llu09");
237 
238     tester::apply
239         (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,30 0,31 1)"),
240          from_wkt<L>("LINESTRING(-1 -1,0 0,1 0,2 1,3 0,30 0)"),
241          from_wkt<ML>("MULTILINESTRING((-1 1,0 0,1 0,5 5,10 5,15 0,20 0,\
242                       30 0,31 1),(-1 -1,0 0),(1 0,2 1,3 0,15 0))"),
243          from_wkt<ML>("MULTILINESTRING((-1 -1,0 0,1 0,2 1,3 0,30 0),\
244                       (-1 1,0 0),(1 0,5 5,10 5,15 0),(30 0,31 1))"),
245          "llu10");
246 
247     tester::apply
248         (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,4 0,5 5,10 5,15 0,20 0,\
249                                  30 0,31 1)"),
250          from_wkt<L>("LINESTRING(-1 -1,0 0,1 0,2 0,2.5 1,3 0,30 0)"),
251          from_wkt<ML>("MULTILINESTRING((-1 1,0 0,1 0,4 0,5 5,10 5,15 0,20 0,\
252                       30 0,31 1),(-1 -1,0 0),(2 0,2.5 1,3 0),(4 0,15 0))"),
253          from_wkt<ML>("MULTILINESTRING((-1 -1,0 0,1 0,2 0,2.5 1,3 0,30 0),\
254                       (-1 1,0 0),(2 0,3 0),(4 0,5 5,10 5,15 0),(30 0,31 1))"),
255          "llu11");
256 
257     tester::apply
258         (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,4 0,5 5,10 5,15 0,31 0)"),
259          from_wkt<L>("LINESTRING(-1 -1,0 0,1 0,2 0,2.5 1,3 0,30 0)"),
260          from_wkt<ML>("MULTILINESTRING((-1 1,0 0,1 0,4 0,5 5,10 5,15 0,31 0),\
261                       (-1 -1,0 0),(2 0,2.5 1,3 0),(4 0,15 0))"),
262          from_wkt<ML>("MULTILINESTRING((-1 -1,0 0,1 0,2 0,2.5 1,3 0,30 0),\
263                       (-1 1,0 0),(2 0,3 0),(4 0,5 5,10 5,15 0),(30 0,31 0))"),
264          "llu11-1");
265 
266     tester::apply
267         (from_wkt<L>("LINESTRING(0 0,2 0,3 1)"),
268          from_wkt<L>("LINESTRING(0 0,2 0,3 1)"),
269          from_wkt<ML>("MULTILINESTRING((0 0,2 0,3 1))"),
270          "llu12");
271 
272     tester::apply
273         (from_wkt<L>("LINESTRING(0 0,2 0,3 1)"),
274          from_wkt<L>("LINESTRING(3 1,2 0,0 0)"),
275          from_wkt<ML>("MULTILINESTRING((0 0,2 0,3 1))"),
276          from_wkt<ML>("MULTILINESTRING((3 1,2 0,0 0))"),
277          "llu12-1");
278 
279    tester::apply
280         (from_wkt<L>("LINESTRING(0 0,1 0,2 1,3 5,4 0)"),
281          from_wkt<L>("LINESTRING(1 0,2 1,3 5,4 0,5 10)"),
282          from_wkt<ML>("MULTILINESTRING((0 0,1 0,2 1,3 5,4 0),(4 0,5 10))"),
283          from_wkt<ML>("MULTILINESTRING((1 0,2 1,3 5,4 0,5 10),(0 0,1 0))"),
284          "llu13");
285 
286    tester::apply
287         (from_wkt<L>("LINESTRING(0 0,1 0,2 0,2.5 0,3 1)"),
288          from_wkt<L>("LINESTRING(0 0,2 0,2.5 0,3 1)"),
289          from_wkt<ML>("MULTILINESTRING((0 0,1 0,2 0,2.5 0,3 1))"),
290          from_wkt<ML>("MULTILINESTRING((0 0,2 0,2.5 0,3 1))"),
291          "llu14");
292 
293     tester::apply
294         (from_wkt<L>("LINESTRING(0 0,1 0,2 1,3 5,4 0)"),
295          from_wkt<L>("LINESTRING(1 0,2 1,3 5)"),
296          from_wkt<ML>("MULTILINESTRING((0 0,1 0,2 1,3 5,4 0))"),
297          from_wkt<ML>("MULTILINESTRING((1 0,2 1,3 5),(0 0,1 0),(3 5,4 0))"),
298          "llu15");
299 
300     tester::apply
301         (from_wkt<L>("LINESTRING(0 0,1 0,2 1,3 2)"),
302          from_wkt<L>("LINESTRING(0.5 0,1 0,3 2,4 5)"),
303          from_wkt<ML>("MULTILINESTRING((0 0,1 0,2 1,3 2),(3 2,4 5))"),
304          from_wkt<ML>("MULTILINESTRING((0.5 0,1 0,3 2,4 5),(0 0,0.5 0))"),
305          "llu16");
306 
307     tester::apply
308         (from_wkt<L>("LINESTRING(0 0,1 0,2 1,3 2)"),
309          from_wkt<L>("LINESTRING(4 5,3 2,1 0,0.5 0)"),
310          from_wkt<ML>("MULTILINESTRING((0 0,1 0,2 1,3 2),(4 5,3 2))"),
311          from_wkt<ML>("MULTILINESTRING((4 5,3 2,1 0,0.5 0),(0 0,0.5 0))"),
312          "llu16-r");
313 
314     tester::apply
315         (from_wkt<L>("LINESTRING(0 0,10 0,20 1,30 1)"),
316          from_wkt<L>("LINESTRING(1 1,2 0,3 1,20 1,25 1)"),
317          from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1,30 1),(1 1,2 0,3 1,20 1))"),
318          from_wkt<ML>("MULTILINESTRING((1 1,2 0,3 1,20 1,25 1),\
319                       (0 0,10 0,20 1),(25 1,30 1))"),
320          "llu17");
321 
322     tester::apply
323         (from_wkt<L>("LINESTRING(0 0,10 0,20 1,21 0,30 0)"),
324          from_wkt<L>("LINESTRING(1 1,2 0,3 1,20 1,25 0)"),
325          from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1,21 0,30 0),\
326                        (1 1,2 0,3 1,20 1,25 0))"),
327          "llu18");
328 
329     tester::apply
330         (from_wkt<L>("LINESTRING(0 0,30 0)"),
331          from_wkt<L>("LINESTRING(1 0,5 0,20 1,4 1,4 0,5 1)"),
332          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(5 0,20 1,4 1,4 0,5 1))"),
333          from_wkt<ML>("MULTILINESTRING((1 0,5 0,20 1,4 1,4 0,5 1),\
334                       (0 0,1 0),(5 0,30 0))"),
335          "llu19");
336 
337     tester::apply
338         (from_wkt<L>("LINESTRING(0 0,30 0)"),
339          from_wkt<L>("LINESTRING(5 1,4 0,4 1,20 1,5 0,1 0)"),
340          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(5 1,4 0,4 1,20 1,5 0))"),
341          from_wkt<ML>("MULTILINESTRING((5 1,4 0,4 1,20 1,5 0,1 0),\
342                       (0 0,1 0),(5 0,30 0))"),
343          "llu19-r");
344 
345     tester::apply
346         (from_wkt<L>("LINESTRING(0 0,30 0)"),
347          from_wkt<L>("LINESTRING(1 0,5 0,20 1,4 1,4 0)"),
348          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(5 0,20 1,4 1,4 0))"),
349          from_wkt<ML>("MULTILINESTRING((1 0,5 0,20 1,4 1,4 0),(0 0,1 0),\
350                       (5 0,30 0))"),
351          "llu19a");
352 
353     tester::apply
354         (from_wkt<L>("LINESTRING(0 0,30 0)"),
355          from_wkt<L>("LINESTRING(4 0,4 1,20 1,5 0,1 0)"),
356          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(4 0,4 1,20 1,5 0))"),
357          from_wkt<ML>("MULTILINESTRING((4 0,4 1,20 1,5 0,1 0),(0 0,1 0),\
358                       (5 0,30 0))"),
359          "llu19a-r");
360 
361     tester::apply
362         (from_wkt<L>("LINESTRING(0 0,30 0)"),
363          from_wkt<L>("LINESTRING(1 0,5 0,20 1,4 1,4 0,5 0)"),
364          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(5 0,20 1,4 1,4 0))"),
365          from_wkt<ML>("MULTILINESTRING((1 0,5 0,20 1,4 1,4 0,5 0),\
366                       (0 0,1 0),(5 0,30 0))"),
367          "llu19b");
368 
369     tester::apply
370         (from_wkt<L>("LINESTRING(0 0,30 0)"),
371          from_wkt<L>("LINESTRING(1 0,5 0,20 1,4 1,4 0,5 0,6 1)"),
372          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(5 0,20 1,4 1,4 0),(5 0,6 1))"),
373          from_wkt<ML>("MULTILINESTRING((1 0,5 0,20 1,4 1,4 0,5 0,6 1),\
374                       (0 0,1 0),(5 0,30 0))"),
375          "llu19c");
376 
377     tester::apply
378         (from_wkt<L>("LINESTRING(0 0,30 0)"),
379          from_wkt<L>("LINESTRING(1 0,5 0,20 1,4 1,4 0,3 0)"),
380          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(5 0,20 1,4 1,4 0))"),
381          from_wkt<ML>("MULTILINESTRING((1 0,5 0,20 1,4 1,4 0,3 0),\
382                       (0 0,1 0),(5 0,30 0))"),
383          "llu19d");
384 
385     tester::apply
386         (from_wkt<L>("LINESTRING(0 0,30 0)"),
387          from_wkt<L>("LINESTRING(1 0,5 0,20 1,4 1,4 0,3 0,3 1)"),
388          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(5 0,20 1,4 1,4 0),(3 0,3 1))"),
389          from_wkt<ML>("MULTILINESTRING((1 0,5 0,20 1,4 1,4 0,3 0,3 1),\
390                       (0 0,1 0),(5 0,30 0))"),
391          "llu19e");
392 
393     tester::apply
394         (from_wkt<L>("LINESTRING(0 0,30 0)"),
395          from_wkt<L>("LINESTRING(1 0,5 0,20 1,4 1,4 0,5 0,5 1)"),
396          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(5 0,20 1,4 1,4 0),(5 0,5 1))"),
397          from_wkt<ML>("MULTILINESTRING((1 0,5 0,20 1,4 1,4 0,5 0,5 1),\
398                       (0 0,1 0),(5 0,30 0))"),
399          "llu19f");
400 
401     tester::apply
402         (from_wkt<L>("LINESTRING(0 0,30 0)"),
403          from_wkt<L>("LINESTRING(5 1,5 0,4 0,4 1,20 1,5 0,1 0)"),
404          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(5 1,5 0),\
405                       (4 0,4 1,20 1,5 0))"),
406          from_wkt<ML>("MULTILINESTRING((5 1,5 0,4 0,4 1,20 1,5 0,1 0),\
407                       (0 0,1 0),(5 0,30 0))"),
408          "llu19f-r");
409 
410     tester::apply
411         (from_wkt<L>("LINESTRING(0 0,30 0)"),
412          from_wkt<L>("LINESTRING(1 0,5 0,20 1,4 1,5 0,5 1)"),
413          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(5 0,20 1,4 1,5 0,5 1))"),
414          from_wkt<ML>("MULTILINESTRING((1 0,5 0,20 1,4 1,5 0,5 1),\
415                       (0 0,1 0),(5 0,30 0))"),
416          "llu19g");
417 
418     tester::apply
419         (from_wkt<L>("LINESTRING(0 0,30 0)"),
420          from_wkt<L>("LINESTRING(5 1,5 0,4 1,20 1,5 0,1 0)"),
421          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(5 1,5 0,4 1,20 1,5 0))"),
422          from_wkt<ML>("MULTILINESTRING((5 1,5 0,4 1,20 1,5 0,1 0),\
423                       (0 0,1 0),(5 0,30 0))"),
424          "llu19g-r");
425 
426     tester::apply
427         (from_wkt<L>("LINESTRING(0 0,30 0,30 30,10 30,10 -10,15 0,40 0)"),
428          from_wkt<L>("LINESTRING(5 5,10 0,10 30,20 0,25 0,25 25,50 0,35 0)"),
429          from_wkt<ML>("MULTILINESTRING((0 0,30 0,30 30,10 30,10 -10,15 0,40 0),\
430                       (5 5,10 0),(10 30,20 0),(25 0,25 25,50 0,40 0))"),
431          from_wkt<ML>("MULTILINESTRING((5 5,10 0,10 30,20 0,25 0,25 25,50 0,35 0),\
432                       (0 0,20 0),(25 0,30 0,30 30,10 30),\
433                       (10 0,10 -10,15 0,20 0),(25 0,35 0))"),
434          "llu20");
435 
436     tester::apply
437         (from_wkt<L>("LINESTRING(0 0,30 0,30 30,10 30,10 -10,15 0,40 0)"),
438          from_wkt<L>("LINESTRING(5 5,10 0,10 30,20 0,25 0,25 25,50 0,15 0)"),
439          from_wkt<ML>("MULTILINESTRING((0 0,30 0,30 30,10 30,10 -10,15 0,40 0),\
440                       (5 5,10 0),(10 30,20 0),(25 0,25 25,50 0,40 0))"),
441          from_wkt<ML>("MULTILINESTRING((5 5,10 0,10 30,20 0,25 0,25 25,50 0,15 0),\
442                       (0 0,15 0),(30 0,30 30,10 30),(10 0,10 -10,15 0))"),
443          "llu20a");
444 
445     tester::apply
446         (from_wkt<L>("LINESTRING(0 0,18 0,19 0,30 0)"),
447          from_wkt<L>("LINESTRING(2 2,5 -1,15 2,18 0,20 0)"),
448          from_wkt<ML>("MULTILINESTRING((0 0,18 0,19 0,30 0),\
449                       (2 2,5 -1,15 2,18 0))"),
450          from_wkt<ML>("MULTILINESTRING((2 2,5 -1,15 2,18 0,20 0),\
451                       (0 0,18 0),(20 0,30 0))"),
452          "llu21"
453          );
454 
455     tester::apply
456         (from_wkt<L>("LINESTRING(2 2,5 -1,15 2,18 0,20 0)"),
457          from_wkt<L>("LINESTRING(0 0,18 0,19 0,30 0)"),
458          from_wkt<ML>("MULTILINESTRING((2 2,5 -1,15 2,18 0,20 0),\
459                       (0 0,18 0),(20 0,30 0))"),
460          from_wkt<ML>("MULTILINESTRING((0 0,18 0,19 0,30 0),\
461                       (2 2,5 -1,15 2,18 0))"),
462          "llu21a"
463          );
464 
465     tester::apply
466         (from_wkt<L>("LINESTRING(-2 -2,-4 0,1 -8,-2 6,8 5,-7 -8,3 0,\
467                      4 -1,-7 10,-4 10)"),
468          from_wkt<L>("LINESTRING(-5 -4,3 0,4 -1,7 -4,2 -1,-4 -1,-2 6)"),
469          from_wkt<ML>("MULTILINESTRING((-2 -2,-4 0,1 -8,-2 6,8 5,-7 -8,3 0,\
470                      4 -1,-7 10,-4 10),(-5 -4,3 0),\
471                      (4 -1,7 -4,2 -1,-4 -1,-2 6))"),
472          from_wkt<ML>("MULTILINESTRING((-5 -4,3 0,4 -1,7 -4,2 -1,-4 -1,-2 6),\
473                       (-2 -2,-4 0,1 -8,-2 6,8 5,-7 -8,3 0),\
474                       (3 0,-7 10,-4 10))"),
475          "llu22"
476          );
477 }
478 
479 
480 
BOOST_AUTO_TEST_CASE(test_union_linestring_multilinestring)481 BOOST_AUTO_TEST_CASE( test_union_linestring_multilinestring )
482 {
483 #ifdef BOOST_GEOMETRY_TEST_DEBUG
484     std::cout << std::endl << std::endl << std::endl;
485     std::cout << "*** LINESTRING / MULTILINESTRING UNION ***"
486               << std::endl;
487     std::cout << std::endl;
488 #endif
489 
490     typedef linestring_type L;
491     typedef multi_linestring_type ML;
492 
493     typedef test_union_of_geometries<L, ML, ML> tester;
494 
495     // disjoint linestrings
496     tester::apply
497         (from_wkt<L>("LINESTRING(0 0,10 0,20 1)"),
498          from_wkt<ML>("MULTILINESTRING((1 1,2 2,4 3),(1 1,2 2,5 3))"),
499          from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 1,2 2,4 3),\
500                       (1 1,2 2,5 3))"),
501          "lmlu01"
502         );
503 
504     tester::apply
505         (from_wkt<L>("LINESTRING(0 0,10 0,20 1)"),
506          from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,4 0))"),
507          from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 1,2 0),(1 1,3 0))"),
508          "lmlu02"
509         );
510 
511     tester::apply
512         (from_wkt<L>("LINESTRING(0 0,10 0,20 1)"),
513          from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,5 0))"),
514          from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 1,2 0),(1 1,3 0))"),
515          "lmlu03"
516         );
517 
518     tester::apply
519         (from_wkt<L>("LINESTRING(0 0,10 0,20 1)"),
520          from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0))"),
521          from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 1,2 0))"),
522          "lmlu04"
523         );
524 
525     tester::apply
526         (from_wkt<L>("LINESTRING(0 0,101 0)"),
527          from_wkt<ML>("MULTILINESTRING((-1 -1,1 0,101 0,200 -1))"),
528          from_wkt<ML>("MULTILINESTRING((0 0,101 0),(-1 -1,1 0),(101 0,200 -1))"),
529          "lmlu07"
530         );
531 
532     tester::apply
533         (from_wkt<L>("LINESTRING(-1 1,0 0,101 0)"),
534          from_wkt<ML>("MULTILINESTRING((-1 -1,0 0,50 0),\
535                       (19 -1,20 0,101 0,200 -1))"),
536          from_wkt<ML>("MULTILINESTRING((-1 1,0 0,101 0),(-1 -1,0 0),\
537                       (19 -1,20 0),(101 0,200 -1))"),
538          "lmlu07a"
539         );
540 
541     tester::apply
542         (from_wkt<L>("LINESTRING(0 0,101 0)"),
543          from_wkt<ML>("MULTILINESTRING((-1 -1,0 0,50 0),\
544                       (19 -1,20 0,101 0,200 -1))"),
545          from_wkt<ML>("MULTILINESTRING((0 0,101 0),(-1 -1,0 0),\
546                       (19 -1,20 0),(101 0,200 -1))"),
547          "lmlu07b"
548         );
549 
550     tester::apply
551         (from_wkt<L>("LINESTRING(0 0,101 0)"),
552          from_wkt<ML>("MULTILINESTRING((0 1,1 1,2 0),\
553                       (-1 -1,1 0,101 0,200 -1))"),
554          from_wkt<ML>("MULTILINESTRING((0 0,101 0),(0 1,1 1,2 0),\
555                       (-1 -1,1 0),(101 0,200 -1))"),
556          "lmlu08"
557         );
558 
559     tester::apply
560         (from_wkt<L>("LINESTRING(0 0,1 0,2 0.5,3 0,101 0)"),
561          from_wkt<ML>("MULTILINESTRING((0 1,1 1,2 0.5),\
562                        (-1 -1,1 0,101 0,200 -1))"),
563          from_wkt<ML>("MULTILINESTRING((0 0,1 0,2 0.5,3 0,101 0),\
564                       (0 1,1 1,2 0.5),(-1 -1,1 0,3 0),(101 0,200 -1))"),
565          "lmlu09"
566         );
567 
568     tester::apply
569         (from_wkt<L>("LINESTRING(0 0,1 0,1.5 0,2 0.5,3 0,101 0)"),
570          from_wkt<ML>("MULTILINESTRING((0 1,1 1,1 0,2 0.5),\
571                       (-1 -1,1 0,101 0,200 -1))"),
572          from_wkt<ML>("MULTILINESTRING((0 0,1 0,1.5 0,2 0.5,3 0,101 0),\
573                       (0 1,1 1,1 0,2 0.5),(-1 -1,1 0),(1.5 0,3 0),\
574                       (101 0,200 -1))"),
575          "lmlu10"
576         );
577 
578     tester::apply
579         (from_wkt<L>("LINESTRING(0 0,20 0)"),
580          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
581                       (1 1,2 0,18 0,19 1),(2 1,3 0,17 0,18 1),\
582                       (3 1,4 0,16 0,17 1))"),
583          from_wkt<ML>("MULTILINESTRING((0 0,20 0),(0 1,1 0),(19 0,20 1),\
584                       (1 1,2 0),(18 0,19 1),(2 1,3 0),(17 0,18 1),\
585                       (3 1,4 0),(16 0,17 1))"),
586          "lmlu12"
587          );
588 
589     tester::apply
590         (from_wkt<L>("LINESTRING(0 0,20 0)"),
591          from_wkt<ML>("MULTILINESTRING((1 0,19 0,20 1),\
592                       (2 0,18 0,19 1),(3 0,17 0,18 1),\
593                       (4 0,16 0,17 1))"),
594          from_wkt<ML>("MULTILINESTRING((0 0,20 0),(19 0,20 1),(18 0,19 1),\
595                       (17 0,18 1),(16 0,17 1))"),
596          "lmlu13"
597          );
598 
599     tester::apply
600         (from_wkt<L>("LINESTRING(0 0,20 0)"),
601          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1,19 1,18 0,2 0,\
602                        1 1,2 1,3 0,17 0,18 1,17 1,16 0,4 0,3 1))"),
603          from_wkt<ML>("MULTILINESTRING((0 0,20 0),(0 1,1 0),\
604                       (19 0,20 1,19 1,18 0),(2 0,1 1,2 1,3 0),\
605                       (17 0,18 1,17 1,16 0),(4 0,3 1))"),
606          "lmlu14"
607          );
608 
609     tester::apply
610         (from_wkt<L>("LINESTRING(0 0,20 0)"),
611          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
612                        (2 2,4 2,6 0))"),
613          from_wkt<ML>("MULTILINESTRING((0 0,20 0),(0 1,1 0),(19 0,20 1),\
614                       (2 2,4 2,6 0))"),
615          "lmlu15"
616          );
617 
618     tester::apply
619         (from_wkt<L>("LINESTRING(0 0,20 0)"),
620          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
621                        (6 0,4 2,2 2))"),
622          from_wkt<ML>("MULTILINESTRING((0 0,20 0),(0 1,1 0),(19 0,20 1),\
623                       (6 0,4 2,2 2))"),
624          "lmlu15a"
625          );
626 
627     tester::apply
628         (from_wkt<L>("LINESTRING(0 0,20 0)"),
629          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
630                        (2 2,4 2,5 0,6 0))"),
631          from_wkt<ML>("MULTILINESTRING((0 0,20 0),(0 1,1 0),(19 0,20 1),\
632                       (2 2,4 2,5 0))"),
633          "lmlu16"
634          );
635 
636     tester::apply
637         (from_wkt<L>("LINESTRING(0 0,20 0)"),
638          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
639                        (6 0,5 0,4 2,2 2))"),
640          from_wkt<ML>("MULTILINESTRING((0 0,20 0),(0 1,1 0),(19 0,20 1),\
641                       (5 0,4 2,2 2))"),
642          "lmlu16a"
643          );
644 
645     tester::apply
646         (from_wkt<L>("LINESTRING(0 0,30 0)"),
647          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
648                       (2 2,4 0,5 2,20 2,25 0))"),
649          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(0 1,1 0),(19 0,20 1),\
650                       (2 2,4 0,5 2,20 2,25 0))"),
651          "lmlu17"
652          );
653 
654     tester::apply
655         (from_wkt<L>("LINESTRING(0 0,30 0)"),
656          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
657                        (2 2,4 0,5 2,20 2,25 0,26 2))"),
658          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(0 1,1 0),(19 0,20 1),\
659                       (2 2,4 0,5 2,20 2,25 0,26 2))"),
660          "lmlu17a"
661          );
662 
663     tester::apply
664         (from_wkt<L>("LINESTRING(0 0,30 0)"),
665          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
666                       (2 2,5 -1,15 2,18 0))"),
667          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(0 1,1 0),(19 0,20 1),\
668                       (2 2,5 -1,15 2,18 0))"),
669          "lmlu18"
670          );
671 
672     tester::apply
673         (from_wkt<L>("LINESTRING(0 0,18 0,19 0,30 0)"),
674          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
675                        (2 2,5 -1,15 2,18 0))"),
676          from_wkt<ML>("MULTILINESTRING((0 0,18 0,19 0,30 0),(0 1,1 0),\
677                       (19 0,20 1),(2 2,5 -1,15 2,18 0))"),
678          "lmlu18a"
679          );
680 
681     tester::apply
682         (from_wkt<L>("LINESTRING(0 0,18 0,19 0,30 0)"),
683          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
684                        (2 2,5 -1,15 2,18 0,20 0))"),
685          from_wkt<ML>("MULTILINESTRING((0 0,18 0,19 0,30 0),(0 1,1 0),\
686                       (19 0,20 1),(2 2,5 -1,15 2,18 0))"),
687          "lmlu18b"
688          );
689 
690     tester::apply
691         (from_wkt<L>("LINESTRING(0 0,18 0,19 0,30 0)"),
692          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
693                        (2 2,5 -1,15 2,25 0,26 0))"),
694          from_wkt<ML>("MULTILINESTRING((0 0,18 0,19 0,30 0),(0 1,1 0),\
695                       (19 0,20 1),(2 2,5 -1,15 2,25 0))"),
696          "lmlu18c"
697          );
698 
699     tester::apply
700         (from_wkt<L>("LINESTRING(0 0,18 0,19 0,30 0)"),
701          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
702                        (2 2,5 -1,15 2,25 0,21 0))"),
703          from_wkt<ML>("MULTILINESTRING((0 0,18 0,19 0,30 0),(0 1,1 0),\
704                       (19 0,20 1),(2 2,5 -1,15 2,25 0))"),
705          "lmlu18d"
706          );
707 }
708 
709 
710 
BOOST_AUTO_TEST_CASE(test_union_multilinestring_linestring)711 BOOST_AUTO_TEST_CASE( test_union_multilinestring_linestring )
712 {
713 #ifdef BOOST_GEOMETRY_TEST_DEBUG
714     std::cout << std::endl << std::endl << std::endl;
715     std::cout << "*** MULTILINESTRING / LINESTRING UNION ***"
716               << std::endl;
717     std::cout << std::endl;
718 #endif
719 
720     typedef linestring_type L;
721     typedef multi_linestring_type ML;
722 
723     typedef test_union_of_geometries<ML, L, ML> tester;
724 
725     // disjoint linestrings
726     tester::apply
727         (from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"),
728          from_wkt<L>("LINESTRING(1 1,2 2,4 3)"),
729          from_wkt<ML>("MULTILINESTRING((1 1,2 2,4 3),(0 0,10 0,20 1),(1 0,7 0))"),
730          "mllu01"
731         );
732 
733     tester::apply
734         (from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"),
735          from_wkt<L>("LINESTRING(1 1,2 0,4 0)"),
736          from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),(0 0,2 0),(4 0,10 0,20 1),\
737                       (1 0,2 0),(4 0,7 0))"),
738          "mllu02"
739         );
740 
741     tester::apply
742         (from_wkt<ML>("MULTILINESTRING((0 0,101 0))"),
743          from_wkt<L>("LINESTRING(-1 -1,1 0,101 0,200 -1)"),
744          from_wkt<ML>("MULTILINESTRING((-1 -1,1 0,101 0,200 -1),(0 0,1 0))"),
745          "mllu03"
746         );
747 
748     tester::apply
749         (from_wkt<ML>("MULTILINESTRING((0 0,20 0))"),
750          from_wkt<L>("LINESTRING(0 1,1 0,19 0,20 1,19 1,18 0,2 0,\
751                        1 1,2 1,3 0,17 0,18 1,17 1,16 0,4 0,3 1)"),
752          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1,19 1,18 0,2 0,\
753                        1 1,2 1,3 0,17 0,18 1,17 1,16 0,4 0,3 1),\
754                        (0 0,1 0),(19 0,20 0))"),
755          "mllu04"
756          );
757 }
758 
759 
760 
761 
762 
763 
764 
BOOST_AUTO_TEST_CASE(test_union_multilinestring_multilinestring)765 BOOST_AUTO_TEST_CASE( test_union_multilinestring_multilinestring )
766 {
767 #ifdef BOOST_GEOMETRY_TEST_DEBUG
768     std::cout << std::endl << std::endl << std::endl;
769     std::cout << "*** MULTILINESTRING / MULTILINESTRING UNION ***"
770               << std::endl;
771     std::cout << std::endl;
772 #endif
773 
774     typedef multi_linestring_type ML;
775 
776     typedef test_union_of_geometries<ML, ML, ML> tester;
777 
778     // disjoint linestrings
779     tester::apply
780         (from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"),
781          from_wkt<ML>("MULTILINESTRING((1 1,2 2,4 3),(1 1,2 2,5 3))"),
782          from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0),\
783                       (1 1,2 2,4 3),(1 1,2 2,5 3))"),
784          "mlmlu01"
785         );
786 
787     tester::apply
788         (from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"),
789          from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,4 0))"),
790          from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0),\
791                       (1 1,2 0),(1 1,3 0))"),
792          from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,4 0),\
793                       (0 0,2 0),(4 0,10 0,20 1),(1 0,2 0),(4 0,7 0))"),
794          "mlmlu02"
795         );
796 
797     tester::apply
798         (from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"),
799          from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,5 0))"),
800          from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0),\
801                       (1 1,2 0),(1 1,3 0))"),
802          from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,5 0),\
803                       (0 0,2 0),(5 0,10 0,20 1),(1 0,2 0),(5 0,7 0))"),
804          "mlmlu03"
805         );
806 
807     tester::apply
808         (from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"),
809          from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0))"),
810          from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0),\
811                       (1 1,2 0))"),
812          from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),(0 0,2 0),\
813                       (4 0,10 0,20 1),(1 0,2 0),(4 0,7 0))"),
814          "mlmlu04"
815         );
816 
817     tester::apply
818         (from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0),\
819                       (10 10,20 10,30 20))"),
820          from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),\
821                       (10 20,15 10,25 10,30 15))"),
822          from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0),\
823                       (10 10,20 10,30 20),(1 1,2 0),(10 20,15 10),\
824                       (20 10,25 10,30 15))"),
825          from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),\
826                       (10 20,15 10,25 10,30 15),(0 0,2 0),(4 0,10 0,20 1),\
827                       (1 0,2 0),(4 0,7 0),(10 10,15 10),(20 10,30 20))"),
828          "mlmlu05"
829         );
830 
831 
832     tester::apply
833         (from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 10),(1 0,7 0),\
834                       (10 10,20 10,30 20))"),
835          from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),\
836                       (-1 -1,0 0,9 0,11 10,12 10,13 3,14 4,15 5),\
837                       (10 20,15 10,25 10,30 15))"),
838          from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 10),(1 0,7 0),\
839                       (10 10,20 10,30 20),(1 1,2 0),\
840                       (-1 -1,0 0),(9 0,11 10),(12 10,13 3),(10 20,15 10),\
841                       (20 10,25 10,30 15))"),
842          from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),\
843                       (-1 -1,0 0,9 0,11 10,12 10,13 3,14 4,15 5),\
844                       (10 20,15 10,25 10,30 15),(9 0,10 0,13 3),\
845                       (15 5,20 10),(10 10,11 10),(12 10,15 10),(20 10,30 20))"),
846          "mlmlu06"
847         );
848 
849     tester::apply
850         (from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),\
851                       (-1 -1,0 0,9 0,11 10,12 10,13 3,14 4,15 5),\
852                       (10 20,15 10,25 10,30 15))"),
853          from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 10),(1 0,7 0),\
854                       (10 10,20 10,30 20))"),
855          from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),\
856                       (-1 -1,0 0,9 0,11 10,12 10,13 3,14 4,15 5),\
857                       (10 20,15 10,25 10,30 15),(9 0,10 0,13 3),\
858                       (15 5,20 10),(10 10,11 10),(12 10,15 10),\
859                       (20 10,30 20))"),
860          from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 10),(1 0,7 0),\
861                       (10 10,20 10,30 20),(1 1,2 0),(-1 -1,0 0),  \
862                       (9 0,11 10),(12 10,13 3),(10 20,15 10),\
863                       (20 10,25 10,30 15))"),
864          "mlmlu06a"
865          );
866 
867     tester::apply
868         (from_wkt<ML>("MULTILINESTRING((0 0,101 0))"),
869          from_wkt<ML>("MULTILINESTRING((-1 -1,1 0,101 0,200 -1))"),
870          from_wkt<ML>("MULTILINESTRING((0 0,101 0),(-1 -1,1 0),(101 0,200 -1))"),
871          from_wkt<ML>("MULTILINESTRING((-1 -1,1 0,101 0,200 -1),(0 0,1 0))"),
872          "mlmlu07"
873         );
874 
875     tester::apply
876         (from_wkt<ML>("MULTILINESTRING((-1 1,0 0,101 0))"),
877          from_wkt<ML>("MULTILINESTRING((-1 -1,0 0,50 0),\
878                       (19 -1,20 0,101 0,200 -1))"),
879          from_wkt<ML>("MULTILINESTRING((-1 1,0 0,101 0),(-1 -1,0 0),\
880                       (19 -1,20 0),(101 0,200 -1))"),
881          from_wkt<ML>("MULTILINESTRING((-1 -1,0 0,50 0),\
882                       (19 -1,20 0,101 0,200 -1),(-1 1,0 0))"),
883          "mlmlu07a"
884         );
885 
886     tester::apply
887         (from_wkt<ML>("MULTILINESTRING((0 0,101 0))"),
888          from_wkt<ML>("MULTILINESTRING((-1 -1,0 0,50 0),\
889                       (19 -1,20 0,101 0,200 -1))"),
890          from_wkt<ML>("MULTILINESTRING((0 0,101 0),(-1 -1,0 0),\
891                       (19 -1,20 0),(101 0,200 -1))"),
892          from_wkt<ML>("MULTILINESTRING((-1 -1,0 0,50 0),\
893                       (19 -1,20 0,101 0,200 -1))"),
894          "mlmlu07b"
895         );
896 
897     tester::apply
898         (from_wkt<ML>("MULTILINESTRING((0 0,101 0))"),
899          from_wkt<ML>("MULTILINESTRING((0 1,1 1,2 0),\
900                       (-1 -1,1 0,101 0,200 -1))"),
901          from_wkt<ML>("MULTILINESTRING((0 0,101 0),(0 1,1 1,2 0),\
902                       (-1 -1,1 0),(101 0,200 -1))"),
903          from_wkt<ML>("MULTILINESTRING((0 1,1 1,2 0),\
904                       (-1 -1,1 0,101 0,200 -1),(0 0,1 0))"),
905          "mlmlu08"
906         );
907 
908     tester::apply
909         (from_wkt<ML>("MULTILINESTRING((0 0,1 0,2 0.5,3 0,101 0))"),
910          from_wkt<ML>("MULTILINESTRING((0 1,1 1,2 0.5),\
911                       (-1 -1,1 0,101 0,200 -1))"),
912          from_wkt<ML>("MULTILINESTRING((0 0,1 0,2 0.5,3 0,101 0),\
913                       (0 1,1 1,2 0.5),(-1 -1,1 0,3 0),(101 0,200 -1))"),
914          from_wkt<ML>("MULTILINESTRING((0 1,1 1,2 0.5),\
915                       (-1 -1,1 0,101 0,200 -1),(0 0,1 0,2 0.5,3 0))"),
916          "mlmlu09"
917         );
918 
919     tester::apply
920         (from_wkt<ML>("MULTILINESTRING((0 0,1 0,1.5 0,2 0.5,3 0,101 0))"),
921          from_wkt<ML>("MULTILINESTRING((0 1,1 1,1 0,2 0.5),\
922                       (-1 -1,1 0,101 0,200 -1))"),
923          from_wkt<ML>("MULTILINESTRING((0 0,1 0,1.5 0,2 0.5,3 0,101 0),\
924                       (0 1,1 1,1 0,2 0.5),(-1 -1,1 0),(1.5 0,3 0),\
925                       (101 0,200 -1))"),
926          from_wkt<ML>("MULTILINESTRING((0 1,1 1,1 0,2 0.5),\
927                       (-1 -1,1 0,101 0,200 -1),(0 0,1 0),(1.5 0,2 0.5,3 0))"),
928          "mlmlu10"
929         );
930 
931     tester::apply
932         (from_wkt<ML>("MULTILINESTRING((0 0,1 1,100 1,101 0),\
933                       (0 0,101 0))"),
934          from_wkt<ML>("MULTILINESTRING((1 0,1 1,2 1,3 0,4 0,5 1,6 1,\
935                       7 0,8 0,9 1,10 1,11 0,12 0,13 1,14 1,15 0),\
936                       (-1 -1,1 0,101 0,200 -1))"),
937          from_wkt<ML>("MULTILINESTRING((0 0,1 1,100 1,101 0),\
938                       (0 0,101 0),(1 0,1 1),(2 1,3 0),(4 0,5 1),(6 1,7 0),\
939                       (8 0,9 1),(10 1,11 0),(12 0,13 1),(14 1,15 0),\
940                       (-1 -1,1 0),(101 0,200 -1))"),
941          from_wkt<ML>("MULTILINESTRING((1 0,1 1,2 1,3 0,4 0,5 1,6 1,\
942                       7 0,8 0,9 1,10 1,11 0,12 0,13 1,14 1,15 0),\
943                       (-1 -1,1 0,101 0,200 -1),(0 0,1 1),(2 1,5 1),\
944                       (6 1,9 1),(10 1,13 1),(14 1,100 1,101 0),(0 0,1 0))"),
945          "mlmlu11"
946         );
947 
948     tester::apply
949         (from_wkt<ML>("MULTILINESTRING((0 0,20 0))"),
950          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
951                       (1 1,2 0,18 0,19 1),(2 1,3 0,17 0,18 1),\
952                       (3 1,4 0,16 0,17 1))"),
953          from_wkt<ML>("MULTILINESTRING((0 0,20 0),(0 1,1 0),(19 0,20 1),\
954                       (1 1,2 0),(18 0,19 1),(2 1,3 0),(17 0,18 1),\
955                       (3 1,4 0),(16 0,17 1))"),
956          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
957                       (1 1,2 0,18 0,19 1),(2 1,3 0,17 0,18 1),\
958                       (3 1,4 0,16 0,17 1),(0 0,1 0),(19 0,20 0))"),
959          "mlmlu12"
960          );
961 
962     tester::apply
963         (from_wkt<ML>("MULTILINESTRING((0 0,20 0))"),
964          from_wkt<ML>("MULTILINESTRING((1 0,19 0,20 1),\
965                       (2 0,18 0,19 1),(3 0,17 0,18 1),\
966                       (4 0,16 0,17 1))"),
967          from_wkt<ML>("MULTILINESTRING((0 0,20 0),(19 0,20 1),(18 0,19 1),\
968                       (17 0,18 1),(16 0,17 1))"),
969          from_wkt<ML>("MULTILINESTRING((1 0,19 0,20 1),\
970                       (2 0,18 0,19 1),(3 0,17 0,18 1),\
971                       (4 0,16 0,17 1),(0 0,1 0),(19 0,20 0))"),
972          "mlmlu13"
973          );
974 
975     tester::apply
976         (from_wkt<ML>("MULTILINESTRING((0 0,20 0))"),
977          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1,19 1,18 0,2 0,\
978                        1 1,2 1,3 0,17 0,18 1,17 1,16 0,4 0,3 1))"),
979          from_wkt<ML>("MULTILINESTRING((0 0,20 0),(0 1,1 0),\
980                       (19 0,20 1,19 1,18 0),(2 0,1 1,2 1,3 0),\
981                       (17 0,18 1,17 1,16 0),(4 0,3 1))"),
982          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1,19 1,18 0,2 0,\
983                        1 1,2 1,3 0,17 0,18 1,17 1,16 0,4 0,3 1),\
984                        (0 0,1 0),(19 0,20 0))"),
985          "mlmlu14"
986          );
987 
988     tester::apply
989         (from_wkt<ML>("MULTILINESTRING((0 0,20 0))"),
990          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
991                        (2 2,4 2,6 0))"),
992          from_wkt<ML>("MULTILINESTRING((0 0,20 0),(0 1,1 0),(19 0,20 1),\
993                        (2 2,4 2,6 0))"),
994          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
995                        (2 2,4 2,6 0),(0 0,1 0),(19 0,20 0))"),
996          "mlmlu15"
997          );
998 
999     tester::apply
1000         (from_wkt<ML>("MULTILINESTRING((0 0,20 0))"),
1001          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
1002                       (6 0,4 2,2 2))"),
1003          from_wkt<ML>("MULTILINESTRING((0 0,20 0),(0 1,1 0),(19 0,20 1),\
1004                       (6 0,4 2,2 2))"),
1005          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
1006                       (6 0,4 2,2 2),(0 0,1 0),(19 0,20 0))"),
1007          "mlmlu15a"
1008          );
1009 
1010     tester::apply
1011         (from_wkt<ML>("MULTILINESTRING((0 0,20 0))"),
1012          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
1013                       (2 2,4 2,5 0,6 0))"),
1014          from_wkt<ML>("MULTILINESTRING((0 0,20 0),(0 1,1 0),(19 0,20 1),\
1015                       (2 2,4 2,5 0))"),
1016          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
1017                       (2 2,4 2,5 0,6 0),(0 0,1 0),(19 0,20 0))"),
1018          "mlmlu16"
1019          );
1020 
1021     tester::apply
1022         (from_wkt<ML>("MULTILINESTRING((0 0,20 0))"),
1023          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
1024                       (6 0,5 0,4 2,2 2))"),
1025          from_wkt<ML>("MULTILINESTRING((0 0,20 0),(0 1,1 0),(19 0,20 1),\
1026                       (5 0,4 2,2 2))"),
1027          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
1028                       (6 0,5 0,4 2,2 2),(0 0,1 0),(19 0,20 0))"),
1029          "mlmlu16a"
1030          );
1031 
1032     tester::apply
1033         (from_wkt<ML>("MULTILINESTRING((0 0,30 0))"),
1034          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
1035                       (2 2,4 0,5 2,20 2,25 0))"),
1036          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(0 1,1 0),(19 0,20 1),\
1037                       (2 2,4 0,5 2,20 2,25 0))"),
1038          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
1039                       (2 2,4 0,5 2,20 2,25 0),(0 0,1 0),(19 0,30 0))"),
1040          "mlmlu17"
1041          );
1042 
1043     tester::apply
1044         (from_wkt<ML>("MULTILINESTRING((0 0,30 0))"),
1045          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
1046                       (2 2,4 0,5 2,20 2,25 0,26 2))"),
1047          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(0 1,1 0),(19 0,20 1),\
1048                       (2 2,4 0,5 2,20 2,25 0,26 2))"),
1049          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
1050                       (2 2,4 0,5 2,20 2,25 0,26 2),(0 0,1 0),(19 0,30 0))"),
1051          "mlmlu17a"
1052          );
1053 
1054     tester::apply
1055         (from_wkt<ML>("MULTILINESTRING((0 0,30 0))"),
1056          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
1057                       (2 2,5 -1,15 2,18 0))"),
1058          from_wkt<ML>("MULTILINESTRING((0 0,30 0),(0 1,1 0),(19 0,20 1),\
1059                       (2 2,5 -1,15 2,18 0))"),
1060          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
1061                       (2 2,5 -1,15 2,18 0),(0 0,1 0),(19 0,30 0))"),
1062          "mlmlu18"
1063          );
1064 
1065     tester::apply
1066         (from_wkt<ML>("MULTILINESTRING((0 0,18 0,19 0,30 0))"),
1067          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
1068                       (2 2,5 -1,15 2,18 0))"),
1069          from_wkt<ML>("MULTILINESTRING((0 0,18 0,19 0,30 0),(0 1,1 0),\
1070                       (19 0,20 1),(2 2,5 -1,15 2,18 0))"),
1071          from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
1072                       (2 2,5 -1,15 2,18 0),(0 0,1 0),(19 0,30 0))"),
1073          "mlmlu18a"
1074          );
1075 }
1076