
ConTeXt에서 사용되는 Lua 코드에 대한 몇 가지 단위 테스트를 작성하고 싶습니다. 다른 사람이 이 작업을 수행했는지, 프레임워크 설정에 무엇이 필요할 수 있는지 알고 싶습니다.
특히 Lua 코드는 별도의 파일(예: numbering.lua
)에 저장됩니다. 이는 테스트 실행기(예:체포)를 와 함께 포함할 수 있습니다 require
.
Python의 단위 테스트를 다음과 같은 테스트 실행기로 사용하고 있다는 점은 주목할 가치가 있습니다(그러나 아마도 중요하지 않을 것입니다).미치광이 파이썬.
본질적인 문제는 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의 훌륭한 의견에 따라 다음을 수행했습니다.
나는 정말 멋진 도구를 사용하여 테스트 스위트를 만들었습니다.가장 미친 프레임워크. 하나만 필요하기 때문에 설정하는 것은 간단하며 다음 페이지 require('lunatest')
에 유용한 예제 세트가 있습니다.test.lua
.
나만의 것을 만든 후에는 다음을 my_tests.lua
사용하여 실행합니다.
context my_tests.lua --purgeall --batchmode --once
내 Python 테스트 실행기는 컨텍스트 프로세스의 반환 코드(실패 시 0이 아님)를 확인합니다.
이것을 잠시 실험해 본 결과 및 기타 기능의 출력을 캡처하는 것이 어렵다는 것을 알았 context
습니다 texio
. 이 문제를 해결하기 위해 ConTeXt가 루아를 시작하는 것에서 벗어나 다음과 같은 스텁이 있는 바닐라 루아를 사용하고 있습니다.
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