changeset 10207:e027c5e42aba

Improve obstack-printf test code. * tests/test-obstack-printf.c (test_function): Fix comment, and simplify usage of obstack_* in macros. Add a test for coverage. Reported by Bruno Haible. Signed-off-by: Eric Blake <ebb9@byu.net>
author Eric Blake <ebb9@byu.net>
date Sat, 14 Jun 2008 07:36:03 -0600
parents 927afe014a7d
children 02f15297cc9c
files ChangeLog tests/test-obstack-printf.c
diffstat 2 files changed, 32 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sat Jun 14 15:06:19 2008 +0200
+++ b/ChangeLog	Sat Jun 14 07:36:03 2008 -0600
@@ -1,3 +1,10 @@
+2008-06-14  Eric Blake  <ebb9@byu.net>
+
+	Improve obstack-printf test code.
+	* tests/test-obstack-printf.c (test_function): Fix comment, and
+	simplify usage of obstack_* in macros.  Add a test for coverage.
+	Reported by Bruno Haible.
+
 2008-06-14  Bruno Haible  <bruno@clisp.org>
 
 	* lib/obstack_printf.c (obstack_vprintf): Define the stack-allocated
--- a/tests/test-obstack-printf.c	Sat Jun 14 15:06:19 2008 +0200
+++ b/tests/test-obstack-printf.c	Sat Jun 14 07:36:03 2008 -0600
@@ -47,23 +47,22 @@
 {
   struct obstack obs;
   obstack_init (&obs);
-  /* In general, don't invoke obstack_* functions inside ASSERT, as
-     not all compilers can avoid multiple side effects.  */
+  /* 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 output
-     longer than the obstack free space grows the obstack.  */
+  /* 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 size;
     int room = obstack_room (&obs) - 4;
 
     obstack_blank_fast (&obs, room);
     result = my_obstack_printf (&obs, "%d %s", 123, "456");
     ASSERT (result == 7);
-    size = obstack_object_size (&obs);
-    ASSERT (result + room == size);
+    ASSERT (result + room == obstack_object_size (&obs));
     obstack_1grow (&obs, 0);
     new_base = obstack_finish (&obs);
     ASSERT (base != new_base);
@@ -76,17 +75,33 @@
     char *base = obstack_base (&obs);
     char *new_base;
     int result;
-    int size;
     int room = obstack_room (&obs);
 
     ASSERT (8 < room);
     result = my_obstack_printf (&obs, "%d %s", 123, "456");
     ASSERT (result == 7);
-    size = obstack_object_size (&obs);
-    ASSERT (result == size);
+    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);