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>
|
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.
|
obstack-zprintf: New module.
|
||||||
* lib/stdio.in.h (obstack_zprintf, obstack_vzprintf): New declarations.
|
* lib/stdio.in.h (obstack_zprintf, obstack_vzprintf): New declarations.
|
||||||
(obstack_printf, obstack_vprintf): Tweak comment.
|
(obstack_printf, obstack_vprintf): Tweak comment.
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
Files:
|
Files:
|
||||||
tests/test-obstack-printf.c
|
tests/test-obstack-printf.c
|
||||||
|
tests/test-obstack-printf.h
|
||||||
tests/signature.h
|
tests/signature.h
|
||||||
tests/macros.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>
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "signature.h"
|
#include "signature.h"
|
||||||
SIGNATURE_CHECK (obstack_printf, int, (struct obstack *, char const *, ...));
|
SIGNATURE_CHECK (obstack_printf, int, (struct obstack *, char const *, ...));
|
||||||
SIGNATURE_CHECK (obstack_vprintf, int, (struct obstack *, char const *,
|
SIGNATURE_CHECK (obstack_vprintf, int,
|
||||||
va_list));
|
(struct obstack *, char const *, va_list));
|
||||||
|
|
||||||
#include "obstack.h"
|
#include "obstack.h"
|
||||||
#include "xalloc.h"
|
#include "xalloc.h"
|
||||||
@@ -34,73 +35,8 @@ SIGNATURE_CHECK (obstack_vprintf, int, (struct obstack *, char const *,
|
|||||||
|
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
|
|
||||||
#define obstack_chunk_alloc xmalloc
|
#define RETTYPE int
|
||||||
#define obstack_chunk_free free
|
#include "test-obstack-printf.h"
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
my_obstack_printf (struct obstack *obs, const char *format, ...)
|
my_obstack_printf (struct obstack *obs, const char *format, ...)
|
||||||
@@ -114,22 +50,10 @@ my_obstack_printf (struct obstack *obs, const char *format, ...)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
test_obstack_vprintf ()
|
|
||||||
{
|
|
||||||
test_function (my_obstack_printf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
test_obstack_printf ()
|
|
||||||
{
|
|
||||||
test_function (obstack_printf);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
test_obstack_vprintf ();
|
test_function (my_obstack_printf);
|
||||||
test_obstack_printf ();
|
test_function (obstack_printf);
|
||||||
return test_exit_status;
|
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