diff mbox series

[2/2] Add tests for the long double version of ecvt and fcvt

Message ID 20181101005330.19692-2-gabriel@inconstante.eti.br
State New
Headers show
Series [1/2] Fix typo in the documentation of gcvt | expand

Commit Message

Gabriel F. T. Gomes Nov. 1, 2018, 12:53 a.m. UTC
The test case misc/tst-efgcvt.c only tests the double variants of the
Old-fashioned System V number-to-string functions: ecvt, fcvt, and their
re-entrant counterparts.  With a few macros, the code can be reused for
the long double versions of these functions.  A future patch will reuse
it again for IEEE long double on powerpc64le.

Tested for powerpc and powerpc64le.

	* misc/Makefile (tests): Remove tst-efgcvt.  Add tst-dbl-efgcvt
	and tst-ldbl-efgcvt.
	* misc/tst-efgcvt.c: Renamed to misc/tst-efgcvt-template.c.
	* misc/tst-efgcvt-template.c: Renamed from misc/tst-efgcvt.c.
	(struct testcase, efcvt_func, efcvt_r_func, ecvt_tests)
	(fcvt_tests, output_error, output_r_error, do_test): Use the
	macros defined in tst-dbl-efgcvt.c and tst-ldbl-efgcvt.c to:
	select the type of floating-point variables and arguments; to
	produce literals and conversion specifiers for printf; and to
	set the names of called functions.
	* misc/tst-dbl-efgcvt.c: New file that defines the macros used
	in tst-efgcvt-template.c.
	* misc/tst-ldbl-efgcvt.c: Likewise.
---
 misc/Makefile                                |   5 +-
 misc/tst-dbl-efgcvt.c                        |  28 +++++++
 misc/{tst-efgcvt.c => tst-efgcvt-template.c} | 120 ++++++++++++++-------------
 misc/tst-ldbl-efgcvt.c                       |  29 +++++++
 4 files changed, 121 insertions(+), 61 deletions(-)
 create mode 100644 misc/tst-dbl-efgcvt.c
 rename misc/{tst-efgcvt.c => tst-efgcvt-template.c} (60%)
 create mode 100644 misc/tst-ldbl-efgcvt.c

Comments

Joseph Myers Nov. 1, 2018, 4:02 p.m. UTC | #1
I think it would be a good idea to clean up this test so it doesn't return 
a count of errors (with no obvious reason that count couldn't be 77 and so 
wrongly interpreted as UNSUPPORTED), so avoiding the new test sharing that 
deficiency with the old one.
Gabriel F. T. Gomes Nov. 1, 2018, 7:39 p.m. UTC | #2
On Thu, 01 Nov 2018, Joseph Myers wrote:

>I think it would be a good idea to clean up this test so it doesn't return 
>a count of errors (with no obvious reason that count couldn't be 77 and so 
>wrongly interpreted as UNSUPPORTED), so avoiding the new test sharing that 
>deficiency with the old one.

Thanks for pointing that out.  I have posted an updated patch.
diff mbox series

Patch

diff --git a/misc/Makefile b/misc/Makefile
index 30e0673c8a..922e48ccd2 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -80,11 +80,12 @@  aux := init-misc
 install-lib := libg.a
 gpl2lgpl := error.c error.h
 
-tests := tst-dirname tst-tsearch tst-fdset tst-efgcvt tst-mntent tst-hsearch \
+tests := tst-dirname tst-tsearch tst-fdset tst-mntent tst-hsearch \
 	 tst-error1 tst-pselect tst-insremque tst-mntent2 bug-hsearch1 \
 	 tst-mntent-blank-corrupt tst-mntent-blank-passno bug18240 \
 	 tst-preadvwritev tst-preadvwritev64 tst-makedev tst-empty \
-	 tst-preadvwritev2 tst-preadvwritev64v2 tst-warn-wide
+	 tst-preadvwritev2 tst-preadvwritev64v2 tst-warn-wide \
+	 tst-dbl-efgcvt tst-ldbl-efgcvt
 
 # Tests which need libdl.
 ifeq (yes,$(build-shared))
