[Gmp-commit] /var/hg/gmp: New test mpq/io.c.

mercurial at gmplib.org mercurial at gmplib.org
Fri Apr 20 22:30:34 CEST 2012


details:   /var/hg/gmp/rev/41150d18e236
changeset: 14875:41150d18e236
user:      Torbjorn Granlund <tege at gmplib.org>
date:      Fri Apr 20 22:24:38 2012 +0200
description:
New test mpq/io.c.

diffstat:

 ChangeLog             |    3 +
 tests/mpq/Makefile.am |    4 +-
 tests/mpq/io.c        |  137 ++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 142 insertions(+), 2 deletions(-)

diffs (173 lines):

diff -r fa36d825eb81 -r 41150d18e236 ChangeLog
--- a/ChangeLog	Fri Apr 20 11:59:54 2012 +0200
+++ b/ChangeLog	Fri Apr 20 22:24:38 2012 +0200
@@ -1,5 +1,8 @@
 2012-04-20  Torbjorn Granlund  <tege at gmplib.org>
 
+	* tests/mpq/io.c: New file.
+	* tests/mpq/Makefile.am: Run it.
+
 	* mpz/clrbit.c: Simplify along the lines of setbit.c.
 
 2012-04-20 Marco Bodrato <bodrato at mail.dm.unipi.it>
diff -r fa36d825eb81 -r 41150d18e236 tests/mpq/Makefile.am
--- a/tests/mpq/Makefile.am	Fri Apr 20 11:59:54 2012 +0200
+++ b/tests/mpq/Makefile.am	Fri Apr 20 22:24:38 2012 +0200
@@ -1,6 +1,6 @@
 ## Process this file with automake to generate Makefile.in
 
-# Copyright 1996, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+# Copyright 1996, 1999, 2000, 2001, 2002, 2012 Free Software Foundation, Inc.
 #
 # This file is part of the GNU MP Library.
 #
@@ -22,7 +22,7 @@
 LDADD = $(top_builddir)/tests/libtests.la $(top_builddir)/libgmp.la
 
 check_PROGRAMS = t-aors t-cmp t-cmp_ui t-cmp_si t-equal t-get_d t-get_str \
-  t-inp_str t-inv t-md_2exp t-set_f t-set_str
+  t-inp_str t-inv t-md_2exp t-set_f t-set_str io
 TESTS = $(check_PROGRAMS)
 
 # Temporary files used by the tests.  Removed automatically if the tests
diff -r fa36d825eb81 -r 41150d18e236 tests/mpq/io.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/mpq/io.c	Fri Apr 20 22:24:38 2012 +0200
@@ -0,0 +1,137 @@
+/* Test conversion and I/O using mpq_out_str and mpq_inp_str.
+
+Copyright 1993, 1994, 1996, 2000, 2001, 2012 Free Software Foundation, Inc.
+
+This file is part of the GNU MP Library.
+
+The GNU MP Library 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.
+
+The GNU MP Library 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 the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>		/* for unlink */
+#endif
+
+#include "gmp.h"
+#include "gmp-impl.h"
+#include "tests.h"
+
+#define FILENAME  "io.tmp"
+
+void
+debug_mp (mpq_t x, int base)
+{
+  mpq_out_str (stdout, base, x); fputc ('\n', stdout);
+}
+
+int
+main (int argc, char **argv)
+{
+  mpq_t  op1, op2;
+  mp_size_t size;
+  int i;
+  int reps = 10000;
+  FILE *fp;
+  int base;
+  gmp_randstate_ptr rands;
+  mpz_t bs;
+  unsigned long bsi, size_range;
+  size_t nread;
+
+  tests_start ();
+  rands = RANDS;
+
+  mpz_init (bs);
+
+  if (argc == 2)
+    reps = atoi (argv[1]);
+
+  mpq_init (op1);
+  mpq_init (op2);
+
+  fp = fopen (FILENAME, "w+");
+
+  for (i = 0; i < reps; i++)
+    {
+      mpz_urandomb (bs, rands, 32);
+      size_range = mpz_get_ui (bs) % 10 + 2;
+
+      mpz_urandomb (bs, rands, size_range);
+      size = mpz_get_ui (bs);
+      mpz_errandomb (mpq_numref(op1), rands, 512L);
+      mpz_errandomb_nonzero (mpq_denref(op1), rands, 512L);
+      mpq_canonicalize (op1);
+
+      mpz_urandomb (bs, rands, 1);
+      bsi = mpz_get_ui (bs);
+      if ((bsi & 1) != 0)
+	mpq_neg (op1, op1);
+
+      mpz_urandomb (bs, rands, 16);
+      bsi = mpz_get_ui (bs);
+      base = bsi % 36 + 1;
+      if (base == 1)
+	base = 0;
+
+      rewind (fp);
+      if (mpq_out_str (fp, base, op1) == 0
+	  || putc (' ', fp) == EOF
+	  || fflush (fp) != 0)
+	{
+	  printf ("mpq_out_str write error\n");
+	  abort ();
+	}
+
+      rewind (fp);
+      nread = mpq_inp_str (op2, fp, base);
+      if (nread == 0)
+	{
+	  if (ferror (fp))
+	    printf ("mpq_inp_str stream read error\n");
+	  else
+	    printf ("mpq_inp_str data conversion error\n");
+	  abort ();
+	}
+
+      if (nread != ftell(fp))
+	{
+	  printf ("mpq_inp_str nread doesn't match ftell\n");
+	  printf ("  nread  %lu\n", (unsigned long) nread);
+	  printf ("  ftell  %ld\n", ftell(fp));
+	  abort ();
+	}
+
+      if (mpq_cmp (op1, op2))
+	{
+	  printf ("ERROR\n");
+	  printf ("op1  = "); debug_mp (op1, -16);
+	  printf ("op2  = "); debug_mp (op2, -16);
+	  printf ("base = %d\n", base);
+	  abort ();
+	}
+    }
+
+  fclose (fp);
+
+  unlink (FILENAME);
+
+  mpz_clear (bs);
+  mpq_clear (op1);
+  mpq_clear (op2);
+
+  tests_end ();
+  exit (0);
+}


More information about the gmp-commit mailing list