]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // Boost.Geometry (aka GGL, Generic Geometry Library) |
2 | // Unit Test | |
3 | ||
1e59de90 | 4 | // Copyright (c) 2014-2021, Oracle and/or its affiliates. |
7c673cae | 5 | // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle |
1e59de90 | 6 | // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle |
7c673cae FG |
7 | |
8 | // Licensed under the Boost Software License version 1.0. | |
9 | // http://www.boost.org/users/license.html | |
10 | ||
11 | #ifndef BOOST_TEST_MODULE | |
12 | #define BOOST_TEST_MODULE test_distance_default_result | |
13 | #endif | |
14 | ||
15 | #include <cstddef> | |
16 | #include <iostream> | |
17 | ||
18 | #include <boost/test/included/unit_test.hpp> | |
19 | ||
7c673cae FG |
20 | #include <boost/geometry/util/calculation_type.hpp> |
21 | ||
22 | #include <boost/geometry/geometries/point.hpp> | |
23 | #include <boost/geometry/geometries/segment.hpp> | |
24 | #include <boost/geometry/geometries/box.hpp> | |
25 | ||
26 | #include <boost/geometry/strategies/strategies.hpp> | |
27 | #include <boost/geometry/strategies/default_distance_result.hpp> | |
28 | #include <boost/geometry/strategies/default_comparable_distance_result.hpp> | |
29 | ||
7c673cae FG |
30 | namespace bg = ::boost::geometry; |
31 | ||
32 | ||
33 | template <typename DefaultResult, typename ExpectedResult> | |
1e59de90 | 34 | inline void assert_equal_types() |
7c673cae | 35 | { |
1e59de90 TL |
36 | BOOST_GEOMETRY_STATIC_ASSERT( |
37 | (std::is_same<DefaultResult, ExpectedResult>::value), | |
38 | "Wrong default distance result", | |
39 | DefaultResult, ExpectedResult); | |
7c673cae FG |
40 | }; |
41 | ||
42 | //========================================================================= | |
43 | ||
44 | template | |
45 | < | |
46 | typename Geometry1, | |
47 | typename Geometry2, | |
48 | typename ExpectedResult, | |
49 | typename ExpectedComparableResult | |
50 | > | |
51 | inline void test_distance_result() | |
52 | { | |
53 | typedef typename bg::default_distance_result | |
54 | < | |
55 | Geometry1, Geometry2 | |
56 | >::type result12; | |
57 | ||
58 | typedef typename bg::default_distance_result | |
59 | < | |
60 | Geometry2, Geometry1 | |
61 | >::type result21; | |
62 | ||
63 | typedef typename bg::default_comparable_distance_result | |
64 | < | |
65 | Geometry1, Geometry2 | |
66 | >::type comparable_result12; | |
67 | ||
68 | typedef typename bg::default_comparable_distance_result | |
69 | < | |
70 | Geometry2, Geometry1 | |
71 | >::type comparable_result21; | |
72 | ||
73 | assert_equal_types<result12, ExpectedResult>(); | |
74 | assert_equal_types<result21, ExpectedResult>(); | |
75 | assert_equal_types<comparable_result12, ExpectedComparableResult>(); | |
76 | assert_equal_types<comparable_result21, ExpectedComparableResult>(); | |
77 | } | |
78 | ||
79 | //========================================================================= | |
80 | ||
81 | template | |
82 | < | |
83 | typename CoordinateType1, | |
84 | typename CoordinateType2, | |
85 | std::size_t Dimension, | |
86 | typename CoordinateSystem, | |
87 | typename ExpectedResult, | |
88 | typename ExpectedComparableResult = ExpectedResult | |
89 | > | |
90 | struct test_distance_result_segment | |
91 | { | |
92 | test_distance_result_segment() | |
93 | { | |
94 | typedef typename bg::model::point | |
95 | < | |
96 | CoordinateType1, Dimension, CoordinateSystem | |
97 | > point1; | |
98 | ||
99 | typedef typename bg::model::point | |
100 | < | |
101 | CoordinateType2, Dimension, CoordinateSystem | |
102 | > point2; | |
103 | ||
104 | typedef typename bg::model::segment<point1> segment1; | |
105 | typedef typename bg::model::segment<point2> segment2; | |
106 | ||
107 | test_distance_result | |
108 | < | |
109 | point1, point2, ExpectedResult, ExpectedComparableResult | |
110 | >(); | |
111 | ||
112 | test_distance_result | |
113 | < | |
114 | point1, segment2, ExpectedResult, ExpectedComparableResult | |
115 | >(); | |
116 | ||
117 | test_distance_result | |
118 | < | |
119 | point2, segment1, ExpectedResult, ExpectedComparableResult | |
120 | >(); | |
121 | } | |
122 | }; | |
123 | ||
124 | //========================================================================= | |
125 | ||
126 | template | |
127 | < | |
128 | typename CoordinateType1, | |
129 | typename CoordinateType2, | |
130 | std::size_t Dimension, | |
131 | typename ExpectedResult, | |
132 | typename ExpectedComparableResult = ExpectedResult | |
133 | > | |
134 | struct test_distance_result_box | |
135 | { | |
136 | test_distance_result_box() | |
137 | { | |
138 | typedef typename bg::model::point | |
139 | < | |
140 | CoordinateType1, Dimension, bg::cs::cartesian | |
141 | > point1; | |
142 | ||
143 | typedef typename bg::model::point | |
144 | < | |
145 | CoordinateType2, Dimension, bg::cs::cartesian | |
146 | > point2; | |
147 | ||
148 | typedef typename bg::model::box<point1> box1; | |
149 | typedef typename bg::model::box<point2> box2; | |
150 | ||
151 | test_distance_result | |
152 | < | |
153 | point1, box2, ExpectedResult, ExpectedComparableResult | |
154 | >(); | |
155 | ||
156 | test_distance_result | |
157 | < | |
158 | point2, box1, ExpectedResult, ExpectedComparableResult | |
159 | >(); | |
160 | ||
161 | test_distance_result | |
162 | < | |
163 | box1, box2, ExpectedResult, ExpectedComparableResult | |
164 | >(); | |
165 | } | |
166 | }; | |
167 | ||
168 | //========================================================================= | |
169 | ||
170 | template <std::size_t D, typename CoordinateSystem> | |
171 | inline void test_segment_all() | |
172 | { | |
1e59de90 | 173 | using fp_return_type = std::conditional_t |
7c673cae | 174 | < |
1e59de90 | 175 | std::is_same<CoordinateSystem, bg::cs::cartesian>::value, |
7c673cae FG |
176 | double, |
177 | float | |
1e59de90 | 178 | >; |
7c673cae FG |
179 | |
180 | test_distance_result_segment<short, short, D, CoordinateSystem, double>(); | |
181 | test_distance_result_segment<int, int, D, CoordinateSystem, double>(); | |
182 | test_distance_result_segment<int, long, D, CoordinateSystem, double>(); | |
183 | test_distance_result_segment<long, long, D, CoordinateSystem, double>(); | |
184 | ||
1e59de90 TL |
185 | test_distance_result_segment<int, float, D, CoordinateSystem, fp_return_type>(); |
186 | test_distance_result_segment<float, float, D, CoordinateSystem, fp_return_type>(); | |
7c673cae FG |
187 | |
188 | test_distance_result_segment<int, double, D, CoordinateSystem, double>(); | |
189 | test_distance_result_segment<double, int, D, CoordinateSystem, double>(); | |
190 | test_distance_result_segment<float, double, D, CoordinateSystem, double>(); | |
191 | test_distance_result_segment<double, float, D, CoordinateSystem, double>(); | |
192 | test_distance_result_segment<double, double, D, CoordinateSystem, double>(); | |
7c673cae FG |
193 | } |
194 | ||
195 | //========================================================================= | |
196 | ||
197 | template <std::size_t D> | |
198 | inline void test_box_all() | |
199 | { | |
7c673cae FG |
200 | typedef bg::util::detail::default_integral::type default_integral; |
201 | ||
202 | test_distance_result_box<short, short, D, double, default_integral>(); | |
203 | test_distance_result_box<int, int, D, double, default_integral>(); | |
204 | test_distance_result_box<int, long, D, double, default_integral>(); | |
205 | test_distance_result_box<long, long, D, double, default_integral>(); | |
206 | ||
207 | test_distance_result_box<int, float, D, double>(); | |
208 | test_distance_result_box<float, float, D, double>(); | |
209 | ||
210 | test_distance_result_box<int, double, D, double>(); | |
211 | test_distance_result_box<double, int, D, double>(); | |
212 | test_distance_result_box<float, double, D, double>(); | |
213 | test_distance_result_box<double, float, D, double>(); | |
214 | test_distance_result_box<double, double, D, double>(); | |
7c673cae FG |
215 | } |
216 | ||
217 | //========================================================================= | |
218 | ||
219 | BOOST_AUTO_TEST_CASE( test_point_point_or_point_segment ) | |
220 | { | |
221 | test_segment_all<2, bg::cs::cartesian>(); | |
222 | test_segment_all<3, bg::cs::cartesian>(); | |
223 | test_segment_all<4, bg::cs::cartesian>(); | |
224 | test_segment_all<2, bg::cs::spherical_equatorial<bg::degree> >(); | |
225 | } | |
226 | ||
227 | BOOST_AUTO_TEST_CASE( test_point_box_or_box ) | |
228 | { | |
229 | test_box_all<2>(); | |
230 | test_box_all<3>(); | |
231 | test_box_all<4>(); | |
232 | } |