diff options
Diffstat (limited to 'gnulib-tests/test-freadseek.c')
-rw-r--r-- | gnulib-tests/test-freadseek.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/gnulib-tests/test-freadseek.c b/gnulib-tests/test-freadseek.c new file mode 100644 index 0000000..d1698c5 --- /dev/null +++ b/gnulib-tests/test-freadseek.c @@ -0,0 +1,98 @@ +/* Test of freadseek() function. + Copyright (C) 2007-2020 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 Bruno Haible <bruno@clisp.org>, 2008. */ + +#include <config.h> + +#include "freadseek.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "macros.h" + +int +main (int argc, char **argv) +{ + static const char stdin_contents[] = + "#!/bin/sh\n\n${CHECKER} ./test-freadseek${EXEEXT} 5 19 6 7 18 9 19 < \"$srcdir/test-freadseek.sh\" || exit 1\ncat \"$srcdir/test-freadseek.sh\" | ${CHECKER} ./test-freadseek${EXEEXT} 5 19 6 7 18 9 19 || exit 1\nexit 0\n"; + int nbytes1 = atoi (argv[1]); + int nbytes2 = atoi (argv[2]); + int nbytes3 = atoi (argv[3]); + int nbytes4 = atoi (argv[4]); + int nbytes5 = atoi (argv[5]); + int nbytes6 = atoi (argv[6]); + int nbytes7 = atoi (argv[7]); + void *buf1 = malloc (nbytes1); + void *buf3 = malloc (nbytes3); + void *buf5 = malloc (nbytes5); + void *buf7 = malloc (nbytes7); + /* A private variable to keep track of the position. */ + size_t position = 0; + + ASSERT (fread (buf1, 1, nbytes1, stdin) == nbytes1); + ASSERT (memcmp (buf1, stdin_contents + position, nbytes1) == 0); + position += nbytes1; + + /* Test normal behaviour. */ + ASSERT (freadseek (stdin, nbytes2) == 0); + position += nbytes2; + + ASSERT (fread (buf3, 1, nbytes3, stdin) == nbytes3); + ASSERT (memcmp (buf3, stdin_contents + position, nbytes3) == 0); + position += nbytes3; + + /* Test behaviour after normal ungetc. */ + ungetc (fgetc (stdin), stdin); + ASSERT (freadseek (stdin, nbytes4) == 0); + position += nbytes4; + + ASSERT (fread (buf5, 1, nbytes5, stdin) == nbytes5); + ASSERT (memcmp (buf5, stdin_contents + position, nbytes5) == 0); + position += nbytes5; + + /* Test behaviour after arbitrary ungetc. */ + fgetc (stdin); + ungetc ('@', stdin); + ASSERT (freadseek (stdin, nbytes6) == 0); + position += nbytes6; + + ASSERT (fread (buf7, 1, nbytes7, stdin) == nbytes7); + ASSERT (memcmp (buf7, stdin_contents + position, nbytes7) == 0); + position += nbytes7; + + /* Test move to end of file. */ + ASSERT (freadseek (stdin, strlen (stdin_contents) - position) == 0); + ASSERT (fgetc (stdin) == EOF); + ASSERT (!ferror (stdin)); + +#if !defined __MINT__ /* FreeMiNT has problems seeking past end of file */ + /* Test move beyond end of file. */ + ASSERT (freadseek (stdin, 1000000) == 0); + ASSERT (fgetc (stdin) == EOF); + ASSERT (!ferror (stdin)); +#endif + + free (buf7); + free (buf5); + free (buf3); + free (buf1); + + return 0; +} |