123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- local file = os.tmpname()
- local otherfile = os.tmpname()
- -- assert(os.setlocale('C', 'all'))
- io.input(io.stdin); io.output(io.stdout);
- os.remove(file)
- assert(loadfile(file) == nil)
- assert(io.open(file) == nil)
- io.output(file)
- assert(io.output() ~= io.stdout)
- assert(io.output():seek() == 0)
- assert(io.write("alo alo"))
- assert(io.output():seek() == string.len("alo alo"))
- assert(io.output():seek("cur", -3) == string.len("alo alo")-3)
- assert(io.write("joao"))
- assert(io.output():seek("end") == string.len("alo joao"))
- assert(io.output():seek("set") == 0)
- assert(io.write('"álo"', "{a}\n", "second line\n", "third line \n"))
- assert(io.write('çfourth_line'))
- io.output():close()
- io.output(io.stdout)
- -- collectgarbage() -- file should be closed by GC
- assert(io.input() == io.stdin and rawequal(io.output(), io.stdout))
- print('+')
- -- test GC for files
- -- collectgarbage()
- -- for i=1,120 do
- -- for i=1,5 do
- -- io.input(file)
- -- assert(io.open(file, 'r'))
- -- io.lines(file)
- -- end
- -- collectgarbage()
- -- end
- assert(os.rename(file, otherfile))
- assert(os.rename(file, otherfile) == nil)
- io.output(io.open(otherfile, "a"))
- assert(io.write("\n\n\t\t 3450\n"));
- io.close()
- -- test line generators
- assert(os.rename(otherfile, file))
- io.output(otherfile)
- local f = io.lines(file)
- while f() do end;
- assert(not pcall(f)) -- read lines after EOF
- assert(not pcall(f)) -- read lines after EOF
- -- copy from file to otherfile
- for l in io.lines(file) do io.write(l, "\n") end
- io.close()
- -- copy from otherfile back to file
- local f = assert(io.open(otherfile))
- assert(io.type(f) == "file")
- io.output(file)
- assert(io.output():read() == nil)
- for l in f:lines() do io.write(l, "\n") end
- assert(f:close()); io.close()
- assert(not pcall(io.close, f)) -- error trying to close again
- assert(tostring(f) == "file (closed)")
- assert(io.type(f) == "closed file")
- io.input(file)
- local of =io.open(otherfile)
- f = of:lines()
- for l in io.lines() do
- assert(l == f())
- end
- of:close()
- assert(os.remove(otherfile))
- assert(io.close(io.input()))
- io.input(file)
- do -- test error returns
- local a,b,c = io.input():write("xuxu")
- assert(not a and type(b) == "string" and type(c) == "number")
- end
- assert(io.read(0) == "") -- not eof
- assert(io.read(5, '*l') == '"álo"')
- assert(io.read(0) == "")
- assert(io.read() == "second line")
- local x = io.input():seek()
- assert(io.read() == "third line ")
- assert(io.input():seek("set", x))
- assert(io.read('*l') == "third line ")
- assert(io.read(1) == "ç")
- assert(io.read(string.len"fourth_line") == "fourth_line")
- assert(io.input():seek("cur", -string.len"fourth_line"))
- assert(io.read() == "fourth_line")
- assert(io.read() == "") -- empty line
- assert(io.read('*n') == 3450)
- assert(io.read(1) == '\n')
- assert(io.read(0) == nil) -- end of file
- assert(io.read(1) == nil) -- end of file
- assert(({io.read(1)})[2] == nil)
- assert(io.read() == nil) -- end of file
- assert(({io.read()})[2] == nil)
- assert(io.read('*n') == nil) -- end of file
- assert(({io.read('*n')})[2] == nil)
- assert(io.read('*a') == '') -- end of file (OK for `*a')
- assert(io.read('*a') == '') -- end of file (OK for `*a')
- collectgarbage()
- print('+')
- io.close(io.input())
- assert(not pcall(io.read))
- assert(os.remove(file))
- local t = '0123456789'
- for i=1,12 do t = t..t; end
- assert(string.len(t) == 10*2^12)
- io.output(file)
- io.write("alo\n")
- io.close()
- assert(not pcall(io.write))
- local f = io.open(file, "a")
- io.output(f)
- collectgarbage()
- assert(io.write(' ' .. t .. ' '))
- assert(io.write(';', 'end of file\n'))
- f:flush(); io.flush()
- f:close()
- print('+')
- io.input(file)
- assert(io.read() == "alo")
- assert(io.read(1) == ' ')
- assert(io.read(string.len(t)) == t)
- assert(io.read(1) == ' ')
- assert(io.read(0))
- assert(io.read('*a') == ';end of file\n')
- assert(io.read(0) == nil)
- assert(io.close(io.input()))
- assert(os.remove(file))
- print('+')
- local x1 = "string\n\n\\com \"\"''coisas [[estranhas]] ]]'"
- io.output(file)
- assert(io.write(string.format("x2 = %q\n-- comment without ending EOS", x1)))
- io.close()
- assert(loadfile(file))()
- assert(x1 == x2)
- print('+')
- assert(os.remove(file))
- assert(os.remove(file) == nil)
- assert(os.remove(otherfile) == nil)
- io.output(file)
- assert(io.write("qualquer coisa\n"))
- assert(io.write("mais qualquer coisa"))
- io.close()
- io.output(assert(io.open(otherfile, 'wb')))
- assert(io.write("outra coisa\0\1\3\0\0\0\0\255\0"))
- io.close()
- local filehandle = assert(io.open(file, 'r'))
- local otherfilehandle = assert(io.open(otherfile, 'rb'))
- assert(filehandle ~= otherfilehandle)
- assert(type(filehandle) == "userdata")
- assert(filehandle:read('*l') == "qualquer coisa")
- io.input(otherfilehandle)
- assert(io.read(string.len"outra coisa") == "outra coisa")
- assert(filehandle:read('*l') == "mais qualquer coisa")
- filehandle:close();
- assert(type(filehandle) == "userdata")
- io.input(otherfilehandle)
- assert(io.read(4) == "\0\1\3\0")
- assert(io.read(3) == "\0\0\0")
- assert(io.read(0) == "") -- 255 is not eof
- assert(io.read(1) == "\255")
- assert(io.read('*a') == "\0")
- assert(not io.read(0))
- assert(otherfilehandle == io.input())
- otherfilehandle:close()
- assert(os.remove(file))
- assert(os.remove(otherfile))
- collectgarbage()
- io.output(file)
- io.write[[
- 123.4 -56e-2 not a number
- second line
- third line
- and the rest of the file
- ]]
- io.close()
- io.input(file)
- local _,a,b,c,d,e,h,__ = io.read(1, '*n', '*n', '*l', '*l', '*l', '*a', 10)
- assert(io.close(io.input()))
- assert(_ == ' ' and __ == nil)
- assert(type(a) == 'number' and a==123.4 and b==-56e-2)
- assert(d=='second line' and e=='third line')
- assert(h==[[
- and the rest of the file
- ]])
- assert(os.remove(file))
- collectgarbage()
- -- testing buffers
- do
- local f = assert(io.open(file, "w"))
- local fr = assert(io.open(file, "r"))
- assert(f:setvbuf("full", 2000))
- f:write("x")
- assert(fr:read("*all") == "") -- full buffer; output not written yet
- f:close()
- fr:seek("set")
- assert(fr:read("*all") == "x") -- `close' flushes it
- f = assert(io.open(file, "w"))
- assert(f:setvbuf("no"))
- f:write("x")
- fr:seek("set")
- assert(fr:read("*all") == "x") -- no buffer; output is ready
- f:close()
- fr:close()
- -- f = assert(io.open(file, "a"))
- -- assert(f:setvbuf("line"))
- -- f:write("x")
- -- fr:seek("set", 1)
- -- assert(fr:read("*all") == "") -- line buffer; no output without `\n'
- -- f:write("a\n")
- -- fr:seek("set", 1)
- -- assert(fr:read("*all") == "xa\n") -- now we have a whole line
- -- f:close(); fr:close()
- end
- -- testing large files (> BUFSIZ)
- io.output(file)
- for i=1,5001 do io.write('0123456789123') end
- io.write('\n12346')
- io.close()
- io.input(file)
- local x = io.read('*a')
- io.input():seek('set', 0)
- local y = io.read(30001)..io.read(1005)..io.read(0)..io.read(1)..io.read(100003)
- assert(x == y and string.len(x) == 5001*13 + 6)
- io.input():seek('set', 0)
- y = io.read() -- huge line
- assert(x == y..'\n'..io.read())
- assert(io.read() == nil)
- io.close(io.input())
- assert(os.remove(file))
- x = nil; y = nil
- x, y = pcall(io.popen, "ls")
- if x then
- assert(y:read("*a"))
- assert(y:close())
- else
- (Message or print)('\a\n >>> popen not available<<<\n\a')
- end
- print'+'
- local t = os.time()
- -- T = os.date("*t", t)
- -- loadstring(os.date([[assert(T.year==%Y and T.month==%m and T.day==%d and
- -- T.hour==%H and T.min==%M and T.sec==%S and
- -- T.wday==%w+1 and T.yday==%j and type(T.isdst) == 'boolean')]], t))()
- --
- -- assert(os.time(T) == t)
- --
- T = os.date("!*t", t)
- -- loadstring(os.date([[!assert(T.year==%Y and T.month==%m and T.day==%d and
- -- T.hour==%H and T.min==%M and T.sec==%S and
- -- T.wday==%w+1 and T.yday==%j and type(T.isdst) == 'boolean')]], t))()
- do
- local T = os.date("*t")
- local t = os.time(T)
- assert(type(T.isdst) == 'boolean')
- T.isdst = nil
- local t1 = os.time(T)
- assert(t == t1) -- if isdst is absent uses correct default
- end
- t = os.time(T)
- T.year = T.year-1;
- local t1 = os.time(T)
- -- allow for leap years
- assert(math.abs(os.difftime(t,t1)/(24*3600) - 365) < 2)
- t = os.time()
- t1 = os.time(os.date("*t"))
- assert(os.difftime(t1,t) <= 2)
- local t1 = os.time{year=2000, month=10, day=1, hour=23, min=12, sec=17}
- local t2 = os.time{year=2000, month=10, day=1, hour=23, min=10, sec=19}
- assert(os.difftime(t1,t2) == 60*2-2)
- io.output(io.stdout)
- local d = os.date('%d')
- local m = os.date('%m')
- local a = os.date('%Y')
- local ds = os.date('%w') + 1
- local h = os.date('%H')
- local min = os.date('%M')
- local s = os.date('%S')
- io.write(string.format('test done on %2.2d/%2.2d/%d', d, m, a))
- io.write(string.format(', at %2.2d:%2.2d:%2.2d\n', h, min, s))
- io.write(string.format('%s\n', _VERSION))
|