diff --git a/misc/tst-dbl-efgcvt.c b/misc/tst-dbl-efgcvt.c
new file mode 100644
index 0000000000..b92dbdbe79
--- /dev/null
+++ b/misc/tst-dbl-efgcvt.c
@@ -0,0 +1,28 @@ 
+/* Tests for *cvt function, double version.
+   Copyright (C) 1998-2018 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C 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 2.1 of the License, or (at your option) any later version.
+
+   The GNU C 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 C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#define ECVT ecvt
+#define FCVT fcvt
+#define ECVT_R ecvt_r
+#define FCVT_R fcvt_r
+#define FLOAT double
+#define L(x) x
+#define NAME(x) #x
+#define PRINTF_CONVERSION "%f"
+
+#include <tst-efgcvt-template.c>
diff --git a/misc/tst-efgcvt.c b/misc/tst-efgcvt-template.c
similarity index 60%
rename from misc/tst-efgcvt.c
rename to misc/tst-efgcvt-template.c
index bb716d5198..7aa1f34181 100644
--- a/misc/tst-efgcvt.c
+++ b/misc/tst-efgcvt-template.c
@@ -29,73 +29,74 @@  int error_count;
 
 typedef struct
 {
-  double value;
+  FLOAT value;
   int ndigit;
   int decpt;
   char result[30];
 } testcase;
 
-typedef char * ((*efcvt_func) (double, int, int *, int *));
+typedef char * ((*efcvt_func) (FLOAT, int, int *, int *));
 
-typedef int ((*efcvt_r_func) (double, int, int *, int *, char *, size_t));
+typedef int ((*efcvt_r_func) (FLOAT, int, int *, int *, char *, size_t));
 
 
 static testcase ecvt_tests[] =
 {
-  { 0.0, 0, 1, "" },
-  { 10.0, 0, 2, "" },
-  { 10.0, 1, 2, "1" },
-  { 10.0, 5, 2, "10000" },
-  { -12.0, 5, 2, "12000" },
-  { 0.2, 4, 0, "2000" },
-  { 0.02, 4, -1, "2000" },
-  { 5.5, 1, 1, "6" },
-  { 1.0, -1, 1, "" },
-  { 0.01, 2, -1, "10" },
-  { 100.0, -2, 3, "" },
-  { 100.0, -5, 3, "" },
-  { 100.0, -4, 3, "" },
-  { 100.01, -4, 3, "" },
-  { 123.01, -4, 3, "" },
-  { 126.71, -4, 3, "" },
-  { 0.0, 4, 1, "0000" },
+  { L (0.0), 0, 1, "" },
+  { L (10.0), 0, 2, "" },
+  { L (10.0), 1, 2, "1" },
+  { L (10.0), 5, 2, "10000" },
+  { L (-12.0), 5, 2, "12000" },
+  { L (0.2), 4, 0, "2000" },
+  { L (0.02), 4, -1, "2000" },
+  { L (5.5), 1, 1, "6" },
+  { L (1.0), -1, 1, "" },
+  { L (0.01), 2, -1, "10" },
+  { L (100.0), -2, 3, "" },
+  { L (100.0), -5, 3, "" },
+  { L (100.0), -4, 3, "" },
+  { L (100.01), -4, 3, "" },
+  { L (123.01), -4, 3, "" },
+  { L (126.71), -4, 3, "" },
+  { L (0.0), 4, 1, "0000" },
 #if DBL_MANT_DIG == 53
-  { 0x1p-1074, 3, -323, "494" },
-  { -0x1p-1074, 3, -323, "494" },
+  { L (0x1p-1074), 3, -323, "494" },
+  { L (-0x1p-1074), 3, -323, "494" },
 #endif
   /* -1.0 is end marker.  */
-  { -1.0, 0, 0, "" }
+  { L (-1.0), 0, 0, "" }
 };
 
 static testcase fcvt_tests[] =
 {
-  { 0.0, 0, 1, "0" },
-  { 10.0, 0, 2, "10" },
-  { 10.0, 1, 2, "100" },
-  { 10.0, 4, 2, "100000" },
-  { -12.0, 5, 2, "1200000" },
-  { 0.2, 4, 0, "2000" },
-  { 0.02, 4, -1, "200" },
-  { 5.5, 1, 1, "55" },
-  { 5.5, 0, 1, "6" },
-  { 0.01, 2, -1, "1" },
-  { 100.0, -2, 3, "100" },
-  { 100.0, -5, 3, "100" },
-  { 100.0, -4, 3, "100" },
-  { 100.01, -4, 3, "100" },
-  { 123.01, -4, 3, "100" },
-  { 126.71, -4, 3, "100" },
-  { 322.5, 16, 3, "3225000000000000000" },
+  { L (0.0), 0, 1, "0" },
+  { L (10.0), 0, 2, "10" },
+  { L (10.0), 1, 2, "100" },
+  { L (10.0), 4, 2, "100000" },
+  { L (-12.0), 5, 2, "1200000" },
+  { L (0.2), 4, 0, "2000" },
+  { L (0.02), 4, -1, "200" },
+  { L (5.5), 1, 1, "55" },
+  { L (5.5), 0, 1, "6" },
+  { L (0.01), 2, -1, "1" },
+  { L (100.0), -2, 3, "100" },
+  { L (100.0), -5, 3, "100" },
+  { L (100.0), -4, 3, "100" },
+  { L (100.01), -4, 3, "100" },
+  { L (123.01), -4, 3, "100" },
+  { L (126.71), -4, 3, "100" },
+  { L (322.5), 16, 3, "3225000000000000000" },
   /* -1.0 is end marker.  */
-  { -1.0, 0, 0, "" }
+  { L (-1.0), 0, 0, "" }
 };
 
 static void
