1 /*++
2 Copyright (c) 2012 Microsoft Corporation
3 
4 Module Name:
5 
6     ext_numeral.cpp
7 
8 Abstract:
9 
10     Unit tests for ext_numeral template.
11 
12 Author:
13 
14     Leonardo (leonardo) 2012-07-18
15 
16 Notes:
17 
18 --*/
19 #include<sstream>
20 #include "util/mpq.h"
21 #include "util/ext_numeral.h"
22 
23 #define MK_TST_UNARY(NAME)                                              \
24 static void tst_ ## NAME(int a, ext_numeral_kind ak, int expected_c, ext_numeral_kind expected_ck) { \
25     unsynch_mpq_manager m;                                              \
26     scoped_mpq _a(m);                                                   \
27     m.set(_a, a);                                                       \
28     NAME(m, _a, ak);                                                    \
29     ENSURE(ak == expected_ck);                                         \
30     if (expected_ck == EN_NUMERAL) {                                    \
31         scoped_mpq _expected_c(m);                                      \
32         m.set(_expected_c, expected_c);                                 \
33         ENSURE(m.eq(_a, _expected_c));                                 \
34     }                                                                   \
35 }
36 
37 MK_TST_UNARY(neg);
38 MK_TST_UNARY(inv);
39 
40 #define MK_TST_BIN_CORE(FUN_NAME, OP_NAME)                              \
41 static void FUN_NAME(int a, ext_numeral_kind ak, int b, ext_numeral_kind bk, int expected_c, ext_numeral_kind expected_ck) { \
42     unsynch_mpq_manager m;                                              \
43     scoped_mpq _a(m), _b(m), _c(m);                                     \
44     m.set(_a, a);                                                       \
45     m.set(_b, b);                                                       \
46     ext_numeral_kind ck(EN_NUMERAL);                                    \
47     OP_NAME(m, _a, ak, _b, bk, _c, ck);                                 \
48     ENSURE(ck == expected_ck);                                          \
49     if (expected_ck == EN_NUMERAL) {                                    \
50         scoped_mpq _expected_c(m);                                      \
51         m.set(_expected_c, expected_c);                                 \
52         ENSURE(m.eq(_c, _expected_c));                                  \
53     }                                                                   \
54 }
55 
56 #define MK_TST_BIN(NAME) MK_TST_BIN_CORE(tst_ ## NAME, NAME)
57 
58 #define MK_TST_COMM_BIN(NAME)                                           \
59 MK_TST_BIN_CORE(tst_ ## NAME ## _core, NAME)                            \
60 static void tst_ ## NAME(int a, ext_numeral_kind ak, int b, ext_numeral_kind bk, int expected_c, ext_numeral_kind expected_ck) { \
61     tst_ ## NAME ## _core(a, ak, b, bk, expected_c, expected_ck);       \
62     tst_ ## NAME ## _core(b, bk, a, ak, expected_c, expected_ck);       \
63 }
64 
65 MK_TST_COMM_BIN(add);
66 MK_TST_BIN(sub);
67 MK_TST_COMM_BIN(mul);
68 
tst1()69 static void tst1() {
70     tst_neg(0, EN_MINUS_INFINITY, 0, EN_PLUS_INFINITY);
71     tst_neg(30, EN_MINUS_INFINITY, 10, EN_PLUS_INFINITY);
72     tst_neg(0, EN_NUMERAL, 0, EN_NUMERAL);
73     tst_neg(10, EN_NUMERAL, -10, EN_NUMERAL);
74     tst_neg(-7, EN_NUMERAL, 7, EN_NUMERAL);
75     tst_neg(0, EN_PLUS_INFINITY, 0, EN_MINUS_INFINITY);
76     tst_neg(30, EN_PLUS_INFINITY, 0, EN_MINUS_INFINITY);
77     tst_neg(-7, EN_PLUS_INFINITY, 0, EN_MINUS_INFINITY);
78 
79     tst_inv(0, EN_MINUS_INFINITY, 0, EN_NUMERAL);
80     tst_inv(0, EN_PLUS_INFINITY, 0, EN_NUMERAL);
81     tst_inv(1, EN_NUMERAL, 1, EN_NUMERAL);
82     tst_inv(-1, EN_NUMERAL, -1, EN_NUMERAL);
83 
84     tst_add(0, EN_MINUS_INFINITY, 0, EN_MINUS_INFINITY, 0, EN_MINUS_INFINITY);
85     tst_add(0, EN_MINUS_INFINITY, 0, EN_NUMERAL, 0, EN_MINUS_INFINITY);
86     tst_add(0, EN_MINUS_INFINITY, -1, EN_NUMERAL, 0, EN_MINUS_INFINITY);
87     tst_add(0, EN_MINUS_INFINITY, 1, EN_NUMERAL, 0, EN_MINUS_INFINITY);
88     tst_add(1, EN_MINUS_INFINITY, -1, EN_NUMERAL, 0, EN_MINUS_INFINITY);
89     tst_add(1, EN_NUMERAL, 0, EN_MINUS_INFINITY, 0, EN_MINUS_INFINITY);
90     tst_add(-1, EN_NUMERAL, 0, EN_MINUS_INFINITY, 0, EN_MINUS_INFINITY);
91     tst_add(0, EN_NUMERAL, 0, EN_MINUS_INFINITY, 0, EN_MINUS_INFINITY);
92 
93     tst_add(0, EN_NUMERAL, 2, EN_NUMERAL, 2, EN_NUMERAL);
94     tst_add(-3, EN_NUMERAL, 4, EN_NUMERAL, 1, EN_NUMERAL);
95     tst_add(-2, EN_NUMERAL, 0, EN_NUMERAL, -2, EN_NUMERAL);
96     tst_add(3, EN_NUMERAL, 4, EN_NUMERAL, 7, EN_NUMERAL);
97 
98     tst_add(0, EN_PLUS_INFINITY, 0, EN_PLUS_INFINITY, 0, EN_PLUS_INFINITY);
99     tst_add(0, EN_PLUS_INFINITY, 0, EN_NUMERAL, 0, EN_PLUS_INFINITY);
100     tst_add(0, EN_PLUS_INFINITY, 1, EN_NUMERAL, 0, EN_PLUS_INFINITY);
101     tst_add(0, EN_PLUS_INFINITY, -1, EN_NUMERAL, 0, EN_PLUS_INFINITY);
102     tst_add(0, EN_NUMERAL, 0, EN_PLUS_INFINITY, 0, EN_PLUS_INFINITY);
103     tst_add(-1, EN_NUMERAL, 0, EN_PLUS_INFINITY, 0, EN_PLUS_INFINITY);
104     tst_add(1, EN_NUMERAL, 0, EN_PLUS_INFINITY, 0, EN_PLUS_INFINITY);
105 
106     tst_mul(0, EN_MINUS_INFINITY, 0, EN_MINUS_INFINITY, 0, EN_PLUS_INFINITY);
107     tst_mul(0, EN_MINUS_INFINITY, 0, EN_PLUS_INFINITY,  0, EN_MINUS_INFINITY);
108     tst_mul(0, EN_PLUS_INFINITY, 0, EN_MINUS_INFINITY,  0, EN_MINUS_INFINITY);
109     tst_mul(0, EN_PLUS_INFINITY, 0, EN_PLUS_INFINITY,  0,  EN_PLUS_INFINITY);
110 
111     tst_mul(0, EN_MINUS_INFINITY, 0, EN_NUMERAL, 0, EN_NUMERAL);
112     tst_mul(0, EN_MINUS_INFINITY, 1, EN_NUMERAL, 0, EN_MINUS_INFINITY);
113     tst_mul(0, EN_MINUS_INFINITY, 5, EN_NUMERAL, 0, EN_MINUS_INFINITY);
114     tst_mul(0, EN_MINUS_INFINITY, -1, EN_NUMERAL, 0, EN_PLUS_INFINITY);
115     tst_mul(0, EN_MINUS_INFINITY, -5, EN_NUMERAL, 0, EN_PLUS_INFINITY);
116 
117     tst_mul(0, EN_PLUS_INFINITY, 0, EN_NUMERAL, 0, EN_NUMERAL);
118     tst_mul(0, EN_PLUS_INFINITY, 1, EN_NUMERAL, 0, EN_PLUS_INFINITY);
119     tst_mul(0, EN_PLUS_INFINITY, 5, EN_NUMERAL, 0, EN_PLUS_INFINITY);
120     tst_mul(0, EN_PLUS_INFINITY, -1, EN_NUMERAL, 0, EN_MINUS_INFINITY);
121     tst_mul(0, EN_PLUS_INFINITY, -5, EN_NUMERAL, 0, EN_MINUS_INFINITY);
122 
123     tst_mul(0, EN_NUMERAL, 3, EN_NUMERAL, 0, EN_NUMERAL);
124     tst_mul(2, EN_NUMERAL, 3, EN_NUMERAL, 6, EN_NUMERAL);
125     tst_mul(-2, EN_NUMERAL, 3, EN_NUMERAL, -6, EN_NUMERAL);
126 
127     tst_sub(0, EN_PLUS_INFINITY, 0, EN_MINUS_INFINITY, 0, EN_PLUS_INFINITY);
128     tst_sub(0, EN_PLUS_INFINITY, 0, EN_NUMERAL, 0, EN_PLUS_INFINITY);
129     tst_sub(0, EN_PLUS_INFINITY, -10, EN_NUMERAL, 0, EN_PLUS_INFINITY);
130     tst_sub(0, EN_PLUS_INFINITY, 10, EN_NUMERAL, 0, EN_PLUS_INFINITY);
131 
132     tst_sub(0, EN_MINUS_INFINITY, 0, EN_PLUS_INFINITY, 0, EN_MINUS_INFINITY);
133     tst_sub(0, EN_MINUS_INFINITY, 0, EN_NUMERAL, 0, EN_MINUS_INFINITY);
134     tst_sub(0, EN_MINUS_INFINITY, -10, EN_NUMERAL, 0, EN_MINUS_INFINITY);
135     tst_sub(0, EN_MINUS_INFINITY, 10, EN_NUMERAL, 0, EN_MINUS_INFINITY);
136 
137     tst_sub(0, EN_MINUS_INFINITY, 0, EN_PLUS_INFINITY, 0, EN_MINUS_INFINITY);
138     tst_sub(0, EN_MINUS_INFINITY, 0, EN_NUMERAL, 0, EN_MINUS_INFINITY);
139     tst_sub(0, EN_MINUS_INFINITY, 3, EN_NUMERAL, 0, EN_MINUS_INFINITY);
140     tst_sub(0, EN_MINUS_INFINITY, -3, EN_NUMERAL, 0, EN_MINUS_INFINITY);
141 
142     tst_sub(0, EN_PLUS_INFINITY, 0, EN_MINUS_INFINITY, 0, EN_PLUS_INFINITY);
143     tst_sub(0, EN_PLUS_INFINITY, 0, EN_NUMERAL, 0, EN_PLUS_INFINITY);
144     tst_sub(0, EN_PLUS_INFINITY, 3, EN_NUMERAL, 0, EN_PLUS_INFINITY);
145     tst_sub(0, EN_PLUS_INFINITY, -3, EN_NUMERAL, 0, EN_PLUS_INFINITY);
146 
147     tst_sub(0, EN_NUMERAL, 2, EN_NUMERAL, -2, EN_NUMERAL);
148     tst_sub(3, EN_NUMERAL, 2, EN_NUMERAL, 1, EN_NUMERAL);
149     tst_sub(3, EN_NUMERAL, -3, EN_NUMERAL, 6, EN_NUMERAL);
150     tst_sub(3, EN_NUMERAL, 3, EN_NUMERAL, 0, EN_NUMERAL);
151     tst_sub(3, EN_NUMERAL, 0, EN_NUMERAL, 3, EN_NUMERAL);
152     tst_sub(-3, EN_NUMERAL, -5, EN_NUMERAL, 2, EN_NUMERAL);
153 }
154 
155 #define MK_TST_REL_CORE(FUN_NAME, OP_NAME)                              \
156 static void FUN_NAME(int a, ext_numeral_kind ak, int b, ext_numeral_kind bk, bool expected)  { \
157     unsynch_mpq_manager m;                                              \
158     scoped_mpq _a(m), _b(m);                                            \
159     m.set(_a, a);                                                       \
160     m.set(_b, b);                                                       \
161     VERIFY(expected == OP_NAME(m, _a, ak, _b, bk));                     \
162 }
163 
164 #define MK_TST_REL(NAME) MK_TST_REL_CORE(tst_ ## NAME, NAME)
165 
166 #define MK_TST_SYMM_REL(NAME)                                           \
167 MK_TST_REL_CORE(tst_ ## NAME ## _core, NAME)                            \
168 static void tst_ ## NAME(int a, ext_numeral_kind ak, int b, ext_numeral_kind bk, bool expected)  { \
169     tst_ ## NAME ## _core(a, ak, b, bk, expected);                      \
170     tst_ ## NAME ## _core(b, bk, a, ak, expected);                      \
171 }
172 
173 MK_TST_SYMM_REL(eq);
174 MK_TST_SYMM_REL(neq);
175 MK_TST_REL(lt);
176 MK_TST_REL(gt);
177 MK_TST_REL(le);
178 MK_TST_REL(ge);
179 
tst2()180 static void tst2() {
181     tst_eq(0, EN_NUMERAL, 0, EN_NUMERAL, true);
182     tst_eq(0, EN_NUMERAL, 2, EN_NUMERAL, false);
183     tst_eq(3, EN_NUMERAL, 0, EN_NUMERAL, false);
184     tst_eq(0, EN_PLUS_INFINITY, 0, EN_NUMERAL, false);
185     tst_eq(0, EN_PLUS_INFINITY, 3, EN_NUMERAL, false);
186     tst_eq(0, EN_PLUS_INFINITY, -2, EN_NUMERAL, false);
187     tst_eq(0, EN_PLUS_INFINITY, 0, EN_MINUS_INFINITY, false);
188 
189     tst_neq(0, EN_NUMERAL, 0, EN_NUMERAL, false);
190     tst_neq(0, EN_NUMERAL, 2, EN_NUMERAL, true);
191     tst_neq(3, EN_NUMERAL, 0, EN_NUMERAL, true);
192     tst_neq(0, EN_PLUS_INFINITY, 0, EN_NUMERAL, true);
193     tst_neq(0, EN_PLUS_INFINITY, 3, EN_NUMERAL, true);
194     tst_neq(0, EN_PLUS_INFINITY, -2, EN_NUMERAL, true);
195     tst_neq(0, EN_PLUS_INFINITY, 0, EN_MINUS_INFINITY, true);
196 
197     tst_lt(0, EN_MINUS_INFINITY, 10, EN_NUMERAL, true);
198     tst_lt(0, EN_MINUS_INFINITY, 0, EN_NUMERAL, true);
199     tst_lt(0, EN_MINUS_INFINITY, -3, EN_NUMERAL, true);
200     tst_lt(30, EN_MINUS_INFINITY, 10, EN_NUMERAL, true);
201     tst_lt(20, EN_MINUS_INFINITY, 0, EN_NUMERAL, true);
202     tst_lt(-20, EN_MINUS_INFINITY, -3, EN_NUMERAL, true);
203     tst_lt(0, EN_MINUS_INFINITY, 10, EN_PLUS_INFINITY, true);
204     tst_lt(0, EN_MINUS_INFINITY, 0, EN_PLUS_INFINITY, true);
205     tst_lt(10, EN_MINUS_INFINITY, -30, EN_PLUS_INFINITY, true);
206 
207     tst_lt(0, EN_PLUS_INFINITY, 10, EN_NUMERAL, false);
208     tst_lt(0, EN_PLUS_INFINITY, 0, EN_NUMERAL, false);
209     tst_lt(0, EN_PLUS_INFINITY, -3, EN_NUMERAL, false);
210     tst_lt(30, EN_PLUS_INFINITY, 10, EN_NUMERAL, false);
211     tst_lt(20, EN_PLUS_INFINITY, 0, EN_NUMERAL, false);
212     tst_lt(-20, EN_PLUS_INFINITY, -3, EN_NUMERAL, false);
213     tst_lt(0, EN_PLUS_INFINITY, 10, EN_MINUS_INFINITY, false);
214     tst_lt(0, EN_PLUS_INFINITY, 0, EN_MINUS_INFINITY, false);
215     tst_lt(10, EN_PLUS_INFINITY, -30, EN_MINUS_INFINITY, false);
216 
217     tst_lt(0, EN_NUMERAL, 0, EN_PLUS_INFINITY, true);
218     tst_lt(20, EN_NUMERAL, 10, EN_PLUS_INFINITY, true);
219     tst_lt(-20, EN_NUMERAL, -100, EN_PLUS_INFINITY, true);
220     tst_lt(0, EN_NUMERAL, 10, EN_NUMERAL, true);
221     tst_lt(0, EN_NUMERAL, 0, EN_NUMERAL, false);
222     tst_lt(10, EN_NUMERAL, 10, EN_NUMERAL, false);
223     tst_lt(0, EN_NUMERAL, -3, EN_NUMERAL, false);
224     tst_lt(30, EN_NUMERAL, 10, EN_NUMERAL, false);
225     tst_lt(30, EN_NUMERAL, 40, EN_NUMERAL, true);
226     tst_lt(20, EN_NUMERAL, 0, EN_NUMERAL, false);
227     tst_lt(-20, EN_NUMERAL, -3, EN_NUMERAL, true);
228     tst_lt(0, EN_NUMERAL, 10, EN_MINUS_INFINITY, false);
229     tst_lt(0, EN_NUMERAL, 0, EN_MINUS_INFINITY, false);
230     tst_lt(10, EN_NUMERAL, -30, EN_MINUS_INFINITY, false);
231 
232     tst_le(0, EN_MINUS_INFINITY, 10, EN_NUMERAL, true);
233     tst_le(0, EN_MINUS_INFINITY, 0, EN_NUMERAL, true);
234     tst_le(0, EN_MINUS_INFINITY, -3, EN_NUMERAL, true);
235     tst_le(30, EN_MINUS_INFINITY, 10, EN_NUMERAL, true);
236     tst_le(20, EN_MINUS_INFINITY, 0, EN_NUMERAL, true);
237     tst_le(-20, EN_MINUS_INFINITY, -3, EN_NUMERAL, true);
238     tst_le(0, EN_MINUS_INFINITY, 10, EN_PLUS_INFINITY, true);
239     tst_le(0, EN_MINUS_INFINITY, 0, EN_PLUS_INFINITY, true);
240     tst_le(10, EN_MINUS_INFINITY, -30, EN_PLUS_INFINITY, true);
241 
242     tst_le(0, EN_PLUS_INFINITY, 10, EN_NUMERAL, false);
243     tst_le(0, EN_PLUS_INFINITY, 0, EN_NUMERAL, false);
244     tst_le(0, EN_PLUS_INFINITY, -3, EN_NUMERAL, false);
245     tst_le(30, EN_PLUS_INFINITY, 10, EN_NUMERAL, false);
246     tst_le(20, EN_PLUS_INFINITY, 0, EN_NUMERAL, false);
247     tst_le(-20, EN_PLUS_INFINITY, -3, EN_NUMERAL, false);
248     tst_le(0, EN_PLUS_INFINITY, 10, EN_MINUS_INFINITY, false);
249     tst_le(0, EN_PLUS_INFINITY, 0, EN_MINUS_INFINITY, false);
250     tst_le(10, EN_PLUS_INFINITY, -30, EN_MINUS_INFINITY, false);
251 
252     tst_le(0, EN_NUMERAL, 0, EN_PLUS_INFINITY, true);
253     tst_le(20, EN_NUMERAL, 10, EN_PLUS_INFINITY, true);
254     tst_le(-20, EN_NUMERAL, -100, EN_PLUS_INFINITY, true);
255     tst_le(0, EN_NUMERAL, 10, EN_NUMERAL, true);
256     tst_le(0, EN_NUMERAL, 0, EN_NUMERAL, true);
257     tst_le(10, EN_NUMERAL, 10, EN_NUMERAL, true);
258     tst_le(0, EN_NUMERAL, -3, EN_NUMERAL, false);
259     tst_le(30, EN_NUMERAL, 10, EN_NUMERAL, false);
260     tst_le(30, EN_NUMERAL, 40, EN_NUMERAL, true);
261     tst_le(20, EN_NUMERAL, 0, EN_NUMERAL, false);
262     tst_le(-20, EN_NUMERAL, -3, EN_NUMERAL, true);
263     tst_le(0, EN_NUMERAL, 10, EN_MINUS_INFINITY, false);
264     tst_le(0, EN_NUMERAL, 0, EN_MINUS_INFINITY, false);
265     tst_le(10, EN_NUMERAL, -30, EN_MINUS_INFINITY, false);
266 
267 
268     tst_ge(0, EN_MINUS_INFINITY, 10, EN_NUMERAL, false);
269     tst_ge(0, EN_MINUS_INFINITY, 0, EN_NUMERAL, false);
270     tst_ge(0, EN_MINUS_INFINITY, -3, EN_NUMERAL, false);
271     tst_ge(30, EN_MINUS_INFINITY, 10, EN_NUMERAL, false);
272     tst_ge(20, EN_MINUS_INFINITY, 0, EN_NUMERAL, false);
273     tst_ge(-20, EN_MINUS_INFINITY, -3, EN_NUMERAL, false);
274     tst_ge(0, EN_MINUS_INFINITY, 10, EN_PLUS_INFINITY, false);
275     tst_ge(0, EN_MINUS_INFINITY, 0, EN_PLUS_INFINITY, false);
276     tst_ge(10, EN_MINUS_INFINITY, -30, EN_PLUS_INFINITY, false);
277 
278     tst_ge(0, EN_PLUS_INFINITY, 10, EN_NUMERAL, true);
279     tst_ge(0, EN_PLUS_INFINITY, 0, EN_NUMERAL, true);
280     tst_ge(0, EN_PLUS_INFINITY, -3, EN_NUMERAL, true);
281     tst_ge(30, EN_PLUS_INFINITY, 10, EN_NUMERAL, true);
282     tst_ge(20, EN_PLUS_INFINITY, 0, EN_NUMERAL, true);
283     tst_ge(-20, EN_PLUS_INFINITY, -3, EN_NUMERAL, true);
284     tst_ge(0, EN_PLUS_INFINITY, 10, EN_MINUS_INFINITY, true);
285     tst_ge(0, EN_PLUS_INFINITY, 0, EN_MINUS_INFINITY, true);
286     tst_ge(10, EN_PLUS_INFINITY, -30, EN_MINUS_INFINITY, true);
287 
288     tst_ge(0, EN_NUMERAL, 0, EN_PLUS_INFINITY, false);
289     tst_ge(20, EN_NUMERAL, 10, EN_PLUS_INFINITY, false);
290     tst_ge(-20, EN_NUMERAL, -100, EN_PLUS_INFINITY, false);
291     tst_ge(0, EN_NUMERAL, 10, EN_NUMERAL, false);
292     tst_ge(0, EN_NUMERAL, 0, EN_NUMERAL, true);
293     tst_ge(10, EN_NUMERAL, 10, EN_NUMERAL, true);
294     tst_ge(0, EN_NUMERAL, -3, EN_NUMERAL, true);
295     tst_ge(30, EN_NUMERAL, 10, EN_NUMERAL, true);
296     tst_ge(30, EN_NUMERAL, 40, EN_NUMERAL, false);
297     tst_ge(20, EN_NUMERAL, 0, EN_NUMERAL, true);
298     tst_ge(-20, EN_NUMERAL, -3, EN_NUMERAL, false);
299     tst_ge(0, EN_NUMERAL, 10, EN_MINUS_INFINITY, true);
300     tst_ge(0, EN_NUMERAL, 0, EN_MINUS_INFINITY, true);
301     tst_ge(10, EN_NUMERAL, -30, EN_MINUS_INFINITY, true);
302 
303 
304     tst_gt(0, EN_MINUS_INFINITY, 10, EN_NUMERAL, false);
305     tst_gt(0, EN_MINUS_INFINITY, 0, EN_NUMERAL, false);
306     tst_gt(0, EN_MINUS_INFINITY, -3, EN_NUMERAL, false);
307     tst_gt(30, EN_MINUS_INFINITY, 10, EN_NUMERAL, false);
308     tst_gt(20, EN_MINUS_INFINITY, 0, EN_NUMERAL, false);
309     tst_gt(-20, EN_MINUS_INFINITY, -3, EN_NUMERAL, false);
310     tst_gt(0, EN_MINUS_INFINITY, 10, EN_PLUS_INFINITY, false);
311     tst_gt(0, EN_MINUS_INFINITY, 0, EN_PLUS_INFINITY, false);
312     tst_gt(10, EN_MINUS_INFINITY, -30, EN_PLUS_INFINITY, false);
313 
314     tst_gt(0, EN_PLUS_INFINITY, 10, EN_NUMERAL, true);
315     tst_gt(0, EN_PLUS_INFINITY, 0, EN_NUMERAL, true);
316     tst_gt(0, EN_PLUS_INFINITY, -3, EN_NUMERAL, true);
317     tst_gt(30, EN_PLUS_INFINITY, 10, EN_NUMERAL, true);
318     tst_gt(20, EN_PLUS_INFINITY, 0, EN_NUMERAL, true);
319     tst_gt(-20, EN_PLUS_INFINITY, -3, EN_NUMERAL, true);
320     tst_gt(0, EN_PLUS_INFINITY, 10, EN_MINUS_INFINITY, true);
321     tst_gt(0, EN_PLUS_INFINITY, 0, EN_MINUS_INFINITY, true);
322     tst_gt(10, EN_PLUS_INFINITY, -30, EN_MINUS_INFINITY, true);
323 
324     tst_gt(0, EN_NUMERAL, 0, EN_PLUS_INFINITY, false);
325     tst_gt(20, EN_NUMERAL, 10, EN_PLUS_INFINITY, false);
326     tst_gt(-20, EN_NUMERAL, -100, EN_PLUS_INFINITY, false);
327     tst_gt(0, EN_NUMERAL, 10, EN_NUMERAL, false);
328     tst_gt(0, EN_NUMERAL, 0, EN_NUMERAL, false);
329     tst_gt(10, EN_NUMERAL, 10, EN_NUMERAL, false);
330     tst_gt(0, EN_NUMERAL, -3, EN_NUMERAL, true);
331     tst_gt(30, EN_NUMERAL, 10, EN_NUMERAL, true);
332     tst_gt(30, EN_NUMERAL, 40, EN_NUMERAL, false);
333     tst_gt(20, EN_NUMERAL, 0, EN_NUMERAL, true);
334     tst_gt(-20, EN_NUMERAL, -3, EN_NUMERAL, false);
335     tst_gt(0, EN_NUMERAL, 10, EN_MINUS_INFINITY, true);
336     tst_gt(0, EN_NUMERAL, 0, EN_MINUS_INFINITY, true);
337     tst_gt(10, EN_NUMERAL, -30, EN_MINUS_INFINITY, true);
338 }
339 
tst3()340 static void tst3() {
341     unsynch_mpq_manager m;
342     scoped_mpq a(m);
343     ENSURE(is_zero(m, a, EN_NUMERAL));
344     ENSURE(!is_zero(m, a, EN_PLUS_INFINITY));
345     ENSURE(!is_zero(m, a, EN_MINUS_INFINITY));
346     ENSURE(!is_pos(m, a, EN_NUMERAL));
347     ENSURE(is_pos(m, a, EN_PLUS_INFINITY));
348     ENSURE(!is_pos(m, a, EN_MINUS_INFINITY));
349     ENSURE(!is_infinite(EN_NUMERAL));
350     ENSURE(is_infinite(EN_PLUS_INFINITY));
351     ENSURE(is_infinite(EN_MINUS_INFINITY));
352     ENSURE(!is_neg(m, a, EN_NUMERAL));
353     ENSURE(!is_neg(m, a, EN_PLUS_INFINITY));
354     ENSURE(is_neg(m, a, EN_MINUS_INFINITY));
355     m.set(a, 10);
356     ENSURE(!is_zero(m, a, EN_NUMERAL));
357     ENSURE(is_pos(m, a, EN_NUMERAL));
358     ENSURE(!is_neg(m, a, EN_NUMERAL));
359     ENSURE(!is_infinite(EN_NUMERAL));
360     m.set(a, -5);
361     ENSURE(!is_zero(m, a, EN_NUMERAL));
362     ENSURE(!is_pos(m, a, EN_NUMERAL));
363     ENSURE(is_neg(m, a, EN_NUMERAL));
364     ENSURE(!is_infinite(EN_NUMERAL));
365     ext_numeral_kind ak;
366     ak = EN_MINUS_INFINITY;
367     reset(m, a, ak);
368     ENSURE(is_zero(m, a, EN_NUMERAL));
369     {
370         std::ostringstream buffer;
371         display(buffer, m, a, ak);
372         ENSURE(buffer.str() == "0");
373     }
374     {
375         std::ostringstream buffer;
376         m.set(a, -10);
377         display(buffer, m, a, ak);
378         ENSURE(buffer.str() == "-10");
379     }
380     {
381         std::ostringstream buffer;
382         display(buffer, m, a, EN_PLUS_INFINITY);
383         ENSURE(buffer.str() == "+oo");
384     }
385     {
386         std::ostringstream buffer;
387         display(buffer, m, a, EN_MINUS_INFINITY);
388         ENSURE(buffer.str() == "-oo");
389     }
390 }
391 
tst_ext_numeral()392 void tst_ext_numeral() {
393     tst1();
394     tst2();
395     tst3();
396 }
397