1// Boost.TypeErasure library
2//
3// Copyright 2011 Steven Watanabe
4//
5// Distributed under the Boost Software License Version 1.0. (See
6// accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt)
8//
9// $Id$
10
11#include <boost/type_erasure/any.hpp>
12#include <boost/type_erasure/builtin.hpp>
13#include <boost/type_erasure/operators.hpp>
14#include <boost/type_erasure/any_cast.hpp>
15#include <boost/type_erasure/tuple.hpp>
16#include <boost/mpl/vector.hpp>
17
18#define BOOST_TEST_MAIN
19#include <boost/test/unit_test.hpp>
20
21using namespace boost::type_erasure;
22
23BOOST_AUTO_TEST_CASE(test_basic)
24{
25 typedef boost::mpl::vector<copy_constructible<>, less_than_comparable<> > test_concept;
26 any<test_concept> x(1);
27 any<test_concept> y(2);
28
29 BOOST_CHECK((x < y));
30 BOOST_CHECK(!(y < x));
31 BOOST_CHECK(!(x < x));
32
33 BOOST_CHECK(!(x > y));
34 BOOST_CHECK((y > x));
35 BOOST_CHECK(!(x > x));
36
37 BOOST_CHECK((x <= y));
38 BOOST_CHECK(!(y <= x));
39 BOOST_CHECK((x <= x));
40
41 BOOST_CHECK(!(x >= y));
42 BOOST_CHECK((y >= x));
43 BOOST_CHECK((x >= x));
44}
45
46BOOST_AUTO_TEST_CASE(test_mixed_less)
47{
48 typedef boost::mpl::vector<copy_constructible<_a>, copy_constructible<_b>, less_than_comparable<_a, _b> > test_concept;
49 tuple<test_concept, _a, _b> t(1, 2.0);
50 any<test_concept, _a> x(get<0>(t));
51 any<test_concept, _b> y(get<1>(t));
52
53 BOOST_CHECK((x < y));
54 BOOST_CHECK((y > x));
55 BOOST_CHECK(!(y <= x));
56 BOOST_CHECK(!(x >= y));
57}
58
59BOOST_AUTO_TEST_CASE(test_mixed_equal)
60{
61 typedef boost::mpl::vector<copy_constructible<_a>, copy_constructible<_b>, less_than_comparable<_a, _b> > test_concept;
62 tuple<test_concept, _a, _b> t(1, 1);
63 any<test_concept, _a> x(get<0>(t));
64 any<test_concept, _b> y(get<1>(t));
65
66 BOOST_CHECK(!(x < y));
67 BOOST_CHECK(!(y > x));
68 BOOST_CHECK((y <= x));
69 BOOST_CHECK((x >= y));
70}
71
72BOOST_AUTO_TEST_CASE(test_mixed_greater)
73{
74 typedef boost::mpl::vector<copy_constructible<_a>, copy_constructible<_b>, less_than_comparable<_a, _b> > test_concept;
75 tuple<test_concept, _a, _b> t(2.0, 1);
76 any<test_concept, _a> x(get<0>(t));
77 any<test_concept, _b> y(get<1>(t));
78
79 BOOST_CHECK(!(x < y));
80 BOOST_CHECK(!(y > x));
81 BOOST_CHECK((y <= x));
82 BOOST_CHECK((x >= y));
83}
84
85BOOST_AUTO_TEST_CASE(test_fixed_lhs_less)
86{
87 typedef boost::mpl::vector<copy_constructible<>, less_than_comparable<int, _self> > test_concept;
88 int x(1);
89 any<test_concept> y(2.0);
90
91 BOOST_CHECK((x < y));
92 BOOST_CHECK((y > x));
93 BOOST_CHECK(!(y <= x));
94 BOOST_CHECK(!(x >= y));
95}
96
97BOOST_AUTO_TEST_CASE(test_fixed_lhs_equal)
98{
99 typedef boost::mpl::vector<copy_constructible<>, less_than_comparable<int, _self> > test_concept;
100 int x(1);
101 any<test_concept> y(1);
102
103 BOOST_CHECK(!(x < y));
104 BOOST_CHECK(!(y > x));
105 BOOST_CHECK((y <= x));
106 BOOST_CHECK((x >= y));
107}
108
109
110BOOST_AUTO_TEST_CASE(test_fixed_lhs_greater)
111{
112 typedef boost::mpl::vector<copy_constructible<>, less_than_comparable<int, _self> > test_concept;
113 int x(1);
114 any<test_concept> y(0.5);
115
116 BOOST_CHECK(!(x < y));
117 BOOST_CHECK(!(y > x));
118 BOOST_CHECK((y <= x));
119 BOOST_CHECK((x >= y));
120}
121
122BOOST_AUTO_TEST_CASE(test_fixed_rhs_less)
123{
124 typedef boost::mpl::vector<copy_constructible<>, less_than_comparable<_self, int> > test_concept;
125 any<test_concept> x(1.0);
126 int y(2);
127
128 BOOST_CHECK((x < y));
129 BOOST_CHECK((y > x));
130 BOOST_CHECK(!(y <= x));
131 BOOST_CHECK(!(x >= y));
132}
133
134BOOST_AUTO_TEST_CASE(test_fixed_rhs_equal)
135{
136 typedef boost::mpl::vector<copy_constructible<>, less_than_comparable<_self, int> > test_concept;
137 any<test_concept> x(1);
138 int y(1);
139
140 BOOST_CHECK(!(x < y));
141 BOOST_CHECK(!(y > x));
142 BOOST_CHECK((y <= x));
143 BOOST_CHECK((x >= y));
144}
145
146
147BOOST_AUTO_TEST_CASE(test_fixed_rhs_greater)
148{
149 typedef boost::mpl::vector<copy_constructible<>, less_than_comparable<_self, int> > test_concept;
150 any<test_concept> x(2.0);
151 int y(1);
152
153 BOOST_CHECK(!(x < y));
154 BOOST_CHECK(!(y > x));
155 BOOST_CHECK((y <= x));
156 BOOST_CHECK((x >= y));
157}
158
159BOOST_AUTO_TEST_CASE(test_relaxed)
160{
161 typedef boost::mpl::vector<copy_constructible<>, less_than_comparable<>, relaxed> test_concept;
162 any<test_concept> x(1);
163 any<test_concept> y(2);
164 any<test_concept> z(std::string("test"));
165
166 BOOST_CHECK((x < y));
167 BOOST_CHECK(!(y < x));
168 BOOST_CHECK(!(x < x));
169
170 BOOST_CHECK(!(x > y));
171 BOOST_CHECK((y > x));
172 BOOST_CHECK(!(x > x));
173
174 BOOST_CHECK((x <= y));
175 BOOST_CHECK(!(y <= x));
176 BOOST_CHECK((x <= x));
177
178 BOOST_CHECK(!(x >= y));
179 BOOST_CHECK((y >= x));
180 BOOST_CHECK((x >= x));
181
182 bool expected = x < z;
183
184 BOOST_CHECK_EQUAL((x < z), expected);
185 BOOST_CHECK_EQUAL(!(z < x), expected);
186
187 BOOST_CHECK_EQUAL(!(x > z), expected);
188 BOOST_CHECK_EQUAL((z > x), expected);
189
190 BOOST_CHECK_EQUAL((x <= z), expected);
191 BOOST_CHECK_EQUAL(!(z <= x), expected);
192
193 BOOST_CHECK_EQUAL(!(x >= z), expected);
194 BOOST_CHECK_EQUAL((z >= x), expected);
195
196 BOOST_CHECK_EQUAL((y < z), expected);
197 BOOST_CHECK_EQUAL(!(z < y), expected);
198
199 BOOST_CHECK_EQUAL(!(y > z), expected);
200 BOOST_CHECK_EQUAL((z > y), expected);
201
202 BOOST_CHECK_EQUAL((y <= z), expected);
203 BOOST_CHECK_EQUAL(!(z <= y), expected);
204
205 BOOST_CHECK_EQUAL(!(y >= z), expected);
206 BOOST_CHECK_EQUAL((z >= y), expected);
207}
208
209BOOST_AUTO_TEST_CASE(test_overload)
210{
211 typedef boost::mpl::vector<
212 copy_constructible<_a>,
213 copy_constructible<_b>,
214 less_than_comparable<_a>,
215 less_than_comparable<_a, int>,
216 less_than_comparable<int, _a>,
217 less_than_comparable<_b>,
218 less_than_comparable<_b, int>,
219 less_than_comparable<int, _b>,
220 less_than_comparable<_a, _b>
221 > test_concept;
222 tuple<test_concept, _a, _b> t(1, 2);
223 any<test_concept, _a> x(get<0>(t));
224 any<test_concept, _b> y(get<1>(t));
225
226 BOOST_CHECK(!(x < x));
227 BOOST_CHECK(x <= x);
228 BOOST_CHECK(!(x > x));
229 BOOST_CHECK(x >= x);
230
231 BOOST_CHECK(!(x < 1));
232 BOOST_CHECK(x <= 1);
233 BOOST_CHECK(!(x > 1));
234 BOOST_CHECK(x >= 1);
235
236 BOOST_CHECK(!(1 < x));
237 BOOST_CHECK(1 <= x);
238 BOOST_CHECK(!(1 > x));
239 BOOST_CHECK(1 >= x);
240
241 BOOST_CHECK(!(y < y));
242 BOOST_CHECK(y <= y);
243 BOOST_CHECK(!(y > y));
244 BOOST_CHECK(y >= y);
245
246 BOOST_CHECK(!(y < 2));
247 BOOST_CHECK(y <= 2);
248 BOOST_CHECK(!(y > 2));
249 BOOST_CHECK(y >= 2);
250
251 BOOST_CHECK(!(2 < y));
252 BOOST_CHECK(2 <= y);
253 BOOST_CHECK(!(2 > y));
254 BOOST_CHECK(2 >= y);
255
256 BOOST_CHECK(x < y);
257 BOOST_CHECK(y > x);
258 BOOST_CHECK(!(y <= x));
259 BOOST_CHECK(!(x >= y));
260}
261

source code of boost/libs/type_erasure/test/test_less.cpp