Schreiben Sie Unit-Tests für Lua in ConTeXt

Schreiben Sie Unit-Tests für Lua in ConTeXt

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 contextund texiosind einfach nicht zugänglich, ohne requiredass 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 .luarelevanten Dateien im Allgemeinen vorhanden wären, ./tex/texmf-context/tex/context/base/aber das ist nur eine Vermutung und da es ungefähr 840 .luaDateien 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.luafü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 contextund texiound 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.setupwird vom lunatestRunner vor jedem Test aufgerufen. Das Ergebnis ist, dass ich Lua jetzt auf die Aufrufe testen kann, die es machen würde, texiound contextzwar 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 luatexaufgerufen werden .python-lunatic

verwandte Informationen