1 /* Boost test/cmp_exn.cpp
2 * test policies with respect to exception throwing
3 *
4 * Copyright 2004 Guillaume Melquiond
5 *
6 * Distributed under the Boost Software License, Version 1.0.
7 * (See accompanying file LICENSE_1_0.txt or
8 * copy at http://www.boost.org/LICENSE_1_0.txt)
9 */
10
11 #include <boost/numeric/interval/interval.hpp>
12 #include <boost/numeric/interval/checking.hpp>
13 #include <boost/numeric/interval/compare.hpp>
14 #include <boost/numeric/interval/policies.hpp>
15 #include <boost/numeric/interval/compare/tribool.hpp>
16 #include <boost/test/test_tools.hpp>
17
18 struct my_checking
19 {
nanmy_checking20 static int nan() { return -1; }
is_nanmy_checking21 static bool is_nan(int x) { return x < 0; }
empty_lowermy_checking22 static int empty_lower() { return -1; }
empty_uppermy_checking23 static int empty_upper() { return -1; }
is_emptymy_checking24 static bool is_empty(int l, int u) { return l == -1 && u == -1; }
25 };
26
27 struct empty_class {};
28
29 typedef boost::numeric::interval_lib::policies< empty_class, my_checking >
30 my_policies;
31
32 typedef boost::numeric::interval<int, my_policies> I;
33
34 #define BOOST_C_EXN(e) \
35 BOOST_CHECK_THROW(e, boost::numeric::interval_lib::comparison_error)
36
test_cer()37 static void test_cer()
38 {
39 I const a(I::empty()), b(1,2);
40 int const c = 0, d = my_checking::nan();
41 using namespace boost::numeric::interval_lib::compare::certain;
42
43 BOOST_C_EXN(a < b);
44 BOOST_C_EXN(a <= b);
45 BOOST_C_EXN(a > b);
46 BOOST_C_EXN(a >= b);
47 BOOST_C_EXN(a == b);
48 BOOST_C_EXN(a != b);
49 BOOST_C_EXN(b < a);
50 BOOST_C_EXN(b <= a);
51 BOOST_C_EXN(b > a);
52 BOOST_C_EXN(b >= a);
53 BOOST_C_EXN(b == a);
54 BOOST_C_EXN(b != a);
55
56 BOOST_C_EXN(a < c);
57 BOOST_C_EXN(a <= c);
58 BOOST_C_EXN(a > c);
59 BOOST_C_EXN(a >= c);
60 BOOST_C_EXN(a == c);
61 BOOST_C_EXN(a != c);
62 BOOST_C_EXN(b < d);
63 BOOST_C_EXN(b <= d);
64 BOOST_C_EXN(b > d);
65 BOOST_C_EXN(b >= d);
66 BOOST_C_EXN(b == d);
67 BOOST_C_EXN(b != d);
68 }
69
test_def()70 static void test_def()
71 {
72 I const a(I::empty()), b(1,2);
73 int const c = 0, d = my_checking::nan();
74
75 BOOST_C_EXN(a < b);
76 BOOST_C_EXN(a <= b);
77 BOOST_C_EXN(a > b);
78 BOOST_C_EXN(a >= b);
79 BOOST_C_EXN(a == b);
80 BOOST_C_EXN(a != b);
81 BOOST_C_EXN(b < a);
82 BOOST_C_EXN(b <= a);
83 BOOST_C_EXN(b > a);
84 BOOST_C_EXN(b >= a);
85 BOOST_C_EXN(b == a);
86 BOOST_C_EXN(b != a);
87
88 BOOST_C_EXN(a < c);
89 BOOST_C_EXN(a <= c);
90 BOOST_C_EXN(a > c);
91 BOOST_C_EXN(a >= c);
92 BOOST_C_EXN(a == c);
93 BOOST_C_EXN(a != c);
94 BOOST_C_EXN(b < d);
95 BOOST_C_EXN(b <= d);
96 BOOST_C_EXN(b > d);
97 BOOST_C_EXN(b >= d);
98 BOOST_C_EXN(b == d);
99 BOOST_C_EXN(b != d);
100 }
101
test_lex()102 static void test_lex()
103 {
104 I const a(I::empty()), b(1,2);
105 int const c = 0, d = my_checking::nan();
106 using namespace boost::numeric::interval_lib::compare::lexicographic;
107
108 BOOST_C_EXN(a < b);
109 BOOST_C_EXN(a <= b);
110 BOOST_C_EXN(a > b);
111 BOOST_C_EXN(a >= b);
112 BOOST_C_EXN(a == b);
113 BOOST_C_EXN(a != b);
114 BOOST_C_EXN(b < a);
115 BOOST_C_EXN(b <= a);
116 BOOST_C_EXN(b > a);
117 BOOST_C_EXN(b >= a);
118 BOOST_C_EXN(b == a);
119 BOOST_C_EXN(b != a);
120
121 BOOST_C_EXN(a < c);
122 BOOST_C_EXN(a <= c);
123 BOOST_C_EXN(a > c);
124 BOOST_C_EXN(a >= c);
125 BOOST_C_EXN(a == c);
126 BOOST_C_EXN(a != c);
127 BOOST_C_EXN(b < d);
128 BOOST_C_EXN(b <= d);
129 BOOST_C_EXN(b > d);
130 BOOST_C_EXN(b >= d);
131 BOOST_C_EXN(b == d);
132 BOOST_C_EXN(b != d);
133 }
134
test_pos()135 static void test_pos()
136 {
137 I const a(I::empty()), b(1,2);
138 int const c = 0, d = my_checking::nan();
139 using namespace boost::numeric::interval_lib::compare::possible;
140
141 BOOST_C_EXN(a < b);
142 BOOST_C_EXN(a <= b);
143 BOOST_C_EXN(a > b);
144 BOOST_C_EXN(a >= b);
145 BOOST_C_EXN(a == b);
146 BOOST_C_EXN(a != b);
147 BOOST_C_EXN(b < a);
148 BOOST_C_EXN(b <= a);
149 BOOST_C_EXN(b > a);
150 BOOST_C_EXN(b >= a);
151 BOOST_C_EXN(b == a);
152 BOOST_C_EXN(b != a);
153
154 BOOST_C_EXN(a < c);
155 BOOST_C_EXN(a <= c);
156 BOOST_C_EXN(a > c);
157 BOOST_C_EXN(a >= c);
158 BOOST_C_EXN(a == c);
159 BOOST_C_EXN(a != c);
160 BOOST_C_EXN(b < d);
161 BOOST_C_EXN(b <= d);
162 BOOST_C_EXN(b > d);
163 BOOST_C_EXN(b >= d);
164 BOOST_C_EXN(b == d);
165 BOOST_C_EXN(b != d);
166 }
167
test_set()168 static void test_set()
169 {
170 I const a(I::empty()), b(1,2);
171 int const c = 0;
172 using namespace boost::numeric::interval_lib::compare::set;
173
174 BOOST_C_EXN(a < c);
175 BOOST_C_EXN(a <= c);
176 BOOST_C_EXN(a > c);
177 BOOST_C_EXN(a >= c);
178 BOOST_C_EXN(a == c);
179 BOOST_C_EXN(a != c);
180 BOOST_C_EXN(b < c);
181 BOOST_C_EXN(b <= c);
182 BOOST_C_EXN(b > c);
183 BOOST_C_EXN(b >= c);
184 BOOST_C_EXN(b == c);
185 BOOST_C_EXN(b != c);
186 }
187
test_tri()188 static void test_tri()
189 {
190 I const a(I::empty()), b(1,2);
191 int const c = 0, d = my_checking::nan();
192 using namespace boost::numeric::interval_lib::compare::tribool;
193
194 BOOST_C_EXN(a < b);
195 BOOST_C_EXN(a <= b);
196 BOOST_C_EXN(a > b);
197 BOOST_C_EXN(a >= b);
198 BOOST_C_EXN(a == b);
199 BOOST_C_EXN(a != b);
200 BOOST_C_EXN(b < a);
201 BOOST_C_EXN(b <= a);
202 BOOST_C_EXN(b > a);
203 BOOST_C_EXN(b >= a);
204 BOOST_C_EXN(b == a);
205 BOOST_C_EXN(b != a);
206
207 BOOST_C_EXN(a < c);
208 BOOST_C_EXN(a <= c);
209 BOOST_C_EXN(a > c);
210 BOOST_C_EXN(a >= c);
211 BOOST_C_EXN(a == c);
212 BOOST_C_EXN(a != c);
213 BOOST_C_EXN(b < d);
214 BOOST_C_EXN(b <= d);
215 BOOST_C_EXN(b > d);
216 BOOST_C_EXN(b >= d);
217 BOOST_C_EXN(b == d);
218 BOOST_C_EXN(b != d);
219 }
220
test_main(int,char * [])221 int test_main(int, char *[]) {
222 test_cer();
223 test_def();
224 test_lex();
225 test_pos();
226 test_set();
227 test_tri();
228
229 return 0;
230 }
231