Написание модульных тестов для Lua в ConTeXt

Написание модульных тестов для Lua в ConTeXt

Я хотел бы написать несколько модульных тестов для кода 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 проверяет код возврата контекстного процесса (который в случае сбоя будет ненулевым).


Поэкспериментировав с этим некоторое время, я обнаружил, что сложно захватывать вывод функций contextand 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или иного интерпретатора-мост, если возникнет такая необходимость.

Связанный контент