ido-ubiquitous-test.el 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544
  1. ;;; ido-ubiquitous-test.el --- -*- lexical-binding: nil -*-
  2. ;; Copyright (C) 2015 Ryan C. Thompson
  3. ;; Filename: ido-ubiquitous-test.el
  4. ;; Author: Ryan C. Thompson
  5. ;; Created: Tue Oct 6 20:52:45 2015 (-0700)
  6. ;; This file is NOT part of GNU Emacs.
  7. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  8. ;;
  9. ;; This program 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 (at
  12. ;; your option) any later version.
  13. ;;
  14. ;; This program is distributed in the hope that it will be useful, but
  15. ;; WITHOUT ANY WARRANTY; without even the implied warranty of
  16. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. ;; 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. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  23. ;;
  24. ;;; Code:
  25. (require 'ido-completing-read+)
  26. (require 'ido-ubiquitous)
  27. (require 'ert)
  28. (require 'cl-lib)
  29. ;; This is a series of macros to facilitate the testing of completion
  30. ;; non-interactively by simulating input.
  31. (defmacro keyboard-quit-to-error (&rest body)
  32. "Evaluate BODY but signal an error on `keyboard-quit'."
  33. `(condition-case nil
  34. (progn ,@body)
  35. (quit
  36. (error "Caught `keyboard-quit'"))))
  37. (defmacro with-simulated-input (keys &rest body)
  38. "Eval body with KEYS as simulated input.
  39. This macro is intended for testing normally interactive functions
  40. by simulating input. If BODY tries to read more input events than
  41. KEYS provides, `keyboard-quit' is invoked (by means of appending
  42. multple C-g keys to KEYS). This is to ensure that BODY will never
  43. block waiting for input, since this macro is intended for
  44. noninteractive use. As such, BODY should not invoke
  45. `keyboard-quit' under normal operation, and KEYS should not
  46. include C-g, or this macro will interpret it as reading past the
  47. end of input."
  48. ;; It would be better to detect end-of-input by overriding
  49. ;; `read-event' to throw an error, since theoretically C-g could be
  50. ;; rebound to something other than `keyboard-quit'. But apparently
  51. ;; some functions read input directly in C code, and redefining
  52. ;; `read-event' has no effect on those. So the suboptimal solution
  53. ;; is to rely on C-g.
  54. (declare (indent 1))
  55. `(let* ((key-sequence (listify-key-sequence (kbd ,keys)))
  56. (C-g-key-sequence
  57. (listify-key-sequence
  58. ;; We *really* want to trigger `keyboard-quit' if we reach
  59. ;; the end of the input.
  60. (kbd "C-g C-g C-g C-g C-g C-g C-g")))
  61. (unread-command-events
  62. (append key-sequence C-g-key-sequence)))
  63. (when (member (car C-g-key-sequence) key-sequence)
  64. (error "KEYS must not include C-g"))
  65. (condition-case nil
  66. (progn ,@body)
  67. (quit
  68. (error "Reached end of simulated input while evaluating body")))))
  69. (defmacro with-mode (mode arg &rest body)
  70. "Eval (MODE ARG), then body, then restore previous status of MODE.
  71. This will only work on modes that respect the normal conventions
  72. for activation and deactivation."
  73. (declare (indent 2))
  74. `(let* ((orig-status ,mode)
  75. (restore-arg (if orig-status 1 0)))
  76. (unwind-protect
  77. (progn
  78. (,mode ,arg)
  79. ,@body)
  80. (message "Restoring mode %s to %s" ',mode restore-arg)
  81. (,mode restore-arg))))
  82. (defmacro with-ido-ubiquitous-standard-env (&rest body)
  83. "Execute BODY with standard ido-ubiquitous settings.\n\nAll ido-ubiquitous and ido-cr+ options will be let-bound to their\ndefault values, and `ido-ubiquitous-mode' will be enabled."
  84. (declare (indent 0))
  85. (let*
  86. ((ido-ubiquitous-options
  87. '(ido-ubiquitous-allow-on-functional-collection
  88. ido-ubiquitous-command-overrides
  89. ido-ubiquitous-debug-mode
  90. ido-ubiquitous-default-state
  91. ido-ubiquitous-function-overrides
  92. ido-cr+-fallback-function
  93. ido-cr+-max-items
  94. ido-cr+-replace-completely))
  95. (idu-bindings
  96. (cl-loop for var in ido-ubiquitous-options collect
  97. (list var
  98. (list 'quote
  99. (eval (car (get var 'standard-value))))))))
  100. `(with-mode ido-ubiquitous-mode 1
  101. (let ,idu-bindings ,@body))))
  102. (defun collection-as-function (collection)
  103. "Return a function equivalent to COLLECTION.
  104. The returned function will work equivalently to COLLECTION when
  105. passed to `all-completions' and `try-completion'."
  106. (completion-table-dynamic (lambda (string) (all-completions string collection))))
  107. (defun should-with-tag-internal (form tag)
  108. (let ((complete-form (list 'and tag form)))
  109. (eval (list 'should complete-form))))
  110. (cl-defmacro should-with-tag (form &key tag)
  111. "Equivalent to `(should FORM)' but with a tag on the output.
  112. This is useful if the same `should' form will be called multiple
  113. times in different contexts. Each test can pass a different tag
  114. so it's clear in the ERT output which context is causing the
  115. failure."
  116. `(if ,tag
  117. (should-with-tag-internal ',form ,tag)
  118. (should ,form)))
  119. (defun plist-delete (plist property)
  120. "Delete PROPERTY from PLIST.
  121. This is in contrast to merely setting it to 0."
  122. (let (p)
  123. (while plist
  124. (if (not (eq property (car plist)))
  125. (setq p (plist-put p (car plist) (nth 1 plist))))
  126. (setq plist (cddr plist)))
  127. p))
  128. (defun should-error-with-tag-internal (form other-args tag)
  129. (let ((complete-form (list 'and tag form)))
  130. (eval (nconc (list 'should-error complete-form)
  131. other-args))))
  132. (cl-defmacro should-error-with-tag (form &rest other-keys &key tag &allow-other-keys)
  133. "Equivalent to `(should FORM)' but with a tag on the output.
  134. See `should-with-tag'."
  135. (setq other-keys (plist-delete other-keys :tag))
  136. `(if ,tag
  137. (should-error-with-tag-internal ',form ',other-keys ,tag)
  138. (should-error ,form ,@other-keys)))
  139. (defun test-ido-ubiquitous-expected-mode (override &optional tag)
  140. "Test whether observed ido-ubiquitous behavior matches OVERRIDE."
  141. (declare (indent 1))
  142. (if (eq override 'disable)
  143. (progn
  144. (should-with-tag
  145. ;; Verify that we get standard completion
  146. (string=
  147. "g"
  148. (with-simulated-input "g RET"
  149. (completing-read "Prompt: " '("blue" "yellow" "green"))))
  150. :tag tag)
  151. (should-with-tag
  152. (string=
  153. "green"
  154. (with-simulated-input "g RET"
  155. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  156. :tag tag)
  157. ;; Standard completion should refuse to finish with incomplete
  158. ;; input if match is required
  159. (should-error-with-tag
  160. (with-simulated-input "b RET"
  161. (completing-read "Prompt: " '("brown" "blue" "yellow" "green") nil t))
  162. :type 'error
  163. :tag tag))
  164. ;; Common tests whenever ido-ubiquitous is enabled in any way
  165. (should-with-tag
  166. ;; Verify that ido completion is active
  167. (string=
  168. "green"
  169. (with-simulated-input "g RET"
  170. (completing-read "Prompt: " '("blue" "yellow" "green"))))
  171. :tag tag)
  172. ;; Verify that C-j is working correctly
  173. (should-with-tag
  174. (string=
  175. "g"
  176. (with-simulated-input "g C-j"
  177. (completing-read "Prompt: " '("blue" "yellow" "green"))))
  178. :tag tag)
  179. (let ((collection '("brown" "blue" "yellow" "green")))
  180. (should-with-tag
  181. (member
  182. (with-simulated-input "b RET"
  183. (completing-read "Prompt: " collection))
  184. (all-completions "b" collection))
  185. :tag tag))
  186. (case override
  187. (enable
  188. ;; Test for new style
  189. (should-with-tag
  190. (string=
  191. "blue"
  192. (with-simulated-input "RET"
  193. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  194. :tag tag)
  195. (should-with-tag
  196. (string=
  197. ""
  198. (with-simulated-input "C-j"
  199. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  200. :tag tag))
  201. (enable-old
  202. (should-with-tag
  203. (string=
  204. ""
  205. (with-simulated-input "RET"
  206. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  207. :tag tag)
  208. (should-with-tag
  209. (string=
  210. "blue"
  211. (with-simulated-input "C-j"
  212. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  213. :tag tag)
  214. ;; Verify that doing other stuff reverts RET and C-j to standard
  215. ;; meanings
  216. (should-with-tag
  217. (string=
  218. "blue"
  219. (with-simulated-input "g DEL RET"
  220. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  221. :tag tag)
  222. (should-with-tag
  223. (string=
  224. "blue"
  225. (with-simulated-input "<right> <left> RET"
  226. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  227. :tag tag)
  228. (should-with-tag
  229. (string=
  230. ""
  231. (with-simulated-input "g DEL C-j"
  232. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  233. :tag tag)
  234. (should-with-tag
  235. (string=
  236. ""
  237. (with-simulated-input "<right> <left> C-j"
  238. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  239. :tag tag))
  240. (otherwise (error "Unknown override %S" override)))))
  241. (defun test-ido-ubiquitous-expected-mode-on-functional-collection (override &optional tag)
  242. "Test whether observed ido-ubiquitous behavior on functional collection matches OVERRIDE."
  243. (declare (indent 1))
  244. ;; This just temporarily replaces `completing-read' with a wrapper
  245. ;; that always converts the collection argument to an equivalent
  246. ;; function.
  247. (cl-letf* ((original-completing-read (symbol-function #'completing-read))
  248. ((symbol-function #'completing-read)
  249. (lambda (prompt collection &rest args)
  250. (apply original-completing-read prompt
  251. (collection-as-function collection)
  252. args))))
  253. (test-ido-ubiquitous-expected-mode override tag)))
  254. (ert-deftest ido-ubiquitous-test-simple ()
  255. :tags '(ido ido-ubiquitous)
  256. "Test that basic ido-ubiquitous functionality is working."
  257. (with-ido-ubiquitous-standard-env
  258. (ido-ubiquitous-mode 1)
  259. (test-ido-ubiquitous-expected-mode 'enable
  260. :simple-enable)
  261. (ido-ubiquitous-mode 0)
  262. (test-ido-ubiquitous-expected-mode 'disable
  263. :simple-disable)))
  264. (ert-deftest ido-ubiquitous-test-oldstyle ()
  265. :tags '(ido ido-ubiquitous)
  266. "Test whether old-style completion works as expected."
  267. (with-ido-ubiquitous-standard-env
  268. (let ((ido-ubiquitous-default-state 'enable-old))
  269. (test-ido-ubiquitous-expected-mode 'enable-old
  270. :simple-oldstyle))))
  271. (ert-deftest ido-ubiquitous-test-maxitems ()
  272. :tags '(ido ido-ubiquitous)
  273. "Test whether the large-collection fallback works."
  274. (with-ido-ubiquitous-standard-env
  275. (let ((ido-cr+-max-items -1))
  276. (test-ido-ubiquitous-expected-mode 'disable
  277. :maxitems))))
  278. (ert-deftest ido-ubiquitous-test-override ()
  279. :tags '(ido ido-ubiquitous)
  280. "Test whether ido-ubiquitous overrides work."
  281. (with-ido-ubiquitous-standard-env
  282. (ido-ubiquitous-with-override 'enable
  283. (test-ido-ubiquitous-expected-mode 'enable
  284. :override-enable))
  285. (ido-ubiquitous-with-override 'enable-old
  286. (test-ido-ubiquitous-expected-mode 'enable-old
  287. :override-enable-old))
  288. (ido-ubiquitous-with-override 'disable
  289. (test-ido-ubiquitous-expected-mode 'disable
  290. :override-disable))))
  291. (ert-deftest ido-ubiquitous-test-functional-collection ()
  292. :tags '(ido ido-ubiquitous)
  293. "Test whether ido-ubiquitous overrides work when collection is a function."
  294. (with-ido-ubiquitous-standard-env
  295. (test-ido-ubiquitous-expected-mode-on-functional-collection 'disable
  296. :collfunc)
  297. (ido-ubiquitous-with-override 'enable
  298. (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable
  299. :override-enable-collfunc))
  300. (ido-ubiquitous-with-override 'enable-old
  301. (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable-old
  302. :override-enable-old-collfunc))))
  303. (ert-deftest ido-cr+-require-match ()
  304. :tags '(ido ido-cr+)
  305. "Test whether require-match works."
  306. ;; "C-j" should be allowed to return an empty string even if
  307. ;; require-match is non-nil, as long as default is nil
  308. (should
  309. (string=
  310. ""
  311. (with-simulated-input "C-j"
  312. (ido-completing-read+
  313. "Prompt: "
  314. '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))
  315. ;; "C-j" should NOT be allowed to return an empty string if
  316. ;; require-match and default are both non-nil.
  317. (should-error
  318. (with-simulated-input "C-j"
  319. (ido-completing-read+
  320. "Prompt: "
  321. '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t nil nil "yellow")))
  322. ;; Multiple presses of C-j won't just select the first match
  323. (should-error
  324. (with-simulated-input "b C-j C-j C-j"
  325. (ido-completing-read+
  326. "Prompt: "
  327. '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t)))
  328. ;; First press of C-j should complete unique common prefix after the
  329. ;; first b, but then get stuck on the choice for the second b.
  330. (should-error
  331. (with-simulated-input "b C-j b C-j C-j"
  332. (ido-completing-read+
  333. "Prompt: "
  334. '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t)))
  335. ;; This should complete to "blueberry" via 2 rounds of unique common
  336. ;; prefix completion, and then return on the 3rd "C-j"
  337. (should
  338. (string=
  339. "blueberry"
  340. (with-simulated-input "b C-j b C-j e C-j C-j"
  341. (ido-completing-read+
  342. "Prompt: "
  343. '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))
  344. ;; The "C-j" should complete to "bluegrass" but should
  345. ;; not return.
  346. (should-error
  347. (with-simulated-input "b l u e g C-j"
  348. (ido-completing-read+
  349. "Prompt: "
  350. '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t)))
  351. ;; The first "C-j" should complete to "bluegrass", and the second
  352. ;; should return.
  353. (should
  354. (string=
  355. "bluegrass"
  356. (with-simulated-input "b l u e g C-j C-j"
  357. (ido-completing-read+
  358. "Prompt: "
  359. '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))
  360. ;; Finally, a few tests for the expected wrong behavior without
  361. ;; ido-cr+. If ido.el ever fixes this bug, it will cause this test
  362. ;; to fail as a signal that the workaround can be phased out.
  363. (should
  364. (string=
  365. ""
  366. (with-simulated-input "C-j"
  367. (ido-completing-read
  368. "Prompt: "
  369. '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))
  370. (should
  371. (string=
  372. "b"
  373. (with-simulated-input "b C-j"
  374. (ido-completing-read
  375. "Prompt: "
  376. '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t)))))
  377. ;; Functions to define overrides on for testing
  378. (defun idu-no-override-testfunc ()
  379. (test-ido-ubiquitous-expected-mode 'enable
  380. :func-override-none)
  381. (test-ido-ubiquitous-expected-mode-on-functional-collection 'disable
  382. :func-override-none-collfunc))
  383. (defun idu-enabled-testfunc (&rest args)
  384. (test-ido-ubiquitous-expected-mode 'enable
  385. :func-override-enable)
  386. (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable
  387. :func-override-enable-collfunc))
  388. (defun idu-disabled-testfunc (&rest args)
  389. (test-ido-ubiquitous-expected-mode 'disable
  390. :func-override-disable)
  391. (test-ido-ubiquitous-expected-mode-on-functional-collection 'disable
  392. :func-override-disable-collfunc))
  393. (defun idu-enabled-oldstyle-testfunc (&rest args)
  394. (test-ido-ubiquitous-expected-mode 'enable-old
  395. :func-override-enable-old)
  396. (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable-old
  397. :func-override-enable-old-collfunc))
  398. ;; commands to define overrides on for testing
  399. (defun idu-no-override-testcmd (&rest args)
  400. (interactive
  401. (list
  402. (test-ido-ubiquitous-expected-mode 'enable
  403. :cmd-override-none)
  404. (test-ido-ubiquitous-expected-mode-on-functional-collection 'disable
  405. :cmd-override-non-collfunc)))
  406. (test-ido-ubiquitous-expected-mode 'enable
  407. :cmd-override-none)
  408. (test-ido-ubiquitous-expected-mode-on-functional-collection 'disable
  409. :cmd-override-non-collfunc))
  410. (defun idu-enabled-testcmd (&rest args)
  411. (interactive
  412. (list
  413. (test-ido-ubiquitous-expected-mode 'enable
  414. :cmd-override-enable)
  415. (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable
  416. :cmd-override-enable-collfunc)))
  417. (test-ido-ubiquitous-expected-mode 'enable
  418. :cmd-override-enable)
  419. (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable
  420. :cmd-override-enable-collfunc))
  421. (defun idu-disabled-testcmd (&rest args)
  422. (interactive
  423. (list
  424. (test-ido-ubiquitous-expected-mode 'disable
  425. :cmd-override-disable)
  426. (test-ido-ubiquitous-expected-mode-on-functional-collection 'disable
  427. :cmd-override-disable-collfunc)))
  428. (test-ido-ubiquitous-expected-mode 'disable
  429. :cmd-override-disable)
  430. (test-ido-ubiquitous-expected-mode-on-functional-collection 'disable
  431. :cmd-override-disable-collfunc))
  432. (defun idu-enabled-oldstyle-testcmd (&rest args)
  433. (interactive
  434. (list
  435. (test-ido-ubiquitous-expected-mode 'enable-old
  436. :cmd-override-enable-old)
  437. (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable-old
  438. :cmd-override-enable-old-collfunc)))
  439. (test-ido-ubiquitous-expected-mode 'enable-old
  440. :cmd-override-enable-old)
  441. (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable-old
  442. :cmd-override-enable-old-collfunc))
  443. (ert-deftest ido-ubiquitous-test-command-and-function-overrides ()
  444. :tags '(ido ido-ubiquitous)
  445. "Test whether command- and function-specific overrides work."
  446. (let ((orig-func-overrides ido-ubiquitous-function-overrides)
  447. (orig-cmd-overrides ido-ubiquitous-command-overrides))
  448. (unwind-protect
  449. (progn
  450. (customize-set-variable
  451. 'ido-ubiquitous-function-overrides
  452. (append ido-ubiquitous-function-overrides
  453. '((enable exact "idu-enabled-testfunc")
  454. (disable exact "idu-disabled-testfunc")
  455. (enable-old exact "idu-enabled-oldstyle-testfunc"))))
  456. (cl-loop for func in
  457. '(idu-no-override-testfunc
  458. idu-enabled-testfunc
  459. idu-disabled-testfunc
  460. idu-enabled-oldstyle-testfunc)
  461. do (funcall func))
  462. (customize-set-variable
  463. 'ido-ubiquitous-command-overrides
  464. (append ido-ubiquitous-command-overrides
  465. '((enable exact "idu-enabled-testcmd")
  466. (disable exact "idu-disabled-testcmd")
  467. (enable-old exact "idu-enabled-oldstyle-testcmd"))))
  468. (cl-loop for cmd in
  469. '(idu-no-override-testcmd
  470. idu-enabled-testcmd
  471. idu-disabled-testcmd
  472. idu-enabled-oldstyle-testcmd)
  473. do (call-interactively cmd)))
  474. (customize-set-variable 'ido-ubiquitous-function-overrides orig-func-overrides)
  475. (customize-set-variable 'ido-ubiquitous-command-overrides orig-cmd-overrides))))
  476. (ert-deftest ido-ubiquitous-test-fallback ()
  477. :tags '(ido ido-ubiquitous)
  478. "Test whether manually invoking fallback works."
  479. (with-ido-ubiquitous-standard-env
  480. (should
  481. ;; C-b/f not at beginning/end of input should not fall back
  482. (string=
  483. "green"
  484. (with-simulated-input "g C-b C-f RET"
  485. (completing-read "Prompt: " '("blue" "yellow" "green")))))
  486. (should
  487. ;; C-f at end of input should fall back
  488. (string=
  489. "g"
  490. (with-simulated-input "g C-f RET"
  491. (completing-read "Prompt: " '("blue" "yellow" "green")))))
  492. (should
  493. ;; Repeated C-b should not fall back
  494. (string=
  495. "green"
  496. (with-simulated-input "g C-b C-b C-b C-b RET"
  497. (completing-read "Prompt: " '("blue" "yellow" "green")))))
  498. (should
  499. ;; C-b at beginning of line should fall back (if previous action
  500. ;; was not also C-b)
  501. (string=
  502. "g"
  503. (with-simulated-input "g C-b x DEL C-b RET"
  504. (completing-read "Prompt: " '("blue" "yellow" "green")))))))
  505. (defun ido-ubiquitous-run-all-tests ()
  506. (interactive)
  507. (ert "^ido-\\(ubiquitous\\|cr\\+\\)-"))
  508. (provide 'ido-ubiquitous-test)
  509. ;;; ido-ubiquitous-test.el ends here