aboutsummaryrefslogtreecommitdiff
path: root/stdlib/tst-strfrom.h
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/tst-strfrom.h')
-rw-r--r--stdlib/tst-strfrom.h120
1 files changed, 120 insertions, 0 deletions
diff --git a/stdlib/tst-strfrom.h b/stdlib/tst-strfrom.h
new file mode 100644
index 0000000..31a6492
--- /dev/null
+++ b/stdlib/tst-strfrom.h
@@ -0,0 +1,120 @@
+/* Tests for strfromf, strfromd, strfroml functions.
+ Copyright (C) 2016 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <float.h>
+#include <math.h>
+#include <locale.h>
+
+#include "tst-strtod.h"
+
+#define _CONCAT(a, b) a ## b
+#define CONCAT(a, b) _CONCAT (a, b)
+
+/* Generator to create an FTYPE member variabled named FSUF
+ * used to populate struct member variables. */
+#define FTYPE_MEMBER(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \
+ FTYPE FSUF;
+
+#define STRUCT_FOREACH_FLOAT_FTYPE GEN_TEST_STRTOD_FOREACH (FTYPE_MEMBER)
+
+#define ENTRY(FSUF, FTYPE, FTOSTR, LSUF, CSUF, ...) \
+ CONCAT (__VA_ARGS__, CSUF),
+/* This is hacky way around the seemingly unavoidable macro
+ * expansion of the INFINITY or HUGE_VAL like macros in the
+ * above. It is assumed the compiler will implicitly convert
+ * the infinity correctly. */
+#define INF INFINITY + 0.0
+#define NAN_ NAN + 0.0
+
+struct test_input
+{
+ STRUCT_FOREACH_FLOAT_FTYPE
+};
+struct test {
+ const char *s;
+ const char *fmt;
+ int size;
+ int rc;
+ struct test_input t;
+};
+#define TEST(s, fmt, size, rc, val) \
+ { \
+ s, fmt, size, rc, { GEN_TEST_STRTOD_FOREACH (ENTRY, val) } \
+ }
+/* Hexadecimal tests. */
+struct htests
+{
+ const char *fmt;
+ const char *exp[4];
+ struct test_input t;
+};
+#define HTEST(fmt, exp1, exp2, exp3, exp4, val) \
+ { \
+ fmt, exp1, exp2, exp3, exp4, { GEN_TEST_STRTOD_FOREACH (ENTRY, val) } \
+ }
+
+#define TEST_STRFROM(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \
+static int \
+test_ ## FSUF (void) \
+{ \
+ char buf[50], sbuf[5]; \
+ int status = 0; \
+ int i, rc = 0, rc1 = 0; \
+ for (i = 0; i < sizeof (stest) / sizeof (stest[0]); i++) \
+ { \
+ rc = FTOSTR (sbuf, stest[i].size, stest[i].fmt, stest[i].t.FSUF); \
+ rc1 = (strcmp (sbuf, stest[i].s) != 0) || (rc != stest[i].rc); \
+ if (rc1) \
+ { \
+ printf (#FTOSTR ": got %s (%d), expected %s (%d)\n", \
+ sbuf, rc, stest[i].s, stest[i].rc); \
+ status++; \
+ } \
+ } \
+ for (i = 0; i < sizeof (tests) / sizeof (tests[0]); i++) \
+ { \
+ rc = FTOSTR (buf, tests[i].size, tests[i].fmt, tests[i].t.FSUF); \
+ rc1 = (strcmp (buf, tests[i].s) != 0) || (rc != tests[i].rc); \
+ if (rc1) \
+ { \
+ printf (#FTOSTR ": got %s (%d), expected %s (%d)\n", \
+ buf, rc, tests[i].s, tests[i].rc); \
+ status++; \
+ } \
+ } \
+ for (i = 0; i < sizeof (htest) / sizeof (htest[0]); i++) \
+ { \
+ rc = FTOSTR (buf, 50, htest[i].fmt, htest[i].t.FSUF); \
+ if (strcmp (buf, htest[i].exp[0]) == 0 || \
+ strcmp (buf, htest[i].exp[1]) == 0 || \
+ strcmp (buf, htest[i].exp[2]) == 0 || \
+ strcmp (buf, htest[i].exp[3]) == 0) \
+ continue; \
+ else \
+ { \
+ printf (#FTOSTR ": got %s (%d), expected %s or %s or %s " \
+ "or %s\n", buf, rc, htest[i].exp[0], htest[i].exp[1], \
+ htest[i].exp[2], htest[i].exp[3]); \
+ status++; \
+ } \
+ } \
+ return status; \
+}