| 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)) |