Annotation of OpenXM_contrib/gmp/tests/cxx/t-ostream.cc, Revision 1.1.1.1
1.1 ohara 1: /* Test ostream formatted output.
2:
3: Copyright 2001, 2002 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 2.1 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; see the file COPYING.LIB. If not, write to
19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20: MA 02111-1307, USA. */
21:
22: #include <iostream>
23: #include <strstream>
24: #include <stdio.h>
25: #include <stdlib.h>
26: #include <string.h>
27: #include "gmp.h"
28: #include "gmp-impl.h"
29: #include "tests.h"
30:
31: using namespace std;
32:
33:
34: int option_check_standard = 0;
35:
36:
37: #define CALL(expr) \
38: do { \
39: got.flags (data[i].flags); \
40: got.width (data[i].width); \
41: got.precision (data[i].precision); \
42: if (data[i].fill == '\0') \
43: got.fill (' '); \
44: else \
45: got.fill (data[i].fill); \
46: \
47: expr; \
48: \
49: if (!got) \
50: { \
51: printf ("\"got\" output error\n"); \
52: abort (); \
53: } \
54: if (got.width() != 0) \
55: { \
56: printf ("\"got\" width not reset to 0\n"); \
57: abort (); \
58: } \
59: \
60: } while (0)
61:
62:
63: #define DUMP() \
64: do { \
65: printf (" want: |%s|\n", data[i].want); \
66: printf (" got: |%s|\n", got.str()); \
67: printf (" width: %d\n", data[i].width); \
68: printf (" prec: %d\n", got.precision()); \
69: printf (" flags: 0x%lX\n", (unsigned long) got.flags()); \
70: } while (0)
71:
72: #define ABORT() \
73: do { \
74: DUMP (); \
75: abort (); \
76: } while (0)
77:
78: void
79: check_mpz (void)
80: {
81: static const struct {
82: const char *z;
83: const char *want;
84: ios::fmtflags flags;
85: int width;
86: int precision;
87: char fill;
88:
89: } data[] = {
90:
91: { "0", "0", ios::dec },
92:
93: { "0", "0", ios::oct },
94: { "0", "0", ios::oct | ios::showbase },
95:
96: { "0", "0", ios::hex },
97: { "0", "0x0", ios::hex | ios::showbase },
98: { "0", "0X0", ios::hex | ios::showbase | ios::uppercase },
99:
100: { "1", "****1", ios::dec, 5, 0, '*' },
101:
102: { "-1", " -1", ios::dec | ios::right, 5 },
103: { "-1", "- 1", ios::dec | ios::internal, 5 },
104: { "-1", "-1 ", ios::dec | ios::left, 5 },
105:
106: { "1", " 0x1", ios::hex | ios::showbase | ios::right, 6 },
107: { "1", "0x 1", ios::hex | ios::showbase | ios::internal, 6 },
108: { "1", "0x1 ", ios::hex | ios::showbase | ios::left, 6 },
109:
110: { "1", " +0x1", ios::hex | ios::showbase | ios::showpos | ios::right, 7 },
111: { "1", "+0x 1", ios::hex | ios::showbase | ios::showpos | ios::internal, 7 },
112: { "1", "+0x1 ", ios::hex | ios::showbase | ios::showpos | ios::left, 7 },
113:
114: { "123", "7b", ios::hex },
115: { "123", "7B", ios::hex | ios::uppercase },
116: { "123", "0x7b", ios::hex | ios::showbase },
117: { "123", "0X7B", ios::hex | ios::showbase | ios::uppercase },
118: { "-123", "-0x7b", ios::hex | ios::showbase },
119: { "-123", "-0X7B", ios::hex | ios::showbase | ios::uppercase },
120:
121: { "123", "173", ios::oct },
122: { "123", "173", ios::oct | ios::uppercase },
123: { "123", "0173", ios::oct | ios::showbase },
124: { "123", "0173", ios::oct | ios::showbase | ios::uppercase },
125: { "-123", "-0173", ios::oct | ios::showbase },
126: { "-123", "-0173", ios::oct | ios::showbase | ios::uppercase },
127:
128: };
129:
130: size_t i;
131: mpz_t z;
132:
133: mpz_init (z);
134:
135: for (i = 0; i < numberof (data); i++)
136: {
137: mpz_set_str_or_abort (z, data[i].z, 0);
138:
139: if (option_check_standard
140: && mpz_fits_slong_p (z)
141:
142: /* no negatives or showpos in hex or oct */
143: && (((data[i].flags & ios::basefield) == ios::hex
144: || (data[i].flags & ios::basefield) == ios::oct)
145: ? (mpz_sgn (z) >= 0
146: && ! (data[i].flags & ios::showpos))
147: : 1)
148: )
149: {
150: ostrstream got;
151: long n = mpz_get_si (z);
152: CALL (got << n << '\0');
153: if (strcmp (got.str(), data[i].want) != 0)
154: {
155: printf ("check_mpz data[%d] doesn't match standard ostream output\n", i);
156: printf (" z: %s\n", data[i].z);
157: printf (" n: %ld\n", n);
158: DUMP ();
159: }
160: }
161:
162: {
163: ostrstream got;
164: CALL (operator<< (got, z) << '\0');
165: if (strcmp (got.str(), data[i].want) != 0)
166: {
167: printf ("mpz operator<< wrong, data[%d]\n", i);
168: printf (" z: %s\n", data[i].z);
169: mpz_trace (" z", z);
170: ABORT ();
171: }
172: }
173: }
174:
175: mpz_clear (z);
176: }
177:
178: void
179: check_mpq (void)
180: {
181: static const struct {
182: const char *q;
183: const char *want;
184: ios::fmtflags flags;
185: int width;
186: int precision;
187: char fill;
188:
189: } data[] = {
190:
191: { "0", "0", ios::dec },
192: { "0", "0", ios::hex },
193: { "0", "0x0", ios::hex | ios::showbase },
194: { "0", "0X0", ios::hex | ios::showbase | ios::uppercase },
195:
196: { "5/8", "5/8", ios::dec },
197: { "5/8", "0X5/0X8", ios::hex | ios::showbase | ios::uppercase },
198:
199: /* zero denominator with showbase */
200: { "0/0", " 0/0", ios::oct | ios::showbase, 10 },
201: { "0/0", " 0/0", ios::dec | ios::showbase, 10 },
202: { "0/0", " 0x0/0x0", ios::hex | ios::showbase, 10 },
203: { "123/0", " 0173/0", ios::oct | ios::showbase, 10 },
204: { "123/0", " 123/0", ios::dec | ios::showbase, 10 },
205: { "123/0", " 0x7b/0x0", ios::hex | ios::showbase, 10 },
206: { "123/0", " 0X7B/0X0", ios::hex | ios::showbase | ios::uppercase, 10 },
207: { "0/123", " 0/0173", ios::oct | ios::showbase, 10 },
208: { "0/123", " 0/123", ios::dec | ios::showbase, 10 },
209: { "0/123", " 0x0/0x7b", ios::hex | ios::showbase, 10 },
210: { "0/123", " 0X0/0X7B", ios::hex | ios::showbase | ios::uppercase, 10 },
211: };
212:
213: size_t i;
214: mpq_t q;
215:
216: mpq_init (q);
217:
218: #define mpq_integer_p(q) (mpz_cmp_ui (mpq_denref(q), 1L) == 0)
219:
220: for (i = 0; i < numberof (data); i++)
221: {
222: mpq_set_str_or_abort (q, data[i].q, 0);
223: MPZ_CHECK_FORMAT (mpq_numref (q));
224: MPZ_CHECK_FORMAT (mpq_denref (q));
225:
226: if (option_check_standard
227: && mpz_fits_slong_p (mpq_numref(q))
228: && mpq_integer_p (q))
229: {
230: ostrstream got;
231: long n = mpz_get_si (mpq_numref(q));
232: CALL (got << n << '\0');
233: if (strcmp (got.str(), data[i].want) != 0)
234: {
235: printf ("check_mpq data[%d] doesn't match standard ostream output\n", i);
236: printf (" q: %s\n", data[i].q);
237: printf (" n: %ld\n", n);
238: DUMP ();
239: }
240: }
241:
242: {
243: ostrstream got;
244: CALL (operator<< (got, q) << '\0');
245: if (strcmp (got.str(), data[i].want) != 0)
246: {
247: printf ("mpq operator<< wrong, data[%d]\n", i);
248: printf (" q: %s\n", data[i].q);
249: mpq_trace (" q", q);
250: ABORT ();
251: }
252: }
253: }
254:
255: mpq_clear (q);
256: }
257:
258:
259: void
260: check_mpf (void)
261: {
262: static const struct {
263: const char *f;
264: const char *want;
265: ios::fmtflags flags;
266: int width;
267: int precision;
268: char fill;
269:
270: } data[] = {
271:
272: { "0", "0", ios::dec },
273: { "0", "+0", ios::dec | ios::showpos },
274: { "0", "0.00000", ios::dec | ios::showpoint },
275: { "0", "0", ios::dec | ios::fixed },
276: { "0", "0.", ios::dec | ios::fixed | ios::showpoint },
277: { "0", "0.000000e+00", ios::dec | ios::scientific },
278: { "0", "0.000000e+00", ios::dec | ios::scientific | ios::showpoint },
279:
280: { "0", "0", ios::dec, 0, 4 },
281: { "0", "0.000", ios::dec | ios::showpoint, 0, 4 },
282: { "0", "0.0000", ios::dec | ios::fixed, 0, 4 },
283: { "0", "0.0000", ios::dec | ios::fixed | ios::showpoint, 0, 4 },
284: { "0", "0.0000e+00", ios::dec | ios::scientific, 0, 4 },
285: { "0", "0.0000e+00", ios::dec | ios::scientific | ios::showpoint, 0, 4 },
286:
287: { "1", "1", ios::dec },
288: { "1", "+1", ios::dec | ios::showpos },
289: { "1", "1.00000", ios::dec | ios::showpoint },
290: { "1", "1", ios::dec | ios::fixed },
291: { "1", "1.", ios::dec | ios::fixed | ios::showpoint },
292: { "1", "1.000000e+00", ios::dec | ios::scientific },
293: { "1", "1.000000e+00", ios::dec | ios::scientific | ios::showpoint },
294:
295: { "1", "1", ios::dec, 0, 4 },
296: { "1", "1.000", ios::dec | ios::showpoint, 0, 4 },
297: { "1", "1.0000", ios::dec | ios::fixed, 0, 4 },
298: { "1", "1.0000", ios::dec | ios::fixed | ios::showpoint, 0, 4 },
299: { "1", "1.0000e+00", ios::dec | ios::scientific, 0, 4 },
300: { "1", "1.0000e+00", ios::dec | ios::scientific | ios::showpoint, 0, 4 },
301:
302: { "-1", "-1", ios::dec | ios::showpos },
303:
304: { "-1", " -1", ios::dec, 4 },
305: { "-1", "- 1", ios::dec | ios::internal, 4 },
306: { "-1", "-1 ", ios::dec | ios::left, 4 },
307:
308: { "-1", " -0x1", ios::hex | ios::showbase, 6 },
309: { "-1", "-0x 1", ios::hex | ios::showbase | ios::internal, 6 },
310: { "-1", "-0x1 ", ios::hex | ios::showbase | ios::left, 6 },
311:
312: { "1", "*********1", ios::dec, 10, 4, '*' },
313: { "1234", "******1234", ios::dec, 10, 4, '*' },
314: { "1234", "*****1234.", ios::dec | ios::showpoint, 10, 4, '*' },
315:
316: { "12345", "1.23e+04", ios::dec, 0, 3 },
317:
318: { "12345", "12345.", ios::dec | ios::fixed | ios::showpoint },
319:
320: { "1.9999999", "2", ios::dec, 0, 1 },
321: { "1.0009999999", "1.001", ios::dec, 0, 4 },
322: { "1.0001", "1", ios::dec, 0, 4 },
323: { "1.0004", "1", ios::dec, 0, 4 },
324: { "1.000555", "1.001", ios::dec, 0, 4 },
325:
326: { "1.0002", "1.000", ios::dec | ios::fixed, 0, 3 },
327: { "1.0008", "1.001", ios::dec | ios::fixed, 0, 3 },
328:
329: { "0", "0", ios::hex },
330: { "0", "0x0", ios::hex | ios::showbase },
331: { "0", "0X0", ios::hex | ios::showbase | ios::uppercase },
332: { "123", "7b", ios::hex },
333: { "123", "0x7b", ios::hex | ios::showbase },
334: { "123", "0X7B", ios::hex | ios::showbase | ios::uppercase },
335:
336: { "0", "0.000@+00", ios::hex | ios::scientific, 0, 3 },
337: { "256", "1.000@+02", ios::hex | ios::scientific, 0, 3 },
338:
339: { "123", "7.b@+01", ios::hex | ios::scientific, 0, 1 },
340: { "123", "7.B@+01", ios::hex | ios::scientific | ios::uppercase, 0, 1 },
341: { "123", "0x7.b@+01", ios::hex | ios::scientific | ios::showbase, 0, 1 },
342: { "123", "0X7.B@+01", ios::hex | ios::scientific | ios::showbase | ios::uppercase, 0, 1 },
343:
344: { "1099511627776", "1.0@+10", ios::hex | ios::scientific, 0, 1 },
345: { "1099511627776", "1.0@+10", ios::hex | ios::scientific | ios::uppercase, 0, 1 },
346:
347: { "0.0625", "1.00@-01", ios::hex | ios::scientific, 0, 2 },
348:
349: { "0", "0", ios::oct },
350: { "123", "173", ios::oct },
351: { "123", "0173", ios::oct | ios::showbase },
352:
353: /* octal showbase suppressed for 0 */
354: { "0", "0", ios::oct | ios::showbase },
355: { ".125", "00.1", ios::oct | ios::showbase, 0, 1 },
356: { ".015625", "00.01", ios::oct | ios::showbase, 0, 2 },
357: { ".125", "00.1", ios::fixed | ios::oct | ios::showbase, 0, 1 },
358: { ".015625", "0.0", ios::fixed | ios::oct | ios::showbase, 0, 1 },
359: { ".015625", "00.01", ios::fixed | ios::oct | ios::showbase, 0, 2 },
360:
361: { "0.125", "1.000000e-01", ios::oct | ios::scientific },
362: { "0.125", "+1.000000e-01", ios::oct | ios::scientific | ios::showpos },
363: { "-0.125", "-1.000000e-01", ios::oct | ios::scientific },
364: { "-0.125", "-1.000000e-01", ios::oct | ios::scientific | ios::showpos },
365:
366: { "0", "0.000e+00", ios::oct | ios::scientific, 0, 3 },
367: { "256", "4.000e+02", ios::oct | ios::scientific, 0, 3 },
368: { "256", "04.000e+02", ios::oct | ios::scientific | ios::showbase, 0, 3 },
369: { "256", "4.000E+02", ios::oct | ios::scientific | ios::uppercase, 0, 3 },
370: { "256", "04.000E+02", ios::oct | ios::scientific | ios::showbase | ios::uppercase, 0, 3 },
371:
372: { "16777216", "1.000000e+08", ios::oct | ios::scientific },
373: { "16777216", "1.000000E+08", ios::oct | ios::scientific | ios::uppercase },
374: { "16777216", "01.000000e+08", ios::oct | ios::scientific | ios::showbase },
375: { "16777216", "01.000000E+08", ios::oct | ios::scientific | ios::showbase | ios::uppercase },
376: { "16777216", "+01.000000e+08", ios::oct | ios::scientific | ios::showbase | ios::showpos },
377: { "16777216", "+01.000000E+08", ios::oct | ios::scientific | ios::showbase | ios::showpos | ios::uppercase },
378: { "-16777216", "-01.000000e+08", ios::oct | ios::scientific | ios::showbase | ios::showpos },
379: { "-16777216", "-01.000000E+08", ios::oct | ios::scientific | ios::showbase | ios::showpos | ios::uppercase },
380:
381: };
382:
383: size_t i;
384: mpf_t f, f2;
385: double d;
386:
387: mpf_init (f);
388: mpf_init (f2);
389:
390: for (i = 0; i < numberof (data); i++)
391: {
392: mpf_set_str_or_abort (f, data[i].f, 0);
393:
394: d = mpf_get_d (f);
395: mpf_set_d (f2, d);
396: if (option_check_standard && mpf_cmp (f, f2) == 0
397: && ! (data[i].flags & (ios::hex | ios::oct | ios::showbase)))
398: {
399: ostrstream got;
400: CALL (got << d << '\0');
401: if (strcmp (got.str(), data[i].want) != 0)
402: {
403: printf ("check_mpf data[%d] doesn't match standard ostream output\n", i);
404: printf (" f: %s\n", data[i].f);
405: printf (" d: %g\n", d);
406: DUMP ();
407: }
408: }
409:
410: {
411: ostrstream got;
412: CALL (operator<< (got, f) << '\0');
413: if (strcmp (got.str(), data[i].want) != 0)
414: {
415: printf ("mpf operator<< wrong, data[%d]\n", i);
416: printf (" f: %s\n", data[i].f);
417: mpf_trace (" f", f);
418: ABORT ();
419: }
420: }
421: }
422:
423: mpf_clear (f);
424: mpf_clear (f2);
425: }
426:
427:
428:
429: int
430: main (int argc, char *argv[])
431: {
432: if (argc > 1 && strcmp (argv[1], "-s") == 0)
433: option_check_standard = 1;
434:
435: tests_start ();
436:
437: check_mpz ();
438: check_mpq ();
439: check_mpf ();
440:
441: tests_end ();
442: exit (0);
443: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>