unigbrk: New modules for grapheme clusters.
[pspp] / tests / test-copysign.c
index 60bda2fe8622466da676d0b7e0a4bf90f78ffd1c..3c75e126e483403bfdacc79eb7a0ceeac36b9ee1 100644 (file)
 SIGNATURE_CHECK (copysign, double, (double, double));
 
 #include "macros.h"
+#include "minus-zero.h"
+
+#include <string.h>
 
 volatile double x;
 volatile double y;
 double z;
+double zero = 0.0;
 
 int
 main ()
@@ -56,5 +60,52 @@ main ()
   z = copysign (x, y);
   ASSERT (z == -0.6);
 
+  /* From signed zero.  */
+  x = 1.0;
+  y = 0.0;
+  z = copysign (x, y);
+  ASSERT (z == 1.0);
+
+  x = 1.0;
+  y = minus_zerod;
+  z = copysign (x, y);
+  /* Assume all gnulib targets support -0.0, until proven otherwise.  */
+  ASSERT (z == -1.0);
+
+  x = -1.0;
+  y = 0.0;
+  z = copysign (x, y);
+  ASSERT (z == 1.0);
+
+  x = -1.0;
+  y = minus_zerod;
+  z = copysign (x, y);
+  ASSERT (z == -1.0);
+
+  /* To signed zero.  */
+  x = 0.0;
+  y = 1.0;
+  z = copysign (x, y);
+  ASSERT (z == 0.0);
+  ASSERT (memcmp (&z, &zero, sizeof z) == 0);
+
+  x = 0.0;
+  y = -1.0;
+  z = copysign (x, y);
+  ASSERT (z == 0.0);
+  ASSERT (memcmp (&z, &zero, sizeof z) != 0);
+
+  x = minus_zerod;
+  y = 1.0;
+  z = copysign (x, y);
+  ASSERT (z == 0.0);
+  ASSERT (memcmp (&z, &zero, sizeof z) == 0);
+
+  x = minus_zerod;
+  y = -1.0;
+  z = copysign (x, y);
+  ASSERT (z == 0.0);
+  ASSERT (memcmp (&z, &zero, sizeof z) != 0);
+
   return 0;
 }