• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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