ecosystem test harness: decouple phases from modes

develop
myk002 2021-10-04 11:14:05 -07:00 committed by Myk
parent 15456c523b
commit 490afa28c5
1 changed files with 47 additions and 26 deletions

@ -23,15 +23,16 @@ config.mode = 'fortress'
local blueprint = require('plugins.blueprint') local blueprint = require('plugins.blueprint')
local quickfort_list = reqscript('internal/quickfort/list') local quickfort_list = reqscript('internal/quickfort/list')
local quickfort_command = reqscript('internal/quickfort/command') local quickfort_command = reqscript('internal/quickfort/command')
local utils = require('utils')
local blueprints_dir = 'blueprints/' local blueprints_dir = 'blueprints/'
local input_dir = 'library/test/ecosystem/in/' local input_dir = 'library/test/ecosystem/in/'
local output_dir = 'library/test/ecosystem/out/' local output_dir = 'library/test/ecosystem/out/'
local mode_names = {'dig', 'build', 'place', 'query'} local phase_names = utils.invert(blueprint.valid_phases)
-- clear the output dir before each test run (but not after -- to allow -- clear the output dir before each test run (but not after -- to allow
-- inspection of the results) -- inspection of failed results)
local function test_wrapper(test_fn) local function test_wrapper(test_fn)
local outdir = blueprints_dir .. output_dir local outdir = blueprints_dir .. output_dir
for _, v in ipairs(dfhack.filesystem.listdir_recursive(outdir)) do for _, v in ipairs(dfhack.filesystem.listdir_recursive(outdir)) do
@ -68,12 +69,13 @@ local function get_blueprint_sets()
local sets = {} local sets = {}
for _,args in ipairs(mock_print.call_args) do for _,args in ipairs(mock_print.call_args) do
local line = args[1] local line = args[1]
local _,_,listnum,fname,mode = line:find('(%d+)%) (%S+).-%((%S+)%)$') -- phase is the label or, if the label doesn't exist, the mode
local _,_,listnum,fname,phase = line:find('(%d+)%) (%S+).-[/(]([^ )]+)')
if listnum then if listnum then
local _,_,file_part = fname:find('/([^/]+)$') local _,_,file_part = fname:find('/([^/]+)$')
local _,_,basename = file_part:find('^([^-.]+)') local _,_,basename = file_part:find('^([^-.]+)')
if not sets[basename] then sets[basename] = {spec={}, modes={}} end if not sets[basename] then sets[basename] = {spec={}, phases={}} end
sets[basename].modes[mode] = { sets[basename].phases[phase] = {
listnum=listnum, listnum=listnum,
input_filepath=blueprints_dir..fname, input_filepath=blueprints_dir..fname,
output_filepath=blueprints_dir..output_dir..file_part} output_filepath=blueprints_dir..output_dir..file_part}
@ -82,7 +84,7 @@ local function get_blueprint_sets()
-- load test specs -- load test specs
for basename,set in pairs(sets) do for basename,set in pairs(sets) do
local spec, notes = set.spec, set.modes.notes local spec, notes = set.spec, set.phases.notes
-- set defaults -- set defaults
spec.depth = '1' spec.depth = '1'
@ -191,6 +193,15 @@ local function designate_area(pos, spec)
end end end end end end
end end
local function format_pos(pos)
return ('%s,%s,%s'):format(pos.x, pos.y, pos.z)
end
local function run_dig_now(area)
dfhack.run_command('dig-now', format_pos(area.pos),
format_pos(area.endpos), '--clean')
end
local function run_blueprint(basename, set, pos) local function run_blueprint(basename, set, pos)
blueprint.run(tostring(set.spec.width), tostring(set.spec.height), blueprint.run(tostring(set.spec.width), tostring(set.spec.height),
tostring(-set.spec.depth), output_dir..basename, tostring(-set.spec.depth), output_dir..basename,
@ -217,10 +228,18 @@ local function reset_area(area, spec)
pos.z = pos.z - spec.depth + 1 pos.z = pos.z - spec.depth + 1
dfhack.run_command('tiletypes-here', '--quiet', get_cursor_arg(pos)) dfhack.run_command('tiletypes-here', '--quiet', get_cursor_arg(pos))
end
local function format_pos(pos) -- patch up tiles where the material couldn't be automatically determined
return ('%s,%s,%s'):format(pos.x, pos.y, pos.z) -- we don't just set all tiles to 'stone' so we don't obliterate veins
commands = {
'f', 's', 'empty', ';',
'p', 'm', 'stone'}
dfhack.run_command('tiletypes-command', table.unpack(commands))
dfhack.run_command('tiletypes-here', '--quiet', get_cursor_arg(pos))
commands = {'f', 's', 'ramp_top'}
dfhack.run_command('tiletypes-command', table.unpack(commands))
dfhack.run_command('tiletypes-here', '--quiet', get_cursor_arg(pos))
end end
function test.end_to_end() function test.end_to_end()
@ -229,7 +248,7 @@ function test.end_to_end()
local area = {width=0, height=0, depth=0} local area = {width=0, height=0, depth=0}
for basename,set in pairs(sets) do for basename,set in pairs(sets) do
print(('running quickfort test: "%s": %s'): print(('running quickfort ecosystem test: "%s": %s'):
format(basename, set.spec.description)) format(basename, set.spec.description))
-- find an unused area of the map that meets requirements, else skip -- find an unused area of the map that meets requirements, else skip
@ -241,21 +260,23 @@ function test.end_to_end()
-- quickfort run #dig blueprint (or just designate the whole block if -- quickfort run #dig blueprint (or just designate the whole block if
-- there is no #dig blueprint) -- there is no #dig blueprint)
local modes = set.modes local phases = set.phases
if modes.dig then if phases.dig then
quickfort_run(modes.dig.listnum, area.pos) quickfort_run(phases.dig.listnum, area.pos)
else else
designate_area(area.pos, set.spec) designate_area(area.pos, set.spec)
end end
-- run dig-now to dig out designated tiles -- run dig-now to dig out designated tiles
dfhack.run_command('dig-now', format_pos(area.pos), run_dig_now(area)
format_pos(area.endpos), '--clean')
-- quickfort run remaining blueprints -- quickfort run remaining blueprints
for _,mode_name in pairs(mode_names) do for _,phase_name in ipairs(phase_names) do
if mode_name ~= 'dig' and modes[mode_name] then if phase_name ~= 'dig' and phases[phase_name] then
quickfort_run(modes[mode_name].listnum, area.pos) quickfort_run(phases[phase_name].listnum, area.pos)
if phase_name == 'track' then
run_dig_now(area)
end
end end
end end
@ -263,9 +284,9 @@ function test.end_to_end()
run_blueprint(basename, set, area.pos) run_blueprint(basename, set, area.pos)
-- quickfort undo blueprints -- quickfort undo blueprints
for _,mode_name in pairs(mode_names) do for _,phase_name in ipairs(phase_names) do
if modes[mode_name] then if phases[phase_name] then
quickfort_undo(modes[mode_name].listnum, area.pos) quickfort_undo(phases[phase_name].listnum, area.pos)
end end
end end
@ -274,11 +295,11 @@ function test.end_to_end()
-- compare md5sum of input and output files -- compare md5sum of input and output files
local md5File = dfhack.internal.md5File local md5File = dfhack.internal.md5File
for mode,mode_data in pairs(modes) do for phase,phase_data in pairs(phases) do
if mode == 'notes' then goto continue end if phase == 'notes' then goto continue end
print((' verifying phase: %s'):format(mode)) print((' verifying phase: %s'):format(phase))
local input_filepath = mode_data.input_filepath local input_filepath = phase_data.input_filepath
local output_filepath = mode_data.output_filepath local output_filepath = phase_data.output_filepath
local input_hash, input_size = md5File(input_filepath) local input_hash, input_size = md5File(input_filepath)
local output_hash, output_size = md5File(output_filepath) local output_hash, output_size = md5File(output_filepath)
expect.eq(input_hash, output_hash, expect.eq(input_hash, output_hash,