t-cmp.c revision 1.1 1 1.1 mrg /* Test mpz_cmp and mpz_cmpabs.
2 1.1 mrg
3 1.1 mrg Copyright 2001 Free Software Foundation, Inc.
4 1.1 mrg
5 1.1 mrg This file is part of the GNU MP Library.
6 1.1 mrg
7 1.1 mrg The GNU MP Library is free software; you can redistribute it and/or modify
8 1.1 mrg it under the terms of the GNU Lesser General Public License as published by
9 1.1 mrg the Free Software Foundation; either version 3 of the License, or (at your
10 1.1 mrg option) any later version.
11 1.1 mrg
12 1.1 mrg The GNU MP Library is distributed in the hope that it will be useful, but
13 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 1.1 mrg License for more details.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU Lesser General Public License
18 1.1 mrg along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
19 1.1 mrg
20 1.1 mrg #include <stdio.h>
21 1.1 mrg #include <stdlib.h>
22 1.1 mrg #include "gmp.h"
23 1.1 mrg #include "gmp-impl.h"
24 1.1 mrg #include "tests.h"
25 1.1 mrg
26 1.1 mrg
27 1.1 mrg /* Nothing sophisticated here, just exercise some combinations of sizes and
28 1.1 mrg signs. */
29 1.1 mrg
30 1.1 mrg
31 1.1 mrg void
32 1.1 mrg check_one (mpz_ptr x, mpz_ptr y, int want_cmp, int want_cmpabs)
33 1.1 mrg {
34 1.1 mrg int got;
35 1.1 mrg
36 1.1 mrg got = mpz_cmp (x, y);
37 1.1 mrg if (( got < 0) != (want_cmp < 0)
38 1.1 mrg || (got == 0) != (want_cmp == 0)
39 1.1 mrg || (got > 0) != (want_cmp > 0))
40 1.1 mrg {
41 1.1 mrg printf ("mpz_cmp got %d want %d\n", got, want_cmp);
42 1.1 mrg mpz_trace ("x", x);
43 1.1 mrg mpz_trace ("y", y);
44 1.1 mrg abort ();
45 1.1 mrg }
46 1.1 mrg
47 1.1 mrg got = mpz_cmpabs (x, y);
48 1.1 mrg if (( got < 0) != (want_cmpabs < 0)
49 1.1 mrg || (got == 0) != (want_cmpabs == 0)
50 1.1 mrg || (got > 0) != (want_cmpabs > 0))
51 1.1 mrg {
52 1.1 mrg printf ("mpz_cmpabs got %d want %d\n", got, want_cmpabs);
53 1.1 mrg mpz_trace ("x", x);
54 1.1 mrg mpz_trace ("y", y);
55 1.1 mrg abort ();
56 1.1 mrg }
57 1.1 mrg }
58 1.1 mrg
59 1.1 mrg
60 1.1 mrg void
61 1.1 mrg check_all (mpz_ptr x, mpz_ptr y, int want_cmp, int want_cmpabs)
62 1.1 mrg {
63 1.1 mrg check_one (x, y, want_cmp, want_cmpabs);
64 1.1 mrg check_one (y, x, -want_cmp, -want_cmpabs);
65 1.1 mrg
66 1.1 mrg mpz_neg (x, x);
67 1.1 mrg mpz_neg (y, y);
68 1.1 mrg want_cmp = -want_cmp;
69 1.1 mrg
70 1.1 mrg check_one (x, y, want_cmp, want_cmpabs);
71 1.1 mrg check_one (y, x, -want_cmp, -want_cmpabs);
72 1.1 mrg }
73 1.1 mrg
74 1.1 mrg
75 1.1 mrg #define SET1(z,size, n) \
76 1.1 mrg SIZ(z) = size; PTR(z)[0] = n
77 1.1 mrg
78 1.1 mrg #define SET2(z,size, n1,n0) \
79 1.1 mrg SIZ(z) = size; PTR(z)[1] = n1; PTR(z)[0] = n0
80 1.1 mrg
81 1.1 mrg #define SET4(z,size, n3,n2,n1,n0) \
82 1.1 mrg SIZ(z) = size; PTR(z)[3] = n3; PTR(z)[2] = n2; PTR(z)[1] = n1; PTR(z)[0] = n0
83 1.1 mrg
84 1.1 mrg void
85 1.1 mrg check_various (void)
86 1.1 mrg {
87 1.1 mrg mpz_t x, y;
88 1.1 mrg
89 1.1 mrg mpz_init (x);
90 1.1 mrg mpz_init (y);
91 1.1 mrg
92 1.1 mrg mpz_realloc (x, (mp_size_t) 20);
93 1.1 mrg mpz_realloc (y, (mp_size_t) 20);
94 1.1 mrg
95 1.1 mrg /* 0 cmp 0, junk in low limbs */
96 1.1 mrg SET1 (x,0, 123);
97 1.1 mrg SET1 (y,0, 456);
98 1.1 mrg check_all (x, y, 0, 0);
99 1.1 mrg
100 1.1 mrg
101 1.1 mrg /* 123 cmp 0 */
102 1.1 mrg SET1 (x,1, 123);
103 1.1 mrg SET1 (y,0, 456);
104 1.1 mrg check_all (x, y, 1, 1);
105 1.1 mrg
106 1.1 mrg /* 123:456 cmp 0 */
107 1.1 mrg SET2 (x,2, 456,123);
108 1.1 mrg SET1 (y,0, 9999);
109 1.1 mrg check_all (x, y, 1, 1);
110 1.1 mrg
111 1.1 mrg
112 1.1 mrg /* 123 cmp 123 */
113 1.1 mrg SET1(x,1, 123);
114 1.1 mrg SET1(y,1, 123);
115 1.1 mrg check_all (x, y, 0, 0);
116 1.1 mrg
117 1.1 mrg /* -123 cmp 123 */
118 1.1 mrg SET1(x,-1, 123);
119 1.1 mrg SET1(y,1, 123);
120 1.1 mrg check_all (x, y, -1, 0);
121 1.1 mrg
122 1.1 mrg
123 1.1 mrg /* 123 cmp 456 */
124 1.1 mrg SET1(x,1, 123);
125 1.1 mrg SET1(y,1, 456);
126 1.1 mrg check_all (x, y, -1, -1);
127 1.1 mrg
128 1.1 mrg /* -123 cmp 456 */
129 1.1 mrg SET1(x,-1, 123);
130 1.1 mrg SET1(y,1, 456);
131 1.1 mrg check_all (x, y, -1, -1);
132 1.1 mrg
133 1.1 mrg /* 123 cmp -456 */
134 1.1 mrg SET1(x,1, 123);
135 1.1 mrg SET1(y,-1, 456);
136 1.1 mrg check_all (x, y, 1, -1);
137 1.1 mrg
138 1.1 mrg
139 1.1 mrg /* 1:0 cmp 1:0 */
140 1.1 mrg SET2 (x,2, 1,0);
141 1.1 mrg SET2 (y,2, 1,0);
142 1.1 mrg check_all (x, y, 0, 0);
143 1.1 mrg
144 1.1 mrg /* -1:0 cmp 1:0 */
145 1.1 mrg SET2 (x,-2, 1,0);
146 1.1 mrg SET2 (y,2, 1,0);
147 1.1 mrg check_all (x, y, -1, 0);
148 1.1 mrg
149 1.1 mrg
150 1.1 mrg /* 2:0 cmp 1:0 */
151 1.1 mrg SET2 (x,2, 2,0);
152 1.1 mrg SET2 (y,2, 1,0);
153 1.1 mrg check_all (x, y, 1, 1);
154 1.1 mrg
155 1.1 mrg
156 1.1 mrg /* 4:3:2:1 cmp 2:1 */
157 1.1 mrg SET4 (x,4, 4,3,2,1);
158 1.1 mrg SET2 (y,2, 2,1);
159 1.1 mrg check_all (x, y, 1, 1);
160 1.1 mrg
161 1.1 mrg /* -4:3:2:1 cmp 2:1 */
162 1.1 mrg SET4 (x,-4, 4,3,2,1);
163 1.1 mrg SET2 (y,2, 2,1);
164 1.1 mrg check_all (x, y, -1, 1);
165 1.1 mrg
166 1.1 mrg
167 1.1 mrg mpz_clear (x);
168 1.1 mrg mpz_clear (y);
169 1.1 mrg }
170 1.1 mrg
171 1.1 mrg
172 1.1 mrg int
173 1.1 mrg main (void)
174 1.1 mrg {
175 1.1 mrg tests_start ();
176 1.1 mrg mp_trace_base = -16;
177 1.1 mrg
178 1.1 mrg check_various ();
179 1.1 mrg
180 1.1 mrg tests_end ();
181 1.1 mrg exit (0);
182 1.1 mrg }
183