-- -- Tests for the system module -- local system = require 'system' -- Check existence static fields assert(type(system.arch) == 'string') assert(type(system.compiler_name) == 'string') assert(type(system.compiler_version) == 'table') assert(type(system.os) == 'string') -- getwd assert(type(system.getwd()) == 'string') -- env assert(type(system.env()) == 'table') -- ls assert(type(system.ls('.')) == 'table') assert(#system.ls('.') == #system.ls()) -- ls should fail when called on files or non-existent directories assert(pcall(system.ls, 'thisdoesnotexist') == false) assert(pcall(system.ls, 'README.md') == false) -- mkdir and rmdir function in_tmpdir (callback) local orig_dir = system.getwd() return system.with_tmpdir( 'hello', function (tmpdir) system.setwd(tmpdir) local result = callback(tmpdir) system.setwd(orig_dir) return result end ) end function test_mkdir_rmdir () -- mkdir assert(not pcall(system.mkdir, '.'), "should not be possible to create `.`") assert(pcall(system.mkdir, 'foo'), "normal dir creation") assert(pcall(system.mkdir, 'foo', true), "dir creation if exists") assert((system.ls())[1] == 'foo') assert(not pcall(system.mkdir, 'bar/baz'), "creation of nested dir") assert(pcall(system.mkdir, 'bar/baz', true), "nested dir creation, including parent directories") assert((system.ls 'bar')[1] == 'baz') -- rmdir assert(pcall(system.rmdir, 'foo'), "delete empty directory") assert(not pcall(system.rmdir, 'bar'), "cannot delete non-empty dir") assert(pcall(system.rmdir, 'bar', true), "delete dir recursively") assert(#system.ls() == 0, "dir should be empty") end in_tmpdir(test_mkdir_rmdir) -- tmpdirname assert(type(system.tmpdirname()) == 'string', "tmpdirname should return a string") -- with_env local outer_value = 'outer test value' local inner_value = 'inner test value' local inner_only = 'test #2' function check_env () assert(os.getenv 'SYSTEM_TEST' == inner_value, "env has test value") assert(os.getenv 'SYSTEM_TEST_INNER_ONLY' == inner_only, "inner only exists") assert(os.getenv 'SYSTEM_TEST_OUTER_ONLY' == nil, "outer only variable should be unset") end local test_env = { SYSTEM_TEST = inner_value, SYSTEM_TEST_INNER_ONLY = inner_only } system.setenv('SYSTEM_TEST_OUTER_ONLY', outer_value) system.setenv('SYSTEM_TEST', outer_value) system.with_env(test_env, check_env) assert(system.getenv 'SYSTEM_TEST' == outer_value, "value was restored") assert(system.getenv 'SYSTEM_TEST_INNER_ONLY' == nil, "value was restored") assert(system.getenv 'SYSTEM_TEST_OUTER_ONLY' == outer_value, "value was restored") -- with_tmpdir local token = 'Banana' function write_read_token (tmpdir) local filename = tmpdir .. '/foo.txt' local fh = io.open(filename, 'w') fh:write(token .. '\n') fh:close() return io.open(filename):read '*l' end assert(system.with_tmpdir('.', 'foo', write_read_token) == token) assert(system.with_tmpdir('foo', write_read_token) == token) -- Complex scripts function create_then_count_files () io.open('README.org', 'w'):close() return #system.ls '.' end assert(in_tmpdir(create_then_count_files) == 1, 'Number of files should be 1') system.setenv('TESTING', token) assert(system.getenv 'TESTING' == token, 'setting and getting env var is inconsistent') -- with_wd local cwd = system.getwd() function check_wd (path) assert(path == system.getwd(), "current path is given as arg") assert(path ~= cwd, "current path has changed from original") end system.with_tmpdir( 'wd-test', function (path) return system.with_wd(path, check_wd) end )