[PATCH v2 0/2] Adapt and extend tst-efgcvt

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH v2 0/2] Adapt and extend tst-efgcvt

Gabriel F. T. Gomes-2
Added a new patch to the set, adapting the test case to the new testing
framework.

Gabriel F. T. Gomes (2):
  Convert tst-efgcvt to the new test framework
  Add tests for the long double version of ecvt and fcvt

 misc/Makefile                                |   5 +-
 misc/tst-dbl-efgcvt.c                        |  28 ++++++
 misc/{tst-efgcvt.c => tst-efgcvt-template.c} | 135 ++++++++++++++-------------
 misc/tst-ldbl-efgcvt.c                       |  29 ++++++
 4 files changed, 128 insertions(+), 69 deletions(-)
 create mode 100644 misc/tst-dbl-efgcvt.c
 rename misc/{tst-efgcvt.c => tst-efgcvt-template.c} (57%)
 create mode 100644 misc/tst-ldbl-efgcvt.c

--
2.14.5

Reply | Threaded
Open this post in threaded view
|

[PATCH v2 1/2] Convert tst-efgcvt to the new test framework

Gabriel F. T. Gomes-2
New since v1.

-- 8< --
The function do_test in tst-efgcvt.c increments an error counter for
each error that it finds, then returns it to the test framework.
However, the test framework does not expect an error count as return,
but zero for a passing test, one for a failing test, or 77 for an
unsupported test.  Alternatively, the framework provides the function
support_record_failure that records errors, which then allows the test
program to return zero unconditionally.

This patch removes the error counter, replaces each increment of the
counter with a call to support_record_failure, and makes do_test
unconditionally return zero.

Tested for powerpc64le (as-is and with a patched results table to check
that the error reporting actually works).

        * misc/tst-efgcvt.c: Include support/check.h and
        support/test-driver.c.
        (error_count): Remove.
        (output_error): Replace increments to error_count with calls to
        support_record_failure.
        (output_r_error): Likewise.
        (special): Likewise.
        (do_test): Unconditionally return zero.
---
 misc/tst-efgcvt.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/misc/tst-efgcvt.c b/misc/tst-efgcvt.c
index bb716d5198..5a598f49e3 100644
--- a/misc/tst-efgcvt.c
+++ b/misc/tst-efgcvt.c
@@ -25,7 +25,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-int error_count;
+#include <support/check.h>
 
 typedef struct
 {
@@ -101,7 +101,7 @@ output_error (const char *name, double value, int ndigit,
   res_p, res_decpt, res_sign);
   printf ("Should be  p: \"%s\", decpt: %d, sign: %d\n",
   exp_p, exp_decpt, exp_sign);
-  ++error_count;
+  support_record_failure ();
 }
 
 
@@ -116,7 +116,7 @@ output_r_error (const char *name, double value, int ndigit,
   res_p, res_decpt, res_sign, res_return);
   printf ("Should be  buf: \"%s\", decpt: %d, sign: %d\n",
   exp_p, exp_decpt, exp_sign);
-  ++error_count;
+  support_record_failure ();
 }
 
 static void
@@ -189,13 +189,13 @@ special (void)
   if (res == 0)
     {
       printf ("ecvt_r with a too small buffer was succesful.\n");
-      ++error_count;
+      support_record_failure ();
     }
   res = fcvt_r (123.456, 10, &decpt, &sign, buf, 1);
   if (res == 0)
     {
       printf ("fcvt_r with a too small buffer was succesful.\n");
-      ++error_count;
+      support_record_failure ();
     }
 }
 
@@ -209,8 +209,7 @@ do_test (void)
   test_r (fcvt_tests, fcvt_r, "fcvt_r");
   special ();
 
-  return error_count;
+  return 0;
 }
 
-#define TEST_FUNCTION do_test ()
-#include "../test-skeleton.c"
+#include <support/test-driver.c>
--
2.14.5

Reply | Threaded
Open this post in threaded view
|

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

Gabriel F. T. Gomes-2
In reply to this post by Gabriel F. T. Gomes-2
Changes since v1:

  - Rebased on top of the new patch that adapts the test to the new
    testing framework.

-- 8< --
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

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 5a598f49e3..69d253826c 100644
--- a/misc/tst-efgcvt.c
+++ b/misc/tst-efgcvt-template.c
@@ -29,73 +29,74 @@
 
 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");
       support_record_failure ();
     }
-  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");
       support_record_failure ();
     }
 }
@@ -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 0;
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>
--
2.14.5

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v2 1/2] Convert tst-efgcvt to the new test framework

Florian Weimer
In reply to this post by Gabriel F. T. Gomes-2
* Gabriel F. T. Gomes:

> * misc/tst-efgcvt.c: Include support/check.h and
> support/test-driver.c.
> (error_count): Remove.
> (output_error): Replace increments to error_count with calls to
> support_record_failure.
> (output_r_error): Likewise.
> (special): Likewise.
> (do_test): Unconditionally return zero.

Looks good.  Thanks.
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v2 2/2] Add tests for the long double version of ecvt and fcvt

Florian Weimer-5
In reply to this post by Gabriel F. T. Gomes-2
* Gabriel F. T. Gomes:

> 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 5a598f49e3..69d253826c 100644
> --- a/misc/tst-efgcvt.c
> +++ b/misc/tst-efgcvt-template.c
> @@ -29,73 +29,74 @@

> +  { L (0.0), 0, 1, "" },

Do you need the L macro?  I would expect you can write the literal and
let the compiler handle the conversation.

> +  { 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

The preprocessor condition seems wrong for the long double version of
the tests.  Does something like DBL_MANT_DIG even exist for IBM long
double?

My feeling is that we need an EXTRA_ECVT_TESTS macro, or separate
(second) test array definition.

Thanks,
Florian
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v2 2/2] Add tests for the long double version of ecvt and fcvt

Gabriel F. T. Gomes-2
On Tue, 06 Nov 2018, Florian Weimer wrote:

>* Gabriel F. T. Gomes:
>
>> +  { L (0.0), 0, 1, "" },  
>
>Do you need the L macro?  I would expect you can write the literal and
>let the compiler handle the conversation.

Hrm, I don't need it, indeed.

>>  #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  
>
>The preprocessor condition seems wrong for the long double version of
>the tests.  Does something like DBL_MANT_DIG even exist for IBM long
>double?

I thought it wouldn't matter, because, if these numbers fit in a double
typed variable, they would also fit in long double.  Anyhow, now that you
asked, I see that it would be very misleading.

I'm testing a new version.
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v2 1/2] Convert tst-efgcvt to the new test framework

Gabriel F. T. Gomes-2
In reply to this post by Florian Weimer
On Thu, 01 Nov 2018, Florian Weimer wrote:

>* Gabriel F. T. Gomes:
>
>> * misc/tst-efgcvt.c: Include support/check.h and
>> support/test-driver.c.
>> (error_count): Remove.
>> (output_error): Replace increments to error_count with calls to
>> support_record_failure.
>> (output_r_error): Likewise.
>> (special): Likewise.
>> (do_test): Unconditionally return zero.  
>
>Looks good.  Thanks.

Thanks.  Now committed.