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