1/* Test mpz_fits_*_p */
2
3/*
4Copyright 2001 Free Software Foundation, Inc.
5
6This file is part of the GNU MP Library test suite.
7
8The GNU MP Library test suite is free software; you can redistribute it
9and/or modify it under the terms of the GNU General Public License as
10published by the Free Software Foundation; either version 3 of the License,
11or (at your option) any later version.
12
13The GNU MP Library test suite is distributed in the hope that it will be
14useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
16Public License for more details.
17
18You should have received a copy of the GNU General Public License along with
19the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
20
21#include <stdio.h>
22#include <stdlib.h>
23#include "gmp-impl.h"
24#include "tests.h"
25
26
27/* Nothing sophisticated here, just exercise mpz_fits_*_p on a small amount
28   of data. */
29
30#define EXPECT_S(fun,name,answer)                                       \
31  got = fun (z);                                                        \
32  if (got != answer)                                                    \
33    {                                                                   \
34      printf ("%s (%s) got %d want %d\n", name, expr, got, answer);     \
35      printf (" z size %d\n", SIZ(z));                                  \
36      printf (" z dec "); mpz_out_str (stdout, 10, z); printf ("\n");   \
37      printf (" z hex "); mpz_out_str (stdout, 16, z); printf ("\n");   \
38      error = 1;                                                        \
39    }
40
41#define EXPECT(fun,answer)  EXPECT_S(fun,#fun,answer)
42
43int
44main (void)
45{
46  mpz_t       z;
47  int         got;
48  const char  *expr;
49  int         error = 0;
50
51  tests_start ();
52  mpz_init (z);
53
54  mpz_set_ui (z, 0L);
55  expr = "0";
56  EXPECT (mpz_fits_ulong_p, 1);
57  EXPECT (mpz_fits_uint_p, 1);
58  EXPECT (mpz_fits_ushort_p, 1);
59  EXPECT (mpz_fits_slong_p, 1);
60  EXPECT (mpz_fits_sint_p, 1);
61  EXPECT (mpz_fits_sshort_p, 1);
62
63  mpz_set_ui (z, 1L);
64  expr = "1";
65  EXPECT (mpz_fits_ulong_p, 1);
66  EXPECT (mpz_fits_uint_p, 1);
67  EXPECT (mpz_fits_ushort_p, 1);
68  EXPECT (mpz_fits_slong_p, 1);
69  EXPECT (mpz_fits_sint_p, 1);
70  EXPECT (mpz_fits_sshort_p, 1);
71
72  mpz_set_si (z, -1L);
73  expr = "-1";
74  EXPECT (mpz_fits_ulong_p, 0);
75  EXPECT (mpz_fits_uint_p, 0);
76  EXPECT (mpz_fits_ushort_p, 0);
77  EXPECT (mpz_fits_slong_p, 1);
78  EXPECT (mpz_fits_sint_p, 1);
79  EXPECT (mpz_fits_sshort_p, 1);
80
81  mpz_set_ui (z, 1L);
82  mpz_mul_2exp (z, z, 5L*GMP_LIMB_BITS);
83  expr = "2^(5*BPML)";
84  EXPECT (mpz_fits_ulong_p, 0);
85  EXPECT (mpz_fits_uint_p, 0);
86  EXPECT (mpz_fits_ushort_p, 0);
87  EXPECT (mpz_fits_slong_p, 0);
88  EXPECT (mpz_fits_sint_p, 0);
89  EXPECT (mpz_fits_sshort_p, 0);
90
91
92  mpz_set_ui (z, (unsigned long) USHRT_MAX);
93  expr = "USHRT_MAX";
94  EXPECT (mpz_fits_ulong_p, 1);
95  EXPECT (mpz_fits_uint_p, 1);
96  EXPECT (mpz_fits_ushort_p, 1);
97
98  mpz_set_ui (z, (unsigned long) USHRT_MAX);
99  mpz_add_ui (z, z, 1L);
100  expr = "USHRT_MAX + 1";
101  EXPECT (mpz_fits_ushort_p, 0);
102
103
104  mpz_set_ui (z, (unsigned long) UINT_MAX);
105  expr = "UINT_MAX";
106  EXPECT (mpz_fits_ulong_p, 1);
107  EXPECT (mpz_fits_uint_p, 1);
108
109  mpz_set_ui (z, (unsigned long) UINT_MAX);
110  mpz_add_ui (z, z, 1L);
111  expr = "UINT_MAX + 1";
112  EXPECT (mpz_fits_uint_p, 0);
113
114
115  mpz_set_ui (z, ULONG_MAX);
116  expr = "ULONG_MAX";
117  EXPECT (mpz_fits_ulong_p, 1);
118
119  mpz_set_ui (z, ULONG_MAX);
120  mpz_add_ui (z, z, 1L);
121  expr = "ULONG_MAX + 1";
122  EXPECT (mpz_fits_ulong_p, 0);
123
124
125  mpz_set_si (z, (long) SHRT_MAX);
126  expr = "SHRT_MAX";
127  EXPECT (mpz_fits_slong_p, 1);
128  EXPECT (mpz_fits_sint_p, 1);
129  EXPECT (mpz_fits_sshort_p, 1);
130
131  mpz_set_si (z, (long) SHRT_MAX);
132  mpz_add_ui (z, z, 1L);
133  expr = "SHRT_MAX + 1";
134  EXPECT (mpz_fits_sshort_p, 0);
135
136
137  mpz_set_si (z, (long) INT_MAX);
138  expr = "INT_MAX";
139  EXPECT (mpz_fits_slong_p, 1);
140  EXPECT (mpz_fits_sint_p, 1);
141
142  mpz_set_si (z, (long) INT_MAX);
143  mpz_add_ui (z, z, 1L);
144  expr = "INT_MAX + 1";
145  EXPECT (mpz_fits_sint_p, 0);
146
147
148  mpz_set_si (z, LONG_MAX);
149  expr = "LONG_MAX";
150  EXPECT (mpz_fits_slong_p, 1);
151
152  mpz_set_si (z, LONG_MAX);
153  mpz_add_ui (z, z, 1L);
154  expr = "LONG_MAX + 1";
155  EXPECT (mpz_fits_slong_p, 0);
156
157
158  mpz_set_si (z, (long) SHRT_MIN);
159  expr = "SHRT_MIN";
160  EXPECT (mpz_fits_slong_p, 1);
161  EXPECT (mpz_fits_sint_p, 1);
162  EXPECT (mpz_fits_sshort_p, 1);
163
164  mpz_set_si (z, (long) SHRT_MIN);
165  mpz_sub_ui (z, z, 1L);
166  expr = "SHRT_MIN + 1";
167  EXPECT (mpz_fits_sshort_p, 0);
168
169
170  mpz_set_si (z, (long) INT_MIN);
171  expr = "INT_MIN";
172  EXPECT (mpz_fits_slong_p, 1);
173  EXPECT (mpz_fits_sint_p, 1);
174
175  mpz_set_si (z, (long) INT_MIN);
176  mpz_sub_ui (z, z, 1L);
177  expr = "INT_MIN + 1";
178  EXPECT (mpz_fits_sint_p, 0);
179
180
181  mpz_set_si (z, LONG_MIN);
182  expr = "LONG_MIN";
183  EXPECT (mpz_fits_slong_p, 1);
184
185  mpz_set_si (z, LONG_MIN);
186  mpz_sub_ui (z, z, 1L);
187  expr = "LONG_MIN + 1";
188  EXPECT (mpz_fits_slong_p, 0);
189
190
191  if (error)
192    abort ();
193
194  mpz_clear (z);
195  tests_end ();
196  exit (0);
197}
198