1
0
mirror of https://git.savannah.gnu.org/git/gnulib.git synced 2025-08-08 17:22:05 +03:00

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.
This commit is contained in:
Bruno Haible
2024-06-22 21:59:50 +02:00
parent b216546a9d
commit 94c5a52ccb
6 changed files with 179 additions and 83 deletions

View File

@@ -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.

View File

@@ -1,5 +1,6 @@
Files:
tests/test-obstack-printf.c
tests/test-obstack-printf.h
tests/signature.h
tests/macros.h

View File

@@ -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@

View File

@@ -18,12 +18,13 @@
#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;
}

View File

@@ -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);
}

View File

@@ -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;
}