-output_error (const char *name, double value, int ndigit,
+output_error (const char *name, FLOAT value, int ndigit,
 	      const char *exp_p, int exp_decpt, int exp_sign,
 	      char *res_p, int res_decpt, int res_sign)
 {
-  printf ("%s returned wrong result for value: %f, ndigits: %d\n",
+  printf ("%s returned wrong result for value: " PRINTF_CONVERSION
+	  ", ndigits: %d\n",
 	  name, value, ndigit);
   printf ("Result was p: \"%s\", decpt: %d, sign: %d\n",
 	  res_p, res_decpt, res_sign);
@@ -106,11 +107,12 @@  output_error (const char *name, double value, int ndigit,
 
 
 static void
-output_r_error (const char *name, double value, int ndigit,
+output_r_error (const char *name, FLOAT value, int ndigit,
 		const char *exp_p, int exp_decpt, int exp_sign, int exp_return,
 		char *res_p, int res_decpt, int res_sign, int res_return)
 {
-  printf ("%s returned wrong result for value: %f, ndigits: %d\n",
+  printf ("%s returned wrong result for value: " PRINTF_CONVERSION
+	  ", ndigits: %d\n",
 	  name, value, ndigit);
   printf ("Result was buf: \"%s\", decpt: %d, sign: %d return value: %d\n",
 	  res_p, res_decpt, res_sign, res_return);
@@ -171,30 +173,30 @@  special (void)
   char *p;
   char buf [1024];
 
-  p = ecvt (NAN, 10, &decpt, &sign);
+  p = ECVT (NAN, 10, &decpt, &sign);
   if (sign != 0 || strcmp (p, "nan") != 0)
-    output_error ("ecvt", NAN, 10, "nan", 0, 0, p, decpt, sign);
+    output_error (NAME (ecvt), NAN, 10, "nan", 0, 0, p, decpt, sign);
 
-  p = ecvt (INFINITY, 10, &decpt, &sign);
+  p = ECVT (INFINITY, 10, &decpt, &sign);
   if (sign != 0 || strcmp (p, "inf") != 0)
-    output_error ("ecvt", INFINITY, 10, "inf", 0, 0, p, decpt, sign);
+    output_error (NAME (ecvt), INFINITY, 10, "inf", 0, 0, p, decpt, sign);
 
   /* Simply make sure these calls with large NDIGITs don't crash.  */
-  (void) ecvt (123.456, 10000, &decpt, &sign);
-  (void) fcvt (123.456, 10000, &decpt, &sign);
+  (void) ECVT (L (123.456), 10000, &decpt, &sign);
+  (void) FCVT (L (123.456), 10000, &decpt, &sign);
 
   /* Some tests for the reentrant functions.  */
   /* Use a too small buffer.  */
-  res = ecvt_r (123.456, 10, &decpt, &sign, buf, 1);
+  res = ECVT_R (L (123.456), 10, &decpt, &sign, buf, 1);
   if (res == 0)
     {
-      printf ("ecvt_r with a too small buffer was succesful.\n");
+      printf (NAME (ecvt_r) " with a too small buffer was succesful.\n");
       ++error_count;
     }
-  res = fcvt_r (123.456, 10, &decpt, &sign, buf, 1);
+  res = FCVT_R (L (123.456), 10, &decpt, &sign, buf, 1);
   if (res == 0)
     {
-      printf ("fcvt_r with a too small buffer was succesful.\n");
+      printf (NAME (fcvt_r) " with a too small buffer was succesful.\n");
       ++error_count;
     }
 }
@@ -203,10 +205,10 @@  special (void)
 static int
 do_test (void)
 {
-  test (ecvt_tests, ecvt, "ecvt");
-  test (fcvt_tests, fcvt, "fcvt");
-  test_r (ecvt_tests, ecvt_r, "ecvt_r");
-  test_r (fcvt_tests, fcvt_r, "fcvt_r");
+  test (ecvt_tests, ECVT, NAME (ecvt));
+  test (fcvt_tests, FCVT, NAME (fcvt));
+  test_r (ecvt_tests, ECVT_R, NAME (ecvt_r));
+  test_r (fcvt_tests, FCVT_R, NAME (fcvt_r));
   special ();
 
   return error_count;
diff --git a/misc/tst-ldbl-efgcvt.c b/misc/tst-ldbl-efgcvt.c
new file mode 100644
index 0000000000..6dfa1ce52a
--- /dev/null
+++ b/misc/tst-ldbl-efgcvt.c
@@ -0,0 +1,29 @@ 
+/* Tests for *cvt function, long double version.
+   Copyright (C) 1998-2018 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C 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 2.1 of the License, or (at your option) any later version.
+
+   The GNU C 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 C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#define ECVT qecvt
+#define FCVT qfcvt
+#define ECVT_R qecvt_r
+#define FCVT_R qfcvt_r
+#define FLOAT long double
+#define L(x) x##L
+#define NAME(x) NAMEX(q##x)
+#define NAMEX(x) #x
+#define PRINTF_CONVERSION "%Lf"
+
+#include <tst-efgcvt-template.c>