2024年4月16日火曜日

Vim の CUI 版に描画テストを追加して実行する

以下 3 点を忘れないようにメモ。

  • ビルド環境構築方法
  • CFLAGS へのワーニングフラグ追加
  • 一部のみテスト実行方法
  • ターミナルの描画テスト実装方法

前提

  • OS: Ubuntu 22.04

ビルド環境構築方法

ビルドパッケージ取得用に deb-src ソースを追加

後述の apt build-dep を利用するために、 /etc/apt/sources.list のコメントアウトされている deb-src を有効にする。

sed -i -e 's/^# deb-src /deb-src /' /etc/apt/sources.list

vim-gtk3 のビルドに必要なパッケージのインストール

apt build-dep を利用し、Debian が vim-gtk3 のパッケージをビルドするために使っているパッケージをインストールする。

sudo apt build-dep vim-gtk3

CFLAGS へのワーニングフラグ追加

CI では、以下のようにワーニングフラグの追加を行っているので、 Pull request を送るならローカルでもこれらフラグを追加してビルドすること。

ci.yml#L242-L248 - vim/vim

テスト実行方法

全テスト実行

src ディレクトリ内で make test する。

cd src
make test

部分的なテスト実行

src/testdirtest_*.vim が複数あるので、ファイル名の拡張子を除いたものを make に渡すと、その中のテストのみを実行できる。

cd src/testdir
make test_utf8

ターミナルの描画テスト実装方法

CUI の描画テストを行う場合には、Vim が提供している、ターミナル出力をダンプ・比較する仕組みを使う。

5. 画面ダンプの差分 - terminal - Vim日本語ドキュメント の「Vimの画面ダンプテストを書く」の通りにやればよい。

  1. ターミナルダンプの正解ファイルを生成する(最初は空ファイル)
    • src/testdir/dumps に入れる
  2. 「1.」で作ったファイルを正解ファイルとして読み込むテストを実装する
    • テストの実装は後述
  3. 「2.」で作ったテストを実行する
    • テストが失敗して、失敗時のターミナルダンプが src/testdir/failed に出力される
  4. 新しい vim を立ち上げ、失敗時のターミナルダンプを読み込み、想定通りになっているかを確認
    • vim -u NONE -N して :call term_dumpload("./failed/<「2.」で出力された失敗時のターミナルダンプ>")
  5. 「4.」の結果が想定通りであれば、失敗時のターミナルダンプで「1.」で作った正解ファイルを上書きする
    • cp failed/<「2.」で出力された失敗時のターミナルダンプ> dumps/<「1.」で作った空ファイル>

テスト実装

これも 5. 画面ダンプの差分 - terminal - Vim日本語ドキュメント の「Vimの画面ダンプテストを書く」の通りにやればよい。

例えば以下のように実装する。

func Test_setcellwidths_with_non_ambiwidth_character_dump()
  CheckRunVimInTerminal

  " テスト開始時の初期状態までもっていくためのスクリプトを定義
  let lines =<< trim END
      call setline(1, [repeat("\u279c", 60), repeat("\u279c", 60)])
      set ambiwidth=single
  END
  call writefile(lines, 'XCellwidthsWithNonAmbiwidthCharacter', 'D')

  " vim を開いてテスト開始時の初期状態までもっていく(`-S` は「Vim を起動した後に指定したファイルを Vim script として実行する」オプション)
  let buf = RunVimInTerminal('-S XCellwidthsWithNonAmbiwidthCharacter', {'rows': 6, 'cols': 50})

  " 初期状態から、「1.」で作った正解ファイルの状態になるまでの操作を実行
  call term_sendkeys(buf, ":call setcellwidths([[0x279c, 0x279c, 1]])\<CR>")
  call term_sendkeys(buf, ":echo\<CR>")

  " 「1.」で作った正解ファイルと比較する。差分があった場合テストが失敗する。
  call VerifyScreenDump(buf, 'Test_setcellwidths_with_non_ambiwidth_character_dump_1', {})
endfunc

参考資料

変更履歴

日付 内容
2024/4/16 新規作成
2024/4/17 CFLAGS へのワーニングフラグ追加について追記

0 件のコメント:

コメントを投稿