>From 507b790ed13750b4c81afff56f403d2aeac4ca72 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Wed, 17 Apr 2024 11:09:13 +0200 Subject: [PATCH 6/6] getpayloadl: Add tests. * tests/test-getpayloadl.c: New file. * modules/getpayloadl-tests: New file. --- ChangeLog | 4 ++ modules/getpayloadl-tests | 18 ++++++ tests/test-getpayloadl.c | 119 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+) create mode 100644 modules/getpayloadl-tests create mode 100644 tests/test-getpayloadl.c diff --git a/ChangeLog b/ChangeLog index bcc40cb255..e6b4eff89b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2024-04-17 Bruno Haible + getpayloadl: Add tests. + * tests/test-getpayloadl.c: New file. + * modules/getpayloadl-tests: New file. + getpayloadl: New module. * lib/math.in.h (getpayloadl): New declaration. * lib/getpayloadl.c: New file. diff --git a/modules/getpayloadl-tests b/modules/getpayloadl-tests new file mode 100644 index 0000000000..02433a206d --- /dev/null +++ b/modules/getpayloadl-tests @@ -0,0 +1,18 @@ +Files: +tests/test-getpayloadl.c +tests/minus-zero.h +tests/infinity.h +tests/signature.h +tests/macros.h + +Depends-on: +setpayloadl +setpayloadsigl +signed-snan + +configure.ac: + +Makefile.am: +TESTS += test-getpayloadl +check_PROGRAMS += test-getpayloadl +test_getpayloadl_LDADD = $(LDADD) @GETPAYLOADL_LIBM@ $(SETPAYLOADL_LIBM) $(SETPAYLOADSIGL_LIBM) diff --git a/tests/test-getpayloadl.c b/tests/test-getpayloadl.c new file mode 100644 index 0000000000..4aaa7c5c0c --- /dev/null +++ b/tests/test-getpayloadl.c @@ -0,0 +1,119 @@ +/* Test getpayloadl. + Copyright 2024 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include "signature.h" +SIGNATURE_CHECK (getpayloadl, long double, (const long double *)); + +#include "minus-zero.h" +#include "infinity.h" +#include "signed-snan.h" +#include "macros.h" + +#if defined __powerpc__ && LDBL_MANT_DIG == 106 + /* This is PowerPC "double double", a pair of two doubles. NaN is represented + as the corresponding 64-bit IEEE value in the first double; the second is + irrelevant and therefore does not contain a payload. */ +# define PAYLOAD_BITS (DBL_MANT_DIG - 2) +#else +# define PAYLOAD_BITS (LDBL_MANT_DIG - 2) +#endif + +int +main () +{ + long double arg; + long double ret; + + /* Test non-NaN arguments. */ + + arg = 2.71828182845904523536028747135266249776L; + ret = getpayloadl (&arg); + ASSERT (ret == -1.0L); + + arg = -3.1415926535897932384626433832795028842L; + ret = getpayloadl (&arg); + ASSERT (ret == -1.0L); + + arg = 0.0L; + ret = getpayloadl (&arg); + ASSERT (ret == -1.0L); + + arg = minus_zerol; + ret = getpayloadl (&arg); + ASSERT (ret == -1.0L); + + arg = Infinityl (); + ret = getpayloadl (&arg); + ASSERT (ret == -1.0L); + + arg = - Infinityl (); + ret = getpayloadl (&arg); + ASSERT (ret == -1.0L); + + /* Test quiet NaNs. */ + { + int i; + long double p; + + for (i = 0, p = 1.0L; i < PAYLOAD_BITS; i++, p *= 2.0L) + { + ASSERT (setpayloadl (&arg, p) == 0); + ret = getpayloadl (&arg); + ASSERT (ret == p); + /* Test quiet NaNs with sign bit == 1. */ + arg = - arg; + ret = getpayloadl (&arg); + ASSERT (ret == p); + } + + p = 1320699239819071.0L; + ASSERT (setpayloadl (&arg, p) == 0); + ret = getpayloadl (&arg); + ASSERT (ret == p); + } + + /* Test signalling NaNs. */ + { + int i; + long double p; + + for (i = 0, p = 1.0L; i < PAYLOAD_BITS; i++, p *= 2.0L) + { + ASSERT (setpayloadsigl (&arg, p) == 0); + ret = getpayloadl (&arg); + ASSERT (ret == p); + } + + p = 1320699239819071.0L; + ASSERT (setpayloadsigl (&arg, p) == 0); + ret = getpayloadl (&arg); + ASSERT (ret == p); + + /* Test signalling NaNs with sign bit == 1. */ + memory_long_double pos_arg = memory_positive_SNaNl (); + memory_long_double neg_arg = memory_negative_SNaNl (); + long double pos_ret = getpayloadl (&pos_arg.value); + long double neg_ret = getpayloadl (&neg_arg.value); + ASSERT (neg_ret == pos_ret); + } + + return 0; +} -- 2.34.1