]> Savannah Git Hosting - gnulib.git/commitdiff
obstack-zprintf: Add tests.
authorBruno Haible <bruno@clisp.org>
Sat, 22 Jun 2024 19:59:50 +0000 (21:59 +0200)
committerBruno Haible <bruno@clisp.org>
Sat, 22 Jun 2024 19:59:50 +0000 (21:59 +0200)
* tests/test-obstack-printf.h: New file, based on
tests/test-obstack-printf.c.
* tests/test-obstack-printf.c: Include test-obstack-printf.h.
(obstack_chunk_alloc, obstack_chunk_free, test_function): Moved to
tests/test-obstack-printf.h.
(test_obstack_vprintf, test_obstack_printf): Remove functions.
(main): Inline them here.
* tests/test-obstack-zprintf.c: New file, based on
tests/test-obstack-printf.c.
* modules/obstack-printf-tests (Files): Add tests/test-obstack-printf.h.
* modules/obstack-zprintf-tests: New file.

ChangeLog
modules/obstack-printf-tests
modules/obstack-zprintf-tests [new file with mode: 0644]
tests/test-obstack-printf.c
tests/test-obstack-printf.h [new file with mode: 0644]
tests/test-obstack-zprintf.c [new file with mode: 0644]

index 156dd401383503836046b27b0400ee30272d5612..96f1e397da3f9b398c91e672102b0b0f19bfe8e0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
 2024-06-22  Bruno Haible  <bruno@clisp.org>
 
+       obstack-zprintf: Add tests.
+       * tests/test-obstack-printf.h: New file, based on
+       tests/test-obstack-printf.c.
+       * tests/test-obstack-printf.c: Include test-obstack-printf.h.
+       (obstack_chunk_alloc, obstack_chunk_free, test_function): Moved to
+       tests/test-obstack-printf.h.
+       (test_obstack_vprintf, test_obstack_printf): Remove functions.
+       (main): Inline them here.
+       * tests/test-obstack-zprintf.c: New file, based on
+       tests/test-obstack-printf.c.
+       * modules/obstack-printf-tests (Files): Add tests/test-obstack-printf.h.
+       * modules/obstack-zprintf-tests: New file.
+
        obstack-zprintf: New module.
        * lib/stdio.in.h (obstack_zprintf, obstack_vzprintf): New declarations.
        (obstack_printf, obstack_vprintf): Tweak comment.
index 2790e6942b0565f36c753900dc7fa6c8d7c71bc8..d319a79d2016a0328c1e5c6fb3745731b3260c12 100644 (file)
@@ -1,5 +1,6 @@
 Files:
 tests/test-obstack-printf.c
+tests/test-obstack-printf.h
 tests/signature.h
 tests/macros.h
 
diff --git a/modules/obstack-zprintf-tests b/modules/obstack-zprintf-tests
new file mode 100644 (file)
index 0000000..8ee6979
--- /dev/null
@@ -0,0 +1,15 @@
+Files:
+tests/test-obstack-zprintf.c
+tests/test-obstack-printf.h
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+xalloc
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-obstack-zprintf
+check_PROGRAMS += test-obstack-zprintf
+test_obstack_zprintf_LDADD = $(LDADD) @LIBINTL@
index 2c7694320b42c846a2c2fc73e6c96acde9b4d240..c2048c5ceefadf1973b6683d2bee46b5820d090a 100644 (file)
 
 #include <config.h>
 
+/* Specification.  */
 #include <stdio.h>
 
 #include "signature.h"
 SIGNATURE_CHECK (obstack_printf, int, (struct obstack *, char const *, ...));
-SIGNATURE_CHECK (obstack_vprintf, int, (struct obstack *, char const *,
-                                        va_list));
+SIGNATURE_CHECK (obstack_vprintf, int,
+                 (struct obstack *, char const *, va_list));
 
 #include "obstack.h"
 #include "xalloc.h"
