Skip to content

Commit 8bec74b

Browse files
committed
Add ERT tests for Isearch extensions
New files: - tctest.el : Test items. - tctest-play.el : Test driver. Simulate user inputs using keyboard macro. - tctest-env.el, run.bash : Convenient scripts for selecting isearch options.
1 parent 38d089d commit 8bec74b

File tree

4 files changed

+1682
-0
lines changed

4 files changed

+1682
-0
lines changed

test/run.bash

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#!/usr/bin/env bash
2+
3+
# 複数バージョンの emacs と、複数の初期設定オプションの組み合わせで、
4+
# tctest のバッチテストを実行する。
5+
#
6+
# 実行方法:
7+
# 1. tc-setup.el のあるディレクトリに cd する。(カレントディレクトリ
8+
# が load-path に加えられる。)
9+
# 2. このスクリプトを、パス指定で実行する。通常は test/run.bash でよ
10+
# い。テスト開発時など、tctest.el が別の場所にある場合は、そのディ
11+
# レクトリにある run.bash を実行する。(run.bash のあるディレクト
12+
# リが load-path に加えられる。)
13+
# 3. テスト対象の各バージョンの emacs のコマンド名を、「,」で区切っ
14+
# て並べたものを、第1引数に指定する。
15+
# 4. 初期設定方法のキーワード(tctest-env.el 参照)を、「,」で区切って
16+
# 並べたものを、第2引数に指定する。
17+
# 5. 残りの引数は、そのまま emacs に渡される。
18+
#
19+
# 実行例:
20+
# $ cd ~/tc
21+
# $ test/run.bash emacs-30 isadvice --batch
22+
# 動作: 以下と同じ。つまり、(setq tcode-use-isearch 'advice) が設
23+
# 定され、ert のバッチテストが実行される。
24+
# $ TCTEST_ENV=isadvice emacs-30 -L ~/tc -L ~/tc/test -l tctest.env --batch
25+
#
26+
# $ test/run.bash emacs-30,emacs-26 isoverwrite,isadvice,isim --batch
27+
# 動作: 以下を順に実行するのと同じ。
28+
# $ test/run.bash emacs-30 isoverwrite --batch
29+
# $ test/run.bash emacs-30 isadvice --batch
30+
# $ test/run.bash emacs-30 isim --batch
31+
# $ test/run.bash emacs-26 isoverwrite --batch
32+
# $ test/run.bash emacs-26 isadvice --batch
33+
# $ test/run.bash emacs-26 isim --batch
34+
#
35+
# Windows での注意点:
36+
# - バッチモードで動作する Windows 用 emacs は、ターミナルへ直接日本
37+
# 語文字を出力すると、終了コードが1になってしまう。原因不明。
38+
# workaroundとして、出力先をファイル、または、パイプにすればよい。
39+
# 例:
40+
# $ test/run.bash emacs-30 isadvice --batch 2>&1 | tee /tmp/out
41+
42+
test_dir=$(dirname "$0")
43+
cmds=$1; shift
44+
keywords=$1; shift
45+
46+
fixed_args="-L . -L "$test_dir" -l tctest-env"
47+
48+
total=0
49+
for cmd in ${cmds//,/ }; do # split by comma
50+
for keyword in ${keywords//,/ }; do
51+
echo ========================================
52+
echo Running TCTEST_ENV=$keyword $cmd $fixed_args "$@"
53+
TCTEST_ENV=$keyword $cmd $fixed_args "$@"
54+
status=$?
55+
echo ------ exit status: $status -----
56+
total=$(( total + status ))
57+
done
58+
done
59+
echo exit status total: $total
60+
test "$total" -eq 0

test/tctest-env.el

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
;;; tctest-env.el --- Setup environment for tctest. -*- lexical-binding: nil -*-
2+
3+
;; isearch 用設定を変えながら、T-Code 用 ert テストを繰り返し実行する
4+
;; 際の、「.tc を書き換えて emacs 起動」の手間を減らすためのスクリプト。
5+
;;
6+
;; 環境変数 TCTEST_ENV=keyword1:keyword2:... の設定に従って T-Code の
7+
;; 初期設定を行なう。ert テストの手動実行、または run.bashと共に、バッ
8+
;; チテストの起動に用いる。
9+
;;
10+
;; 実行例: (run.bash の実行例も参照。)
11+
;; $ TCTEST_ENV=isadvice emacs --batch -L ~/tc -L ~/tc/test -l tctest-env
12+
;; 動作 : (setq tcode-use-isearch 'advice) を設定した上でディレク
13+
;; トリ ~/tc 下の tc-setup、test/tctest をロードし、ert の
14+
;; テストをバッチモードで実行する。
15+
;;
16+
;; $ TCTEST_ENV=isoverwrite emacs -Q -L ~/tc -L ~/tc/test -l tctest-env
17+
;; 動作 : (setq tcode-use-isearch 'overwrite) を設定した上で
18+
;; tc-setup、tctest をロードする。--batch を指定していない
19+
;; ので、テストのバッチ実行は行なわれない。M-x ert で手動
20+
;; 実行できる。(この場合、個人用設定がテストに影響しないよ
21+
;; う、-Q 推奨。)
22+
;;
23+
;; 必須キーワード(どれか一つを設定する):
24+
;; isnil : tcode-use-isearch を nil に設定する。
25+
;; isoverwrite : tcode-use-isearch を 'overwrite に設定する。
26+
;; isadvice : tcode-use-isearch を 'advice に設定する。
27+
;; isim : tcode-use-isearch を 'im に設定する。
28+
;; notc : tc-setup をロードしない。
29+
;;
30+
;; オプションキーワード:
31+
;; nobatch : バッチテストを実行しない。(デフォルトでは、emacs を
32+
;; --batch で起動するとバッチテストを自動で実行する。)
33+
;; debug : debug-on-error を t に設定する。
34+
;; notctest : tctest.el をロードしない。
35+
;; uim : tcode-use-input-method を t に設定する。
36+
;; nodefim : tcode-use-as-default-input-method を nil に設定する。
37+
;;
38+
;; FIXME: バッチモードで、単体テストを実行できるようにしたい。
39+
;; --batch で起動した emacs は、対話モードと動作が異なる場合がある
40+
;; (sit-for がsleep-for の動作になるなど)。テストのデバッグ用に単体実
41+
;; 行機能が必要。
42+
;;
43+
;; FIXME: .tc ファイルや ~/tcode ディレクトリの初期設定機能が必要かも。
44+
;; 現状はユーザー任せ。tctest.el のテスト内容は、プレーンな設定を仮定
45+
;; している。
46+
47+
(defvar tcode-use-isearch)
48+
(defvar tcode-use-input-method)
49+
(defvar tcode-use-as-default-input-method)
50+
51+
(defconst tctest-env-mandatory-keywords
52+
'("isim" "isadvice" "isoverwrite" "ist" "isnil" "notc")
53+
"isearch 実装の種別。TCTEST_ENV には、これらのうち一つを必ず指定する。")
54+
55+
(defun tctest-env-chk-mandatory (keywords)
56+
"必要なキーワードがセットされているかチェックする。"
57+
(let ((count 0))
58+
(dolist (w tctest-env-mandatory-keywords)
59+
(when (member w keywords)
60+
(setq count (1+ count))))
61+
(when (/= count 1)
62+
(error "Exactly one of %s must be specified as keyword"
63+
tctest-env-mandatory-keywords))))
64+
65+
(defun tctest-env-msg (fmt &rest args)
66+
"バッファ、またはバッチモードの場合標準エラーにメッセージを出力する。"
67+
(let ((msg (apply #'format fmt args)))
68+
(if noninteractive
69+
(message msg) ; to stderr
70+
(insert msg "\n"))))
71+
72+
(defun tctest-env-load-tc (keywords)
73+
"変数設定をした上で、tc-setup をロードする。"
74+
;; tctest-env-chk-mandatory によるチェックにより、キーワード isim,
75+
;; isadvice, isoverwrite, isnil, ist, notc は、これらのうちちょうど1
76+
;; つだけが指定されている。
77+
(when (member "isim" keywords)
78+
(setq tcode-use-isearch 'im))
79+
(when (member "isadvice" keywords)
80+
(setq tcode-use-isearch 'advice))
81+
(when (member "isoverwrite" keywords)
82+
(setq tcode-use-isearch 'overwrite))
83+
(when (member "ist" keywords)
84+
(setq tcode-use-isearch t))
85+
(when (member "isnil" keywords)
86+
(with-eval-after-load ".tc"
87+
(setq tcode-use-isearch nil)))
88+
(when (member "nodefim" keywords)
89+
(with-eval-after-load ".tc"
90+
(setq tcode-use-as-default-input-method nil)))
91+
(when (member "uim" keywords)
92+
(setq tcode-use-input-method t))
93+
(unless (member "notc" keywords)
94+
(require 'tc-setup))
95+
(when (member "nodefim" keywords)
96+
;; batch モードで [IMON] 時に input method を聞かれるのを防ぐ。
97+
(set-input-method "japanese-T-Code")))
98+
99+
(defun tctest-env-show-exprs (exprs)
100+
"リスト EXPRS の各要素を評価して値を表示する。"
101+
(dolist (expr exprs)
102+
(let ((val (if (symbolp expr)
103+
(if (boundp expr)
104+
(symbol-value expr)
105+
'UNDEF)
106+
(eval expr))))
107+
(tctest-env-msg "%S: %S" expr val))))
108+
109+
(defun tctest-env-run-test (keywords)
110+
"ert のバッチテストを実行する。"
111+
(when (and noninteractive
112+
(not (member "nobatch" keywords)))
113+
;; FIXME: quiet オプションは、実験的に付けてはみたものの、isearch
114+
;; の echo area 表示が標準エラーに大量に出力されるので、あまり意味
115+
;; はなかった。個々のテスト中で、inhibit-message t を設定する機能
116+
;; を追加する必要がある。
117+
(let ((ert-quiet (member "quiet" keywords)))
118+
(ert-run-tests-batch-and-exit))))
119+
120+
(defun tctest-env-main ()
121+
(let* ((keywords-packed (or (getenv "TCTEST_ENV")
122+
(error "TCTEST_ENV not specified")))
123+
(keywords (split-string keywords-packed ":")))
124+
(tctest-env-chk-mandatory keywords)
125+
(when (member "debug" keywords)
126+
(setq debug-on-error t))
127+
(tctest-env-msg "dir: %s" default-directory)
128+
(tctest-env-msg "emacs-version: %s" emacs-version)
129+
(tctest-env-msg "keywords: %S" keywords)
130+
(tctest-env-load-tc keywords)
131+
(unless (or (member "notc" keywords)
132+
(member "notctest" keywords))
133+
(require 'tctest))
134+
(tctest-env-show-exprs '(tcode-data-directory
135+
tcode-use-isearch
136+
tcode-use-input-method
137+
tcode-use-as-default-input-method
138+
(locate-library "tc-setup")
139+
(featurep 'tc-is22)
140+
(featurep 'tc-ishelper)))
141+
(tctest-env-run-test keywords)))
142+
143+
(tctest-env-main)

0 commit comments

Comments
 (0)