]> code.delx.au - gnu-emacs-elpa/blob - packages/hydra/hydra-test.el
Merge commit '0c08964462812942db51d177e6ea922b26019e65' from hydra
[gnu-emacs-elpa] / packages / hydra / hydra-test.el
1 ;;; hydra-test.el --- Tests for Hydra
2
3 ;; Copyright (C) 2015 Free Software Foundation, Inc.
4
5 ;; Author: Oleh Krehel
6
7 ;; This file is part of GNU Emacs.
8
9 ;; GNU Emacs is free software: you can redistribute it and/or modify
10 ;; it under the terms of the GNU General Public License as published by
11 ;; the Free Software Foundation, either version 3 of the License, or
12 ;; (at your option) any later version.
13
14 ;; GNU Emacs is distributed in the hope that it will be useful,
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ;; GNU General Public License for more details.
18
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
21
22 ;;; Commentary:
23 ;;
24
25 ;;; Code:
26
27 (require 'ert)
28
29 (ert-deftest hydra-red-error ()
30 (should
31 (equal
32 (macroexpand
33 '(defhydra hydra-error (global-map "M-g")
34 "error"
35 ("h" first-error "first")
36 ("j" next-error "next")
37 ("k" previous-error "prev")))
38 '(progn
39 (defun hydra-error/first-error nil "Create a hydra with a \"M-g\" body and the heads:
40
41 \"h\": `first-error',
42 \"j\": `next-error',
43 \"k\": `previous-error'
44
45 The body can be accessed via `hydra-error/body'.
46
47 Call the head: `first-error'."
48 (interactive)
49 (hydra-disable)
50 (catch (quote hydra-disable)
51 (condition-case err (prog1 t (call-interactively (function first-error)))
52 ((debug error)
53 (message "%S" err)
54 (sit-for 0.8)
55 nil))
56 (when hydra-is-helpful (message #("error: [h]: first, [j]: next, [k]: prev." 8 9 (face hydra-face-red)
57 20 21 (face hydra-face-red)
58 31 32 (face hydra-face-red))))
59 (setq hydra-last
60 (hydra-set-transient-map
61 (setq hydra-curr-map
62 (quote (keymap (107 . hydra-error/previous-error)
63 (106 . hydra-error/next-error)
64 (104 . hydra-error/first-error)
65 (kp-subtract . hydra--negative-argument)
66 (kp-9 . hydra--digit-argument)
67 (kp-8 . hydra--digit-argument)
68 (kp-7 . hydra--digit-argument)
69 (kp-6 . hydra--digit-argument)
70 (kp-5 . hydra--digit-argument)
71 (kp-4 . hydra--digit-argument)
72 (kp-3 . hydra--digit-argument)
73 (kp-2 . hydra--digit-argument)
74 (kp-1 . hydra--digit-argument)
75 (kp-0 . hydra--digit-argument)
76 (57 . hydra--digit-argument)
77 (56 . hydra--digit-argument)
78 (55 . hydra--digit-argument)
79 (54 . hydra--digit-argument)
80 (53 . hydra--digit-argument)
81 (52 . hydra--digit-argument)
82 (51 . hydra--digit-argument)
83 (50 . hydra--digit-argument)
84 (49 . hydra--digit-argument)
85 (48 . hydra--digit-argument)
86 (45 . hydra--negative-argument)
87 (21 . hydra--universal-argument))))
88 t))))
89 (defun hydra-error/next-error nil "Create a hydra with a \"M-g\" body and the heads:
90
91 \"h\": `first-error',
92 \"j\": `next-error',
93 \"k\": `previous-error'
94
95 The body can be accessed via `hydra-error/body'.
96
97 Call the head: `next-error'."
98 (interactive)
99 (hydra-disable)
100 (catch (quote hydra-disable)
101 (condition-case err (prog1 t (call-interactively (function next-error)))
102 ((debug error)
103 (message "%S" err)
104 (sit-for 0.8)
105 nil))
106 (when hydra-is-helpful (message #("error: [h]: first, [j]: next, [k]: prev." 8 9 (face hydra-face-red)
107 20 21 (face hydra-face-red)
108 31 32 (face hydra-face-red))))
109 (setq hydra-last
110 (hydra-set-transient-map
111 (setq hydra-curr-map
112 (quote (keymap (107 . hydra-error/previous-error)
113 (106 . hydra-error/next-error)
114 (104 . hydra-error/first-error)
115 (kp-subtract . hydra--negative-argument)
116 (kp-9 . hydra--digit-argument)
117 (kp-8 . hydra--digit-argument)
118 (kp-7 . hydra--digit-argument)
119 (kp-6 . hydra--digit-argument)
120 (kp-5 . hydra--digit-argument)
121 (kp-4 . hydra--digit-argument)
122 (kp-3 . hydra--digit-argument)
123 (kp-2 . hydra--digit-argument)
124 (kp-1 . hydra--digit-argument)
125 (kp-0 . hydra--digit-argument)
126 (57 . hydra--digit-argument)
127 (56 . hydra--digit-argument)
128 (55 . hydra--digit-argument)
129 (54 . hydra--digit-argument)
130 (53 . hydra--digit-argument)
131 (52 . hydra--digit-argument)
132 (51 . hydra--digit-argument)
133 (50 . hydra--digit-argument)
134 (49 . hydra--digit-argument)
135 (48 . hydra--digit-argument)
136 (45 . hydra--negative-argument)
137 (21 . hydra--universal-argument))))
138 t))))
139 (defun hydra-error/previous-error nil "Create a hydra with a \"M-g\" body and the heads:
140
141 \"h\": `first-error',
142 \"j\": `next-error',
143 \"k\": `previous-error'
144
145 The body can be accessed via `hydra-error/body'.
146
147 Call the head: `previous-error'."
148 (interactive)
149 (hydra-disable)
150 (catch (quote hydra-disable)
151 (condition-case err (prog1 t (call-interactively (function previous-error)))
152 ((debug error)
153 (message "%S" err)
154 (sit-for 0.8)
155 nil))
156 (when hydra-is-helpful (message #("error: [h]: first, [j]: next, [k]: prev." 8 9 (face hydra-face-red)
157 20 21 (face hydra-face-red)
158 31 32 (face hydra-face-red))))
159 (setq hydra-last
160 (hydra-set-transient-map
161 (setq hydra-curr-map
162 (quote (keymap (107 . hydra-error/previous-error)
163 (106 . hydra-error/next-error)
164 (104 . hydra-error/first-error)
165 (kp-subtract . hydra--negative-argument)
166 (kp-9 . hydra--digit-argument)
167 (kp-8 . hydra--digit-argument)
168 (kp-7 . hydra--digit-argument)
169 (kp-6 . hydra--digit-argument)
170 (kp-5 . hydra--digit-argument)
171 (kp-4 . hydra--digit-argument)
172 (kp-3 . hydra--digit-argument)
173 (kp-2 . hydra--digit-argument)
174 (kp-1 . hydra--digit-argument)
175 (kp-0 . hydra--digit-argument)
176 (57 . hydra--digit-argument)
177 (56 . hydra--digit-argument)
178 (55 . hydra--digit-argument)
179 (54 . hydra--digit-argument)
180 (53 . hydra--digit-argument)
181 (52 . hydra--digit-argument)
182 (51 . hydra--digit-argument)
183 (50 . hydra--digit-argument)
184 (49 . hydra--digit-argument)
185 (48 . hydra--digit-argument)
186 (45 . hydra--negative-argument)
187 (21 . hydra--universal-argument))))
188 t))))
189 (unless (keymapp (lookup-key global-map (kbd "M-g")))
190 (define-key global-map (kbd "M-g")
191 nil))
192 (define-key global-map [134217831 104]
193 (function hydra-error/first-error))
194 (define-key global-map [134217831 106]
195 (function hydra-error/next-error))
196 (define-key global-map [134217831 107]
197 (function hydra-error/previous-error))
198 (defun hydra-error/body nil "Create a hydra with a \"M-g\" body and the heads:
199
200 \"h\": `first-error',
201 \"j\": `next-error',
202 \"k\": `previous-error'
203
204 The body can be accessed via `hydra-error/body'."
205 (interactive)
206 (hydra-disable)
207 (catch (quote hydra-disable)
208 (when hydra-is-helpful (message #("error: [h]: first, [j]: next, [k]: prev." 8 9 (face hydra-face-red)
209 20 21 (face hydra-face-red)
210 31 32 (face hydra-face-red))))
211 (setq hydra-last
212 (hydra-set-transient-map
213 (setq hydra-curr-map
214 (quote (keymap (107 . hydra-error/previous-error)
215 (106 . hydra-error/next-error)
216 (104 . hydra-error/first-error)
217 (kp-subtract . hydra--negative-argument)
218 (kp-9 . hydra--digit-argument)
219 (kp-8 . hydra--digit-argument)
220 (kp-7 . hydra--digit-argument)
221 (kp-6 . hydra--digit-argument)
222 (kp-5 . hydra--digit-argument)
223 (kp-4 . hydra--digit-argument)
224 (kp-3 . hydra--digit-argument)
225 (kp-2 . hydra--digit-argument)
226 (kp-1 . hydra--digit-argument)
227 (kp-0 . hydra--digit-argument)
228 (57 . hydra--digit-argument)
229 (56 . hydra--digit-argument)
230 (55 . hydra--digit-argument)
231 (54 . hydra--digit-argument)
232 (53 . hydra--digit-argument)
233 (52 . hydra--digit-argument)
234 (51 . hydra--digit-argument)
235 (50 . hydra--digit-argument)
236 (49 . hydra--digit-argument)
237 (48 . hydra--digit-argument)
238 (45 . hydra--negative-argument)
239 (21 . hydra--universal-argument))))
240 t))
241 (setq prefix-arg current-prefix-arg)))))))
242
243 (ert-deftest hydra-blue-toggle ()
244 (should
245 (equal
246 (macroexpand
247 '(defhydra toggle (:color blue)
248 "toggle"
249 ("t" toggle-truncate-lines "truncate")
250 ("f" auto-fill-mode "fill")
251 ("a" abbrev-mode "abbrev")
252 ("q" nil "cancel")))
253 '(progn
254 (defun toggle/toggle-truncate-lines nil "Create a hydra with no body and the heads:
255
256 \"t\": `toggle-truncate-lines',
257 \"f\": `auto-fill-mode',
258 \"a\": `abbrev-mode',
259 \"q\": `nil'
260
261 The body can be accessed via `toggle/body'.
262
263 Call the head: `toggle-truncate-lines'."
264 (interactive)
265 (hydra-disable)
266 (catch (quote hydra-disable)
267 (call-interactively (function toggle-truncate-lines))))
268 (defun toggle/auto-fill-mode nil "Create a hydra with no body and the heads:
269
270 \"t\": `toggle-truncate-lines',
271 \"f\": `auto-fill-mode',
272 \"a\": `abbrev-mode',
273 \"q\": `nil'
274
275 The body can be accessed via `toggle/body'.
276
277 Call the head: `auto-fill-mode'."
278 (interactive)
279 (hydra-disable)
280 (catch (quote hydra-disable)
281 (call-interactively (function auto-fill-mode))))
282 (defun toggle/abbrev-mode nil "Create a hydra with no body and the heads:
283
284 \"t\": `toggle-truncate-lines',
285 \"f\": `auto-fill-mode',
286 \"a\": `abbrev-mode',
287 \"q\": `nil'
288
289 The body can be accessed via `toggle/body'.
290
291 Call the head: `abbrev-mode'."
292 (interactive)
293 (hydra-disable)
294 (catch (quote hydra-disable)
295 (call-interactively (function abbrev-mode))))
296 (defun toggle/nil nil "Create a hydra with no body and the heads:
297
298 \"t\": `toggle-truncate-lines',
299 \"f\": `auto-fill-mode',
300 \"a\": `abbrev-mode',
301 \"q\": `nil'
302
303 The body can be accessed via `toggle/body'.
304
305 Call the head: `nil'."
306 (interactive)
307 (hydra-disable)
308 (catch (quote hydra-disable)))
309 (defun toggle/body nil "Create a hydra with no body and the heads:
310
311 \"t\": `toggle-truncate-lines',
312 \"f\": `auto-fill-mode',
313 \"a\": `abbrev-mode',
314 \"q\": `nil'
315
316 The body can be accessed via `toggle/body'."
317 (interactive)
318 (hydra-disable)
319 (catch (quote hydra-disable)
320 (when hydra-is-helpful (message #("toggle: [t]: truncate, [f]: fill, [a]: abbrev, [q]: cancel." 9 10 (face hydra-face-blue)
321 24 25 (face hydra-face-blue)
322 35 36 (face hydra-face-blue)
323 48 49 (face hydra-face-blue))))
324 (setq hydra-last
325 (hydra-set-transient-map
326 (setq hydra-curr-map
327 (quote (keymap (113 . toggle/nil)
328 (97 . toggle/abbrev-mode)
329 (102 . toggle/auto-fill-mode)
330 (116 . toggle/toggle-truncate-lines)
331 (kp-subtract . hydra--negative-argument)
332 (kp-9 . hydra--digit-argument)
333 (kp-8 . hydra--digit-argument)
334 (kp-7 . hydra--digit-argument)
335 (kp-6 . hydra--digit-argument)
336 (kp-5 . hydra--digit-argument)
337 (kp-4 . hydra--digit-argument)
338 (kp-3 . hydra--digit-argument)
339 (kp-2 . hydra--digit-argument)
340 (kp-1 . hydra--digit-argument)
341 (kp-0 . hydra--digit-argument)
342 (57 . hydra--digit-argument)
343 (56 . hydra--digit-argument)
344 (55 . hydra--digit-argument)
345 (54 . hydra--digit-argument)
346 (53 . hydra--digit-argument)
347 (52 . hydra--digit-argument)
348 (51 . hydra--digit-argument)
349 (50 . hydra--digit-argument)
350 (49 . hydra--digit-argument)
351 (48 . hydra--digit-argument)
352 (45 . hydra--negative-argument)
353 (21 . hydra--universal-argument))))
354 t))
355 (setq prefix-arg current-prefix-arg)))))))
356
357 (ert-deftest hydra-amaranth-vi ()
358 (unless (version< emacs-version "24.4")
359 (should
360 (equal
361 (macroexpand
362 '(defhydra hydra-vi
363 (:pre
364 (set-cursor-color "#e52b50")
365 :post
366 (set-cursor-color "#ffffff")
367 :color amaranth)
368 "vi"
369 ("j" next-line)
370 ("k" previous-line)
371 ("q" nil "quit")))
372 '(progn
373 (defun hydra-vi/next-line nil "Create a hydra with no body and the heads:
374
375 \"j\": `next-line',
376 \"k\": `previous-line',
377 \"q\": `nil'
378
379 The body can be accessed via `hydra-vi/body'.
380
381 Call the head: `next-line'."
382 (interactive)
383 (set-cursor-color "#e52b50")
384 (hydra-disable)
385 (catch (quote hydra-disable)
386 (condition-case err (prog1 t (call-interactively (function next-line)))
387 ((debug error)
388 (message "%S" err)
389 (sit-for 0.8)
390 nil))
391 (when hydra-is-helpful (message #("vi: j, k, [q]: quit." 4 5 (face hydra-face-amaranth)
392 7 8 (face hydra-face-amaranth)
393 11 12 (face hydra-face-blue))))
394 (setq hydra-last
395 (hydra-set-transient-map
396 (setq hydra-curr-map
397 (quote (keymap (7 lambda nil (interactive)
398 (hydra-disable)
399 (set-cursor-color "#ffffff"))
400 (t lambda nil (interactive)
401 (message "An amaranth Hydra can only exit through a blue head")
402 (hydra-set-transient-map hydra-curr-map t)
403 (when hydra-is-helpful (sit-for 0.8)
404 (message #("vi: j, k, [q]: quit." 4 5 (face hydra-face-amaranth)
405 7 8 (face hydra-face-amaranth)
406 11 12 (face hydra-face-blue)))))
407 (113 . hydra-vi/nil)
408 (107 . hydra-vi/previous-line)
409 (106 . hydra-vi/next-line)
410 (kp-subtract . hydra--negative-argument)
411 (kp-9 . hydra--digit-argument)
412 (kp-8 . hydra--digit-argument)
413 (kp-7 . hydra--digit-argument)
414 (kp-6 . hydra--digit-argument)
415 (kp-5 . hydra--digit-argument)
416 (kp-4 . hydra--digit-argument)
417 (kp-3 . hydra--digit-argument)
418 (kp-2 . hydra--digit-argument)
419 (kp-1 . hydra--digit-argument)
420 (kp-0 . hydra--digit-argument)
421 (57 . hydra--digit-argument)
422 (56 . hydra--digit-argument)
423 (55 . hydra--digit-argument)
424 (54 . hydra--digit-argument)
425 (53 . hydra--digit-argument)
426 (52 . hydra--digit-argument)
427 (51 . hydra--digit-argument)
428 (50 . hydra--digit-argument)
429 (49 . hydra--digit-argument)
430 (48 . hydra--digit-argument)
431 (45 . hydra--negative-argument)
432 (21 . hydra--universal-argument))))
433 t))))
434 (defun hydra-vi/previous-line nil "Create a hydra with no body and the heads:
435
436 \"j\": `next-line',
437 \"k\": `previous-line',
438 \"q\": `nil'
439
440 The body can be accessed via `hydra-vi/body'.
441
442 Call the head: `previous-line'."
443 (interactive)
444 (set-cursor-color "#e52b50")
445 (hydra-disable)
446 (catch (quote hydra-disable)
447 (condition-case err (prog1 t (call-interactively (function previous-line)))
448 ((debug error)
449 (message "%S" err)
450 (sit-for 0.8)
451 nil))
452 (when hydra-is-helpful (message #("vi: j, k, [q]: quit." 4 5 (face hydra-face-amaranth)
453 7 8 (face hydra-face-amaranth)
454 11 12 (face hydra-face-blue))))
455 (setq hydra-last
456 (hydra-set-transient-map
457 (setq hydra-curr-map
458 (quote (keymap (7 lambda nil (interactive)
459 (hydra-disable)
460 (set-cursor-color "#ffffff"))
461 (t lambda nil (interactive)
462 (message "An amaranth Hydra can only exit through a blue head")
463 (hydra-set-transient-map hydra-curr-map t)
464 (when hydra-is-helpful (sit-for 0.8)
465 (message #("vi: j, k, [q]: quit." 4 5 (face hydra-face-amaranth)
466 7 8 (face hydra-face-amaranth)
467 11 12 (face hydra-face-blue)))))
468 (113 . hydra-vi/nil)
469 (107 . hydra-vi/previous-line)
470 (106 . hydra-vi/next-line)
471 (kp-subtract . hydra--negative-argument)
472 (kp-9 . hydra--digit-argument)
473 (kp-8 . hydra--digit-argument)
474 (kp-7 . hydra--digit-argument)
475 (kp-6 . hydra--digit-argument)
476 (kp-5 . hydra--digit-argument)
477 (kp-4 . hydra--digit-argument)
478 (kp-3 . hydra--digit-argument)
479 (kp-2 . hydra--digit-argument)
480 (kp-1 . hydra--digit-argument)
481 (kp-0 . hydra--digit-argument)
482 (57 . hydra--digit-argument)
483 (56 . hydra--digit-argument)
484 (55 . hydra--digit-argument)
485 (54 . hydra--digit-argument)
486 (53 . hydra--digit-argument)
487 (52 . hydra--digit-argument)
488 (51 . hydra--digit-argument)
489 (50 . hydra--digit-argument)
490 (49 . hydra--digit-argument)
491 (48 . hydra--digit-argument)
492 (45 . hydra--negative-argument)
493 (21 . hydra--universal-argument))))
494 t))))
495 (defun hydra-vi/nil nil "Create a hydra with no body and the heads:
496
497 \"j\": `next-line',
498 \"k\": `previous-line',
499 \"q\": `nil'
500
501 The body can be accessed via `hydra-vi/body'.
502
503 Call the head: `nil'."
504 (interactive)
505 (set-cursor-color "#e52b50")
506 (hydra-disable)
507 (catch (quote hydra-disable)
508 (set-cursor-color "#ffffff")))
509 (defun hydra-vi/body nil "Create a hydra with no body and the heads:
510
511 \"j\": `next-line',
512 \"k\": `previous-line',
513 \"q\": `nil'
514
515 The body can be accessed via `hydra-vi/body'."
516 (interactive)
517 (set-cursor-color "#e52b50")
518 (hydra-disable)
519 (catch (quote hydra-disable)
520 (when hydra-is-helpful (message #("vi: j, k, [q]: quit." 4 5 (face hydra-face-amaranth)
521 7 8 (face hydra-face-amaranth)
522 11 12 (face hydra-face-blue))))
523 (setq hydra-last
524 (hydra-set-transient-map
525 (setq hydra-curr-map
526 (quote (keymap (7 lambda nil (interactive)
527 (hydra-disable)
528 (set-cursor-color "#ffffff"))
529 (t lambda nil (interactive)
530 (message "An amaranth Hydra can only exit through a blue head")
531 (hydra-set-transient-map hydra-curr-map t)
532 (when hydra-is-helpful (sit-for 0.8)
533 (message #("vi: j, k, [q]: quit." 4 5 (face hydra-face-amaranth)
534 7 8 (face hydra-face-amaranth)
535 11 12 (face hydra-face-blue)))))
536 (113 . hydra-vi/nil)
537 (107 . hydra-vi/previous-line)
538 (106 . hydra-vi/next-line)
539 (kp-subtract . hydra--negative-argument)
540 (kp-9 . hydra--digit-argument)
541 (kp-8 . hydra--digit-argument)
542 (kp-7 . hydra--digit-argument)
543 (kp-6 . hydra--digit-argument)
544 (kp-5 . hydra--digit-argument)
545 (kp-4 . hydra--digit-argument)
546 (kp-3 . hydra--digit-argument)
547 (kp-2 . hydra--digit-argument)
548 (kp-1 . hydra--digit-argument)
549 (kp-0 . hydra--digit-argument)
550 (57 . hydra--digit-argument)
551 (56 . hydra--digit-argument)
552 (55 . hydra--digit-argument)
553 (54 . hydra--digit-argument)
554 (53 . hydra--digit-argument)
555 (52 . hydra--digit-argument)
556 (51 . hydra--digit-argument)
557 (50 . hydra--digit-argument)
558 (49 . hydra--digit-argument)
559 (48 . hydra--digit-argument)
560 (45 . hydra--negative-argument)
561 (21 . hydra--universal-argument))))
562 t))
563 (setq prefix-arg current-prefix-arg))))))))
564
565 (provide 'hydra-test)
566
567 ;;; hydra-test.el ends here