@@ -34,73 +35,8 @@ SIGNATURE_CHECK (obstack_vprintf, int, (struct obstack *, char const *,
 
 #include "macros.h"
 
-#define obstack_chunk_alloc xmalloc
-#define obstack_chunk_free free
-
-static void
-test_function (int (*my_obstack_printf) (struct obstack *, const char *, ...))
-{
-  struct obstack obs;
-  obstack_init (&obs);
-  /* In general, be careful that arguments to obstack_* don't have
-     side effects, as not all compilers evaluate macro arguments only
-     once.  */
-
-  /* Grow the obstack to near its boundary, then check that short
-     output longer than the obstack free space grows the obstack.  */
-  {
-    char *base = obstack_base (&obs);
-    char *new_base;
-    int result;
-    int room = obstack_room (&obs) - 4;
-
-    obstack_blank_fast (&obs, room);
-    result = my_obstack_printf (&obs, "%d %s", 123, "456");
-    ASSERT (result == 7);
-    ASSERT (result + room == obstack_object_size (&obs));
-    obstack_1grow (&obs, 0);
-    new_base = obstack_finish (&obs);
-    ASSERT (base != new_base);
-    ASSERT (strcmp (new_base + room, "123 456") == 0);
-  }
-
-  /* Check that strings shorter than the obstack free space don't
-     cause a reshuffling of the obstack.  */
-  {
-    char *base = obstack_base (&obs);
-    char *new_base;
-    int result;
-    int room = obstack_room (&obs);
-
-    ASSERT (8 < room);
-    result = my_obstack_printf (&obs, "%d %s", 123, "456");
-    ASSERT (result == 7);
-    ASSERT (result == obstack_object_size (&obs));
-    new_base = obstack_base (&obs);
-    ASSERT (base == new_base);
-    ASSERT (strncmp (base, "123 456", result) == 0);
-    obstack_finish (&obs);
-  }
-
-  /* Check for generating much more output than a chunk size.  */
-  {
-    char *base = obstack_base (&obs);
-    char *new_base;
-    int result;
-    int i;
-
-    ASSERT (obstack_chunk_size (&obs) < 10000);
-    result = my_obstack_printf (&obs, "%010000d", 0);
-    ASSERT (result == 10000);
-    ASSERT (result == obstack_object_size (&obs));
-    new_base = obstack_base (&obs);
-    ASSERT (base != new_base);
-    for (i = 0; i < 10000; i++)
-      ASSERT (new_base[i] == '0');
-  }
-
-  obstack_free (&obs, NULL);
-}
+#define RETTYPE int
+#include "test-obstack-printf.h"
 
 static int
 my_obstack_printf (struct obstack *obs, const char *format, ...)
@@ -114,22 +50,10 @@ my_obstack_printf (struct obstack *obs, const char *format, ...)
   return ret;
 }
 
-static void
-test_obstack_vprintf ()
-{
-  test_function (my_obstack_printf);
-}
-
-static void
-test_obstack_printf ()
-{
-  test_function (obstack_printf);
-}
-
 int
 main (int argc, char *argv[])
 {
-  test_obstack_vprintf ();
-  test_obstack_printf ();
+  test_function (my_obstack_printf);
+  test_function (obstack_printf);
   return test_exit_status;
 }
diff --git a/tests/test-obstack-printf.h b/tests/test-obstack-printf.h
new file mode 100644 (file)
index 0000000..560decf
--- /dev/null
@@ -0,0 +1,85 @@
+/* Test of obstack_[v][z]printf() functions.
+   Copyright (C) 2008-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 <https://www.gnu.org/licenses/>.  */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2008.  */
+
+#define obstack_chunk_alloc xmalloc
+#define obstack_chunk_free free
+
+static void
+test_function (RETTYPE (*my_obstack_printf) (struct obstack *, const char *, ...))
+{
+  struct obstack obs;
+  obstack_init (&obs);
+  /* In general, be careful that arguments to obstack_* don't have
+     side effects, as not all compilers evaluate macro arguments only
+     once.  */
+
+  /* Grow the obstack to near its boundary, then check that short
+     output longer than the obstack free space grows the obstack.  */
+  {
+    char *base = obstack_base (&obs);
+    char *new_base;
+    RETTYPE result;
+    int room = obstack_room (&obs) - 4;
+
+    obstack_blank_fast (&obs, room);
+    result = my_obstack_printf (&obs, "%d %s", 123, "456");
+    ASSERT (result == 7);
+    ASSERT (result + room == obstack_object_size (&obs));
+    obstack_1grow (&obs, 0);
+    new_base = obstack_finish (&obs);
+    ASSERT (base != new_base);
+    ASSERT (strcmp (new_base + room, "123 456") == 0);
+  }
+
+  /* Check that strings shorter than the obstack free space don't
+     cause a reshuffling of the obstack.  */
+  {
+    char *base = obstack_base (&obs);
+    char *new_base;
+    RETTYPE result;
+    int room = obstack_room (&obs);
+
+    ASSERT (8 < room);
+    result = my_obstack_printf (&obs, "%d %s", 123, "456");
+    ASSERT (result == 7);
+    ASSERT (result == obstack_object_size (&obs));
+    new_base = obstack_base (&obs);
+    ASSERT (base == new_base);
+    ASSERT (strncmp (base, "123 456", result) == 0);
+    obstack_finish (&obs);
+  }
+
+  /* Check for generating much more output than a chunk size.  */
+  {
+    char *base = obstack_base (&obs);
+    char *new_base;
+    RETTYPE result;
+    int i;
+
+    ASSERT (obstack_chunk_size (&obs) < 10000);
+    result = my_obstack_printf (&obs, "%010000d", 0);
+    ASSERT (result == 10000);
+    ASSERT (result == obstack_object_size (&obs));
+    new_base = obstack_base (&obs);
+    ASSERT (base != new_base);
+    for (i = 0; i < 10000; i++)
+      ASSERT (new_base[i] == '0');
+  }
+
+  obstack_free (&obs, NULL);
+}
diff --git a/tests/test-obstack-zprintf.c b/tests/test-obstack-zprintf.c
new file mode 100644 (file)
index 0000000..1434246
--- /dev/null
@@ -0,0 +1,58 @@
+/* Test of obstack_zprintf() and obstack_vzprintf() functions.
+   Copyright (C) 2008-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 <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <stdio.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (obstack_zprintf, ptrdiff_t,
+                 (struct obstack *, char const *, ...));
+SIGNATURE_CHECK (obstack_vzprintf, ptrdiff_t,
+                 (struct obstack *, char const *, va_list));
+
+#include "obstack.h"
+#include "xalloc.h"
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "macros.h"
+
+#define RETTYPE ptrdiff_t
+#include "test-obstack-printf.h"
+
+static ptrdiff_t
+my_obstack_zprintf (struct obstack *obs, const char *format, ...)
+{
+  va_list args;
+  ptrdiff_t ret;
+
+  va_start (args, format);
+  ret = obstack_vzprintf (obs, format, args);
+  va_end (args);
+  return ret;
+}
+
+int
+main (int argc, char *argv[])
+{
+  test_function (my_obstack_zprintf);
+  test_function (obstack_zprintf);
+  return test_exit_status;
+}