qvi もだいぶ複雑になってきて副作用もチラホラの目立ち初めてきたので、 ちょいと手順前後かもしれないが、ここらで自動テストの機構を実装することにする。
# テストスクリプト例 1 :set fontName=Courier New <int main() <{ < printf("hello, world.\n"); < printf("hello, world.\n"); <} =1 0 # 初期カーソル位置 "G" =5 0 # 最終行に移動 "kdd" # 上(4行目)に移動して、行削除 >int main() >{ > printf("hello, world.\n"); >} > /printf =3 1 "ixyz" 0x1b # 0x1b は Esc >int main() >{ > xyzprintf("hello, world.\n"); >} >
'#' または ';' は行コメントを意味する。 後で出てくる vi コマンド行の途中に出てきた場合は、それ以降がコメントとなる。
':' で始まる行は ex コマンドとみなされ実行される。
途中からコメントを記述することはできない。
j k コマンドなどはフォントがプロポーショナルかどうかで、動作結果が異なる。
したがって、:set fontName=Courier New を必ず記述しておくこと。
'<' で始まる一連の行は、テストを行う場合の初期文書を意味する。 その時点でバッファがクリアされ、'>' に続く文字列が読み込まれる。 行頭が '<' 以外の文字の行が現れたら、初期文書指定は終了する。 最後には必ず改行があるものとする。 最後に改行の無い文書のテストを行いたい場合は、vi コマンドで明示的に削除する。
ダブルクォートで囲まれた文字列は、vi コマンドとして処理される。 ダブルクォートを vi コマンドとして処理させたい場合はダブルクォートを2つ記述する。 0x20 未満のコントロールコードを記述したい場合は、(ダブルクォートで囲まず)16進数または10進数で指定する。
例:"iabc" 0x1b
'=' に続けて、行番号(1..*)、行内オフセット(0..*)を着記述する。 現在カーソル位置が指定位置と等しいかどうかがテストされる。
'/' または '?' に続けて正規表現を記述した場合は、正規表現検索として処理される。 マッチ位置が正しいかどうかは、= によるカーソル位置テストにより行う。
'>' で始まる一連の行は、現在のバッファと比較するための文書とみなされる。 EOF 行が空の場合(デフォルトではそうなる)は、上の例の様に '>' だけの行を記述すること。 バッファと比較し、不一致があればテスト失敗となる。
テストスクリプトファイルを記述したら、qvi を起動し、
:test <テストスクリプトファイル名>
でテストスクリプトを実行する。
テスト結果は下図の様にアウトプットに表示される。
テスト失敗回数 / テスト回数 が表示され、失敗があった場合は失敗箇所のテストスクリプトファイル名、行番号と詳細が表示される。
失敗箇所部分をマウスダブルクリックすると、テストスクリプトがオープンされ、失敗箇所にジャンプする。
テストスクリプト仕様の説明だけで長くなってしまったので、実装の説明は次原にゆずる。