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