Tizen 2.1 base
[external/gmp.git] / tests / mpz / t-cmp.c
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.
6
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.
11
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.
16
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/.  */
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 }