# HG changeset patch # User Eric Blake # Date 1213450563 21600 # Node ID e027c5e42aba89563e8a7d9eaac81a30c44ce70d # Parent 927afe014a7d1de8d4e69269a8d57d5cca14a22e 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 diff -r 927afe014a7d -r e027c5e42aba ChangeLog --- 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 + + 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 * lib/obstack_printf.c (obstack_vprintf): Define the stack-allocated diff -r 927afe014a7d -r e027c5e42aba tests/test-obstack-printf.c --- 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);