1 | /* |
2 | * Copyright 2015 INRIA Paris-Rocquencourt |
3 | * |
4 | * Use of this software is governed by the MIT license |
5 | * |
6 | * Written by Michael Kruse, INRIA Paris-Rocquencourt, |
7 | * Domaine de Voluceau, Rocquenqourt, B.P. 105, |
8 | * 78153 Le Chesnay Cedex France |
9 | */ |
10 | |
11 | #include <limits.h> |
12 | #include <assert.h> |
13 | #include <isl_imath.h> |
14 | |
15 | /* This constant is not defined in limits.h, but IMath uses it */ |
16 | #define ULONG_MIN 0ul |
17 | |
18 | /* Test the IMath internals assumed by the imath implementation of isl_int. |
19 | * |
20 | * In particular, we test the ranges of IMath-defined types. |
21 | * |
22 | * Also, isl uses the existence and function of imath's struct |
23 | * fields. The digits are stored with less significant digits at lower array |
24 | * indices. Where they are stored (on the heap or in the field 'single') does |
25 | * not matter. |
26 | */ |
27 | int test_imath_internals() |
28 | { |
29 | mpz_t val; |
30 | mp_result retval; |
31 | |
32 | assert(sizeof(mp_small) == sizeof(long)); |
33 | assert(MP_SMALL_MIN == LONG_MIN); |
34 | assert(MP_SMALL_MAX == LONG_MAX); |
35 | |
36 | assert(sizeof(mp_usmall) == sizeof(unsigned long)); |
37 | assert(MP_USMALL_MAX == ULONG_MAX); |
38 | |
39 | retval = mp_int_init_value(z: &val, value: 0); |
40 | assert(retval == MP_OK); |
41 | assert(val.alloc >= val.used); |
42 | assert(val.used == 1); |
43 | assert(val.sign == MP_ZPOS); |
44 | assert(val.digits[0] == 0); |
45 | |
46 | retval = mp_int_set_value(z: &val, value: -1); |
47 | assert(retval == MP_OK); |
48 | assert(val.alloc >= val.used); |
49 | assert(val.used == 1); |
50 | assert(val.sign == MP_NEG); |
51 | assert(val.digits[0] == 1); |
52 | |
53 | retval = mp_int_set_value(z: &val, value: 1); |
54 | assert(retval == MP_OK); |
55 | assert(val.alloc >= val.used); |
56 | assert(val.used == 1); |
57 | assert(val.sign == MP_ZPOS); |
58 | assert(val.digits[0] == 1); |
59 | |
60 | retval = mp_int_mul_pow2(a: &val, p2: sizeof(mp_digit) * CHAR_BIT, c: &val); |
61 | assert(retval == MP_OK); |
62 | assert(val.alloc >= val.used); |
63 | assert(val.used == 2); |
64 | assert(val.sign == MP_ZPOS); |
65 | assert(val.digits[0] == 0); |
66 | assert(val.digits[1] == 1); |
67 | |
68 | mp_int_clear(z: &val); |
69 | return 0; |
70 | } |
71 | |
72 | int main() |
73 | { |
74 | if (test_imath_internals() < 0) |
75 | return -1; |
76 | |
77 | return 0; |
78 | } |
79 | |