
Me gustaría escribir algunas pruebas unitarias para el código Lua que utiliza ConTeXt y me gustaría saber si alguien más ha hecho esto y qué puede ser necesario para configurar el marco.
El código Lua en particular se almacena en archivos separados (p. ej. numbering.lua
), lo que significa que un ejecutor de pruebas (p. ej.Arrestado) puede simplemente incluirlos con require
.
Puede que valga la pena señalar (pero probablemente no importe) que estoy usando la prueba unitaria de Python como ejecutor de pruebas conpitón-lunático.
El problema inherente es que los globales definidos por LuaTeX y ConTeXt no están naturalmente en Lua. Tablas como context
y texio
simplemente no son accesibles sin un require
programa que las importe desde sus archivos correspondientes. (Que parece ser tex/texmf-context/tex/context/base/trac-log.lua
y...quién sabe, respectivamente).
¿Alguien ha realizado pruebas unitarias de ConTeXt + Lua? ¿Qué archivos Lua se podrían necesitar incluir para obtener las variables? Esperaría que hubiera un punto de entrada en algún lugar que se encargara de la mayor parte de la configuración.
Parece que los .lua
archivos relevantes generalmente estarían aquí, ./tex/texmf-context/tex/context/base/
pero solo estoy adivinando, y dado que hay alrededor de 840 .lua
archivos, agradecería cualquier orientación sobre por dónde empezar.
Respuesta1
Siguiendo con los excelentes comentarios de @Aditya y @phg, hice lo siguiente:
Creé un conjunto de pruebas usando el realmente genialmarco más luna. Es trivial de configurar porque sólo es necesario require('lunatest')
y hay un conjunto útil de ejemplos entest.lua
.
Una vez que he creado el mío, my_tests.lua
lo ejecuto con:
context my_tests.lua --purgeall --batchmode --once
Luego, mi ejecutor de pruebas de Python verifica el código de retorno del proceso de contexto (que sería distinto de cero en caso de falla).
Después de haber experimentado con esto durante un tiempo, me resultó difícil capturar el resultado de las funciones context
and texio
y otras. Para resolver esto, dejé de hacer que ConTeXt iniciara lua y estoy usando vanilla lua con códigos auxiliares como este:
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
Donde M.setup
es llamado por el lunatest
corredor antes de cada prueba. El resultado es que ahora puedo probar Lua para las llamadas que haría texio
y context
así (con un poco más de configuración, pero no demasiada):
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
Al final, debido a que esta configuración no tiene nada de especial (es decir, no luatex
se requieren variables), es fácil invocarla con el python-lunatic
puente de intérprete u otro, si así se desea.