Merge branch 'tests' into develop

develop
lethosor 2018-07-19 14:39:32 -04:00
commit 46a28c5f52
5 changed files with 97 additions and 29 deletions

@ -55,7 +55,6 @@ script:
- python travis/run-tests.py "$DF_FOLDER" - python travis/run-tests.py "$DF_FOLDER"
- python travis/check-rpc.py "$DF_FOLDER/dfhack-rpc.txt" - python travis/check-rpc.py "$DF_FOLDER/dfhack-rpc.txt"
before_cache: before_cache:
- cat "$DF_FOLDER/stdout.log"
- cat "$DF_FOLDER/stderr.log" - cat "$DF_FOLDER/stderr.log"
- rm -rf "$DF_FOLDER/hack" - rm -rf "$DF_FOLDER/hack"
- rm -rf "$DF_FOLDER/dfhack-config" - rm -rf "$DF_FOLDER/dfhack-config"

@ -41,6 +41,9 @@ changelog.txt uses a syntax similar to RST, with a few special sequences:
- Core: various thread safety and memory management improvements - Core: various thread safety and memory management improvements
- Fixed cmake build dependencies for generated header files - Fixed cmake build dependencies for generated header files
## Lua
- ``utils``: new ``OrderedTable`` class
================================================================================ ================================================================================
# 0.44.12-r1 # 0.44.12-r1

@ -682,4 +682,40 @@ function addressof(obj)
return select(2, obj:sizeof()) return select(2, obj:sizeof())
end end
function OrderedTable()
-- store values in a separate table to ensure that __index and __newindex
-- run on every table index operation
local t = {}
local key_to_index = {}
local index_to_key = {}
local mt = {}
function mt:__index(k)
return t[k]
end
function mt:__newindex(k, v)
if not key_to_index[k] then
table.insert(index_to_key, k)
key_to_index[k] = #index_to_key
end
t[k] = v
end
function mt:__pairs()
return function(_, k)
if k then
k = index_to_key[key_to_index[k] + 1]
else
k = index_to_key[1]
end
if k then
return k, t[k]
end
end, nil, nil
end
local self = {}
setmetatable(self, mt)
return self
end
return _ENV return _ENV

@ -0,0 +1,15 @@
local utils = require 'utils'
function test.OrderedTable()
local t = utils.OrderedTable()
local keys = {'a', 'c', 'e', 'd', 'b', 'q', 58, -1.2}
for i = 1, #keys do
t[keys[i]] = i
end
local i = 1
for k, v in pairs(t) do
expect.eq(k, keys[i], 'key order')
expect.eq(v, i, 'correct value')
i = i + 1
end
end

@ -1,18 +1,21 @@
local script = require 'gui.script'
local utils = require 'utils'
local args = {...} local args = {...}
local done_command = args[1] local done_command = args[1]
expect = {} expect = {}
function expect.true_(value) function expect.true_(value, comment)
return not not value return not not value, comment, 'expected true'
end end
function expect.false_(value) function expect.false_(value, comment)
return not value return not value, comment, 'expected false'
end end
function expect.eq(a, b) function expect.eq(a, b, comment)
return a == b return a == b, comment, ('%s ~= %s'):format(a, b)
end end
function expect.ne(a, b) function expect.ne(a, b, comment)
return a ~= b return a ~= b, comment, ('%s == %s'):format(a, b)
end end
function expect.error(func, ...) function expect.error(func, ...)
local ok, ret = pcall(func, ...) local ok, ret = pcall(func, ...)
@ -23,10 +26,16 @@ function expect.error(func, ...)
end end
end end
function delay(frames)
frames = frames or 1
script.sleep(frames, 'frames')
end
function build_test_env() function build_test_env()
local env = { local env = {
test = {}, test = utils.OrderedTable(),
expect = {}, expect = {},
delay = delay,
} }
local private = { local private = {
checks = 0, checks = 0,
@ -35,7 +44,15 @@ function build_test_env()
for name, func in pairs(expect) do for name, func in pairs(expect) do
env.expect[name] = function(...) env.expect[name] = function(...)
private.checks = private.checks + 1 private.checks = private.checks + 1
local ok, msg = func(...) local ret = {func(...)}
local ok = table.remove(ret, 1)
local msg = ''
for _, part in pairs(ret) do
if part then
msg = msg .. ': ' .. tostring(part)
end
end
msg = msg:sub(3) -- strip leading ': '
if ok then if ok then
private.checks_ok = private.checks_ok + 1 private.checks_ok = private.checks_ok + 1
else else
@ -90,6 +107,21 @@ function main()
} }
local passed = true local passed = true
print('Looking for title screen...')
for i = 0, 100 do
local scr = dfhack.gui.getCurViewscreen()
if df.viewscreen_titlest:is_instance(scr) then
print('Found title screen')
break
else
scr:feed_key(df.interface_key.LEAVESCREEN)
delay(10)
end
end
if not df.viewscreen_titlest:is_instance(dfhack.gui.getCurViewscreen()) then
qerror('Could not find title screen')
end
print('Running tests') print('Running tests')
for _, file in ipairs(files) do for _, file in ipairs(files) do
print('Running file: ' .. file:sub(file:find('test'), -1)) print('Running file: ' .. file:sub(file:find('test'), -1))
@ -137,21 +169,4 @@ function main()
finish_tests(passed) finish_tests(passed)
end end
local check_count = 0 script.start(main)
function check_title()
local scr = dfhack.gui.getCurViewscreen()
if df.viewscreen_titlest:is_instance(scr) then
print('Found title screen')
main()
else
check_count = check_count + 1
if check_count > 100 then
qerror('Could not find title screen')
end
scr:feed_key(df.interface_key.LEAVESCREEN)
dfhack.timeout(10, 'frames', check_title)
end
end
print('Looking for title screen...')
check_title()