
Я хотел бы написать несколько модульных тестов для кода Lua, используемого ConTeXt, и хотел бы узнать, делал ли это кто-нибудь еще и что может потребоваться при настройке фреймворка.
В частности, код Lua хранится в отдельных файлах (например, numbering.lua
), что означает, что программа запуска тестов (например,Разоблачен) можно просто включить их в require
.
Стоит отметить (но, возможно, это не имеет значения), что я использую unittest Python в качестве средства запуска тестов ссумасшедший-питон.
Неотъемлемая проблема заключается в том, что глобальные переменные, определенные LuaTeX и ConTeXt, не являются естественными в Lua. Такие таблицы, как context
и texio
просто недоступны без , require
который импортирует их из соответствующих файлов. (Что выглядит как tex/texmf-context/tex/context/base/trac-log.lua
и ...кто знает, соответственно).
Кто-нибудь проводил модульное тестирование ConTeXt + Lua? Какие файлы Lua нужно включить, чтобы получить переменные? Я бы ожидал, что где-то будет точка входа, которая позаботится о большей части настройки.
Похоже, что .lua
все нужные файлы, как правило, находятся там, ./tex/texmf-context/tex/context/base/
но это всего лишь мои догадки, и поскольку их около 840 .lua
, я был бы благодарен за любые указания, с чего начать.
решение1
В ответ на замечательные комментарии @Aditya и @phg я сделал следующее:
Я создал тестовый набор, используя действительно классныйфреймворк lunatest. Его легко настроить, потому что нужно только require('lunatest')
, и есть полезный набор примеров вtest.lua
.
После того, как я создал свой собственный, my_tests.lua
я запускаю его с помощью:
context my_tests.lua --purgeall --batchmode --once
Затем мой тестовый исполнитель Python проверяет код возврата контекстного процесса (который в случае сбоя будет ненулевым).
Поэкспериментировав с этим некоторое время, я обнаружил, что сложно захватывать вывод функций context
and texio
и других. Чтобы решить эту проблему, я отошел от запуска lua ConTeXt и использую vanilla lua с такими заглушками:
local function stub(name)
local stubbed = {}
local calls = {}
local metatable = {
__call = function(meta, ...)
local call = {}
call.method = nil
call.args = arg
table.insert(calls, call)
end,
__index = function(meta, ...)
local method = arg[1]
return function(...)
local call = {}
call.method = method
call.args = arg
table.insert(calls, call)
end
end
}
stubbed._calls = calls
setmetatable(stubbed, metatable)
_G[name] = stubbed
end
function M.setup()
stub('context')
stub('texio')
end
Where M.setup
вызывается бегуном lunatest
перед каждым тестом. Результатом является то, что теперь я могу протестировать Lua на предмет вызовов, которые он будет делать, texio
и context
вот так (с немного большей, но не слишком большой, настройкой):
lt = require('lunatest')
function suite.test_double_indent()
test_double_indent()
lt.assert_len(5, context._calls)
lt.assert_equal('\\startitemize\\sym{}\\startitemize\\sym{}',
context._calls[1].args[1])
lt.assert_equal('\n\\stopitemize\n\\stopitemize\n\\stopitemize',
context._calls[5].args[1])
end
В конце концов, поскольку в этой настройке нет ничего особенного (т. е. не luatex
требуются переменные), ее легко вызвать с помощью того python-lunatic
или иного интерпретатора-мост, если возникнет такая необходимость.