]> Savannah Git Hosting - gnulib.git/commitdiff
fenv-exceptions-state-c23: Add tests.
authorBruno Haible <bruno@clisp.org>
Mon, 30 Oct 2023 15:52:20 +0000 (16:52 +0100)
committerBruno Haible <bruno@clisp.org>
Mon, 30 Oct 2023 15:53:10 +0000 (16:53 +0100)
* tests/test-fenv-except-state-3.c: New file.
* modules/fenv-exceptions-state-c23-tests: New file.

ChangeLog
modules/fenv-exceptions-state-c23-tests [new file with mode: 0644]
tests/test-fenv-except-state-3.c [new file with mode: 0644]

index a513bcf2af28d43c33b10d161f8b76bd9ca713f8..e0bf89a9e2cdf483d40c5c650ea9b6d06402fef6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2023-10-30  Bruno Haible  <bruno@clisp.org>
 
+       fenv-exceptions-state-c23: Add tests.
+       * tests/test-fenv-except-state-3.c: New file.
+       * modules/fenv-exceptions-state-c23-tests: New file.
+
        fenv-exceptions-state-c23: New module.
        * lib/fenv.in.h (fetestexceptflag): New declaration.
        * lib/fenv-except-state-test.c: New file, based on glibc.
diff --git a/modules/fenv-exceptions-state-c23-tests b/modules/fenv-exceptions-state-c23-tests
new file mode 100644 (file)
index 0000000..3d92a47
--- /dev/null
@@ -0,0 +1,13 @@
+Files:
+tests/test-fenv-except-state-3.c
+tests/macros.h
+
+Depends-on:
+fenv-exceptions-tracking-c99
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-fenv-except-state-3
+check_PROGRAMS += test-fenv-except-state-3
+test_fenv_except_state_3_LDADD = $(LDADD) @FENV_EXCEPTIONS_STATE_LIBM@ $(FENV_EXCEPTIONS_TRACKING_LIBM)
diff --git a/tests/test-fenv-except-state-3.c b/tests/test-fenv-except-state-3.c
new file mode 100644 (file)
index 0000000..b1f72e6
--- /dev/null
@@ -0,0 +1,70 @@
+/* Test of saving the floating-point exception status flags.
+   Copyright (C) 2023 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 <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2023.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <fenv.h>
+
+#include "macros.h"
+
+int
+main ()
+{
+  fexcept_t saved_flags_1;
+  fexcept_t saved_flags_2;
+
+  /* Test setting all exception flags.  */
+  if (feraiseexcept (FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT) != 0)
+    {
+      fputs ("Skipping test: floating-point exceptions are not supported on this machine.\n", stderr);
+      return 77;
+    }
+
+  /* Fill saved_flags_1.  */
+  ASSERT (fegetexceptflag (&saved_flags_1,
+                           FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT)
+          == 0);
+  /* Check its contents.  */
+  ASSERT (fetestexceptflag (&saved_flags_1,
+                            FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT)
+          == (FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT));
+  ASSERT (fetestexceptflag (&saved_flags_1, FE_INVALID) == FE_INVALID);
+  ASSERT (fetestexceptflag (&saved_flags_1, FE_DIVBYZERO) == FE_DIVBYZERO);
+  ASSERT (fetestexceptflag (&saved_flags_1, FE_OVERFLOW) == FE_OVERFLOW);
+  ASSERT (fetestexceptflag (&saved_flags_1, FE_UNDERFLOW) == FE_UNDERFLOW);
+  ASSERT (fetestexceptflag (&saved_flags_1, FE_INEXACT) == FE_INEXACT);
+
+  /* Clear some of the exception flags.  */
+  ASSERT (feclearexcept (FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT) == 0);
+  /* Here, the set exception flags are FE_INVALID | FE_DIVBYZERO.  */
+  ASSERT (fetestexcept (FE_INVALID) == FE_INVALID);
+  ASSERT (fetestexcept (FE_DIVBYZERO) == FE_DIVBYZERO);
+  ASSERT (fetestexcept (FE_OVERFLOW) == 0);
+  ASSERT (fetestexcept (FE_UNDERFLOW) == 0);
+  ASSERT (fetestexcept (FE_INEXACT) == 0);
+
+  /* Fill saved_flags_2.  */
+  ASSERT (fegetexceptflag (&saved_flags_2, FE_INVALID | FE_OVERFLOW) == 0);
+  /* Check its contents.  */
+  ASSERT (fetestexceptflag (&saved_flags_2, FE_INVALID | FE_OVERFLOW) == FE_INVALID);
+  ASSERT (fetestexceptflag (&saved_flags_2, FE_INVALID) == FE_INVALID);
+  ASSERT (fetestexceptflag (&saved_flags_2, FE_OVERFLOW) == 0);
+
+  return 0;
+}