123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- /* Tests for strfromf, strfromd, strfroml functions.
- Copyright (C) 2016-2019 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__, LSUF),
- /* 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; \
- }
|