|
| 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