highlightのテストに関するメモ

だいぶ前に m2ymさんに教えていただいたんですが, 最近になっていざ
使おうとしたときすっかり忘れていて, また調べまわるハメになったので
メモとして残しておきます.

問題

ert等を使ってテストをするとき, '-batch'オプションを使ってコマンドライン
から実行するわけですが, その場合 highlightされません(--scriptオプションも同じ).
なんでそれだとファイル開いて, モードを設定して, 目的の場所に移動して,
face-at-pointを実行しても, nilしか返らず, faceが正しく設定されて
いるかを確認することができません.

解決方法

font-lock-fontify-bufferを実行することで highlightされた
ことになり, face-at-pointで現在の point位置の faceが取得
できるようになります.


ここで重要なのは文字を書いてから font-lock-fontify-bufferを
する必要があるということです. font-lock-fontify-bufferを
実行したら以後挿入する文字が色付けされるというわけではなく,
挿入済みのものが色付けされます.


一番初めに font-lock-fontify-bufferを実行して, あとで
insertして, なんで変わんないんだ〜っていうのでハマりましたので,
使う人は注意してください.

テスト例

ユーティリティ
;; codeを temporary bufferに挿入し, coffee-modeを有効にする
(defmacro with-coffee-temp-buffer (code &rest body)
  "Insert `code' and enable `coffee-mode'. cursor is beginning of buffer"
  (declare (indent 0) (debug t))
  `(with-temp-buffer
     (insert ,code)
     (goto-char (point-min))
     (coffee-mode)
     (font-lock-fontify-buffer)
     ,@body))

;; patternの位置までカーソルを進める
(defun forward-cursor-on (pattern)
  (re-search-forward pattern)
  (goto-char (match-beginning 0)))

;; 現在カーソル下の faceと引数の faceが一致していれば true
(defun face-at-cursor-p (face)
  (eq (face-at-point) face))
テスト
(ert-deftest lambda-expression-fat-arrow ()
  "Highlight lambda expression with fat arrow"

  (with-coffee-temp-buffer
    "foo =>
      \"bar\""

    (forward-cursor-on "=>")
    (should (face-at-cursor-p 'font-lock-function-name-face))))