Lua の doctest.lua を使い始めました。これは、ソースコードのコメント中に書いたテストコードを実行してくれるというものです。
ただし、バージョンが古いのか、そのままでは動かなかったので、メモ。261行目(付近?)にある、if num > 1 then が問題で、これだと引数に指定した 1つ目のソースを無視してしまいます。(Windows 版 Lua 5.1.4)
- if num > 1 then
+ if num >= 1 then
加えて、doctest では、テストする関数の名前を取り出してくれて便利なのですが、これが単純な[a-z]+的なものしかピックアップしてくれないので「function lib.name()」のようなライブラリ中の関数だとライブラリ名しか取り出してくれません。そこで、217行目(付近?)にある、doctest の抜き出し用正規表現を次のように修正しました。
- local doctestre = g.string.format("%s(.-)%s[\r\n]*([%%w _]*)",
+ local doctestre = g.string.format("%s(.-)%s[\r\n]*([%%w _.:]*)",すると、以下のように、ライブラリのテストで便利です。以下のようなテストを書いたとすると...
--[=[= embed variables
~~~
> =ku.embed("this is {name}",{name="pen"})
this is pen
> = ku.embed("{a}:{a}:{b}",{a="A",b="B"})
A:A:B
> = ku.embed("abc", {a="a"})
abc
=]=]
ku.embed = function (str, vars)
local ret = str
for name, value in pairs(vars) do
local pat = "{"..name.."}"
ret = string.gsub(ret, pat, value)
end
return ret
end以下のような結果を表示させることができます。
testing ku.lua
---------------
1.1 (ku.embed): ok
1.2 (ku.embed): ok
1.3 (ku.embed): ok
---------------
3 of 3 ok
doctest.lua の使い方 †
テストを実行したいソースは、以下のようなコメントの中に書くこと
--[=[=
※ここにテストコード
=]=]
テストコードは、Lua の対話 モードでのテストコードと実行結果のように書くこと
--[=[=
> =doctest.matches(",", ",")
true
=]=]Lua の対話モードは、Pythonと違って、30 のような値を直接書くとエラーになるので、下記のように "= 式" のような形式で書くこと
--[=[=
>=30
30
=]=]