Merge remote-tracking branch 'myk002/myk_printall_nontable' into develop
commit
10db894d99
@ -0,0 +1,40 @@
|
|||||||
|
-- tests misc functions added by dfhack.lua
|
||||||
|
|
||||||
|
function test.safe_pairs()
|
||||||
|
for k,v in safe_pairs(nil) do
|
||||||
|
expect.fail('nil should not be iterable')
|
||||||
|
end
|
||||||
|
for k,v in safe_pairs('a') do
|
||||||
|
expect.fail('a string should not be iterable')
|
||||||
|
end
|
||||||
|
for k,v in safe_pairs({}) do
|
||||||
|
expect.fail('an empty table should not be iterable')
|
||||||
|
end
|
||||||
|
for k,v in safe_pairs(df.item._identity) do
|
||||||
|
expect.fail('a non-iterable light userdata var should not be iterable')
|
||||||
|
end
|
||||||
|
|
||||||
|
local iterated = 0
|
||||||
|
local t = {a='hello', b='world', [1]='extra'}
|
||||||
|
for k,v in safe_pairs(t) do
|
||||||
|
expect.eq(t[k], v)
|
||||||
|
iterated = iterated + 1
|
||||||
|
end
|
||||||
|
expect.eq(3, iterated)
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.safe_pairs_ipairs()
|
||||||
|
local t = {1, 2}
|
||||||
|
setmetatable(t, {
|
||||||
|
__pairs = function()
|
||||||
|
expect.fail('pairs() should not be called')
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
local iterated = 0
|
||||||
|
for k,v in safe_pairs(t, ipairs) do
|
||||||
|
expect.eq(k, v)
|
||||||
|
iterated = iterated + 1
|
||||||
|
end
|
||||||
|
expect.eq(#t, iterated)
|
||||||
|
end
|
@ -0,0 +1,205 @@
|
|||||||
|
-- tests print-related functions added by dfhack.lua
|
||||||
|
|
||||||
|
local dfhack = dfhack
|
||||||
|
|
||||||
|
local mock_print = mock.func()
|
||||||
|
local function test_wrapper(test_fn)
|
||||||
|
mock.patch({{dfhack, 'print', mock_print},
|
||||||
|
{dfhack, 'println', mock_print}},
|
||||||
|
test_fn)
|
||||||
|
mock_print = mock.func()
|
||||||
|
end
|
||||||
|
config.wrapper = test_wrapper
|
||||||
|
|
||||||
|
function test.printall_table()
|
||||||
|
printall({a='b'})
|
||||||
|
expect.eq(1, mock_print.call_count)
|
||||||
|
expect.true_(mock_print.call_args[1][1]:find('a%s+= b'))
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_string()
|
||||||
|
printall('a')
|
||||||
|
expect.eq(0, mock_print.call_count)
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_number()
|
||||||
|
printall(10)
|
||||||
|
expect.eq(0, mock_print.call_count)
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_nil()
|
||||||
|
printall(nil)
|
||||||
|
expect.eq(0, mock_print.call_count)
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_boolean()
|
||||||
|
printall(false)
|
||||||
|
expect.eq(0, mock_print.call_count)
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_function()
|
||||||
|
printall(function() end)
|
||||||
|
expect.eq(0, mock_print.call_count)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function new_int_vector()
|
||||||
|
-- create a vector of integers by cloning one from world. we do it this way
|
||||||
|
-- because we can't allocate typed vectors from lua directly.
|
||||||
|
local vector = df.global.world.busy_buildings:new()
|
||||||
|
vector:resize(0)
|
||||||
|
return vector
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_userdata()
|
||||||
|
local utable = new_int_vector()
|
||||||
|
dfhack.with_temp_object(utable, function()
|
||||||
|
utable:insert(0, 10)
|
||||||
|
utable:insert(1, 20)
|
||||||
|
printall(utable)
|
||||||
|
expect.eq(2, mock_print.call_count)
|
||||||
|
expect.true_(mock_print.call_args[1][1]:find('0%s+= 10'))
|
||||||
|
expect.true_(mock_print.call_args[2][1]:find('1%s+= 20'))
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_noniterable_userdata()
|
||||||
|
printall(df.item._identity)
|
||||||
|
expect.eq(0, mock_print.call_count)
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_ipairs_table()
|
||||||
|
printall_ipairs({'a', 'b'})
|
||||||
|
expect.eq(2, mock_print.call_count)
|
||||||
|
expect.true_(mock_print.call_args[1][1]:find('1%s+= a'))
|
||||||
|
expect.true_(mock_print.call_args[2][1]:find('2%s+= b'))
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_ipairs_string()
|
||||||
|
printall_ipairs('a')
|
||||||
|
expect.eq(0, mock_print.call_count)
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_ipairs_number()
|
||||||
|
printall_ipairs(10)
|
||||||
|
expect.eq(0, mock_print.call_count)
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_ipairs_nil()
|
||||||
|
printall_ipairs(nil)
|
||||||
|
expect.eq(0, mock_print.call_count)
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_ipairs_boolean()
|
||||||
|
printall_ipairs(false)
|
||||||
|
expect.eq(0, mock_print.call_count)
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_ipairs_function()
|
||||||
|
printall_ipairs(function() end)
|
||||||
|
expect.eq(0, mock_print.call_count)
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_ipairs_userdata()
|
||||||
|
local utable = new_int_vector()
|
||||||
|
dfhack.with_temp_object(utable, function()
|
||||||
|
utable:insert(0, 10)
|
||||||
|
utable:insert(1, 20)
|
||||||
|
printall_ipairs(utable)
|
||||||
|
expect.eq(2, mock_print.call_count)
|
||||||
|
expect.true_(mock_print.call_args[1][1]:find('0%s+= 10'))
|
||||||
|
expect.true_(mock_print.call_args[2][1]:find('1%s+= 20'))
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_ipairs_noniterable_userdata()
|
||||||
|
printall_ipairs(df.item._identity)
|
||||||
|
expect.eq(0, mock_print.call_count)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function validate_patterns(start_idx, patterns)
|
||||||
|
for i,pattern in ipairs(patterns) do
|
||||||
|
expect.true_(mock_print.call_args[start_idx+i-1][1]:find(pattern))
|
||||||
|
end
|
||||||
|
return start_idx + #patterns
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_recurse()
|
||||||
|
local udatatable = new_int_vector()
|
||||||
|
dfhack.with_temp_object(udatatable, function()
|
||||||
|
local udataint = df.new('uint32_t')
|
||||||
|
dfhack.with_temp_object(udataint, function ()
|
||||||
|
udatatable:insert(0, 10)
|
||||||
|
udatatable:insert(1, 20)
|
||||||
|
udatatable:insert(2, 20)
|
||||||
|
udatatable:insert(3, 20)
|
||||||
|
udatatable:insert(4, 0)
|
||||||
|
udatatable:insert(5, 0)
|
||||||
|
local t2 = {}
|
||||||
|
local t = {num=5,
|
||||||
|
bool=false,
|
||||||
|
fn=function() end,
|
||||||
|
udatatable=udatatable,
|
||||||
|
udataint=udataint,
|
||||||
|
lightudata=df.item._identity,
|
||||||
|
table=t2}
|
||||||
|
t2.cyclic = t
|
||||||
|
printall_recurse(t)
|
||||||
|
expect.eq(55, mock_print.call_count)
|
||||||
|
expect.true_(mock_print.call_args[1][1]:find('^table: '))
|
||||||
|
local idx = 2
|
||||||
|
local EQ = '^%s+= $'
|
||||||
|
while idx <= 55 do
|
||||||
|
expect.eq('', mock_print.call_args[idx][1])
|
||||||
|
idx = idx + 1
|
||||||
|
local str = mock_print.call_args[idx][1]
|
||||||
|
if str:startswith('num') then
|
||||||
|
idx = validate_patterns(idx, {'^num$', EQ, '^5$'})
|
||||||
|
elseif str:startswith('bool') then
|
||||||
|
idx = validate_patterns(idx, {'^bool$', EQ, '^false$'})
|
||||||
|
elseif str:startswith('fn') then
|
||||||
|
idx = validate_patterns(idx, {'^fn$', EQ, '^function: '})
|
||||||
|
elseif str:startswith('udatatable') then
|
||||||
|
idx = validate_patterns(idx,
|
||||||
|
{'^udatatable$', EQ, '^<vector<int32_t>%[6%]: ',
|
||||||
|
'%s+', '^0$', EQ, '^10$',
|
||||||
|
'%s+', '^1$', EQ, '^20$',
|
||||||
|
'Repeated 2 times',
|
||||||
|
'%s+', '^4$', EQ, '^0$',
|
||||||
|
'Repeated 1 times'}) -- [sic]
|
||||||
|
elseif str:startswith('udataint') then
|
||||||
|
idx = validate_patterns(idx,
|
||||||
|
{'^udataint$', EQ, '^<uint32_t: ',
|
||||||
|
'%s+', '^value$', EQ, '^0$'})
|
||||||
|
elseif str:startswith('lightudata') then
|
||||||
|
idx = validate_patterns(idx,
|
||||||
|
{'^lightudata$', EQ, '',
|
||||||
|
'', 'iteration with pairs>$'})
|
||||||
|
elseif str:startswith('table') then
|
||||||
|
idx = validate_patterns(idx,
|
||||||
|
{'^table$', EQ, '^table: ',
|
||||||
|
'%s+', '^cyclic$', EQ, '^table: ',
|
||||||
|
'%s+', '^<Cyclic reference'})
|
||||||
|
else
|
||||||
|
expect.fail('unhandled print output')
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function test.printall_recurse_cyclic_userdata()
|
||||||
|
local t = df.job_list_link:new()
|
||||||
|
dfhack.with_temp_object(t, function()
|
||||||
|
t.next = t
|
||||||
|
printall_recurse(t)
|
||||||
|
expect.eq(15, mock_print.call_count)
|
||||||
|
-- conveniently, field order is deterministic
|
||||||
|
validate_patterns(1,
|
||||||
|
{'^<job_list_link: ',
|
||||||
|
'', '^item$', EQ, 'nil',
|
||||||
|
'', '^prev$', EQ, 'nil',
|
||||||
|
'', '^next$', EQ, '^<job_list_link: ',
|
||||||
|
' +', '^<Cyclic reference'})
|
||||||
|
end)
|
||||||
|
end
|
Loading…
Reference in New Issue