#include <assert.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wchar.h>
#undef NDEBUG
#define TMPFILENAME "test_fflush.tmp"
void setup(void);
void test_fflush_read0(void);
void test_fflush_read1(void);
void test_fflush_read2(void);
void test_fflush_read3(void);
void test_fflush_read4(void);
void setupw(void);
void test_fflush_read5(void);
void test_fflush_read6(void);
void
setup(void)
{
FILE *fp;
unlink(TMPFILENAME);
fp = fopen(TMPFILENAME, "w+");
assert(fp != NULL);
fputs("Hello world\n", fp);
fclose(fp);
}
void
test_fflush_read0(void)
{
int r;
char buf[80];
FILE *fp;
setup();
fp = fopen(TMPFILENAME, "r");
assert(fp != NULL);
assert(fgetc(fp) == 'H');
r = fflush(fp);
assert(r == 0);
assert(ftell(fp) == 1);
fgets(buf, sizeof(buf), fp);
assert(strcmp(buf, "ello world\n") == 0);
r = fclose(fp);
assert(r == 0);
}
void
test_fflush_read1(void)
{
int r;
char buf[80];
FILE *fp;
setup();
fp = fopen(TMPFILENAME, "r");
assert(fp != NULL);
assert(fgetc(fp) == 'H');
assert(fgetc(fp) == 'e');
assert(fgetc(fp) == 'l');
assert(fgetc(fp) == 'l');
assert(fgetc(fp) == 'o');
ungetc('A', fp);
ungetc('A', fp);
ungetc('A', fp);
ungetc('A', fp);
fgets(buf, sizeof(buf), fp);
assert(strcmp(buf, "AAAA world\n") == 0);
r = fclose(fp);
assert(r == 0);
fp = fopen(TMPFILENAME, "r");
assert(fp != NULL);
assert(fgetc(fp) == 'H');
assert(fgetc(fp) == 'e');
assert(fgetc(fp) == 'l');
assert(fgetc(fp) == 'l');
assert(fgetc(fp) == 'o');
ungetc('A', fp);
ungetc('A', fp);
ungetc('A', fp);
ungetc('A', fp);
r = fflush(fp);
assert(r == 0);
fgets(buf, sizeof(buf), fp);
assert(strcmp(buf, " world\n") == 0);
r = fclose(fp);
assert(r == 0);
}
void
test_fflush_read2(void)
{
int r;
FILE *fp;
char buf[80];
fp = popen("echo Hello world", "r");
assert(fp != NULL);
assert(fgetc(fp) == 'H');
r = fflush(fp);
assert(r == 0);
fgets(buf, sizeof(buf), fp);
assert(strcmp(buf, "ello world\n") == 0);
r = pclose(fp);
assert(r == 0);
}
void
test_fflush_read3(void)
{
int r;
FILE *fp;
setup();
fp = fopen(TMPFILENAME, "r");
assert(fp != NULL);
r = fflush(fp);
assert(r == 0);
r = fclose(fp);
assert(r == 0);
}
void
test_fflush_read4(void)
{
int r;
FILE *fp;
off_t pos;
char buf[80];
setup();
fp = fopen(TMPFILENAME, "r");
assert(fp != NULL);
assert(fgetc(fp) == 'H');
pos = lseek(fileno(fp), 0, SEEK_CUR);
assert(pos >= 1);
assert(pos > 1);
fp = freopen(TMPFILENAME, "r", fp);
assert(fp != NULL);
fgets(buf, sizeof(buf), fp);
assert(strcmp(buf, "Hello world\n") == 0);
r = fclose(fp);
assert(r == 0);
}
void
setupw(void)
{
FILE *fp;
unlink(TMPFILENAME);
fp = fopen(TMPFILENAME, "w+");
assert(fp != NULL);
fputws(L"\u3053\u3093\u306b\u3061\u308f \u4e16\u754c\n", fp);
fclose(fp);
}
void
test_fflush_read5(void)
{
int r;
wchar_t buf[80];
FILE *fp;
setupw();
fp = fopen(TMPFILENAME, "r");
assert(fp != NULL);
assert(fgetwc(fp) == L'\u3053');
assert(fgetwc(fp) == L'\u3093');
assert(fgetwc(fp) == L'\u306b');
assert(fgetwc(fp) == L'\u3061');
assert(fgetwc(fp) == L'\u308f');
assert(ungetwc(L'\u263a', fp));
assert(fgetwc(fp) == L'\u263a');
fgetws(buf, sizeof(buf), fp);
assert(wcscmp(buf, L" \u4e16\u754c\n") == 0);
r = fclose(fp);
assert(r == 0);
fp = fopen(TMPFILENAME, "r");
assert(fp != NULL);
assert(fgetwc(fp) == L'\u3053');
assert(fgetwc(fp) == L'\u3093');
assert(fgetwc(fp) == L'\u306b');
assert(fgetwc(fp) == L'\u3061');
assert(fgetwc(fp) == L'\u308f');
assert(ungetwc(L'\u263a', fp));
assert(fgetwc(fp) == L'\u263a');
r = fflush(fp);
assert(r == 0);
fgetws(buf, sizeof(buf), fp);
assert(wcscmp(buf, L" \u4e16\u754c\n") == 0);
r = fclose(fp);
assert(r == 0);
}
void
test_fflush_read6(void)
{
int r, c;
FILE *fp;
setup();
fp = fopen(TMPFILENAME, "r");
assert(fp != NULL);
assert(fgetc(fp) == 'H');
c = getc(fp);
ungetc(c, fp);
r = fflush(fp);
assert(r == 0);
assert(getc(fp) == c);
fseek(fp, 0, SEEK_SET);
assert(fgetc(fp) == 'H');
c = getc(fp);
ungetc('X', fp);
r = fflush(fp);
assert(r == 0);
assert(getc(fp) == 'l');
r = fclose(fp);
assert(r == 0);
}
int
main(int argc, char *argv[])
{
setlocale(LC_ALL, "C.UTF-8");
test_fflush_read0();
test_fflush_read1();
test_fflush_read2();
test_fflush_read3();
test_fflush_read4();
test_fflush_read5();
test_fflush_read6();
exit(0);
}