From patchwork Thu Oct 6 22:40:45 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gabriel F T Gomes X-Patchwork-Id: 16322 Received: (qmail 92646 invoked by alias); 6 Oct 2016 22:41:16 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 92150 invoked by uid 89); 6 Oct 2016 22:41:11 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.1 required=5.0 tests=AWL, BAYES_00, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW, RCVD_IN_SEMBACKSCATTER autolearn=no version=3.3.2 spammy=en_us.utf-8, UD:en_US.UTF-8, en_USUTF8, en_usutf8 X-HELO: mx0a-001b2d01.pphosted.com From: "Gabriel F. T. Gomes" To: libc-alpha@sourceware.org Cc: ricaljasan@pacific.net, joseph@codesourcery.com Subject: [PATCH v7 3/3] Add tests for strfrom functions Date: Thu, 6 Oct 2016 19:40:45 -0300 In-Reply-To: <1475793645-20556-1-git-send-email-gftg@linux.vnet.ibm.com> References: <1475793645-20556-1-git-send-email-gftg@linux.vnet.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16100622-0028-0000-0000-0000015475CF X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 16100622-0029-0000-0000-000014427E8D Message-Id: <1475793645-20556-4-git-send-email-gftg@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2016-10-06_09:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=4 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1609300000 definitions=main-1610060396 From: Rajalakshmi Srinivasaraghavan 2016-09-21 Rajalakshmi Srinivasaraghavan * stdlib/Makefile (tests): Add tst-strfrom and tst-strfrom-locale. * stdlib/tst-strfrom.c: New file. * stdlib/tst-strfrom-locale.c: New file. --- stdlib/Makefile | 4 +- stdlib/tst-strfrom-locale.c | 179 ++++++++++++++++++++++++++++++++++++++++++++ stdlib/tst-strfrom.c | 179 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 361 insertions(+), 1 deletion(-) create mode 100644 stdlib/tst-strfrom-locale.c create mode 100644 stdlib/tst-strfrom.c diff --git a/stdlib/Makefile b/stdlib/Makefile index 3cacb8b..3cce9d9 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -79,7 +79,7 @@ tests := tst-strtol tst-strtod testmb testrand testsort testdiv \ tst-setcontext3 tst-tls-atexit-nodelete \ tst-strtol-locale tst-strtod-nan-locale tst-strfmon_l \ tst-quick_exit tst-thread-quick_exit tst-width \ - tst-width-stdint + tst-width-stdint tst-strfrom tst-strfrom-locale tests-static := tst-secure-getenv ifeq ($(have-cxx-thread_local),yes) CFLAGS-tst-quick_exit.o = -std=c++11 @@ -158,6 +158,8 @@ $(objpfx)tst-strtod5.out: $(gen-locales) $(objpfx)tst-strtol-locale.out: $(gen-locales) $(objpfx)tst-strtod-nan-locale.out: $(gen-locales) $(objpfx)tst-strfmon_l.out: $(gen-locales) +$(objpfx)tst-strfrom.out: $(gen-locales) +$(objpfx)tst-strfrom-locale.out: $(gen-locales) endif # Testdir has to be named stdlib and needs to be writable diff --git a/stdlib/tst-strfrom-locale.c b/stdlib/tst-strfrom-locale.c new file mode 100644 index 0000000..ab97ad9 --- /dev/null +++ b/stdlib/tst-strfrom-locale.c @@ -0,0 +1,179 @@ +/* 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 + . */ + +#include +#include +#include +#include +#include +#include + +#include "tst-strtod.h" + +/* Hexadecimal tests. */ +struct htest +{ + double val; + const char *fmt; + const char *exp[4]; +}; +static const struct htest htests[] = { + {0x1.ffp+6, "%a", { "0x1,ffp+6", "0x3,fep+5", "0x7,fcp+4", "0xf,f8p+3" } }, + {0x1.88p+4, "%a", { "0x1,88p+4", "0x3,1p+3", "0x6,2p+2", "0xc,4p+1" } }, + {-0x1.88p+5, "%A", { "-0X1,88P+5", "-0X3,1P+4", "-0X6,2P+3", "-0XC,4P+2" } }, + {0x1.44p+10, "%a", { "0x1,44p+10", "0x2,88p+9", "0x5,1p+8", "0xa,2p+7"} }, + {0x0.0040p+0, "%a", { "0x1p-10", "0x2p-11", "0x4p-12", "0x8p-13"} }, + {10.0, "%a", { "0x1,4p+3", "0x2,8p+2", "0x5p+1", "0xap+0"} }, + {0, NULL, {NULL}}, +}; + +/* Tests with buffer size small. */ +struct stest +{ + const char *expect; + double val; + const char *fmt; + int size; + int rc; +}; +static const struct stest stests[] = { + {"1234", 12345.345, "%g", 5, 7}, + {"0,12", .125, "%f", 5, 8}, + {"9,99", 9.999, "%.3f", 5, 5}, + {"100", 1e2, "%g", 5, 3}, + {NULL, 0, "%f", 50, 0}, +}; + +struct ltest +{ + const char *expect; + double val; + const char *fmt; + int size; + int rc; +}; +static const struct ltest ltests[] = { + {"inf", HUGE_VAL, "%f", 50, 3}, + {"12,345000", 12.345, "%f", 50, 9}, + {"0,125000", .125, "%f", 50, 8}, + {"9,999", 9.999, "%.3f", 50, 5}, + {"0,000000", 0.0, "%f", 50, 8}, + {"0,125000", .125, "%f", 50, 8}, + {"inf", HUGE_VAL, "%f", 50, 3}, + {"INF", DBL_MAX * DBL_MAX, "%F", 50, 3}, + {"9,900000", 9.9, "%f", 50, 8}, + {"9,900", 9.9, "%.3f", 50, 5}, + {"9,1", 9.123456, "%.5f", 4, 7}, + {"nan", __builtin_nan (""), "%f", 50, 3}, + {"NAN", __builtin_nans (""), "%G", 50, 3}, + {"-INF", -HUGE_VAL, "%G", 50, 4}, + {"-NAN", -NAN, "%G", 50, 4}, + {"-inf", -HUGE_VAL, "%g", 50, 4}, + {"0", 0.0, "%g", 50, 1}, + {"-INF", -DBL_MAX * DBL_MAX, "%G", 50, 4}, + {"9,91235", 9.91234567812345678, "%g", 50, 7}, + {"79,8765", 79.8765432111, "%g", 50, 7}, + {"79,8765", 79.8765432111, "%G", 50, 7}, + {"1,000000e+38", 1e+38, "%e", 50, 12}, + {"1,000000e+38", 1e38, "%e", 50, 12}, + {"-1,000000e-37", -1e-37, "%e", 50, 13}, + {"1,000000e-37", 0.00000001e-29, "%e", 50, 12}, + {"1,000000e-37", 1.000000e-37, "%e", 50, 12}, + {"5,900000e-16", 5.9e-16, "%e", 50, 12}, + {"1,234500e+20", 12.345e19, "%e", 50, 12}, + {"1,000000e+05", 1e5, "%e", 50, 12}, + {"nan", NAN, "%e", 50, 3}, + {"1,797690e+38", 1.79769e+38, "%e", 50, 12}, + {NULL, 0, "%e", 50, 0}, +}; + +#define TEST_STRFROM(STRTOF, FTYPE, FTOSTR, LSUF, CSUF) \ +static int \ +test_ ## STRTOF (void) \ +{ \ + char buf[50], sbuf[5]; \ + const struct ltest *lt; \ + const struct htest *ht; \ + const struct stest *st; \ + int status = 0; \ + int rc = 0, rc1 = 0; \ + for (st = stests; st->expect != NULL; ++st) \ + { \ + rc = FTOSTR (sbuf, st->size, st->fmt, st->val); \ + rc1 = (strcmp (sbuf, st->expect) != 0) || (rc != st->rc); \ + if (rc1) \ + { \ + printf (#FTOSTR ": got %s (%d), expected %s (%d)\n", \ + sbuf, rc, st->expect, st->rc); \ + status++; \ + } \ + } \ + for (lt = ltests; lt->expect != NULL; ++lt) \ + { \ + rc = FTOSTR (buf, lt->size, lt->fmt, lt->val); \ + rc1 = (strcmp (buf, lt->expect) != 0) || (rc != lt->rc); \ + if (rc1) \ + { \ + printf (#FTOSTR ": got %s (%d), expected %s (%d)\n", \ + buf, rc, lt->expect, lt->rc); \ + status++; \ + } \ + } \ + for (ht = htests; ht->val != 0; ++ht) \ + { \ + rc = FTOSTR (buf, 50, ht->fmt, ht->val); \ + if (strcmp (buf, ht->exp[0]) == 0 || \ + strcmp (buf, ht->exp[1]) == 0 || \ + strcmp (buf, ht->exp[2]) == 0 || \ + strcmp (buf, ht->exp[3]) == 0) \ + continue; \ + else \ + { \ + printf (#FTOSTR ": got %s (%d), expected %s or %s or %s " \ + "or %s\n", buf, rc, ht->exp[0], ht->exp[1], \ + ht->exp[2], ht->exp[3]); \ + status++; \ + } \ + } \ + return status; \ +} + +GEN_TEST_STRTOD_FOREACH (TEST_STRFROM) + +static int +test_locale (const char *locale) +{ + printf ("Testing in locale: %s\n", locale); + if (setlocale (LC_ALL, locale) == NULL) + { + printf ("Cannot set locale %s\n", locale); + } + return STRTOD_TEST_FOREACH (test_); +} +static int +do_test (void) +{ + int result = 0; + result += test_locale ("de_DE.UTF-8"); + result += test_locale ("tr_TR.ISO-8859-9"); + result += test_locale ("tr_TR.UTF-8"); + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/stdlib/tst-strfrom.c b/stdlib/tst-strfrom.c new file mode 100644 index 0000000..8482239 --- /dev/null +++ b/stdlib/tst-strfrom.c @@ -0,0 +1,179 @@ +/* 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 + . */ + +#include +#include +#include +#include +#include +#include + +#include "tst-strtod.h" + +/* Hexadecimal tests. */ +struct htest +{ + double val; + const char *fmt; + const char *exp[4]; +}; +static const struct htest htests[] = { + {0x1.ffp+6, "%a", { "0x1.ffp+6", "0x3.fep+5", "0x7.fcp+4", "0xf.f8p+3" } }, + {0x1.88p+4, "%a", { "0x1.88p+4", "0x3.1p+3", "0x6.2p+2", "0xc.4p+1" } }, + {-0x1.88p+5, "%A", { "-0X1.88P+5", "-0X3.1P+4", "-0X6.2P+3", "-0XC.4P+2" } }, + {0x1.44p+10, "%a", { "0x1.44p+10", "0x2.88p+9", "0x5.1p+8", "0xa.2p+7"} }, + {0x0.0040p+0, "%a", { "0x1p-10", "0x2p-11", "0x4p-12", "0x8p-13"} }, + {10.0, "%a", { "0x1.4p+3", "0x2.8p+2", "0x5p+1", "0xap+0"} }, + {0, NULL, {NULL}}, +}; + +/* Tests with buffer size small. */ +struct stest +{ + const char *expect; + double val; + const char *fmt; + int size; + int rc; +}; +static const struct stest stests[] = { + {"1234", 12345.345, "%g", 5, 7}, + {"0.12", .125, "%f", 5, 8}, + {"9.99", 9.999, "%.3f", 5, 5}, + {"100", 1e2, "%g", 5, 3}, + {NULL, 0, "%f", 50, 0}, +}; + +struct ltest +{ + const char *expect; + double val; + const char *fmt; + int size; + int rc; +}; +static const struct ltest ltests[] = { + {"inf", HUGE_VAL, "%f", 50, 3}, + {"12.345000", 12.345, "%f", 50, 9}, + {"0.125000", .125, "%f", 50, 8}, + {"9.999", 9.999, "%.3f", 50, 5}, + {"0.000000", 0.0, "%f", 50, 8}, + {"0.125000", .125, "%f", 50, 8}, + {"inf", HUGE_VAL, "%f", 50, 3}, + {"INF", DBL_MAX * DBL_MAX, "%F", 50, 3}, + {"9.900000", 9.9, "%f", 50, 8}, + {"9.900", 9.9, "%.3f", 50, 5}, + {"9.1", 9.123456, "%.5f", 4, 7}, + {"nan", __builtin_nan (""), "%f", 50, 3}, + {"NAN", __builtin_nans (""), "%G", 50, 3}, + {"-INF", -HUGE_VAL, "%G", 50, 4}, + {"-NAN", -NAN, "%G", 50, 4}, + {"-inf", -HUGE_VAL, "%g", 50, 4}, + {"0", 0.0, "%g", 50, 1}, + {"-INF", -DBL_MAX * DBL_MAX, "%G", 50, 4}, + {"9.91235", 9.91234567812345678, "%g", 50, 7}, + {"79.8765", 79.8765432111, "%g", 50, 7}, + {"79.8765", 79.8765432111, "%G", 50, 7}, + {"1.000000e+38", 1e+38, "%e", 50, 12}, + {"1.000000e+38", 1e38, "%e", 50, 12}, + {"-1.000000e-37", -1e-37, "%e", 50, 13}, + {"1.000000e-37", 0.00000001e-29, "%e", 50, 12}, + {"1.000000e-37", 1.000000e-37, "%e", 50, 12}, + {"5.900000e-16", 5.9e-16, "%e", 50, 12}, + {"1.234500e+20", 12.345e19, "%e", 50, 12}, + {"1.000000e+05", 1e5, "%e", 50, 12}, + {"nan", NAN, "%e", 50, 3}, + {"1.797690e+38", 1.79769e+38, "%e", 50, 12}, + {NULL, 0, "%e", 50, 0}, +}; + +#define TEST_STRFROM(STRTOF, FTYPE, FTOSTR, LSUF, CSUF) \ +static int \ +test_ ## STRTOF (void) \ +{ \ + char buf[50], sbuf[5]; \ + const struct ltest *lt; \ + const struct htest *ht; \ + const struct stest *st; \ + int status = 0; \ + int rc = 0, rc1 = 0; \ + for (st = stests; st->expect != NULL; ++st) \ + { \ + rc = FTOSTR (sbuf, st->size, st->fmt, st->val); \ + rc1 = (strcmp (sbuf, st->expect) != 0) || (rc != st->rc); \ + if (rc1) \ + { \ + printf (#FTOSTR ": got %s (%d), expected %s (%d)\n", \ + sbuf, rc, st->expect, st->rc); \ + status++; \ + } \ + } \ + for (lt = ltests; lt->expect != NULL; ++lt) \ + { \ + rc = FTOSTR (buf, lt->size, lt->fmt, lt->val); \ + rc1 = (strcmp (buf, lt->expect) != 0) || (rc != lt->rc); \ + if (rc1) \ + { \ + printf (#FTOSTR ": got %s (%d), expected %s (%d)\n", \ + buf, rc, lt->expect, lt->rc); \ + status++; \ + } \ + } \ + for (ht = htests; ht->val != 0; ++ht) \ + { \ + rc = FTOSTR (buf, 50, ht->fmt, ht->val); \ + if (strcmp (buf, ht->exp[0]) == 0 || \ + strcmp (buf, ht->exp[1]) == 0 || \ + strcmp (buf, ht->exp[2]) == 0 || \ + strcmp (buf, ht->exp[3]) == 0) \ + continue; \ + else \ + { \ + printf (#FTOSTR ": got %s (%d), expected %s or %s or %s " \ + "or %s\n", buf, rc, ht->exp[0], ht->exp[1], \ + ht->exp[2], ht->exp[3]); \ + status++; \ + } \ + } \ + return status; \ +} + +GEN_TEST_STRTOD_FOREACH (TEST_STRFROM) + +static int +test_locale (const char *locale) +{ + printf ("Testing in locale: %s\n", locale); + if (setlocale (LC_ALL, locale) == NULL) + { + printf ("Cannot set locale %s\n", locale); + } + return STRTOD_TEST_FOREACH (test_); +} +static int +do_test (void) +{ + int result = 0; + result += test_locale ("C"); + result += test_locale ("en_US.ISO-8859-1"); + result += test_locale ("en_US.UTF-8"); + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c"