callisto/test.lua
Jeremy Baxter 4fd5dcf29a tests: remove json tests
There's no point in testing it.
2024-03-20 13:59:28 +13:00

227 lines
4.4 KiB
Lua

--[[
Tests for Callisto
Run with:
./csto test.lua
A test should use the smallest amount of functions possible,
and should not rely on facilities such as os.execute to complete
its task. Using functions in the same library is acceptable, but
Callisto facilities in different libraries should not be used.
Licensed to the public domain
]]--
local oldenv = _ENV
local function test(f)
local _ENV = oldenv
local function mesg(...)
io.stdout:write(..., '\n')
end
assert(type(f) == "function")
mesg(f())
end
-- Table containing tests for each library.
-- The cl library is excluded from here as it is almost
-- impossible to test without user interaction.
local tests = {
environ = {
getvar = function ()
local var = "HOME"
assert(environ[var])
return 'environ["' .. var .. '"] ~= nil'
end,
setvar = function ()
local var = "VAR"
local val = "hello"
environ[var] = val
assert(environ[var] == "hello")
return 'environ["' .. var .. '"] = "' .. val .. '"'
end,
pairs = function ()
local ev = {}
local var = "VAR"
environ[var] = "1"
for env in pairs(environ) do
ev[env] = environ[env]
end
assert(ev[var] == "1")
return "pairs(environ)"
end
},
extra = {
},
fs = {
copy = function ()
local src, dst = "testfile", "testfile.cp"
local contents = "hello, world!"
local f, err = io.open(src, 'w')
assert(f, err)
f:write(contents)
f:close()
assert(fs.copy(src, dst))
assert(io.input(dst):read('a') == contents)
assert(fs.remove(src))
assert(fs.remove(dst))
return 'fs.copy("' .. src .. '", "' .. dst .. '")'
end,
directory = function ()
local dir, subdir = "testdir", "testdir/sub"
assert(fs.mkdir(dir))
assert(fs.exists(dir) and fs.isdirectory(dir))
assert(fs.rmdir(dir))
assert(fs.mkdir(subdir, true))
assert(fs.exists(dir))
assert(fs.isdirectory(dir))
assert(fs.exists(subdir))
assert(fs.isdirectory(subdir))
assert(fs.rmdir(subdir))
assert(fs.rmdir(dir))
return ([[
fs.mkdir("%s")
fs.rmdir("%s")
fs.mkdir("%s", true)
fs.rmdir("%s"")
fs.rmdir("%s")]]):format(
dir,
dir,
subdir,
subdir,
dir
)
end,
move = function ()
local src, dst = "testfile", "testfile.new"
local contents = "hello, world!"
local f, err = io.open(src, 'w')
assert(f, err)
f:write(contents)
f:close()
assert(fs.move(src, dst))
assert(io.input(dst):read('a') == contents)
assert(fs.remove(dst))
return 'fs.move("' .. src .. '", "' .. dst .. '")'
end,
path = function ()
local bpath, base = "/etc/fstab", "fstab"
local dpath, dir = "/usr/local/bin", "/usr/local"
assert(fs.basename(bpath) == base)
assert(fs.dirname(dpath) == dir)
return 'fs.basename("' .. bpath .. [[")
fs.dirname("]] .. dpath .. '")'
end,
remove = function ()
local file = "testfile"
local f, err = io.open(file, 'w')
assert(f, err)
f:write("")
f:close()
assert(fs.remove(file))
return 'fs.remove("' .. file .. '")'
end,
workdir = function ()
local d = "/usr"
local wd = fs.workdir()
fs.workdir(d)
assert(fs.workdir() == d)
fs.workdir(wd)
assert(fs.workdir() == wd)
return 'fs.workdir("' .. d .. '")'
end
},
os = {
hostname = function ()
assert(os.hostname())
return "os.hostname()"
end
},
process = {
pid = function ()
assert(math.type(process.pid()) == "integer")
return "process.pid()"
end,
pidof = function ()
local proc = "csto"
assert(math.type(process.pidof(proc)) == "integer")
return 'process.pidof("' .. proc .. '")'
end,
signum = function ()
local sig = "SIGKILL"
-- probably signal no.9
assert(math.type(process.signum(sig)) == "integer")
return 'process.signum("' .. sig .. '")'
end,
send = function ()
local hdl = io.popen("sleep 8")
local pid = process.pidof("sleep")
assert(process.send(pid, "SIGKILL"))
hdl:close()
return "process.send(" .. tostring(pid) .. ', "SIGKILL")'
end
}
}
-- Run all tests.
do
local env = tests
env.test = test
local _ENV = env
-- environ
test(environ.getvar)
test(environ.setvar)
test(environ.pairs)
-- fs
test(fs.copy)
test(fs.directory)
test(fs.move)
test(fs.path)
test(fs.remove)
test(fs.workdir)
-- os
test(os.hostname)
-- process
test(process.pid)
test(process.pidof)
test(process.signum)
test(process.send)
end
cl.mesg("all tests completed successfully")