#include <darwintest.h>
#include <assert.h>
#include <string.h>
#include <stdio.h>
T_DECL(ftell_ungetc, "Test interactions of ftell and ungetc")
{
FILE *fp = stdin;
fp = fopen("assets/ftell_ungetc.txt", "rb");
T_QUIET; T_ASSERT_NE(fp, (FILE*)NULL, "Open the file");
T_ASSERT_EQ(ftell(fp), 0L, "ftell without having done any reads/writes");
T_ASSERT_EQ(fgetc(fp), '/', "Read one charatcter");
T_ASSERT_EQ(ftell(fp), 1L, "ftell after one read");
T_ASSERT_EQ(ungetc('/', fp), '/', "push back one character");
T_ASSERT_EQ(ftell(fp), 0L, "ftell after pushing back one char");
T_ASSERT_EQ(fgetc(fp), '/', "read pushed back character again");
T_ASSERT_EQ(ftell(fp), 1L, "ftell after reading again");
T_ASSERT_EQ(fseek(fp, 2, SEEK_SET), 0, "seek");
T_ASSERT_EQ(ftell(fp), 2L, "ftell after seeking");
T_ASSERT_EQ(ungetc(EOF, fp), EOF, "push back invalid char");
T_ASSERT_EQ(ftell(fp), 2L, "ftell after pushing invalid char, pos should not have changed");
T_ASSERT_EQ(fgetc(fp), '-', "read another character");
T_ASSERT_EQ(ftell(fp), 3L, "ftell after read");
T_ASSERT_EQ(ungetc('A', fp), 'A', "push back a different character");
T_ASSERT_EQ(fgetc(fp), 'A', "read back the different character");
T_ASSERT_EQ(ftell(fp), 3L, "ftell after pushback and read back");
T_ASSERT_EQ(fgetc(fp), '+', "read another character");
T_ASSERT_EQ(ungetc('A', fp), 'A', "push back a different character");
T_EXPECTFAIL; T_ASSERT_EQ(ftell(fp), 3L, "ftell after pushback - EXPECTED FAIL rdar://66131999");
}