Escribir pruebas unitarias para Lua en ConTeXt

Escribir pruebas unitarias para Lua en ConTeXt

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 contexty texiosimplemente no son accesibles sin un requireprograma que las importe desde sus archivos correspondientes. (Que parece ser tex/texmf-context/tex/context/base/trac-log.luay...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 .luaarchivos relevantes generalmente estarían aquí, ./tex/texmf-context/tex/context/base/pero solo estoy adivinando, y dado que hay alrededor de 840 .luaarchivos, 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.lualo 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 contextand texioy 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.setupes llamado por el lunatestcorredor antes de cada prueba. El resultado es que ahora puedo probar Lua para las llamadas que haría texioy contextasí (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 luatexse requieren variables), es fácil invocarla con el python-lunaticpuente de intérprete u otro, si así se desea.

información relacionada