]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Add tests for argp_error and argp_failure with floating-point parameters
authorGabriel F. T. Gomes <gabriel@inconstante.eti.br>
Wed, 13 Jun 2018 01:27:21 +0000 (22:27 -0300)
committerGabriel F. T. Gomes <gabriel@inconstante.eti.br>
Tue, 6 Nov 2018 13:19:54 +0000 (11:19 -0200)
The functions argp_error and argp_failure, from argp.h, have a format
string as parameter, which can possibly request the printing of
floating-point values.  These values could be of long double type, which
can have different formats, depending on the architecture and on
compilation parameters (for instance, on powerpc, long double values can
have double format (-mlong-double-64) or IBM Extended Precision format
(-mlong-double-128)).

This patch adds tests for argp_error and argp_failure that contain a
format string with double and long double conversion specifiers ('%f'
and '%Lf').  These tests automatically check that the default format of
the long double type works.  A future patch will extend the test for
platforms that can have an optional format for long double.

Tested for powerpc64le.

* argp/Makefile (tests): Add tst-ldbl-argp.
* argp/tst-ldbl-argp.c: New file.

ChangeLog
argp/Makefile
argp/tst-ldbl-argp.c [new file with mode: 0644]

index d7ee676cf8ccce17b459f2d598b848f2786cc259..f61a292d972e516ba056046349ea5260595b4351 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2018-11-06  Gabriel F. T. Gomes  <gabriel@inconstante.eti.br>
+
+       * argp/Makefile (tests): Add tst-ldbl-argp.
+       * argp/tst-ldbl-argp.c: New file.
+
 2018-11-05  Arjun Shankar  <arjun@redhat.com>
 
        * iconv/gconv_conf.c (__gconv_read_conf): Remove NULL check for
index 6e4799c220779f97a8b9ab895bfd92ac8ed8c958..2ea71185a33004085eef60ff15e0d8fc1d1ce337 100644 (file)
@@ -26,7 +26,8 @@ headers               = argp.h
 routines       = $(addprefix argp-, ba fmtstream fs-xinl help parse pv \
                                     pvh xinl eexst)
 
-tests          = argp-test tst-argp1 bug-argp1 tst-argp2 bug-argp2
+tests          = argp-test tst-argp1 bug-argp1 tst-argp2 bug-argp2 \
+                 tst-ldbl-argp
 
 CFLAGS-argp-help.c += $(uses-callbacks) -fexceptions
 CFLAGS-argp-parse.c += $(uses-callbacks)
diff --git a/argp/tst-ldbl-argp.c b/argp/tst-ldbl-argp.c
new file mode 100644 (file)
index 0000000..4465f81
--- /dev/null
@@ -0,0 +1,109 @@
+/* Testing of long double conversions in argp.h functions.
+   Copyright (C) 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/>.  */
+
+#include <argp.h>
+#include <string.h>
+
+#include <support/capture_subprocess.h>
+#include <support/check.h>
+
+static const struct argp_option
+options[] =
+{
+  { "error", 'e', "format", OPTION_ARG_OPTIONAL,
+    "Run argp_error function with a format string", 0 },
+  { "failure", 'f', "format", OPTION_ARG_OPTIONAL,
+    "Run argp_failure function with a format string", 0 },
+  { NULL, 0, NULL, 0, NULL }
+};
+
+static error_t
+parser (int key, char *arg, struct argp_state *state)
+{
+  switch (key)
+    {
+      case 'e':
+       argp_error (state, "%Lf%f%Lf%f", (long double) -1, (double) -2,
+                   (long double) -3, (double) -4);
+       break;
+      case 'f':
+       argp_failure (state, 0, 0, "%Lf%f%Lf%f", (long double) -1,
+                     (double) -2, (long double) -3, (double) -4);
+       break;
+      default:
+       return ARGP_ERR_UNKNOWN;
+    }
+  return 0;
+}
+
+static struct argp
+argp =
+{
+  options, parser
+};
+
+int argc = 2;
+char *argv[3] = { (char *) "test-argp", NULL, NULL };
+
+static void
+do_test_call (void)
+{
+  int remaining;
+  argp_parse (&argp, argc, argv, 0, &remaining, NULL);
+}
+
+static int
+do_one_test (const char *expected)
+{
+  struct support_capture_subprocess result;
+  result = support_capture_subprocess ((void *) &do_test_call, NULL);
+
+  if (strcmp (result.err.buffer, expected) != 0)
+    {
+      support_record_failure ();
+      printf ("error:\n"
+             "    expected: '%s'\n"
+             "      actual: '%s'\n",
+             expected, result.err.buffer);
+    }
+
+  return 0;
+}
+
+static int
+do_test (void)
+{
+  const char *param_error = "--error";
+  const char *expected_error =
+    "test-argp: -1.000000-2.000000-3.000000-4.000000\n"
+    "Try `test-argp --help' or `test-argp --usage' for more information.\n";
+
+  const char *param_failure = "--failure";
+  const char *expected_failure =
+    "test-argp: -1.000000-2.000000-3.000000-4.000000\n";
+
+  argv[1] = (char *) param_error;
+  do_one_test (expected_error);
+
+  argv[1] = (char *) param_failure;
+  do_one_test (expected_failure);
+
+  return 0;
+}
+
+#include <support/test-driver.c>