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:
13
ChangeLog
13
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.
|
||||
|
@@ -1,5 +1,6 @@
|
||||
Files:
|
||||
tests/test-obstack-printf.c
|
||||
tests/test-obstack-printf.h
|
||||
tests/signature.h
|
||||
tests/macros.h
|
||||
|
||||
|
15
modules/obstack-zprintf-tests
Normal file
15
modules/obstack-zprintf-tests
Normal 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@
|
@@ -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;
|
||||
}
|
||||
|
85
tests/test-obstack-printf.h
Normal file
85
tests/test-obstack-printf.h
Normal 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);
|
||||
}
|
58
tests/test-obstack-zprintf.c
Normal file
58
tests/test-obstack-zprintf.c
Normal 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;
|
||||
}
|
Reference in New Issue
Block a user