X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=tests%2Ftest-freadptr.c;h=a46d65d3bb7139f6989ebd778a83fdbf94f949dc;hb=8424f040f4bfc95e7448e62ac26ea028faf36480;hp=5c5e41e8ab990f22bccf074655c93902dae42856;hpb=4bf3a252770203a92858bb666561559f3fef5887;p=gnulib.git diff --git a/tests/test-freadptr.c b/tests/test-freadptr.c index 5c5e41e8a..a46d65d3b 100644 --- a/tests/test-freadptr.c +++ b/tests/test-freadptr.c @@ -25,14 +25,13 @@ #include #include -#include "freadahead.h" - #define ASSERT(expr) \ do \ { \ if (!(expr)) \ { \ fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ + fflush (stderr); \ abort (); \ } \ } \ @@ -46,19 +45,60 @@ main (int argc, char **argv) ASSERT (fread (buf, 1, nbytes, stdin) == nbytes); if (lseek (0, 0, SEEK_CUR) == nbytes) - /* An unbuffered stdio, such as BeOS or on uClibc compiled without - __STDIO_BUFFERS. */ - ASSERT (freadahead (stdin) == 0); + { + /* An unbuffered stdio, such as BeOS or on uClibc compiled without + __STDIO_BUFFERS. Or stdin is a pipe. */ + size_t size; + ASSERT (freadptr (stdin, &size) == NULL); + } else { /* Normal buffered stdio. */ const char stdin_contents[] = - "#!/bin/sh\n\n./test-freadptr${EXEEXT} 5 < \"$srcdir/test-freadptr.sh\" || exit 1\nexit 0\n"; + "#!/bin/sh\n\n./test-freadptr${EXEEXT} 5 < \"$srcdir/test-freadptr.sh\" || exit 1\ncat \"$srcdir/test-freadptr.sh\" | ./test-freadptr${EXEEXT} 5 || exit 1\nexit 0\n"; const char *expected = stdin_contents + nbytes; - size_t available = freadahead (stdin); - ASSERT (available != 0); - ASSERT (available <= strlen (expected)); - ASSERT (memcmp (freadptr (stdin), expected, available) == 0); + size_t available1; + size_t available2; + size_t available3; + + /* Test normal behaviour. */ + { + const char *ptr = freadptr (stdin, &available1); + + ASSERT (ptr != NULL); + ASSERT (available1 != 0); + ASSERT (available1 <= strlen (expected)); + ASSERT (memcmp (ptr, expected, available1) == 0); + } + + /* Test behaviour after normal ungetc. */ + ungetc (fgetc (stdin), stdin); + { + const char *ptr = freadptr (stdin, &available2); + + if (ptr != NULL) + { + ASSERT (available2 == available1); + ASSERT (memcmp (ptr, expected, available2) == 0); + } + } + + /* Test behaviour after arbitrary ungetc. */ + fgetc (stdin); + ungetc ('@', stdin); + { + const char *ptr = freadptr (stdin, &available3); + + if (ptr != NULL) + { + ASSERT (available3 == 1 || available3 == available1); + ASSERT (ptr[0] == '@'); + if (available3 > 1) + { + ASSERT (memcmp (ptr + 1, expected + 1, available3 - 1) == 0); + } + } + } } return 0;