1 /* Test of fwriting() function.
2 Copyright (C) 2007 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2, or (at your option)
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software Foundation,
16 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
18 /* Written by Bruno Haible <bruno@clisp.org>, 2007. */
26 #define ASSERT(expr) if (!(expr)) abort ();
28 #define TESTFILE "t-fwriting.tmp"
35 /* Create a file with some contents. Write-only file is always writing. */
36 fp = fopen (TESTFILE, "w");
39 ASSERT (fwriting (fp));
40 if (fwrite ("foobarsh", 1, 8, fp) < 8)
42 ASSERT (fwriting (fp));
46 /* Open it in read-only mode. Read-only file is never writing. */
47 fp = fopen (TESTFILE, "r");
50 ASSERT (!fwriting (fp));
51 if (fgetc (fp) != 'f')
53 ASSERT (!fwriting (fp));
54 if (fseek (fp, 2, SEEK_CUR))
56 ASSERT (!fwriting (fp));
57 if (fgetc (fp) != 'b')
59 ASSERT (!fwriting (fp));
61 ASSERT (!fwriting (fp));
62 if (fgetc (fp) != 'a')
64 ASSERT (!fwriting (fp));
65 if (fseek (fp, 0, SEEK_END))
67 ASSERT (!fwriting (fp));
71 /* Open it in read-write mode. POSIX requires a reposition (fseek,
72 fsetpos, rewind) or fflush when transitioning from write to read,
73 fwriting is only deterministic after input or output, but this
74 test case should be portable even on open, after reposition, and
76 /* First a scenario with only fgetc, fseek, fputc. */
77 fp = fopen (TESTFILE, "r+");
80 ASSERT (!fwriting (fp));
81 if (fgetc (fp) != 'f')
83 ASSERT (!fwriting (fp));
84 if (fseek (fp, 2, SEEK_CUR))
86 ASSERT (!fwriting (fp));
87 if (fgetc (fp) != 'b')
89 ASSERT (!fwriting (fp));
90 /* This fseek call is necessary when switching from reading to writing.
91 See the description of fopen(), ISO C 99 7.19.5.3.(6). */
92 if (fseek (fp, 0, SEEK_CUR) != 0)
94 ASSERT (!fwriting (fp));
95 if (fputc ('x', fp) != 'x')
97 ASSERT (fwriting (fp));
98 if (fseek (fp, 0, SEEK_END))
100 /* fwriting (fp) is undefined here, but freading (fp) is false. */
104 /* Open it in read-write mode. POSIX requires a reposition (fseek,
105 fsetpos, rewind) or fflush when transitioning from write to read,
106 fwriting is only deterministic after input or output, but this
107 test case should be portable even on open, after reposition, and
109 /* Here a scenario that includes fflush. */
110 fp = fopen (TESTFILE, "r+");
113 ASSERT (!fwriting (fp));
114 if (fgetc (fp) != 'f')
116 ASSERT (!fwriting (fp));
117 if (fseek (fp, 2, SEEK_CUR))
119 ASSERT (!fwriting (fp));
120 if (fgetc (fp) != 'b')
122 ASSERT (!fwriting (fp));
124 ASSERT (!fwriting (fp));
125 if (fgetc (fp) != 'x')
127 ASSERT (!fwriting (fp));
128 /* This fseek call is necessary when switching from reading to writing.
129 See the description of fopen(), ISO C 99 7.19.5.3.(6). */
130 if (fseek (fp, 0, SEEK_CUR) != 0)
132 ASSERT (!fwriting (fp));
133 if (fputc ('z', fp) != 'z')
135 ASSERT (fwriting (fp));
136 if (fseek (fp, 0, SEEK_END))
138 /* fwriting (fp) is undefined here, but freading (fp) is false. */
142 /* Open it in append mode. */
143 fp = fopen (TESTFILE, "a");
146 ASSERT (fwriting (fp));
147 if (fwrite ("bla", 1, 3, fp) < 3)
149 ASSERT (fwriting (fp));
156 fprintf (stderr, "Skipping test: file operations failed.\n");