1 /* Test expression evaluation (print nothing and exit 0 if successful).
3 Copyright 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
5 This file is part of the GNU MP Library.
7 The GNU MP Library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
12 The GNU MP Library is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
25 #include "expr-impl.h"
37 #define numberof(x) (sizeof (x) / sizeof ((x)[0]))
40 /* These data_xxx[] arrays are tables to be tested with one or more of the
41 mp?_t types. z=mpz_t, q=mpz_t, f=mpf_t. */
43 struct data_t data_zqf[] = {
45 /* various deliberately wrong expressions */
50 { 0, "foo(1,2)", NULL },
56 { 0, "gcd((4,6))", NULL },
58 { 0, "fac(2**1000)", NULL },
64 { 10, "-123", "-123" },
72 { 10, "4**3 * 2 + 1", "129" },
76 { 10, "(123)", "123" },
78 { 10, "sgn(-123)", "-1" },
81 { 0, "cmp(0,0)", "0" },
82 { 0, "cmp(1,0)", "1" },
83 { 0, "cmp(0,1)", "-1" },
84 { 0, "cmp(-1,0)", "-1" },
85 { 0, "cmp(0,-1)", "1" },
87 { 10, "0 ? 123 : 456", "456" },
88 { 10, "1 ? 4+5 : 6+7", "9" },
90 { 10, "(123)", "123" },
92 { 10, "(4+5)*(5+6)", "99" },
94 { 0, "1 << 16", "65536" },
95 { 0, "256 >> 4", "16" },
96 { 0, "-256 >> 4", "-16" },
102 { 0, "2**2**2", "16" },
103 { 0, "-2**2**2", "-16" },
105 { 0, "0x100", "256" },
106 { 10, "0x100", NULL },
107 { 10, "0x 100", NULL },
109 { 0, " max ( 1, 2, 3, 4, 5, 6, 7, 8)", "8" },
110 { 0, " max ( 1, 9, 2, 3, 4, 5, 6, 7, 8)", "9" },
111 { 0, " min ( 1, 9, 2, 3, 4, 5, 6, 7, 8)", "1" },
113 { 10, "abs(123)", "123" },
114 { 10, "abs(-123)", "123" },
115 { 10, "abs(0)", "0" },
117 /* filling data stack */
118 { 0, "1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+1))))))))))))))", "16" },
120 /* filling control stack */
121 { 0, "----------------------------------------------------1", "1" },
125 const struct data_t data_z[] = {
126 { 0, "divisible_p(333,3)", "1" },
127 { 0, "congruent_p(7,1,3)", "1" },
129 { 0, "cmpabs(0,0)", "0" },
130 { 0, "cmpabs(1,0)", "1" },
131 { 0, "cmpabs(0,1)", "-1" },
132 { 0, "cmpabs(-1,0)", "1" },
133 { 0, "cmpabs(0,-1)", "-1" },
135 { 0, "odd_p(1)", "1" },
136 { 0, "odd_p(0)", "0" },
137 { 0, "odd_p(-1)", "1" },
139 { 0, "even_p(1)", "0" },
140 { 0, "even_p(0)", "1" },
141 { 0, "even_p(-1)", "0" },
143 { 0, "fac(0)", "1" },
144 { 0, "fac(1)", "1" },
145 { 0, "fac(2)", "2" },
146 { 0, "fac(3)", "6" },
147 { 0, "fac(10)", "3628800" },
149 { 10, "root(81,4)", "3" },
151 { 10, "gcd(4,6)", "2" },
152 { 10, "gcd(4,6,9)", "1" },
154 { 10, "powm(3,2,9)", "0" },
155 { 10, "powm(3,2,8)", "1" },
157 /* filling data stack */
158 { 0, "1 ? 1 : 1 || 1 && 1 | 1 ^ 1 & 1 == 1 >= 1 << 1 - 1 * 1 ** 1", "1" },
160 /* filling control stack */
161 { 0, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1", "1" },
163 { 0, "fib(10)", "55" },
165 { 0, "setbit(0,5)", "32" },
166 { 0, "clrbit(32,5)", "0" },
167 { 0, "tstbit(32,5)", "1" },
168 { 0, "tstbit(32,4)", "0" },
169 { 0, "scan0(7,0)", "3" },
170 { 0, "scan1(7,0)", "0" },
173 const struct data_t data_zq[] = {
174 /* expecting failure */
178 const struct data_t data_q[] = {
179 { 10, "(1/2 + 1/3 + 1/4 + 1/5 + 1/6)*20", "29" },
180 { 0, "num(5/9)", "5" },
181 { 0, "den(5/9)", "9" },
184 const struct data_t data_zf[] = {
185 { 10, "sqrt ( 49 )", "7" },
186 { 10, "sqrt ( 49 ) + 1", "8" },
187 { 10, "sqrt((49))", "7" },
188 { 10, "sqrt((((((((49))))))))", "7" },
191 const struct data_t data_f[] = {
192 { 0, "1@10", "10000000000" },
193 { 0, "1.5@10", "15000000000" },
194 { 0, "1000@-1", "100" },
195 { 0, "10.00@-1", "1" },
197 { 0, "1e10", "10000000000" },
198 { 0, "1.5e10", "15000000000" },
199 { 0, "1000e-1", "100" },
200 { 0, "10.00e-1", "1" },
202 { 16, "1@9", "68719476736" },
204 { 16, "1@10", "18446744073709551616" },
205 { -16, "1@10", "1099511627776" },
207 { 0, "ceil(0)", "0" },
208 { 0, "ceil(0.25)", "1" },
209 { 0, "ceil(0.5)", "1" },
210 { 0, "ceil(1.5)", "2" },
211 { 0, "ceil(-0.5)", "0" },
212 { 0, "ceil(-1.5)", "-1" },
214 /* only simple cases because mpf_eq currently only works on whole limbs */
215 { 0, "eq(0xFFFFFFFFFFFFFFFF1111111111111111,0xFFFFFFFFFFFFFFFF2222222222222222,64)", "1" },
216 { 0, "eq(0xFFFFFFFFFFFFFFFF1111111111111111,0xFFFFFFFFFFFFFFFF2222222222222222,128)", "0" },
218 { 0, "floor(0)", "0" },
219 { 0, "floor(0.25)", "0" },
220 { 0, "floor(0.5)", "0" },
221 { 0, "floor(1.5)", "1" },
222 { 0, "floor(-0.5)", "-1" },
223 { 0, "floor(-1.5)", "-2" },
225 { 0, "integer_p(1)", "1" },
226 { 0, "integer_p(0.5)", "0" },
228 { 0, "trunc(0)", "0" },
229 { 0, "trunc(0.25)", "0" },
230 { 0, "trunc(0.5)", "0" },
231 { 0, "trunc(1.5)", "1" },
232 { 0, "trunc(-0.5)", "0" },
233 { 0, "trunc(-1.5)", "-1" },
237 const struct data_t *data;
241 #define DATALIST(data) { data, numberof (data) }
243 struct datalist_t list_z[] = {
250 struct datalist_t list_q[] = {
256 struct datalist_t list_f[] = {
266 const struct data_t *data;
267 mpz_t a, b, got, want;
272 mpz_init_set_ui (a, 55);
273 mpz_init_set_ui (b, 99);
275 for (l = 0; l < numberof (list_z); l++)
277 data = list_z[l].data;
279 for (i = 0; i < list_z[l].num; i++)
282 printf ("mpz_expr \"%s\"\n", data[i].expr);
284 ret = mpz_expr (got, data[i].base, data[i].expr, a, b, NULL);
286 if (data[i].want == NULL)
289 if (ret == MPEXPR_RESULT_OK)
291 printf ("mpz_expr wrong return value, got %d, expected failure\n", ret);
297 if (mpz_set_str (want, data[i].want, 0) != 0)
299 printf ("Cannot parse wanted value string\n");
302 if (ret != MPEXPR_RESULT_OK)
304 printf ("mpz_expr failed unexpectedly\n");
305 printf (" return value %d\n", ret);
308 if (mpz_cmp (got, want) != 0)
310 printf ("mpz_expr wrong result\n");
311 printf (" got "); mpz_out_str (stdout, 10, got);
313 printf (" want "); mpz_out_str (stdout, 10, want);
327 printf (" base %d\n", data[i].base);
328 printf (" expr \"%s\"\n", data[i].expr);
329 if (data[i].want != NULL)
330 printf (" want \"%s\"\n", data[i].want);
337 const struct data_t *data;
338 mpq_t a, b, got, want;
346 mpq_set_ui (a, 55, 1);
347 mpq_set_ui (b, 99, 1);
349 for (l = 0; l < numberof (list_q); l++)
351 data = list_q[l].data;
353 for (i = 0; i < list_q[l].num; i++)
356 printf ("mpq_expr \"%s\"\n", data[i].expr);
358 ret = mpq_expr (got, data[i].base, data[i].expr, a, b, NULL);
360 if (data[i].want == NULL)
363 if (ret == MPEXPR_RESULT_OK)
365 printf ("mpq_expr wrong return value, got %d, expected failure\n", ret);
371 if (mpz_set_str (mpq_numref(want), data[i].want, 0) != 0)
373 printf ("Cannot parse wanted value string\n");
376 mpz_set_ui (mpq_denref(want), 1);
378 if (ret != MPEXPR_RESULT_OK)
380 printf ("mpq_expr failed unexpectedly\n");
381 printf (" return value %d\n", ret);
384 if (mpq_cmp (got, want) != 0)
386 printf ("mpq_expr wrong result\n");
387 printf (" got "); mpq_out_str (stdout, 10, got);
389 printf (" want "); mpq_out_str (stdout, 10, want);
403 printf (" base %d\n", data[i].base);
404 printf (" expr \"%s\"\n", data[i].expr);
405 if (data[i].want != NULL)
406 printf (" want \"%s\"\n", data[i].want);
413 const struct data_t *data;
414 mpf_t a, b, got, want;
417 mpf_set_default_prec (200L);
421 mpf_init_set_ui (a, 55);
422 mpf_init_set_ui (b, 99);
424 for (l = 0; l < numberof (list_f); l++)
426 data = list_f[l].data;
428 for (i = 0; i < list_f[l].num; i++)
431 printf ("mpf_expr \"%s\"\n", data[i].expr);
433 ret = mpf_expr (got, data[i].base, data[i].expr, a, b, NULL);
435 if (data[i].want == NULL)
438 if (ret == MPEXPR_RESULT_OK)
440 printf ("mpf_expr wrong return value, got %d, expected failure\n", ret);
446 if (mpf_set_str (want, data[i].want, 0) != 0)
448 printf ("Cannot parse wanted value string\n");
452 if (ret != MPEXPR_RESULT_OK)
454 printf ("mpf_expr failed unexpectedly\n");
455 printf (" return value %d\n", ret);
458 if (mpf_cmp (got, want) != 0)
460 printf ("mpf_expr wrong result\n");
461 printf (" got "); mpf_out_str (stdout, 10, 20, got);
463 printf (" want "); mpf_out_str (stdout, 10, 20, want);
477 printf (" base %d\n", data[i].base);
478 printf (" expr \"%s\"\n", data[i].expr);
479 if (data[i].want != NULL)
480 printf (" want \"%s\"\n", data[i].want);
486 main (int argc, char *argv[])