From a92fbf1256ed2e17ffb108d7962696e4a8a35a56 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Fri, 19 Apr 2024 02:21:34 +0200 Subject: [PATCH 2/6] totalordermag: Add tests. * tests/test-totalordermag.c: New file, based on tests/test-totalorder.c. * tests/test-totalordermag.h: New file, based on tests/test-totalorder.h. * modules/totalordermag-tests: New file, based on modules/totalorder-tests. --- ChangeLog | 8 ++++ modules/totalordermag-tests | 19 +++++++++ tests/test-totalordermag.c | 33 +++++++++++++++ tests/test-totalordermag.h | 82 +++++++++++++++++++++++++++++++++++++ 4 files changed, 142 insertions(+) create mode 100644 modules/totalordermag-tests create mode 100644 tests/test-totalordermag.c create mode 100644 tests/test-totalordermag.h diff --git a/ChangeLog b/ChangeLog index c2e2e40d97..8ddc7cf6ba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2024-04-18 Bruno Haible + totalordermag: Add tests. + * tests/test-totalordermag.c: New file, based on + tests/test-totalorder.c. + * tests/test-totalordermag.h: New file, based on + tests/test-totalorder.h. + * modules/totalordermag-tests: New file, based on + modules/totalorder-tests. + totalordermag: New module. * lib/math.in.h (totalordermag): New declaration. * lib/totalordermag.c: New file, based on lib/totalorder.c. diff --git a/modules/totalordermag-tests b/modules/totalordermag-tests new file mode 100644 index 0000000000..da45992e66 --- /dev/null +++ b/modules/totalordermag-tests @@ -0,0 +1,19 @@ +Files: +tests/test-totalordermag.c +tests/test-totalordermag.h +tests/minus-zero.h +tests/infinity.h +tests/signature.h +tests/macros.h + +Depends-on: +signed-nan +signed-snan +setpayload + +configure.ac: + +Makefile.am: +TESTS += test-totalordermag +check_PROGRAMS += test-totalordermag +test_totalordermag_LDADD = $(LDADD) @TOTALORDERMAG_LIBM@ $(SETPAYLOAD_LIBM) diff --git a/tests/test-totalordermag.c b/tests/test-totalordermag.c new file mode 100644 index 0000000000..5b2c4c70d9 --- /dev/null +++ b/tests/test-totalordermag.c @@ -0,0 +1,33 @@ +/* Test totalordermag. + Copyright 2023-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 (totalordermag, int, (const double *, const double *)); + +#define TOTALORDER totalordermag +#define TOTALORDER_TYPE memory_double +#define TOTALORDER_INF Infinityd +#define TOTALORDER_MINUS_ZERO minus_zerod +#define TOTALORDER_SETPAYLOAD setpayload +#define TOTALORDER_HAVE_SNAN HAVE_SNAND +#define TOTALORDER_POSITIVE_SNAN memory_positive_SNaNd +#define TOTALORDER_NEGATIVE_SNAN memory_negative_SNaNd +#include "test-totalordermag.h" diff --git a/tests/test-totalordermag.h b/tests/test-totalordermag.h new file mode 100644 index 0000000000..4d4746fae1 --- /dev/null +++ b/tests/test-totalordermag.h @@ -0,0 +1,82 @@ +/* Test a totalordermag-like function. + Copyright 2023-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 + +#include +#include "infinity.h" +#include "macros.h" +#include "minus-zero.h" +#include "signed-nan.h" +#include "signed-snan.h" + +static TOTALORDER_TYPE +positive_NaN_with_payload (int payload) +{ + TOTALORDER_TYPE x; + ASSERT (TOTALORDER_SETPAYLOAD (&x.value, payload) == 0); + return x; +} + +static TOTALORDER_TYPE +negative_NaN_with_payload (int payload) +{ + TOTALORDER_TYPE x; + ASSERT (TOTALORDER_SETPAYLOAD (&x.value, payload) == 0); + x.value = - x.value; + return x; +} + +int +main () +{ + TOTALORDER_TYPE x[] = + { + negative_NaN_with_payload (1729), + negative_NaN_with_payload (641), +#if TOTALORDER_HAVE_SNAN + TOTALORDER_NEGATIVE_SNAN (), +#endif + { -TOTALORDER_INF () }, + { -1e37 }, + { -1 }, + { -1e-5 }, + { TOTALORDER_MINUS_ZERO }, + { 0 }, + { 1e-5 }, + { 1 }, + { 1e37 }, + { TOTALORDER_INF () }, +#if TOTALORDER_HAVE_SNAN + TOTALORDER_POSITIVE_SNAN (), +#endif + positive_NaN_with_payload (641), + positive_NaN_with_payload (1729) + }; + int n = SIZEOF (x); + int result = 0; + + for (int i = 0; i < n; i++) + for (int j = 0; j < n; j++) + if (!(!!TOTALORDER (&x[i].value, &x[j].value) + == ((i < n / 2 ? n - 1 - i : i) <= (j < n /2 ? n - 1 - j : j)))) + { + fprintf (stderr, "Failed: i=%d j=%d\n", i, j); + result = 1; + } + + return result; +} -- 2.34.1