この記事は Vim script Advent Calendar 2015 の 3 日目の記事です。
はじめに
先月末に、Vim の組み込み関数に assert 系の関数が追加されました。
今回はこの関数について紹介します。
歴史
割とどうでもいいので読み飛ばし可です。
2015-11-29 Vim 7.4.944
assertEqual()、assertTrue()、assertFalse() が追加されました。また、一緒に使うための v:errors も追加されました。
しかし、関数名について苦情が多く出ました。
Vim script の組み込み関数の多くは、単語の区切りがなく1単語です。例えば deepcopy() や matchlist() などです。
一部の関数には _ が使われており、has_key() や complete_add() があります。
そして中には大文字を含む関数もありますが、今のところそれらは全て ID と言う単語に使われており、synID() や diff_hlID() などです。これらは例外と言えそうです。
つまり今まで camelCase が使われていなかったのにも関わらず突然 camelCase の関数が追加されたので、それはさすがにおかしいという話になりました。
2015-11-30 Vim 7.4.945
assertEqual()、assertTrue()、assertFalse() がそれぞれ assert_equal()、assert_true()、assert_false() にリネームされました。
また、先の話で別途提案された、各関数にエラー時のメッセージを渡すためのオプショナルの引数を追加するパッチが適用されました。
わずか1日でのスピード対応、ドキュメントもテストも修正されて完璧…と思いきや…肝心の実装が適用されておらず、関数名は変わっていませんでした…。
2015-12-01 Vim 7.4.946
無事実装も適用され、assert_equal()、assert_true()、assert_false() にリネームされました。
2015-12-03 Vim 7.4.950
一通り解決されたかに思いましたが、変数 v:errors が初期化されていないという問題が発見されました。
現在 vim_dev にパッチを投げています。
恐らくすぐに適用されると思います。
適用されました。
使い方
仕組みは単純です。
v:errors は配列になっていて、各 assert 関数が失敗すると、v:errors にメッセージが文字列として追加されます。
なので使用前にまず v:errors を初期化します。
let v:errors = []
続いて適当に assert 系の関数を呼びます。
function! Test() abort let actual = 2 + 2 call assert_equal(5, actual) endfunction call Test()
v:errors を見ると、失敗の結果がわかります。
echo v:errors " => ['function Test line 2: Expected 5 but got 4']
結果のメッセージの : の左側にある文字列は expand('
メッセージの右側には失敗時の値が出ます。
また、assert 系の関数には追加でメッセージを渡すことができ、渡すと : の右側はこのメッセージが表示されます。
let v:errors = [] function! Test() abort let actual = 2 + 2 call assert_equal(5, actual, 'test fail!') endfunction call Test() echo v:errors " => ['function Test line 2: ''test fail!''']