diff options
Diffstat (limited to 'tests/general/io.icn')
-rw-r--r-- | tests/general/io.icn | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/tests/general/io.icn b/tests/general/io.icn new file mode 100644 index 0000000..fec8522 --- /dev/null +++ b/tests/general/io.icn @@ -0,0 +1,214 @@ +#SRC: JCON + +# I/O test -- writes ./tmp1 and ./tmp2 as well as stdout + +procedure main() + local L, f, m, n, t1, t2 + + L := [&input, &output, &errout, + m := open("/etc/motd") | stop("no /etc/motd"), + n := open("/dev/null", "w") | stop("no /dev/null")] + L := sort(L) + every f := !L do + write(type(f), ": ", image(f)) + + write() + write(read()) + write(read(&input)) + while write(read()) do break + write(!&input) + every write(!&input \ 2) + every write(!&input) \ 2 + + write() + write("flush /etc/motd: ", image(flush(m)) | "FAILED") + write("close /etc/motd: ", image(close(m)) | "FAILED") + write("close /etc/motd: ", image(close(m)) | "FAILED") + write("flush /etc/motd: ", image(flush(m)) | "FAILED") + + write() + write("flush /dev/null: ", image(flush(n)) | "FAILED") + write("close /dev/null: ", image(close(n)) | "FAILED") + write("close /dev/null: ", image(close(n)) | "FAILED") + write("flush /dev/null: ", image(flush(n)) | "FAILED") + + every remove("tmp1" | "tmp2") + every remove("tmp1" | "tmp2") + write(image(open("tmp1"))) # should fail + + write() + rfile("/dev/null") + wfile("tmp1", "w", "follow the yellow brick road") + rfile("tmp1") + wfile("tmp1", "w", "shorter file") + rfile("tmp1") + wfile("tmp1", "a", "gets extended") + rfile("tmp1") + wfile("tmp1", "rw", "changed") + rfile("tmp1") + wfile("tmp1", "b", "mode b ") + rfile("tmp1") + wfile("tmp1", "crw", "cleared anew") + rfile("tmp1") + rename("tmp1", "tmp2") + rfile("tmp2") + + write() + write(image(t1 := open("tmp1", "w")) | "can't open tmp1") + write(image(t2 := open("tmp2", "w")) | "can't open tmp2") + writes(">stdout", t1, ">1a", t2, ">2a", &output) + writes(">stdout", t2, ">2b", t1, ">1b", &output) + write(">stdout", t1, ">1c", t2, t2, ">2c", &output) + write(">stdout", t2, ">2d", t1, t1, ">1d", &output) + every write(t1 | t2) + writes(t1, ">1e") + writes(t2, ">2e") + write(t1, ">1f") + write(t2, ">2f") + every close(t1 | t2) + rfile("tmp1") + rfile("tmp2") + + every remove("tmp1" | "tmp2") + every remove("tmp1" | "tmp2") + + write() + writes("abc") + writes("def\nghi") + writes("\njklmno\n") + write("pqr\nstu") + writes("vwxyz") + writes() + writes("") + writes("\n") + + write() + tsys("echo hello world") # simple echo + tsys("ls io.[ids][tca][dnt]") # check wildcarding + + tpipe() + +end + + + +# wfile(name, mode, s) -- break apart string and write file + +procedure wfile(name, mode, s) + local f + + write() + writes("write ", name, ",", mode, ":\t ") + if f := open(name, mode) then s ? { + writes(s) + tab(many(' ')) + while not pos(0) do { + write(f, tab(upto(' ') | 0)) + tab(many(' ')) + } + write(" : ", where(f)) + flush(f) + close(f) + } + else { + write("can't open") + } + return +end + + + +# rfile(name) -- read and echo file contents (several different ways) + +procedure rfile(name) + local f, i + + writes("read ", name, ":\t") + if not (f := open(name, "r")) then { + write(" can't open") + fail + } + + # read() + while writes(" ", read(f)) + write() + + # bang + seek(f, 1) + every writes(" ", " !f:\t\t" | !f | "\n") + + # both, mixed + seek(f, 1) + writes(" read/!f:\t") + while writes(" ", read(f)) do writes(" ", !f) + write() + + # reads() + seek(f, 1) + writes(" reads():\t") + while writes(" ", map(reads(f, 5), "\n", ".")) + write() + +#%#% # nonsequential (disabled because it's inconsistently buggy...) +#%#% writes(" nonseq:\t ") +#%#% every i := 30 to -30 by -1 do +#%#% if seek(f, i) then +#%#% writes(map(reads(f), "\n", ".") | "?") +#%#% else +#%#% writes("-") +#%#% write() + + close(f) + return +end + + +# tsys(s) -- test system call + +procedure tsys(s) + write("$ ", s) + system(s) + return +end + + +# tpipe() -- test pipes + +procedure tpipe() + local f, p + + # very simple case + write() + p := open("echo hello world", "rp") | stop("can't open echo pipe") + write(image(p)) + while write("> ", read(p)) + close(p) + + # check unclosed pipe + write() + p := open("sed 's/^/=()= /' io.icn", "p") | stop("can't open sed pipe") + write(image(p)) + every 1 to 10 do write("> ", read(p)) + # p is deliberately left unclosed + + # check wildcarding, and also !pipe + write() + p := open("ls io.i?n io.d?t io.s?d", "p") | stop("can't open ls pipe") + write(image(p)) + every write("> ", !p) + close(p) + + # check output pipe + write() + p := open("tr aeiou oaeui", "wp") | stop("can't open tr pipe") + write(image(p)) + write(p, "once upon a midnight dreary") + write(p, "two roads diverged in a yellow wood") + write(p, "and the mome raths outgrabe") + write("--- closing output pipe") + close(p) + write("--- done closing output pipe") + remove("tmp1") + + return +end |