
Ich möchte einige Unit-Tests für den von ConTeXt verwendeten Lua-Code schreiben und würde gerne wissen, ob das schon jemand gemacht hat und was zum Einrichten des Frameworks erforderlich sein könnte.
Insbesondere der Lua-Code wird in separaten Dateien (z. B. numbering.lua
) gespeichert, was bedeutet, dass ein Test-Runner (z. B.Erwischt) können Sie sie einfach mit einschließen require
.
Es ist vielleicht erwähnenswert (aber wahrscheinlich nicht wichtig), dass ich Pythons unittest als Test-Runner verwende mitverrückter Python.
Das inhärente Problem besteht darin, dass die von LuaTeX und ConTeXt definierten globalen Variablen nicht von Natur aus in Lua enthalten sind. Tabellen wie context
und texio
sind einfach nicht zugänglich, ohne require
dass ein sie aus den entsprechenden Dateien importiert. (Was wie und aussieht tex/texmf-context/tex/context/base/trac-log.lua
...Wer weiß, jeweils).
Hat jemand Unit-Tests von ConTeXt + Lua durchgeführt? Welche Lua-Dateien muss man möglicherweise einbinden, um die Variablen zu erhalten? Ich würde erwarten, dass es irgendwo einen Einstiegspunkt gibt, der den Großteil der Einrichtung übernimmt.
Es sieht so aus, als ob die .lua
relevanten Dateien im Allgemeinen vorhanden wären, ./tex/texmf-context/tex/context/base/
aber das ist nur eine Vermutung und da es ungefähr 840 .lua
Dateien sind, wäre ich für jeden Hinweis dankbar, wo ich anfangen soll.
Antwort1
Ich habe die tollen Kommentare von @Aditya und @phg weiter verfolgt und Folgendes getan:
Ich habe eine Testsuite erstellt mit dem wirklich coolenLunatest-Rahmen. Die Einrichtung ist trivial, da man nur require('lunatest')
, und es gibt eine Reihe hilfreicher Beispiele intest.lua
.
Nachdem ich mein eigenes erstellt habe, my_tests.lua
führe ich es mit folgendem aus:
context my_tests.lua --purgeall --batchmode --once
Mein Python-Test-Runner prüft dann den Rückgabecode des Kontextprozesses (der im Fehlerfall ungleich Null wäre).
Nachdem ich eine Weile damit experimentiert hatte, fand ich es schwierig, die Ausgabe von context
und texio
und anderen Funktionen zu erfassen. Um dieses Problem zu lösen, ließ ich ConTeXt nicht mehr Lua starten, sondern verwende Vanilla Lua mit Stubs wie diesem:
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
wird vom lunatest
Runner vor jedem Test aufgerufen. Das Ergebnis ist, dass ich Lua jetzt auf die Aufrufe testen kann, die es machen würde, texio
und context
zwar so (mit etwas mehr, aber nicht zu viel Setup):
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
Da an diesem Setup nichts Besonderes ist (d. h. es sind keine Variablen erforderlich), kann es bei Bedarf ganz einfach mit der oder einer anderen Interpreterbrücke luatex
aufgerufen werden .python-lunatic