diff options
Diffstat (limited to 'tests/check_data.c')
-rw-r--r-- | tests/check_data.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/tests/check_data.c b/tests/check_data.c new file mode 100644 index 0000000..6d6bc69 --- /dev/null +++ b/tests/check_data.c @@ -0,0 +1,118 @@ +/* check_data.c -- Check computed data against reference result. + +Copyright (C) 2012, 2013 INRIA + +This file is part of GNU MPC. + +GNU MPC is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this program. If not, see http://www.gnu.org/licenses/ . +*/ + +#include "mpc-tests.h" + +#define MPC_INEX_CMP(c, r, i) \ + (((r) == TERNARY_NOT_CHECKED || (r) == MPC_INEX_RE(c)) \ + && ((i) == TERNARY_NOT_CHECKED || (i) == MPC_INEX_IM (c))) + +static int +check_param (mpc_operand_t* got, mpc_operand_t* expected, mpc_param_t t) +{ + switch (t) + { + case NATIVE_INT: + return got->i == expected->i; + case NATIVE_UL: + return got->ui == expected->ui; + case NATIVE_L: + return got->si == expected->si; + case NATIVE_D: + return got->d == expected->d; + + case GMP_Z: + return mpz_cmp (got->mpz, expected->mpz); + case GMP_Q: + return mpq_cmp (got->mpq, expected->mpq); + case GMP_F: + return mpf_cmp (got->mpf, expected->mpf); + + case MPFR_INEX: + return expected->mpfr_inex == TERNARY_NOT_CHECKED + || got->mpfr_inex == expected->mpfr_inex; + + case MPFR: + return tpl_check_mpfr_data (got->mpfr, + expected->mpfr_data); + + case MPC_INEX: + return MPC_INEX_CMP (got->mpc_inex, + expected->mpc_inex_data.real, + expected->mpc_inex_data.imag); + + case MPC: + return tpl_check_mpc_data (got->mpc, + expected->mpc_data); + + default: + fprintf (stderr, "check_data: unsupported type.\n"); + exit (1); + } +} + +void +check_data (mpc_datafile_context_t* dc, mpc_fun_param_t* params, int reused_op) +{ + int out, i; + int total = params->nbout + params->nbin; + + for (out = 0; out < params->nbout; out++) + { + if (!check_param (&(params->P[out]), &(params->P[total + out]), + params->T[out])) + { + printf ("%s() failed", params->name); + if (dc != NULL) + printf (" (line %lu, file %s)", + dc->test_line_number, dc->pathname); + else + printf (" with random parameter%c", + params->nbin > 2 ? 's' : '\0'); + + if (reused_op != 0) + printf (" when reusing input parameter op%d as output parameter", + reused_op - params->nbout); + printf ("\n"); + + for (i = 0; i < params->nbin; i++) + { + printf ("op%d", i + 1); + print_parameter (params, params->nbout + i); + } + + for (i = 0; i < params->nbout; i++) + { + if ((params->T[i] == MPFR_INEX && params->T[out] != MPFR_INEX) + || (params->T[i] == MPC_INEX && params->T[out] != MPC_INEX)) + continue; /* don't print inexact flag if it is correct */ + + printf (" got%c", + (total + i > params->nbout ? '\0' : i + '0')); + print_parameter (params, i); + printf ("expected%c", + (total + i > params->nbout ? '\0' : i + '0')); + print_parameter (params, total + i); + } + printf ("\n"); + exit (1); + } + } +} |