changeset 8750:67a7b3fd6cf2

Make the tests sharper: also test the interaction with fflush().
author Bruno Haible <bruno@clisp.org>
date Sun, 29 Apr 2007 02:07:56 +0000
parents 6f41e2822863
children e66db74e11a7
files ChangeLog modules/freading-tests modules/fwriting-tests tests/test-freading.c tests/test-fwriting.c
diffstat 5 files changed, 104 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2007-04-28  Bruno Haible  <bruno@clisp.org>
+
+	* tests/test-fwriting.c (main): Also test the interaction between
+	fflush and fwriting.
+	* modules/fwriting-tests (Depends-on): Add fflush.
+
+	* tests/test-freading.c (main): Also test the interaction between
+	fflush and freading.
+	* modules/freading-tests (Depends-on): Add fflush.
+
 2007-04-28  Bruno Haible  <bruno@clisp.org>
 
 	* lib/stdio_.h (fseek, ftell): Provide link warnings suggesting to use
--- a/modules/freading-tests
+++ b/modules/freading-tests
@@ -2,6 +2,7 @@
 tests/test-freading.c
 
 Depends-on:
+fflush
 
 configure.ac:
 
--- a/modules/fwriting-tests
+++ b/modules/fwriting-tests
@@ -2,6 +2,7 @@
 tests/test-fwriting.c
 
 Depends-on:
+fflush
 
 configure.ac:
 
--- a/tests/test-freading.c
+++ b/tests/test-freading.c
@@ -57,6 +57,11 @@
   if (fgetc (fp) != 'b')
     goto skip;
   ASSERT (freading (fp));
+  fflush (fp);
+  ASSERT (freading (fp));
+  if (fgetc (fp) != 'a')
+    goto skip;
+  ASSERT (freading (fp));
   if (fseek (fp, 0, SEEK_END))
     goto skip;
   ASSERT (freading (fp));
@@ -77,12 +82,52 @@
   ASSERT (freading (fp));
   if (fseek (fp, 2, SEEK_CUR))
     goto skip;
-  /* freading (fp)) is undefined here, but fwriting is false.  */
+  /* freading (fp) is undefined here, but fwriting (fp) is false.  */
   if (fgetc (fp) != 'b')
     goto skip;
   ASSERT (freading (fp));
+  /* This fseek call is necessary when switching from reading to writing.
+     See the description of fopen(), ISO C 99 7.19.5.3.(6).  */
   if (fseek (fp, 0, SEEK_CUR) != 0)
     goto skip;
+  /* freading (fp) is undefined here, but fwriting (fp) is false.  */
+  if (fputc ('z', fp) != 'z')
+    goto skip;
+  ASSERT (!freading (fp));
+  if (fseek (fp, 0, SEEK_END))
+    goto skip;
+  ASSERT (!freading (fp));
+  if (fclose (fp))
+    goto skip;
+
+  /* Open it in read-write mode.  POSIX requires a reposition (fseek,
+     fsetpos, rewind) or EOF when transitioning from read to write;
+     freading is only deterministic after input or output, but this
+     test case should be portable even on open, after reposition, and
+     at EOF.  */
+  fp = fopen (TESTFILE, "r+");
+  if (fp == NULL)
+    goto skip;
+  ASSERT (!freading (fp));
+  if (fgetc (fp) != 'f')
+    goto skip;
+  ASSERT (freading (fp));
+  if (fseek (fp, 2, SEEK_CUR))
+    goto skip;
+  /* freading (fp) is undefined here, but fwriting (fp) is false.  */
+  if (fgetc (fp) != 'b')
+    goto skip;
+  ASSERT (freading (fp));
+  fflush (fp);
+  /* freading (fp) is undefined here, but fwriting (fp) is false.  */
+  if (fgetc (fp) != 'a')
+    goto skip;
+  ASSERT (freading (fp));
+  /* This fseek call is necessary when switching from reading to writing.
+     See the description of fopen(), ISO C 99 7.19.5.3.(6).  */
+  if (fseek (fp, 0, SEEK_CUR) != 0)
+    goto skip;
+  /* freading (fp) is undefined here, but fwriting (fp) is false.  */
   if (fputc ('z', fp) != 'z')
     goto skip;
   ASSERT (!freading (fp));
--- a/tests/test-fwriting.c
+++ b/tests/test-fwriting.c
@@ -57,6 +57,11 @@
   if (fgetc (fp) != 'b')
     goto skip;
   ASSERT (!fwriting (fp));
+  fflush (fp);
+  ASSERT (!fwriting (fp));
+  if (fgetc (fp) != 'a')
+    goto skip;
+  ASSERT (!fwriting (fp));
   if (fseek (fp, 0, SEEK_END))
     goto skip;
   ASSERT (!fwriting (fp));
@@ -81,14 +86,54 @@
   if (fgetc (fp) != 'b')
     goto skip;
   ASSERT (!fwriting (fp));
+  /* This fseek call is necessary when switching from reading to writing.
+     See the description of fopen(), ISO C 99 7.19.5.3.(6).  */
   if (fseek (fp, 0, SEEK_CUR) != 0)
     goto skip;
+  ASSERT (!fwriting (fp));
   if (fputc ('z', fp) != 'z')
     goto skip;
   ASSERT (fwriting (fp));
   if (fseek (fp, 0, SEEK_END))
     goto skip;
-  /* fwriting (fp) is undefined here, but freading is false.  */
+  /* fwriting (fp) is undefined here, but freading (fp) is false.  */
+  if (fclose (fp))
+    goto skip;
+
+  /* Open it in read-write mode.  POSIX requires a reposition (fseek,
+     fsetpos, rewind) or fflush when transitioning from write to read,
+     fwriting is only deterministic after input or output, but this
+     test case should be portable even on open, after reposition, and
+     after fflush.  */
+  fp = fopen (TESTFILE, "r+");
+  if (fp == NULL)
+    goto skip;
+  ASSERT (!fwriting (fp));
+  if (fgetc (fp) != 'f')
+    goto skip;
+  ASSERT (!fwriting (fp));
+  if (fseek (fp, 2, SEEK_CUR))
+    goto skip;
+  ASSERT (!fwriting (fp));
+  if (fgetc (fp) != 'b')
+    goto skip;
+  ASSERT (!fwriting (fp));
+  fflush (fp);
+  ASSERT (!fwriting (fp));
+  if (fgetc (fp) != 'a')
+    goto skip;
+  ASSERT (!fwriting (fp));
+  /* This fseek call is necessary when switching from reading to writing.
+     See the description of fopen(), ISO C 99 7.19.5.3.(6).  */
+  if (fseek (fp, 0, SEEK_CUR) != 0)
+    goto skip;
+  ASSERT (!fwriting (fp));
+  if (fputc ('z', fp) != 'z')
+    goto skip;
+  ASSERT (fwriting (fp));
+  if (fseek (fp, 0, SEEK_END))
+    goto skip;
+  /* fwriting (fp) is undefined here, but freading (fp) is false.  */
   if (fclose (fp))
     goto skip;