
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 テスト ランナーはコンテキスト プロセスの戻りコードをチェックします (失敗した場合はゼロ以外になります)。
これを少し試してみたところ、 および などの関数の出力をキャプチャするのが難しいことがわかりましたcontext
。texio
これを解決するために、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 の呼び出しをテストできるようになりました(セットアップは少し増えますが、それほど多くはありません)。texio
context
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
。