|
Packit |
5c3484 |
/* Test istream formatted input.
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
Copyright 2001-2004 Free Software Foundation, Inc.
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
This file is part of the GNU MP Library test suite.
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
The GNU MP Library test suite is free software; you can redistribute it
|
|
Packit |
5c3484 |
and/or modify it under the terms of the GNU General Public License as
|
|
Packit |
5c3484 |
published by the Free Software Foundation; either version 3 of the License,
|
|
Packit |
5c3484 |
or (at your option) any later version.
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
The GNU MP Library test suite is distributed in the hope that it will be
|
|
Packit |
5c3484 |
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
5c3484 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
Packit |
5c3484 |
Public License for more details.
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
You should have received a copy of the GNU General Public License along with
|
|
Packit |
5c3484 |
the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
#include <iostream>
|
|
Packit |
5c3484 |
#include <cstdlib>
|
|
Packit |
5c3484 |
#include <cstring>
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
#include "gmp.h"
|
|
Packit |
5c3484 |
#include "gmp-impl.h"
|
|
Packit |
5c3484 |
#include "tests.h"
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
using namespace std;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
// Under option_check_standard, the various test cases for mpz operator>>
|
|
Packit |
5c3484 |
// are put through the standard operator>> for long, and likewise mpf
|
|
Packit |
5c3484 |
// operator>> is put through double.
|
|
Packit |
5c3484 |
//
|
|
Packit |
5c3484 |
// In g++ 3.3 this results in some printouts about the final position
|
|
Packit |
5c3484 |
// indicated for something like ".e123". Our mpf code stops at the "e"
|
|
Packit |
5c3484 |
// since there's no mantissa digits, but g++ reads the whole thing and only
|
|
Packit |
5c3484 |
// then decides it's bad.
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
bool option_check_standard = false;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
// On some versions of g++ 2.96 it's been observed that putback() may leave
|
|
Packit |
5c3484 |
// tellg() unchanged. We believe this is incorrect and presumably the
|
|
Packit |
5c3484 |
// result of a bug, since for instance it's ok in g++ 2.95 and g++ 3.3. We
|
|
Packit |
5c3484 |
// detect the problem at runtime and disable affected checks.
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
bool putback_tellg_works = true;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
void
|
|
Packit |
5c3484 |
check_putback_tellg (void)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
istringstream input ("hello");
|
|
Packit |
5c3484 |
streampos old_pos, new_pos;
|
|
Packit |
5c3484 |
char c;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
input.get(c);
|
|
Packit |
5c3484 |
old_pos = input.tellg();
|
|
Packit |
5c3484 |
input.putback(c);
|
|
Packit |
5c3484 |
new_pos = input.tellg();
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
if (old_pos == new_pos)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
cout << "Warning, istringstream has a bug: putback() doesn't update tellg().\n";;
|
|
Packit |
5c3484 |
cout << "Tests on tellg() will be skipped.\n";
|
|
Packit |
5c3484 |
putback_tellg_works = false;
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
#define WRONG(str) \
|
|
Packit |
5c3484 |
do { \
|
|
Packit |
5c3484 |
cout << str ", data[" << i << "]\n"; \
|
|
Packit |
5c3484 |
cout << " input: \"" << data[i].input << "\"\n"; \
|
|
Packit |
5c3484 |
cout << " flags: " << hex << input.flags() << dec << "\n"; \
|
|
Packit |
5c3484 |
} while (0)
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
void
|
|
Packit |
5c3484 |
check_mpz (void)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
static const struct {
|
|
Packit |
5c3484 |
const char *input;
|
|
Packit |
5c3484 |
int want_pos;
|
|
Packit |
5c3484 |
const char *want;
|
|
Packit |
5c3484 |
ios::fmtflags flags;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
} data[] = {
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "123", -1, "123", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0123", -1, "83", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0x123", -1, "291", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "-123", -1, "-123", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "-0123", -1, "-83", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "-0x123", -1, "-291", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "+123", -1, "123", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "+0123", -1, "83", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "+0x123", -1, "291", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "0", -1, "0", ios::dec },
|
|
Packit |
5c3484 |
{ "1f", 1, "1", ios::dec },
|
|
Packit |
5c3484 |
{ "011f", 3, "11", ios::dec },
|
|
Packit |
5c3484 |
{ "123", -1, "123", ios::dec },
|
|
Packit |
5c3484 |
{ "-1f", 2, "-1", ios::dec },
|
|
Packit |
5c3484 |
{ "-011f", 4, "-11", ios::dec },
|
|
Packit |
5c3484 |
{ "-123", -1, "-123", ios::dec },
|
|
Packit |
5c3484 |
{ "+1f", 2, "1", ios::dec },
|
|
Packit |
5c3484 |
{ "+011f", 4, "11", ios::dec },
|
|
Packit |
5c3484 |
{ "+123", -1, "123", ios::dec },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "0", -1, "0", ios::oct },
|
|
Packit |
5c3484 |
{ "123", -1, "83", ios::oct },
|
|
Packit |
5c3484 |
{ "-123", -1, "-83", ios::oct },
|
|
Packit |
5c3484 |
{ "+123", -1, "83", ios::oct },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "0", -1, "0", ios::hex },
|
|
Packit |
5c3484 |
{ "123", -1, "291", ios::hex },
|
|
Packit |
5c3484 |
{ "ff", -1, "255", ios::hex },
|
|
Packit |
5c3484 |
{ "FF", -1, "255", ios::hex },
|
|
Packit |
5c3484 |
{ "-123", -1, "-291", ios::hex },
|
|
Packit |
5c3484 |
{ "-ff", -1, "-255", ios::hex },
|
|
Packit |
5c3484 |
{ "-FF", -1, "-255", ios::hex },
|
|
Packit |
5c3484 |
{ "+123", -1, "291", ios::hex },
|
|
Packit |
5c3484 |
{ "+ff", -1, "255", ios::hex },
|
|
Packit |
5c3484 |
{ "+FF", -1, "255", ios::hex },
|
|
Packit |
5c3484 |
{ "ab", -1, "171", ios::hex },
|
|
Packit |
5c3484 |
{ "cd", -1, "205", ios::hex },
|
|
Packit |
5c3484 |
{ "ef", -1, "239", ios::hex },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ " 123", 0, NULL, (ios::fmtflags) 0 }, // not without skipws
|
|
Packit |
5c3484 |
{ " 123", -1, "123", ios::skipws },
|
|
Packit |
5c3484 |
};
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
mpz_t got, want;
|
|
Packit |
5c3484 |
bool got_ok, want_ok;
|
|
Packit |
5c3484 |
bool got_eof, want_eof;
|
|
Packit |
5c3484 |
long got_si, want_si;
|
|
Packit |
5c3484 |
streampos init_tellg, got_pos, want_pos;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
mpz_init (got);
|
|
Packit |
5c3484 |
mpz_init (want);
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
for (size_t i = 0; i < numberof (data); i++)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
size_t input_length = strlen (data[i].input);
|
|
Packit |
5c3484 |
want_pos = (data[i].want_pos == -1
|
|
Packit |
5c3484 |
? input_length : data[i].want_pos);
|
|
Packit |
5c3484 |
want_eof = (want_pos == streampos(input_length));
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
want_ok = (data[i].want != NULL);
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
if (data[i].want != NULL)
|
|
Packit |
5c3484 |
mpz_set_str_or_abort (want, data[i].want, 0);
|
|
Packit |
5c3484 |
else
|
|
Packit |
5c3484 |
mpz_set_ui (want, 0L);
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
if (option_check_standard && mpz_fits_slong_p (want))
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
istringstream input (data[i].input);
|
|
Packit |
5c3484 |
input.flags (data[i].flags);
|
|
Packit |
5c3484 |
init_tellg = input.tellg();
|
|
Packit |
5c3484 |
want_si = mpz_get_si (want);
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
input >> got_si;
|
|
Packit |
5c3484 |
got_ok = !input.fail();
|
|
Packit |
5c3484 |
got_eof = input.eof();
|
|
Packit |
5c3484 |
input.clear();
|
|
Packit |
5c3484 |
got_pos = input.tellg() - init_tellg;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
if (got_ok != want_ok)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("stdc++ operator>> wrong status, check_mpz");
|
|
Packit |
5c3484 |
cout << " want_ok: " << want_ok << "\n";
|
|
Packit |
5c3484 |
cout << " got_ok: " << got_ok << "\n";
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (want_ok && got_si != want_si)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("stdc++ operator>> wrong result, check_mpz");
|
|
Packit |
5c3484 |
cout << " got_si: " << got_si << "\n";
|
|
Packit |
5c3484 |
cout << " want_si: " << want_si << "\n";
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (want_ok && got_eof != want_eof)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("stdc++ operator>> wrong EOF state, check_mpz");
|
|
Packit |
5c3484 |
cout << " got_eof: " << got_eof << "\n";
|
|
Packit |
5c3484 |
cout << " want_eof: " << want_eof << "\n";
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (putback_tellg_works && got_pos != want_pos)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("stdc++ operator>> wrong position, check_mpz");
|
|
Packit |
5c3484 |
cout << " want_pos: " << want_pos << "\n";
|
|
Packit |
5c3484 |
cout << " got_pos: " << got_pos << "\n";
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
istringstream input (data[i].input);
|
|
Packit |
5c3484 |
input.flags (data[i].flags);
|
|
Packit |
5c3484 |
init_tellg = input.tellg();
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
mpz_set_ui (got, 0xDEAD);
|
|
Packit |
5c3484 |
input >> got;
|
|
Packit |
5c3484 |
got_ok = !input.fail();
|
|
Packit |
5c3484 |
got_eof = input.eof();
|
|
Packit |
5c3484 |
input.clear();
|
|
Packit |
5c3484 |
got_pos = input.tellg() - init_tellg;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
if (got_ok != want_ok)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("mpz operator>> wrong status");
|
|
Packit |
5c3484 |
cout << " want_ok: " << want_ok << "\n";
|
|
Packit |
5c3484 |
cout << " got_ok: " << got_ok << "\n";
|
|
Packit |
5c3484 |
abort ();
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (want_ok && mpz_cmp (got, want) != 0)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("mpz operator>> wrong result");
|
|
Packit |
5c3484 |
mpz_trace (" got ", got);
|
|
Packit |
5c3484 |
mpz_trace (" want", want);
|
|
Packit |
5c3484 |
abort ();
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (want_ok && got_eof != want_eof)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("mpz operator>> wrong EOF state");
|
|
Packit |
5c3484 |
cout << " want_eof: " << want_eof << "\n";
|
|
Packit |
5c3484 |
cout << " got_eof: " << got_eof << "\n";
|
|
Packit |
5c3484 |
abort ();
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (putback_tellg_works && got_pos != want_pos)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("mpz operator>> wrong position");
|
|
Packit |
5c3484 |
cout << " want_pos: " << want_pos << "\n";
|
|
Packit |
5c3484 |
cout << " got_pos: " << got_pos << "\n";
|
|
Packit |
5c3484 |
abort ();
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
mpz_clear (got);
|
|
Packit |
5c3484 |
mpz_clear (want);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
void
|
|
Packit |
5c3484 |
check_mpq (void)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
static const struct {
|
|
Packit |
5c3484 |
const char *input;
|
|
Packit |
5c3484 |
int want_pos;
|
|
Packit |
5c3484 |
const char *want;
|
|
Packit |
5c3484 |
ios::fmtflags flags;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
} data[] = {
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "00", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0x0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "123/456", -1, "123/456", ios::dec },
|
|
Packit |
5c3484 |
{ "0123/456", -1, "123/456", ios::dec },
|
|
Packit |
5c3484 |
{ "123/0456", -1, "123/456", ios::dec },
|
|
Packit |
5c3484 |
{ "0123/0456", -1, "123/456", ios::dec },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "123/456", -1, "83/302", ios::oct },
|
|
Packit |
5c3484 |
{ "0123/456", -1, "83/302", ios::oct },
|
|
Packit |
5c3484 |
{ "123/0456", -1, "83/302", ios::oct },
|
|
Packit |
5c3484 |
{ "0123/0456", -1, "83/302", ios::oct },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "ab", -1, "171", ios::hex },
|
|
Packit |
5c3484 |
{ "cd", -1, "205", ios::hex },
|
|
Packit |
5c3484 |
{ "ef", -1, "239", ios::hex },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "0/0", -1, "0/0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "5/8", -1, "5/8", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0x5/0x8", -1, "5/8", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "123/456", -1, "123/456", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "123/0456", -1, "123/302", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "123/0x456", -1, "123/1110", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "123/0X456", -1, "123/1110", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "0123/123", -1, "83/123", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0123/0123", -1, "83/83", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0123/0x123", -1, "83/291", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0123/0X123", -1, "83/291", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "0x123/123", -1, "291/123", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0X123/0123", -1, "291/83", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0x123/0x123", -1, "291/291", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ " 123", 0, NULL, (ios::fmtflags) 0 }, // not without skipws
|
|
Packit |
5c3484 |
{ " 123", -1, "123", ios::skipws },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "123 /456", 3, "123", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "123/ 456", 4, NULL, (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "123/" , -1, NULL, (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "123 /456", 3, "123", ios::skipws },
|
|
Packit |
5c3484 |
{ "123/ 456", 4, NULL, ios::skipws },
|
|
Packit |
5c3484 |
};
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
mpq_t got, want;
|
|
Packit |
5c3484 |
bool got_ok, want_ok;
|
|
Packit |
5c3484 |
bool got_eof, want_eof;
|
|
Packit |
5c3484 |
long got_si, want_si;
|
|
Packit |
5c3484 |
streampos init_tellg, got_pos, want_pos;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
mpq_init (got);
|
|
Packit |
5c3484 |
mpq_init (want);
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
for (size_t i = 0; i < numberof (data); i++)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
size_t input_length = strlen (data[i].input);
|
|
Packit |
5c3484 |
want_pos = (data[i].want_pos == -1
|
|
Packit |
5c3484 |
? input_length : data[i].want_pos);
|
|
Packit |
5c3484 |
want_eof = (want_pos == streampos(input_length));
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
want_ok = (data[i].want != NULL);
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
if (data[i].want != NULL)
|
|
Packit |
5c3484 |
mpq_set_str_or_abort (want, data[i].want, 0);
|
|
Packit |
5c3484 |
else
|
|
Packit |
5c3484 |
mpq_set_ui (want, 0L, 1L);
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
if (option_check_standard
|
|
Packit |
5c3484 |
&& mpz_fits_slong_p (mpq_numref(want))
|
|
Packit |
5c3484 |
&& mpz_cmp_ui (mpq_denref(want), 1L) == 0
|
|
Packit |
5c3484 |
&& strchr (data[i].input, '/') == NULL)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
istringstream input (data[i].input);
|
|
Packit |
5c3484 |
input.flags (data[i].flags);
|
|
Packit |
5c3484 |
init_tellg = input.tellg();
|
|
Packit |
5c3484 |
want_si = mpz_get_si (mpq_numref(want));
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
input >> got_si;
|
|
Packit |
5c3484 |
got_ok = !input.fail();
|
|
Packit |
5c3484 |
got_eof = input.eof();
|
|
Packit |
5c3484 |
input.clear();
|
|
Packit |
5c3484 |
got_pos = input.tellg() - init_tellg;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
if (got_ok != want_ok)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("stdc++ operator>> wrong status, check_mpq");
|
|
Packit |
5c3484 |
cout << " want_ok: " << want_ok << "\n";
|
|
Packit |
5c3484 |
cout << " got_ok: " << got_ok << "\n";
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (want_ok && want_si != got_si)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("stdc++ operator>> wrong result, check_mpq");
|
|
Packit |
5c3484 |
cout << " got_si: " << got_si << "\n";
|
|
Packit |
5c3484 |
cout << " want_si: " << want_si << "\n";
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (want_ok && got_eof != want_eof)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("stdc++ operator>> wrong EOF state, check_mpq");
|
|
Packit |
5c3484 |
cout << " got_eof: " << got_eof << "\n";
|
|
Packit |
5c3484 |
cout << " want_eof: " << want_eof << "\n";
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (putback_tellg_works && got_pos != want_pos)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("stdc++ operator>> wrong position, check_mpq");
|
|
Packit |
5c3484 |
cout << " want_pos: " << want_pos << "\n";
|
|
Packit |
5c3484 |
cout << " got_pos: " << got_pos << "\n";
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
istringstream input (data[i].input);
|
|
Packit |
5c3484 |
input.flags (data[i].flags);
|
|
Packit |
5c3484 |
init_tellg = input.tellg();
|
|
Packit |
5c3484 |
mpq_set_si (got, 0xDEAD, 0xBEEF);
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
input >> got;
|
|
Packit |
5c3484 |
got_ok = !input.fail();
|
|
Packit |
5c3484 |
got_eof = input.eof();
|
|
Packit |
5c3484 |
input.clear();
|
|
Packit |
5c3484 |
got_pos = input.tellg() - init_tellg;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
if (got_ok != want_ok)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("mpq operator>> wrong status");
|
|
Packit |
5c3484 |
cout << " want_ok: " << want_ok << "\n";
|
|
Packit |
5c3484 |
cout << " got_ok: " << got_ok << "\n";
|
|
Packit |
5c3484 |
abort ();
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
// don't use mpq_equal, since we allow non-normalized values to be
|
|
Packit |
5c3484 |
// read, which can trigger ASSERTs in mpq_equal
|
|
Packit |
5c3484 |
if (want_ok && (mpz_cmp (mpq_numref (got), mpq_numref(want)) != 0
|
|
Packit |
5c3484 |
|| mpz_cmp (mpq_denref (got), mpq_denref(want)) != 0))
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("mpq operator>> wrong result");
|
|
Packit |
5c3484 |
mpq_trace (" got ", got);
|
|
Packit |
5c3484 |
mpq_trace (" want", want);
|
|
Packit |
5c3484 |
abort ();
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (want_ok && got_eof != want_eof)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("mpq operator>> wrong EOF state");
|
|
Packit |
5c3484 |
cout << " want_eof: " << want_eof << "\n";
|
|
Packit |
5c3484 |
cout << " got_eof: " << got_eof << "\n";
|
|
Packit |
5c3484 |
abort ();
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (putback_tellg_works && got_pos != want_pos)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("mpq operator>> wrong position");
|
|
Packit |
5c3484 |
cout << " want_pos: " << want_pos << "\n";
|
|
Packit |
5c3484 |
cout << " got_pos: " << got_pos << "\n";
|
|
Packit |
5c3484 |
abort ();
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
mpq_clear (got);
|
|
Packit |
5c3484 |
mpq_clear (want);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
void
|
|
Packit |
5c3484 |
check_mpf (void)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
static const struct {
|
|
Packit |
5c3484 |
const char *input;
|
|
Packit |
5c3484 |
int want_pos;
|
|
Packit |
5c3484 |
const char *want;
|
|
Packit |
5c3484 |
ios::fmtflags flags;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
} data[] = {
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "+0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "-0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0.0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0.", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ ".0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "+.0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "-.0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "+0.00", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "-0.000", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "+0.00", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "-0.000", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0.0e0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0.e0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ ".0e0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0.0e-0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0.e-0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ ".0e-0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0.0e+0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "0.e+0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ ".0e+0", -1, "0", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "1", -1, "1", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "+1", -1, "1", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "-1", -1, "-1", (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ " 0", 0, NULL, (ios::fmtflags) 0 }, // not without skipws
|
|
Packit |
5c3484 |
{ " 0", -1, "0", ios::skipws },
|
|
Packit |
5c3484 |
{ " +0", -1, "0", ios::skipws },
|
|
Packit |
5c3484 |
{ " -0", -1, "0", ios::skipws },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "+-123", 1, NULL, (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "-+123", 1, NULL, (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "1e+-123", 3, NULL, (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "1e-+123", 3, NULL, (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "e123", 0, NULL, (ios::fmtflags) 0 }, // at least one mantissa digit
|
|
Packit |
5c3484 |
{ ".e123", 1, NULL, (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "+.e123", 2, NULL, (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "-.e123", 2, NULL, (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{ "123e", 4, NULL, (ios::fmtflags) 0 }, // at least one exponent digit
|
|
Packit |
5c3484 |
{ "123e-", 5, NULL, (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
{ "123e+", 5, NULL, (ios::fmtflags) 0 },
|
|
Packit |
5c3484 |
};
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
mpf_t got, want;
|
|
Packit |
5c3484 |
bool got_ok, want_ok;
|
|
Packit |
5c3484 |
bool got_eof, want_eof;
|
|
Packit |
5c3484 |
double got_d, want_d;
|
|
Packit |
5c3484 |
streampos init_tellg, got_pos, want_pos;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
mpf_init (got);
|
|
Packit |
5c3484 |
mpf_init (want);
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
for (size_t i = 0; i < numberof (data); i++)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
size_t input_length = strlen (data[i].input);
|
|
Packit |
5c3484 |
want_pos = (data[i].want_pos == -1
|
|
Packit |
5c3484 |
? input_length : data[i].want_pos);
|
|
Packit |
5c3484 |
want_eof = (want_pos == streampos(input_length));
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
want_ok = (data[i].want != NULL);
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
if (data[i].want != NULL)
|
|
Packit |
5c3484 |
mpf_set_str_or_abort (want, data[i].want, 0);
|
|
Packit |
5c3484 |
else
|
|
Packit |
5c3484 |
mpf_set_ui (want, 0L);
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
want_d = mpf_get_d (want);
|
|
Packit |
5c3484 |
if (option_check_standard && mpf_cmp_d (want, want_d) == 0)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
istringstream input (data[i].input);
|
|
Packit |
5c3484 |
input.flags (data[i].flags);
|
|
Packit |
5c3484 |
init_tellg = input.tellg();
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
input >> got_d;
|
|
Packit |
5c3484 |
got_ok = !input.fail();
|
|
Packit |
5c3484 |
got_eof = input.eof();
|
|
Packit |
5c3484 |
input.clear();
|
|
Packit |
5c3484 |
got_pos = input.tellg() - init_tellg;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
if (got_ok != want_ok)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("stdc++ operator>> wrong status, check_mpf");
|
|
Packit |
5c3484 |
cout << " want_ok: " << want_ok << "\n";
|
|
Packit |
5c3484 |
cout << " got_ok: " << got_ok << "\n";
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (want_ok && want_d != got_d)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("stdc++ operator>> wrong result, check_mpf");
|
|
Packit |
5c3484 |
cout << " got: " << got_d << "\n";
|
|
Packit |
5c3484 |
cout << " want: " << want_d << "\n";
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (want_ok && got_eof != want_eof)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("stdc++ operator>> wrong EOF state, check_mpf");
|
|
Packit |
5c3484 |
cout << " got_eof: " << got_eof << "\n";
|
|
Packit |
5c3484 |
cout << " want_eof: " << want_eof << "\n";
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (putback_tellg_works && got_pos != want_pos)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("stdc++ operator>> wrong position, check_mpf");
|
|
Packit |
5c3484 |
cout << " want_pos: " << want_pos << "\n";
|
|
Packit |
5c3484 |
cout << " got_pos: " << got_pos << "\n";
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
istringstream input (data[i].input);
|
|
Packit |
5c3484 |
input.flags (data[i].flags);
|
|
Packit |
5c3484 |
init_tellg = input.tellg();
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
mpf_set_ui (got, 0xDEAD);
|
|
Packit |
5c3484 |
input >> got;
|
|
Packit |
5c3484 |
got_ok = !input.fail();
|
|
Packit |
5c3484 |
got_eof = input.eof();
|
|
Packit |
5c3484 |
input.clear();
|
|
Packit |
5c3484 |
got_pos = input.tellg() - init_tellg;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
if (got_ok != want_ok)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("mpf operator>> wrong status");
|
|
Packit |
5c3484 |
cout << " want_ok: " << want_ok << "\n";
|
|
Packit |
5c3484 |
cout << " got_ok: " << got_ok << "\n";
|
|
Packit |
5c3484 |
abort ();
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (want_ok && mpf_cmp (got, want) != 0)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("mpf operator>> wrong result");
|
|
Packit |
5c3484 |
mpf_trace (" got ", got);
|
|
Packit |
5c3484 |
mpf_trace (" want", want);
|
|
Packit |
5c3484 |
abort ();
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (want_ok && got_eof != want_eof)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("mpf operator>> wrong EOF state");
|
|
Packit |
5c3484 |
cout << " want_eof: " << want_eof << "\n";
|
|
Packit |
5c3484 |
cout << " got_eof: " << got_eof << "\n";
|
|
Packit |
5c3484 |
abort ();
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
if (putback_tellg_works && got_pos != want_pos)
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
WRONG ("mpf operator>> wrong position");
|
|
Packit |
5c3484 |
cout << " want_pos: " << want_pos << "\n";
|
|
Packit |
5c3484 |
cout << " got_pos: " << got_pos << "\n";
|
|
Packit |
5c3484 |
abort ();
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
mpf_clear (got);
|
|
Packit |
5c3484 |
mpf_clear (want);
|
|
Packit |
5c3484 |
}
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
int
|
|
Packit |
5c3484 |
main (int argc, char *argv[])
|
|
Packit |
5c3484 |
{
|
|
Packit |
5c3484 |
if (argc > 1 && strcmp (argv[1], "-s") == 0)
|
|
Packit |
5c3484 |
option_check_standard = true;
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
tests_start ();
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
check_putback_tellg ();
|
|
Packit |
5c3484 |
check_mpz ();
|
|
Packit |
5c3484 |
check_mpq ();
|
|
Packit |
5c3484 |
check_mpf ();
|
|
Packit |
5c3484 |
|
|
Packit |
5c3484 |
tests_end ();
|
|
Packit |
5c3484 |
return 0;
|
|
Packit |
5c3484 |
}
|