ConTeXt で Lua のユニットテストを書く

ConTeXt で Lua のユニットテストを書く

ConTeXt で使用されている Lua コードの単体テストをいくつか作成したいのですが、他にこれを実行した人がいるかどうか、フレームワークの設定に何が必要になるかを知りたいです。

特にLuaコードは別のファイル(例numbering.lua:)に保存されており、テストランナー(例:逮捕) は で含めることができますrequire

注目すべき点かもしれないが(おそらく重要ではないが)、私はPythonのunittestをテストランナーとして使用している。狂人パイソン

本質的な問題は、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 テスト ランナーはコンテキスト プロセスの戻りコードをチェックします (失敗した場合はゼロ以外になります)。


これを少し試してみたところ、 および などの関数の出力をキャプチャするのが難しいことがわかりましたcontexttexioこれを解決するために、ConTeXt で lua を開始するのをやめ、次のようなスタブ付きの標準の 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

M.setup各テストの前にランナーによって呼び出されます。その結果、次のようlunatestに Lua の呼び出しをテストできるようになりました(セットアップは少し増えますが、それほど多くはありません)。texiocontext

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

関連情報