• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Boost.Geometry
2 // Unit Test
3 
4 // Copyright (c) 2016, Oracle and/or its affiliates.
5 
6 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
7 
8 // Use, modification and distribution is subject to the Boost Software License,
9 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
10 // http://www.boost.org/LICENSE_1_0.txt)
11 
12 
13 #include "test_relate.hpp"
14 
15 
16 template <typename P>
test_linestring_linestring()17 void test_linestring_linestring()
18 {
19     typedef bg::model::linestring<P> ls;
20 
21     test_geometry<ls, ls>("LINESTRING(0 0, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 3 2)", "1FFF0FFF2");
22     test_geometry<ls, ls>("LINESTRING(0 0,3 2)", "LINESTRING(0 0, 2 2, 3 2)", "FF1F0F1F2");
23     test_geometry<ls, ls>("LINESTRING(1 0,2 2,2 3)", "LINESTRING(0 0, 2 2, 3 2)", "0F1FF0102");
24 
25     test_geometry<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(0 0,1 1,2 0,2 -1)", "0F1F00102");
26 
27     test_geometry<ls, ls>("LINESTRING(0 0, 1 1.0004570537241206, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 3 2)", "1FFF0FFF2");
28     test_geometry<ls, ls>("LINESTRING(3 2, 2 2, 1 1.0004570537241206, 0 0)", "LINESTRING(0 0, 2 2, 3 2)", "1FFF0FFF2");
29     test_geometry<ls, ls>("LINESTRING(0 0, 1 1.0004570537241206, 2 2, 3 2)", "LINESTRING(3 2, 2 2, 0 0)", "1FFF0FFF2");
30     test_geometry<ls, ls>("LINESTRING(3 2, 2 2, 1 1.0004570537241206, 0 0)", "LINESTRING(3 2, 2 2, 0 0)", "1FFF0FFF2");
31 
32     test_geometry<ls, ls>("LINESTRING(3 1, 2 2, 1 1.0004570537241206, 0 0)", "LINESTRING(0 0, 2 2, 3 2)", "1F1F00102");
33     test_geometry<ls, ls>("LINESTRING(3 3, 2 2.0015234344160047, 1 1.0012195839797347, 0 0)", "LINESTRING(0 0, 2 2.0015234344160047, 3 2)", "1F1F00102");
34 
35     test_geometry<ls, ls>("LINESTRING(0 0, 1 1.0004570537241206, 2 2, 2 3)", "LINESTRING(0 0, 2 2, 2 3)", "1FFF0FFF2");
36     test_geometry<ls, ls>("LINESTRING(2 3, 2 2, 1 1.0004570537241206, 0 0)", "LINESTRING(0 0, 2 2, 2 3)", "1FFF0FFF2");
37     test_geometry<ls, ls>("LINESTRING(0 0, 1 1.0004570537241206, 2 2, 2 3)", "LINESTRING(2 3, 2 2, 0 0)", "1FFF0FFF2");
38     test_geometry<ls, ls>("LINESTRING(2 3, 2 2, 1 1.0004570537241206, 0 0)", "LINESTRING(2 3, 2 2, 0 0)", "1FFF0FFF2");
39 
40     test_geometry<ls, ls>("LINESTRING(1 1.0004570537241206, 2 2, 3 2.0003044086155000)", "LINESTRING(0 0, 2 2, 4 2)", "1FF0FF102");
41 
42     test_geometry<ls, ls>("LINESTRING(3 2.0003044086155000, 2 2, 1 1.0004570537241206)", "LINESTRING(0 0, 2 2, 4 2)", "1FF0FF102");
43     test_geometry<ls, ls>("LINESTRING(1 1.0004570537241206, 2 2, 3 2.0003044086155000)", "LINESTRING(4 2, 2 2, 0 0)", "1FF0FF102");
44     test_geometry<ls, ls>("LINESTRING(3 2.0003044086155000, 2 2, 1 1.0004570537241206)", "LINESTRING(4 2, 2 2, 0 0)", "1FF0FF102");
45 
46 //    test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 2 2)", "LINESTRING(0 0, 2 2, 4 2)", true);
47 
48 //    test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 3)", "LINESTRING(0 0, 2 2, 4 2)", false);
49 //    test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 2, 3 3)", "LINESTRING(0 0, 2 2, 4 2)", false);
50 //    test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 1)", "LINESTRING(0 0, 2 2, 4 2)", false);
51 //    test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 2, 3 1)", "LINESTRING(0 0, 2 2, 4 2)", false);
52 
53 //    test_geometry<ls, ls>("LINESTRING(0 1, 1 1, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", false);
54 //    test_geometry<ls, ls>("LINESTRING(0 1, 0 0, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", false);
55 //    test_geometry<ls, ls>("LINESTRING(1 0, 1 1, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", false);
56 //    test_geometry<ls, ls>("LINESTRING(1 0, 0 0, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", false);
57 
58 //    test_geometry<ls, ls>("LINESTRING(0 0)", "LINESTRING(0 0)", false);
59 //    test_geometry<ls, ls>("LINESTRING(1 1)", "LINESTRING(0 0, 2 2)", true);
60 //    test_geometry<ls, ls>("LINESTRING(0 0)", "LINESTRING(0 0, 2 2)", false);
61 //    test_geometry<ls, ls>("LINESTRING(0 0, 1 1)", "LINESTRING(0 0)", false);
62 
63 //    test_geometry<ls, ls>("LINESTRING(0 0,5 0,3 0,6 0)", "LINESTRING(0 0,6 0)", true);
64 //    test_geometry<ls, ls>("LINESTRING(0 0,2 2,3 3,1 1)", "LINESTRING(0 0,3 3,6 3)", true);
65 
66     // SPIKES!
67     test_geometry<ls, ls>("LINESTRING(0 0,2 2.0015234344160047,3 3,1 1.0012195839797347,5 3.0009124369434743)", "LINESTRING(0 0,3 3,6 3)", "1F100F102");
68     test_geometry<ls, ls>("LINESTRING(5 3.0009124369434743,1 1.0012195839797347,3 3,2 2.0015234344160047,0 0)", "LINESTRING(0 0,3 3,6 3)", "1F100F102");
69     test_geometry<ls, ls>("LINESTRING(0 0,2 2.0015234344160047,3 3,1 1.0012195839797347,5 3.0009124369434743)", "LINESTRING(6 3,3 3,0 0)", "1F100F102");
70     test_geometry<ls, ls>("LINESTRING(5 3.0009124369434743,1 1.0012195839797347,3 3,2 2.0015234344160047,0 0)", "LINESTRING(6 3,3 3,0 0)", "1F100F102");
71 
72     test_geometry<ls, ls>("LINESTRING(6 3,3 3,0 0)", "LINESTRING(0 0,2 2.0015234344160047,3 3,1 1.0012195839797347,5 3.0009124369434743)", "101F001F2");
73 
74     test_geometry<ls, ls>("LINESTRING(0 0,10 0)", "LINESTRING(1 0,9 0,2 0)", "101FF0FF2");
75     test_geometry<ls, ls>("LINESTRING(0 0,2 2.0015234344160047,3 3,1 1.0012195839797347)", "LINESTRING(0 0,3 3,6 3)", "1FF00F102");
76     // TODO: REWRITE MATRICES
77     // BEGIN
78     /*test_geometry<ls, ls>("LINESTRING(0 0,2 2,3 3,1 1)", "LINESTRING(0 0,4 4,6 3)", "1FF00F102");
79 
80     test_geometry<ls, ls>("LINESTRING(0 0,2 0,1 0)", "LINESTRING(0 1,0 0,2 0)", "1FF00F102");
81     test_geometry<ls, ls>("LINESTRING(2 0,0 0,1 0)", "LINESTRING(0 1,0 0,2 0)", "1FF00F102");
82 
83     test_geometry<ls, ls>("LINESTRING(0 0,3 3,1 1)", "LINESTRING(3 0,3 3,3 1)", "0F1FF0102");
84     test_geometry<ls, ls>("LINESTRING(0 0,3 3,1 1)", "LINESTRING(2 0,2 3,2 1)", "0F1FF0102");
85     test_geometry<ls, ls>("LINESTRING(0 0,3 3,1 1)", "LINESTRING(2 0,2 2,2 1)", "0F1FF0102");
86 
87      test_geometry<ls, ls>("LINESTRING(0 0,2 2,3 3,4 4)", "LINESTRING(0 0,1 1,4 4)", "1FFF0FFF2");*/
88     // END
89 
90     test_geometry<ls, ls>("LINESTRING(0 0,2 2.0036594926050868,3 3.0031983963093536,4 4)", "LINESTRING(0 0,1 1.0022887548647632,4 4)", "1FFF0FFF2");
91 
92     // loop i/i i/i u/u u/u
93     test_geometry<ls, ls>("LINESTRING(0 0,10 0)",
94                           "LINESTRING(1 1,1 0,6 0,6 1,4 1,4 0,9 0,9 1)", "1F1FF0102");
95 
96     // self-intersecting and self-touching equal
97     test_geometry<ls, ls>("LINESTRING(0 5,5 5,10 5,10 10,5 10,5 5,5 0)",
98                           "LINESTRING(0 5,5 5,5 10,10 10,10 5,5 5,5 0)", "1FFF0FFF2");
99     // self-intersecting loop and self-touching equal
100     test_geometry<ls, ls>("LINESTRING(0 5,5 5,10 5,10 10,5 10,5 5,10 5,10 10,5 10,5 5,5 0)",
101                           "LINESTRING(0 5,5 5,5 10,10 10,10 5,5 5,5 0)", "1FFF0FFF2");
102 
103     test_geometry<ls, ls>("LINESTRING(0 0,1 1)", "LINESTRING(0 1,1 0)", "0F1FF0102");
104     test_geometry<ls, ls>("LINESTRING(0 0,1 1)", "LINESTRING(1 1,2 0)", "FF1F00102");
105     test_geometry<ls, ls>("LINESTRING(0 0,1 1)", "LINESTRING(2 0,1 1)", "FF1F00102");
106 
107     test_geometry<ls, ls>("LINESTRING(0 0,1 0,2 1,3 5,4 0)", "LINESTRING(1 0,2 1,3 5)", "101FF0FF2");
108     test_geometry<ls, ls>("LINESTRING(0 0,1 0,2 1,3 5,4 0)", "LINESTRING(3 5,2 1,1 0)", "101FF0FF2");
109     test_geometry<ls, ls>("LINESTRING(1 0,2 1,3 5)", "LINESTRING(4 0,3 5,2 1,1 0,0 0)", "1FF0FF102");
110     test_geometry<ls, ls>("LINESTRING(3 5,2 1,1 0)", "LINESTRING(4 0,3 5,2 1,1 0,0 0)", "1FF0FF102");
111 
112     test_geometry<ls, ls>("LINESTRING(0 0,10 0)", "LINESTRING(-1 -1,1 0,10 0,20 -1)", "1F10F0102");
113     test_geometry<ls, ls>("LINESTRING(0 0,10 0)", "LINESTRING(20 -1,10 0,1 0,-1 -1)", "1F10F0102");
114 
115     test_geometry<ls, ls>("LINESTRING(-1 1,0 0,1 0,5 0,5 5,10 5,15 0,31 0)",
116                           "LINESTRING(-1 -1,0 0,1 0,2 0,3 1,4 0,30 0)",
117                           "101FF0102");
118     test_geometry<ls, ls>("LINESTRING(-1 1,0 0,1 0,5 0,5 5,10 5,15 0,31 0)",
119                           "LINESTRING(30 0,4 0,3 1,2 0,1 0,0 0,-1 -1)",
120                           "101FF0102");
121     test_geometry<ls, ls>("LINESTRING(31 0,15 0,10 5,5 5,5 0,1 0,0 0,-1 1)",
122                           "LINESTRING(-1 -1,0 0,1 0,2 0,3 1,4 0,30 0)",
123                           "101FF0102");
124     test_geometry<ls, ls>("LINESTRING(31 0,15 0,10 5,5 5,5 0,1 0,0 0,-1 1)",
125                           "LINESTRING(30 0,4 0,3 1,2 0,1 0,0 0,-1 -1)",
126                           "101FF0102");
127 
128     // self-IP
129     test_geometry<ls, ls>("LINESTRING(1 0,9 0)",
130                           "LINESTRING(0 0,10 0,10 10,5 0,0 10)",
131                           "1FF0FF102");
132     test_geometry<ls, ls>("LINESTRING(1 0,5 0,9 0)",
133                           "LINESTRING(0 0,10 0,10 10,5 0,0 10)",
134                           "1FF0FF102");
135     test_geometry<ls, ls>("LINESTRING(1 0,9 0)",
136                           "LINESTRING(0 0,10 0,10 10,5 10,5 -1)",
137                           "1FF0FF102");
138     test_geometry<ls, ls>("LINESTRING(1 0,9 0)",
139                           "LINESTRING(0 0,10 0,5 0,5 5)",
140                           "1FF0FF102");
141     test_geometry<ls, ls>("LINESTRING(1 0,7 0)", "LINESTRING(0 0,10 0,10 10,4 -1)",
142                           "1FF0FF102");
143     test_geometry<ls, ls>("LINESTRING(1 0,5 0,7 0)", "LINESTRING(0 0,10 0,10 10,4 -1)",
144                           "1FF0FF102");
145     test_geometry<ls, ls>("LINESTRING(1 0,7 0,8 1)", "LINESTRING(0 0,10 0,10 10,4 -1)",
146                           "1F10F0102");
147     test_geometry<ls, ls>("LINESTRING(1 0,5 0,7 0,8 1)", "LINESTRING(0 0,10 0,10 10,4 -1)",
148                           "1F10F0102");
149 
150     // self-IP going out and in on the same point
151     test_geometry<ls, ls>("LINESTRING(2 0,5 0,5 5,6 5,5 0,8 0)", "LINESTRING(1 0,9 0)",
152                           "1F10FF102");
153 
154     // duplicated points
155     test_geometry<ls, ls>("LINESTRING(1 1.0004570537241206, 2 2, 2 2)", "LINESTRING(0 0, 2 2, 4 2)", "1FF0FF102");
156     test_geometry<ls, ls>("LINESTRING(1 1.0004570537241206, 1 1.0004570537241206, 2 2)", "LINESTRING(0 0, 2 2, 4 2)", "1FF0FF102");
157 
158     // linear ring
159     test_geometry<ls, ls>("LINESTRING(0 0,10 0)", "LINESTRING(5 0,9 0,5 5,1 0,5 0)", "1F1FF01F2");
160     test_geometry<ls, ls>("LINESTRING(0 0,5 0,10 0)", "LINESTRING(5 0,9 0,5 5,1 0,5 0)", "1F1FF01F2");
161     test_geometry<ls, ls>("LINESTRING(0 0,5 0,10 0)", "LINESTRING(5 0,10 0,5 5,1 0,5 0)", "1F10F01F2");
162 
163     test_geometry<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(5 0,10 0,5 5,0 0,5 0)", "1FF0FF1F2");
164     test_geometry<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(5 0,10 0,5 5,5 0)", "FF10F01F2");
165 
166     test_geometry<ls, ls>("LINESTRING(1 0,1 6)", "LINESTRING(0 0,5 0,5 5,0 5)", "0F10F0102");
167 
168     // point-size Linestring
169     test_geometry<ls, ls>("LINESTRING(1 0,1 0)", "LINESTRING(0 0,5 0)", "0FFFFF102");
170     test_geometry<ls, ls>("LINESTRING(1 0,1 0)", "LINESTRING(1 0,5 0)", "F0FFFF102");
171     test_geometry<ls, ls>("LINESTRING(1 0,1 0)", "LINESTRING(0 0,1 0)", "F0FFFF102");
172     test_geometry<ls, ls>("LINESTRING(1 0,1 0)", "LINESTRING(1 0,1 0)", "0FFFFFFF2");
173     test_geometry<ls, ls>("LINESTRING(1 0,1 0)", "LINESTRING(0 0,0 0)", "FF0FFF0F2");
174 
175     //to_svg<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(5 0,10 0,5 5,5 0)", "test_relate_00.svg");
176 
177     // INVALID LINESTRINGS
178     // 1-point LS (a Point) NOT disjoint
179     //test_geometry<ls, ls>("LINESTRING(1 0)", "LINESTRING(0 0,5 0)", "0FFFFF102");
180     //test_geometry<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(1 0)", "0F1FF0FF2");
181     //test_geometry<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(1 0,1 0,1 0)", "0F1FF0FF2");
182     // Point/Point
183     //test_geometry<ls, ls>("LINESTRING(0 0)", "LINESTRING(0 0)", "0FFFFFFF2");
184 
185     if ( BOOST_GEOMETRY_CONDITION(
186             boost::is_floating_point<typename bg::coordinate_type<ls>::type>::value ) )
187     {
188         // https://svn.boost.org/trac/boost/ticket/10904
189         // very small segments
190         test_geometry<ls, ls>("LINESTRING(5.6956521739130430148634331999347 -0.60869565217391330413931882503675,5.5 -0.50000000000000066613381477509392)",
191                               "LINESTRING(5.5 -0.50000000000000066613381477509392,5.5 -0.5)",
192                               "*********"); // TODO: be more specific with the result
193         test_geometry<ls, ls>("LINESTRING(-3.2333333333333333925452279800083 5.5999999999999978683717927196994,-3.2333333333333333925452279800083 5.5999999999999996447286321199499)",
194                               "LINESTRING(-3.2333333333333325043668082798831 5.5999999999999996447286321199499,-3.2333333333333333925452279800083 5.5999999999999996447286321199499)",
195                               "*********"); // TODO: be more specific with the result
196     }
197 
198     if ( BOOST_GEOMETRY_CONDITION((
199             boost::is_same<typename bg::coordinate_type<ls>::type, double>::value )) )
200     {
201         // detected as collinear
202         test_geometry<ls, ls>("LINESTRING(1 -10, 3.069359e+307 3.069359e+307)",
203                               "LINESTRING(1 6, 1 0)",
204                               "*********"); // TODO: be more specific with the result
205     }
206 
207     // OTHER MASKS
208     {
209         namespace bgdr = bg::detail::relate;
210         ls ls1, ls2, ls3, ls4;
211         bg::read_wkt("LINESTRING(0 0,2 0)", ls1);
212         bg::read_wkt("LINESTRING(2 0,4 0)", ls2);
213         bg::read_wkt("LINESTRING(1 0,1 1)", ls3);
214         bg::read_wkt("LINESTRING(1 0,4 0)", ls4);
215         BOOST_CHECK(bg::relate(ls1, ls2, bg::de9im::mask("FT*******")
216                                       || bg::de9im::mask("F**T*****")
217                                       || bg::de9im::mask("F***T****")));
218         BOOST_CHECK(bg::relate(ls1, ls3, bg::de9im::mask("FT*******")
219                                       || bg::de9im::mask("F**T*****")
220                                       || bg::de9im::mask("F***T****")));
221         BOOST_CHECK(bg::relate(ls3, ls1, bg::de9im::mask("FT*******")
222                                       || bg::de9im::mask("F**T*****")
223                                       || bg::de9im::mask("F***T****")));
224         BOOST_CHECK(bg::relate(ls2, ls4, bg::de9im::mask("T*F**F***"))); // within
225 
226         BOOST_CHECK(bg::relate(ls1, ls2, bg::de9im::static_mask<'F','T'>()
227                                       || bg::de9im::static_mask<'F','*','*','T'>()
228                                       || bg::de9im::static_mask<'F','*','*','*','T'>()));
229         BOOST_CHECK(bg::relate(ls1, ls2, bg::de9im::mask("FT")
230                                       || bg::de9im::mask("F**T")
231                                       || bg::de9im::mask("F***T**************")));
232 
233         BOOST_CHECK_THROW(bg::relate(ls1, ls2, bg::de9im::mask("A")), bg::invalid_input_exception);
234     }
235 
236     // spike - boundary and interior on the same point
237     test_geometry<ls, ls>("LINESTRING(3 7.0222344894505291, 8 8, 2 6.0297078652914440)", "LINESTRING(5 7.0264720782244758, 10 7, 0 7)", "0010F0102");
238 
239     // 22.01.2015
240     test_geometry<ls, ls>("LINESTRING(5 5.0276084891434261,10 10)", "LINESTRING(6 6.0348911579043349,3 3)", "1010F0102");
241     test_geometry<ls, ls>("LINESTRING(5 5.0146631750126396,2 8)", "LINESTRING(4 6.0155438000959975,7 3)", "1010F0102");
242 }
243 
244 template <typename P>
test_linestring_multi_linestring()245 void test_linestring_multi_linestring()
246 {
247     typedef bg::model::linestring<P> ls;
248     typedef bg::model::multi_linestring<ls> mls;
249 
250     // LS disjoint
251     test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1,2 1))", "101FF0102");
252     // linear ring disjoint
253     test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1,2 1,2 2,1 1))", "101FF01F2");
254     // 2xLS forming non-simple linear ring disjoint
255     test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1,2 1,2 2),(1 1,2 2))", "101FF01F2");
256 
257     test_geometry<ls, mls>("LINESTRING(0 0,10 0)",
258                            "MULTILINESTRING((1 0,9 0),(9 0,2 0))",
259                            "101FF0FF2");
260 
261     // rings
262     test_geometry<ls, mls>("LINESTRING(0 0,5 0,5 5,0 5,0 0)",
263                            "MULTILINESTRING((5 5,0 5,0 0),(0 0,5 0,5 5))",
264                            "1FFFFFFF2");
265     test_geometry<ls, mls>("LINESTRING(0 0,5 0,5 5,0 5,0 0)",
266                            "MULTILINESTRING((5 5,5 0,0 0),(0 0,0 5,5 5))",
267                            "1FFFFFFF2");
268     // overlapping rings
269     test_geometry<ls, mls>("LINESTRING(0 0,5 0,5 5,0 5,0 0)",
270                            "MULTILINESTRING((5 5,0 5,0 0),(0 0,5 0,5 5,0 5))",
271                            "10FFFFFF2");
272     test_geometry<ls, mls>("LINESTRING(0 0,5 0,5 5,0 5,0 0)",
273                            "MULTILINESTRING((5 5,5 0,0 0),(0 0,0 5,5 5,5 0))",
274                            "10FFFFFF2");
275 
276     // INVALID LINESTRINGS
277     // 1-point LS (a Point) disjoint
278     //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1))", "101FF00F2");
279     //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1,1 1))", "101FF00F2");
280     //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1,1 1,1 1))", "101FF00F2");
281     // 1-point LS (a Point) NOT disjoint
282     //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,9 0),(2 0))", "101FF0FF2");
283     //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,9 0),(2 0,2 0))", "101FF0FF2");
284     //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,9 0),(2 0,2 0,2 0))", "101FF0FF2");
285 
286     // point-like
287     test_geometry<ls, mls>("LINESTRING(0 0, 5 0)",                      // |--------------|
288                            "MULTILINESTRING((0 0, 1 0),(2 0, 2 0))",    // |------|  *
289                            "101F00FF2");
290     test_geometry<ls, mls>("LINESTRING(0 0, 5 0)",                      // |--------------|
291                            "MULTILINESTRING((0 0, 1 0),(1 0, 1 0))",    // |------*
292                            "101F00FF2");
293     test_geometry<ls, mls>("LINESTRING(0 0, 5 0)",                      // |--------------|
294                            "MULTILINESTRING((5 0, 1 0),(1 0, 1 0))",    //        *-------|
295                            "101F00FF2");
296     test_geometry<ls, mls>("LINESTRING(0 0, 5 0)",                      // |--------------|
297                            "MULTILINESTRING((0 0, 1 0),(5 0, 5 0))",    // |------|       *
298                            "10100FFF2");
299     test_geometry<ls, mls>("LINESTRING(0 0, 5 0)",                      // |--------------|
300                            "MULTILINESTRING((0 0, 1 0),(0 0, 0 0))",    // *------|
301                            "101000FF2");
302     test_geometry<ls, mls>("LINESTRING(0 0, 5 0)",                      // |--------------|
303                            "MULTILINESTRING((4 0, 5 0),(5 0, 5 0))",    //         |------*
304                            "101000FF2");
305     test_geometry<ls, mls>("LINESTRING(0 0, 5 0)",                      // |--------------|
306                            "MULTILINESTRING((1 0, 2 0),(0 0, 0 0))",    // *  |------|
307                            "1010F0FF2");
308 
309     test_geometry<ls, mls>("LINESTRING(0 0, 5 0)",                      //   |--------------|
310                            "MULTILINESTRING((2 0, 2 0),(2 0, 2 2))",    //            *
311                            "001FF0102");                                //            |
312 
313     // for consistency
314     test_geometry<ls, mls>("LINESTRING(0 0, 5 0)",                      // |--------------|
315                            "MULTILINESTRING((0 0, 5 0),(0 0, 2 0))",    // |--------------|
316                            "10F00FFF2");                                // |------|
317 
318     test_geometry<ls, mls>("LINESTRING(0 0, 5 0)",                      // |--------------|
319                            "MULTILINESTRING((0 0, 5 0),(3 0, 5 0))",    // |--------------|
320                            "10F00FFF2");                                //         |------|
321 
322     test_geometry<ls, mls>("LINESTRING(0 0, 5 0)",                      // |--------------|
323                            "MULTILINESTRING((0 0, 5 0),(0 0, 6 0))",    // |--------------|
324                            "1FF00F102");                                // |----------------|
325 
326     test_geometry<ls, mls>("LINESTRING(0 0, 5 0)",                      //   |--------------|
327                            "MULTILINESTRING((0 0, 5 0),(-1 0, 5 0))",   //   |--------------|
328                            "1FF00F102");                                // |----------------|
329 
330     test_geometry<ls, mls>("LINESTRING(0 0, 5 0)",                      //   |--------------|
331                            "MULTILINESTRING((0 0, 5 0),(-1 0, 6 0))",   //   |--------------|
332                            "1FF00F102");                                // |------------------|
333 
334     test_geometry<ls, mls>("LINESTRING(0 0, 5 0)",                      //   |--------------|
335                            "MULTILINESTRING((0 0, 5 0),(-1 0, 2 0))",   //   |--------------|
336                            "10F00F102");                                // |-------|
337 
338     test_geometry<ls, mls>("LINESTRING(0 0, 5 0)",                      //   |--------------|
339                            "MULTILINESTRING((0 0, 5 0),(2 0, 6 0))",    //   |--------------|
340                            "10F00F102");                                //            |-------|
341 
342     test_geometry<ls, mls>("LINESTRING(0 0, 5 0)",                      //   |--------------|
343                            "MULTILINESTRING((0 0, 5 0),(2 0, 2 2))",    //   |--------------|
344                            "10FF0F102");                                //            |
345                                                                         //            |
346 
347     if ( BOOST_GEOMETRY_CONDITION(boost::is_floating_point<typename bg::coordinate_type<ls>::type>::value) )
348     {
349         // related to https://svn.boost.org/trac/boost/ticket/10904
350         test_geometry<ls, mls>("LINESTRING(-2305843009213693956 4611686018427387906, -33 -92, 78 83)",
351                                "MULTILINESTRING((20 100, 31 -97, -46 57, -20 -4),(-71 -4))",
352                                "*********"); // TODO: be more specific with the result
353     }
354 
355     // 22.01.2015
356     // inspired by L/A and A/A
357     test_geometry<ls, mls>("LINESTRING(1 1.0012195839797347,2 2.0015234344160047)",
358                            "MULTILINESTRING((0 0,1 1.0012195839797347),(1 1.0012195839797347,3 3))",
359                            "1FF0FF102");
360     // for floats this is considered as collinear due to a special check in spherical intersection strategy
361     test_geometry<ls, mls>("LINESTRING(1 1,2 2)",
362                            "MULTILINESTRING((0 0,1 1),(1 1,3 3))",
363                            "FF10F0102", "1FF0FF102");
364 
365     // 25.01.2015
366     test_geometry<ls, mls>("LINESTRING(1 1.0152687848942923, 5 5.0575148968282102, 4 4.0516408785782314)",
367                            "MULTILINESTRING((2 5.1322576184978592, 7 5, 8 3, 6 3, 4 0),(0 0,10 10))",
368                            "1FF0FF102");
369     test_geometry<ls, mls>("LINESTRING(4 1, 4 5, 4 4)",
370                            "MULTILINESTRING((2 5.1322576184978592, 7 5, 8 3, 6 3, 4 0),(4 0, 4 8, 0 4))",
371                            "1FF0FF102");
372     test_geometry<ls, mls>("LINESTRING(1 1.0152687848942923,5 5.0575148968282102,4 4.0516408785782314)",
373                            "MULTILINESTRING((5 0,5 5.0575148968282102,5 10),(0 0,10 10))",
374                            "1FF0FF102");
375     test_geometry<ls, mls>("LINESTRING(1 1.0036662021874625,5 5,1 0)",
376                            "MULTILINESTRING((5 0,5 5,5 10),(0 0,5 5,1 0))",
377                            "1FF00F102");
378     test_geometry<ls, mls>("LINESTRING(5 5.0575148968282102,4 4.0516408785782314)",
379                            "MULTILINESTRING((5 0,5 5.0575148968282102,5 10),(0 0,10 10))",
380                            "1FF0FF102");
381     test_geometry<ls, mls>("LINESTRING(6 6.0587459045645184,5 5.0575148968282102,4 4.0516408785782314)",
382                            "MULTILINESTRING((5 0,5 5.0575148968282102,5 10),(0 0,10 10))",
383                            "1FF0FF102");
384     test_geometry<ls, mls>("LINESTRING(5 5,4 4)",
385                            "MULTILINESTRING((5 0,5 5,5 10))",
386                            "FF10F0102");
387 }
388 
389 template <typename P>
test_multi_linestring_multi_linestring()390 void test_multi_linestring_multi_linestring()
391 {
392     typedef bg::model::linestring<P> ls;
393     typedef bg::model::multi_linestring<ls> mls;
394 
395     test_geometry<mls, mls>("MULTILINESTRING((0 0,0 0,18 0,18 0,19 0,19 0,19 0,30 0,30 0))",
396                             "MULTILINESTRING((0 10,5 0,20 0,20 0,30 0))",
397                             "1F1F00102");
398     test_geometry<mls, mls>("MULTILINESTRING((0 0,0 0,18 0,18 0,19 0,19 0,19 0,30 0,30 0))",
399                             //"MULTILINESTRING((0 10,5 0,20 0,20 0,30 0),(1 10,1 10,1 0,1 0,1 -10),(2 0,2 0),(3 0,3 0,3 0),(0 0,0 0,0 10,0 10),(30 0,30 0,31 0,31 0))",
400                             "MULTILINESTRING((0 10,5 0,20 0,20 0,30 0),(1 10,1 10,1 0,1 0,1 -10),(0 0,0 0,0 10,0 10),(30 0,30 0,31 0,31 0))",
401                             "1F100F102");
402     test_geometry<mls, mls>("MULTILINESTRING((0 0,0 0,18 0,18 0,19 0,19 0,19 0,30 0,30 0))",
403                             "MULTILINESTRING((0 10,5 0,20 0,20 0,30 0),(0 0,0 0,0 10,0 10))",
404                             "1F1F0F1F2");
405 
406     // point-like
407     test_geometry<mls, mls>("MULTILINESTRING((0 0, 0 0),(1 1, 1 1))",
408                             "MULTILINESTRING((0 0, 0 0))",
409                             "0F0FFFFF2");
410     test_geometry<mls, mls>("MULTILINESTRING((0 0, 0 0),(1 1, 1 1))",
411                             "MULTILINESTRING((0 0, 0 0),(1 1, 1 1))",
412                             "0FFFFFFF2");
413     test_geometry<mls, mls>("MULTILINESTRING((0 0, 0 0),(1 1, 1 1))",
414                             "MULTILINESTRING((2 2, 2 2),(3 3, 3 3))",
415                             "FF0FFF0F2");
416 
417     test_geometry<mls, mls>("MULTILINESTRING((0 5,10 5,10 10,5 10),(5 10,5 0,5 2),(5 2,5 5.0190018174896416,0 5))",
418                             "MULTILINESTRING((5 5.0190018174896416,0 5),(5 5.0190018174896416,5 0),(10 10,10 5,5 5.0190018174896416,5 10,10 10))",
419                             "10FFFFFF2");
420 
421     if ( BOOST_GEOMETRY_CONDITION((
422             boost::is_same<typename bg::coordinate_type<P>::type, double>::value )) )
423     {
424         // assertion failure in 1.57
425         test_geometry<mls, mls>("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))",
426                                 "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))",
427                                 "*********");
428     }
429 }
430 
431 template <typename P>
test_all()432 void test_all()
433 {
434     test_linestring_linestring<P>();
435     test_linestring_multi_linestring<P>();
436     test_multi_linestring_multi_linestring<P>();
437 }
438 
test_main(int,char * [])439 int test_main( int , char* [] )
440 {
441     typedef bg::cs::spherical_equatorial<bg::degree> cs_t;
442 
443     test_all<bg::model::point<float, 2, cs_t> >();
444     test_all<bg::model::point<double, 2, cs_t> >();
445 
446 #if defined(HAVE_TTMATH)
447     test_all<bg::model::point<ttmath_big, 2, cs_t> >();
448 #endif
449 
450     return 0;
451 }
452