]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/polygon/test/polygon_interval_test.cpp
1 // Boost.Polygon library polygon_interval_test.cpp file
3 // Copyright Andrii Sydorchuk 2012.
4 // Distributed under the Boost Software License, Version 1.0.
5 // (See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
8 // See http://www.boost.org for updates, documentation, and revision history.
10 #include <boost/core/lightweight_test.hpp>
11 #include <boost/polygon/interval_concept.hpp>
12 #include <boost/polygon/interval_data.hpp>
13 #include <boost/polygon/interval_traits.hpp>
15 using namespace boost::polygon
;
17 void interval_data_test()
19 typedef interval_data
<int> interval_type
;
20 interval_type
interval1(1, 2);
21 interval_type interval2
;
22 interval2
= interval1
;
24 BOOST_TEST_EQ(interval1
.low(), 1);
25 BOOST_TEST_EQ(interval1
.high(), 2);
26 BOOST_TEST_EQ(interval1
.get(LOW
), 1);
27 BOOST_TEST_EQ(interval1
.get(HIGH
), 2);
28 BOOST_TEST(interval1
== interval2
);
29 BOOST_TEST(!(interval1
!= interval2
));
30 BOOST_TEST(!(interval1
< interval2
));
31 BOOST_TEST(!(interval1
> interval2
));
32 BOOST_TEST(interval1
<= interval2
);
33 BOOST_TEST(interval1
>= interval2
);
37 BOOST_TEST_EQ(interval1
.low(), 2);
38 BOOST_TEST_EQ(interval1
.high(), 1);
39 BOOST_TEST(!(interval1
== interval2
));
40 BOOST_TEST(interval1
!= interval2
);
42 interval2
.set(LOW
, 2);
43 interval2
.set(HIGH
, 1);
44 BOOST_TEST(interval1
== interval2
);
47 void interval_traits_test()
49 typedef interval_data
<int> interval_type
;
51 interval_type interval
= interval_mutable_traits
<interval_type
>::construct(1, 2);
52 BOOST_TEST_EQ(interval_traits
<interval_type
>::get(interval
, LOW
), 1);
53 BOOST_TEST_EQ(interval_traits
<interval_type
>::get(interval
, HIGH
), 2);
55 interval_mutable_traits
<interval_type
>::set(interval
, LOW
, 3);
56 interval_mutable_traits
<interval_type
>::set(interval
, HIGH
, 4);
57 BOOST_TEST_EQ(interval_traits
<interval_type
>::get(interval
, LOW
), 3);
58 BOOST_TEST_EQ(interval_traits
<interval_type
>::get(interval
, HIGH
), 4);
70 struct geometry_concept
< Interval
<T
> > {
71 typedef interval_concept type
;
75 struct interval_traits
< Interval
<T
> > {
76 typedef T coordinate_type
;
78 static coordinate_type
get(const Interval
<T
>& interval
, direction_1d dir
) {
79 return (dir
== LOW
) ? interval
.left
: interval
.right
;
84 struct interval_mutable_traits
< Interval
<T
> > {
85 typedef T coordinate_type
;
87 static void set(Interval
<T
>& interval
, direction_1d dir
, T value
) {
88 (dir
== LOW
) ? interval
.left
= value
: interval
.right
= value
;
91 static Interval
<T
> construct(coordinate_type left
, coordinate_type right
) {
94 interval
.right
= right
;
101 void interval_concept_test1()
103 typedef Interval
<int> interval_type
;
105 interval_type interval1
= construct
<interval_type
>(2, 1);
106 BOOST_TEST_EQ(interval1
.left
, 1);
107 BOOST_TEST_EQ(interval1
.right
, 2);
109 set(interval1
, LOW
, 3);
110 set(interval1
, HIGH
, 4);
111 BOOST_TEST_EQ(get(interval1
, LOW
), 3);
112 BOOST_TEST_EQ(get(interval1
, HIGH
), 4);
114 interval_type interval2
= copy_construct
<interval_type
>(interval1
);
115 BOOST_TEST(equivalence(interval1
, interval2
));
119 BOOST_TEST_EQ(low(interval2
), 1);
120 BOOST_TEST_EQ(high(interval2
), 2);
122 assign(interval1
, interval2
);
123 BOOST_TEST(equivalence(interval1
, interval2
));
126 void interval_concept_test2()
128 typedef Interval
<int> interval_type
;
130 interval_type interval1
= construct
<interval_type
>(1, 3);
131 BOOST_TEST_EQ(center(interval1
), 2);
132 BOOST_TEST_EQ(delta(interval1
), 2);
135 BOOST_TEST_EQ(low(interval1
), -5);
136 BOOST_TEST_EQ(high(interval1
), -3);
138 scale_up(interval1
, 2);
139 BOOST_TEST_EQ(low(interval1
), -10);
140 BOOST_TEST_EQ(high(interval1
), -6);
142 scale_down(interval1
, 2);
143 BOOST_TEST_EQ(low(interval1
), -5);
144 BOOST_TEST_EQ(high(interval1
), -3);
147 BOOST_TEST_EQ(low(interval1
), 0);
148 BOOST_TEST_EQ(high(interval1
), 2);
150 convolve(interval1
, 1);
151 BOOST_TEST_EQ(low(interval1
), 1);
152 BOOST_TEST_EQ(high(interval1
), 3);
154 deconvolve(interval1
, 2);
155 BOOST_TEST_EQ(low(interval1
), -1);
156 BOOST_TEST_EQ(high(interval1
), 1);
158 interval_type interval2
= construct
<interval_type
>(-1, 2);
159 convolve(interval1
, interval2
);
160 BOOST_TEST_EQ(low(interval1
), -2);
161 BOOST_TEST_EQ(high(interval1
), 3);
163 deconvolve(interval1
, interval2
);
164 BOOST_TEST_EQ(low(interval1
), -1);
165 BOOST_TEST_EQ(high(interval1
), 1);
167 reflected_convolve(interval1
, interval2
);
168 BOOST_TEST_EQ(low(interval1
), -3);
169 BOOST_TEST_EQ(high(interval1
), 2);
171 reflected_deconvolve(interval1
, interval2
);
172 BOOST_TEST_EQ(low(interval1
), -1);
173 BOOST_TEST_EQ(high(interval1
), 1);
176 void interval_concept_test3()
178 typedef Interval
<int> interval_type
;
180 interval_type interval1
= construct
<interval_type
>(1, 3);
181 BOOST_TEST_EQ(euclidean_distance(interval1
, -2), 3);
182 BOOST_TEST_EQ(euclidean_distance(interval1
, 2), 0);
183 BOOST_TEST_EQ(euclidean_distance(interval1
, 4), 1);
185 interval_type interval2
= construct
<interval_type
>(-1, 0);
186 BOOST_TEST_EQ(euclidean_distance(interval1
, interval2
), 1);
187 BOOST_TEST(!intersects(interval1
, interval2
));
188 BOOST_TEST(!boundaries_intersect(interval1
, interval2
));
189 BOOST_TEST(!intersect(interval2
, interval1
));
190 BOOST_TEST_EQ(low(interval2
), -1);
191 BOOST_TEST_EQ(high(interval2
), 0);
193 interval_type interval3
= construct
<interval_type
>(-1, 6);
194 BOOST_TEST_EQ(euclidean_distance(interval1
, interval3
), 0);
195 BOOST_TEST(intersects(interval1
, interval3
));
196 BOOST_TEST(!boundaries_intersect(interval1
, interval3
));
197 BOOST_TEST(intersect(interval3
, interval1
));
198 BOOST_TEST_EQ(low(interval3
), 1);
199 BOOST_TEST_EQ(high(interval3
), 3);
201 interval_type interval4
= construct
<interval_type
>(5, 6);
202 BOOST_TEST_EQ(euclidean_distance(interval1
, interval4
), 2);
203 BOOST_TEST(!intersects(interval1
, interval4
));
204 BOOST_TEST(!boundaries_intersect(interval1
, interval4
));
205 BOOST_TEST(!intersect(interval4
, interval1
));
206 BOOST_TEST_EQ(low(interval4
), 5);
207 BOOST_TEST_EQ(high(interval4
), 6);
209 interval_type interval5
= construct
<interval_type
>(3, 5);
210 BOOST_TEST_EQ(euclidean_distance(interval1
, interval5
), 0);
211 BOOST_TEST(!intersects(interval1
, interval5
, false));
212 BOOST_TEST(boundaries_intersect(interval1
, interval5
));
213 BOOST_TEST(intersect(interval5
, interval1
));
214 BOOST_TEST_EQ(low(interval5
), 3);
215 BOOST_TEST_EQ(high(interval5
), 3);
218 void interval_concept_test4()
220 typedef Interval
<int> interval_type
;
222 interval_type interval1
= construct
<interval_type
>(1, 3);
223 interval_type interval2
= construct
<interval_type
>(3, 5);
224 BOOST_TEST(!abuts(interval1
, interval2
, LOW
));
225 BOOST_TEST(abuts(interval1
, interval2
, HIGH
));
226 BOOST_TEST(abuts(interval1
, interval2
));
229 BOOST_TEST_EQ(low(interval1
), 0);
230 BOOST_TEST_EQ(high(interval1
), 4);
231 BOOST_TEST(!abuts(interval1
, interval2
));
233 bloat(interval1
, LOW
, 1);
234 BOOST_TEST_EQ(low(interval1
), -1);
235 BOOST_TEST_EQ(high(interval1
), 4);
237 shrink(interval1
, LOW
, 1);
238 BOOST_TEST_EQ(low(interval1
), 0);
239 BOOST_TEST_EQ(high(interval1
), 4);
241 shrink(interval1
, 1);
242 BOOST_TEST_EQ(low(interval1
), 1);
243 BOOST_TEST_EQ(high(interval1
), 3);
245 BOOST_TEST(encompass(interval1
, 4));
246 BOOST_TEST_EQ(low(interval1
), 1);
247 BOOST_TEST_EQ(high(interval1
), 4);
249 BOOST_TEST(encompass(interval1
, interval2
));
250 BOOST_TEST_EQ(low(interval1
), 1);
251 BOOST_TEST_EQ(high(interval1
), 5);
253 interval1
= get_half(interval1
, LOW
);
254 BOOST_TEST_EQ(low(interval1
), 1);
255 BOOST_TEST_EQ(high(interval1
), 3);
257 BOOST_TEST(join_with(interval1
, interval2
));
258 BOOST_TEST_EQ(low(interval1
), 1);
259 BOOST_TEST_EQ(high(interval1
), 5);
264 interval_data_test();
265 interval_traits_test();
266 interval_concept_test1();
267 interval_concept_test2();
268 interval_concept_test3();
269 interval_concept_test4();
270 return boost::report_errors();