From: Bruno Haible Date: Sat, 22 Jun 2024 19:59:50 +0000 (+0200) Subject: obstack-zprintf: Add tests. X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=94c5a52ccbef8fbc3d1af56d12e120e51b4ca75f;p=gnulib.git 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. --- diff --git a/ChangeLog b/ChangeLog index 156dd40138..96f1e397da 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,18 @@ 2024-06-22 Bruno Haible + 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. diff --git a/modules/obstack-printf-tests b/modules/obstack-printf-tests index 2790e6942b..d319a79d20 100644 --- a/modules/obstack-printf-tests +++ b/modules/obstack-printf-tests @@ -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 index 0000000000..8ee697934f --- /dev/null +++ b/modules/obstack-zprintf-tests @@ -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@ diff --git a/tests/test-obstack-printf.c b/tests/test-obstack-printf.c index 2c7694320b..c2048c5cee 100644 --- a/tests/test-obstack-printf.c +++ b/tests/test-obstack-printf.c @@ -18,12 +18,13 @@ #include +/* Specification. */ #include #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 index 0000000000..560decf2ee --- /dev/null +++ b/tests/test-obstack-printf.h @@ -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 . */ + +/* Written by Eric Blake , 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 index 0000000000..143424604e --- /dev/null +++ b/tests/test-obstack-zprintf.c @@ -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 . */ + +#include + +/* Specification. */ +#include + +#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 +#include +#include + +#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; +}