[BACK]Return to t-ostream.cc CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / tests / cxx

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>