Stricter check for printf result for NaN arguments.
[gnulib.git] / tests / test-vasprintf-posix.c
index aa8a0bb..51aebdf 100644 (file)
@@ -74,6 +74,27 @@ strmatch (const char *pattern, const char *string)
   return 1;
 }
 
+/* Test whether string[start_index..end_index-1] is a valid textual
+   representation of NaN.  */
+static int
+strisnan (const char *string, size_t start_index, size_t end_index, int uppercase)
+{
+  if (start_index < end_index)
+    {
+      if (string[start_index] == '-')
+       start_index++;
+      if (start_index + 3 <= end_index
+         && memcmp (string + start_index, uppercase ? "NAN" : "nan", 3) == 0)
+       {
+         start_index += 3;
+         if (start_index == end_index
+             || (string[start_index] == '(' && string[end_index - 1] == ')'))
+           return 1;
+       }
+    }
+  return 0;
+}
+         
 static void
 test_function (int (*my_asprintf) (char **, const char *, ...))
 {
@@ -209,8 +230,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
       my_asprintf (&result, "%a %d", NaN (), 33, 44, 55);
     ASSERT (result != NULL);
     ASSERT (strlen (result) >= 3 + 3
-           && (memcmp (result, "nan", 3) == 0
-               || memcmp (result, "-nan", 4) == 0)
+           && strisnan (result, 0, strlen (result) - 3, 0)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -445,8 +465,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
     /* "0000000nan 33" is not a valid result; see
        <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
     ASSERT (strlen (result) == 20 + 3
-           && (memcmp (result + strspn (result, " "), "nan", 3) == 0
-               || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
+           && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -525,8 +544,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
       my_asprintf (&result, "%La %d", 0.0L / 0.0L, 33, 44, 55);
     ASSERT (result != NULL);
     ASSERT (strlen (result) >= 3 + 3
-           && (memcmp (result, "nan", 3) == 0
-               || memcmp (result, "-nan", 4) == 0)
+           && strisnan (result, 0, strlen (result) - 3, 0)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -762,8 +780,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
     /* "0000000nan 33" is not a valid result; see
        <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
     ASSERT (strlen (result) == 20 + 3
-           && (memcmp (result + strspn (result, " "), "nan", 3) == 0
-               || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
+           && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -941,8 +958,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
       my_asprintf (&result, "%f %d", NaN (), 33, 44, 55);
     ASSERT (result != NULL);
     ASSERT (strlen (result) >= 3 + 3
-           && (memcmp (result, "nan", 3) == 0
-               || memcmp (result, "-nan", 4) == 0)
+           && strisnan (result, 0, strlen (result) - 3, 0)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -1035,8 +1051,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
       my_asprintf (&result, "%020f %d", NaN (), 33, 44, 55);
     ASSERT (result != NULL);
     ASSERT (strlen (result) == 20 + 3
-           && (memcmp (result + strspn (result, " "), "nan", 3) == 0
-               || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
+           && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -1223,8 +1238,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
       my_asprintf (&result, "%Lf %d", zero / zero, 33, 44, 55);
     ASSERT (result != NULL);
     ASSERT (strlen (result) >= 3 + 3
-           && (memcmp (result, "nan", 3) == 0
-               || memcmp (result, "-nan", 4) == 0)
+           && strisnan (result, 0, strlen (result) - 3, 0)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -1318,8 +1332,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
       my_asprintf (&result, "%020Lf %d", zero / zero, 33, 44, 55);
     ASSERT (result != NULL);
     ASSERT (strlen (result) == 20 + 3
-           && (memcmp (result + strspn (result, " "), "nan", 3) == 0
-               || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
+           && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -1416,8 +1429,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
       my_asprintf (&result, "%F %d", NaN (), 33, 44, 55);
     ASSERT (result != NULL);
     ASSERT (strlen (result) >= 3 + 3
-           && (memcmp (result, "NAN", 3) == 0
-               || memcmp (result, "-NAN", 4) == 0)
+           && strisnan (result, 0, strlen (result) - 3, 1)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -1534,8 +1546,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
       my_asprintf (&result, "%LF %d", zero / zero, 33, 44, 55);
     ASSERT (result != NULL);
     ASSERT (strlen (result) >= 3 + 3
-           && (memcmp (result, "NAN", 3) == 0
-               || memcmp (result, "-NAN", 4) == 0)
+           && strisnan (result, 0, strlen (result) - 3, 1)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -1757,8 +1768,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
       my_asprintf (&result, "%e %d", NaN (), 33, 44, 55);
     ASSERT (result != NULL);
     ASSERT (strlen (result) >= 3 + 3
-           && (memcmp (result, "nan", 3) == 0
-               || memcmp (result, "-nan", 4) == 0)
+           && strisnan (result, 0, strlen (result) - 3, 0)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -1869,8 +1879,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
       my_asprintf (&result, "%020e %d", NaN (), 33, 44, 55);
     ASSERT (result != NULL);
     ASSERT (strlen (result) == 20 + 3
-           && (memcmp (result + strspn (result, " "), "nan", 3) == 0
-               || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
+           && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -2058,8 +2067,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
       my_asprintf (&result, "%Le %d", zero / zero, 33, 44, 55);
     ASSERT (result != NULL);
     ASSERT (strlen (result) >= 3 + 3
-           && (memcmp (result, "nan", 3) == 0
-               || memcmp (result, "-nan", 4) == 0)
+           && strisnan (result, 0, strlen (result) - 3, 0)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -2163,8 +2171,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
       my_asprintf (&result, "%020Le %d", zero / zero, 33, 44, 55);
     ASSERT (result != NULL);
     ASSERT (strlen (result) == 20 + 3
-           && (memcmp (result + strspn (result, " "), "nan", 3) == 0
-               || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
+           && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -2362,8 +2369,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
       my_asprintf (&result, "%g %d", NaN (), 33, 44, 55);
     ASSERT (result != NULL);
     ASSERT (strlen (result) >= 3 + 3
-           && (memcmp (result, "nan", 3) == 0
-               || memcmp (result, "-nan", 4) == 0)
+           && strisnan (result, 0, strlen (result) - 3, 0)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -2467,8 +2473,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
       my_asprintf (&result, "%020g %d", NaN (), 33, 44, 55);
     ASSERT (result != NULL);
     ASSERT (strlen (result) == 20 + 3
-           && (memcmp (result + strspn (result, " "), "nan", 3) == 0
-               || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
+           && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -2656,8 +2661,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
       my_asprintf (&result, "%Lg %d", zero / zero, 33, 44, 55);
     ASSERT (result != NULL);
     ASSERT (strlen (result) >= 3 + 3
-           && (memcmp (result, "nan", 3) == 0
-               || memcmp (result, "-nan", 4) == 0)
+           && strisnan (result, 0, strlen (result) - 3, 0)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);
@@ -2761,8 +2765,7 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
       my_asprintf (&result, "%020Lg %d", zero / zero, 33, 44, 55);
     ASSERT (result != NULL);
     ASSERT (strlen (result) == 20 + 3
-           && (memcmp (result + strspn (result, " "), "nan", 3) == 0
-               || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
+           && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
     free (result);