aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rwxr-xr-xtests/runner.py4
-rw-r--r--tests/stdio/test_fgetc_ungetc.c87
2 files changed, 91 insertions, 0 deletions
diff --git a/tests/runner.py b/tests/runner.py
index d16472ad..9d4df744 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -7142,6 +7142,10 @@ def process(filename):
'''
self.do_run(src, 'written=0')
+ def test_fgetc_ungetc(self):
+ src = open(path_from_root('tests', 'stdio', 'test_fgetc_ungetc.c'), 'r').read()
+ self.do_run(src, 'success', force_c=True)
+
def test_fgetc_unsigned(self):
if self.emcc_args is None: return self.skip('requires emcc')
src = r'''
diff --git a/tests/stdio/test_fgetc_ungetc.c b/tests/stdio/test_fgetc_ungetc.c
new file mode 100644
index 00000000..c69a3d1a
--- /dev/null
+++ b/tests/stdio/test_fgetc_ungetc.c
@@ -0,0 +1,87 @@
+#include <assert.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+static void create_file(const char *path, const char *buffer, int mode) {
+ int fd = open(path, O_WRONLY | O_CREAT | O_EXCL, mode);
+ assert(fd >= 0);
+
+ int err = write(fd, buffer, sizeof(char) * strlen(buffer));
+ assert(err == (sizeof(char) * strlen(buffer)));
+
+ close(fd);
+}
+
+void setup() {
+ create_file("file.txt", "cd", 0666);
+}
+
+void cleanup() {
+ unlink("file.txt");
+}
+
+void test() {
+ FILE *file;
+ int err;
+ char buffer[256];
+
+ file = fopen("file.txt", "r");
+ assert(file);
+
+ // pushing EOF always returns EOF
+ rewind(file);
+ err = ungetc(EOF, file);
+ assert(err == EOF);
+
+ // ungetc should return itself
+ err = ungetc('a', file);
+ assert(err == (int)'a');
+
+ // push two chars and make sure they're read back in
+ // the correct order (both by fgetc and fread)
+ rewind(file);
+ ungetc('b', file);
+ ungetc('a', file);
+ err = fgetc(file);
+ assert(err == (int)'a');
+ fread(buffer, sizeof(char), sizeof(buffer), file);
+ assert(!strcmp(buffer, "bcd"));
+
+ // rewind and fseek should reset anything that's been
+ // pushed to the stream
+ ungetc('a', file);
+ rewind(file);
+ err = fgetc(file);
+ assert(err == (int)'c');
+ ungetc('a', file);
+ fseek(file, 0, SEEK_SET);
+ err = fgetc(file);
+ assert(err == (int)'c');
+
+ // fgetc, when nothing is left, should return EOF
+ fseek(file, 0, SEEK_END);
+ err = fgetc(file);
+ assert(err == EOF);
+ err = feof(file);
+ assert(err);
+
+ // ungetc should reset the EOF indicator
+ ungetc('e', file);
+ err = feof(file);
+ assert(!err);
+
+ fclose(file);
+
+ puts("success");
+}
+
+int main() {
+ atexit(cleanup);
+ signal(SIGABRT, cleanup);
+ setup();
+ test();
+ return EXIT_SUCCESS;
+} \ No newline at end of file