ido-ubiquitous-test.el 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
  1. ;;; -*- lexical-binding: t -*-
  2. (require 'ido-completing-read+)
  3. (require 'ido-ubiquitous)
  4. (require 'ert)
  5. (require 'cl-lib)
  6. ;; This is a series of macros to facilitate the non-interactive
  7. ;; testing of interactive functions by simulating user input.
  8. (defmacro keyboard-quit-to-error (&rest body)
  9. "Evaluate BODY but signal an error on `keyboard-quit'."
  10. `(condition-case nil
  11. (progn ,@body)
  12. (quit
  13. (error "Caught `keyboard-quit'"))))
  14. (defmacro with-simulated-input (keys &rest body)
  15. "Eval body with KEYS as simulated input.
  16. This macro is intended for testing normally interactive functions
  17. by simulating input. If BODY tries to read more input events than
  18. KEYS provides, `keyboard-quit' is invoked (by means of appending
  19. multple C-g keys to KEYS). This is to ensure that BODY will never
  20. block waiting for input, since this macro is intended for
  21. noninteractive use. As such, BODY should not invoke
  22. `keyboard-quit' under normal operation, and KEYS should not
  23. include C-g, or this macro will interpret it as reading past the
  24. end of input."
  25. ;; It would be better to detect end-of-input by overriding
  26. ;; `read-event' to throw an error, since theoretically C-g could be
  27. ;; rebound to something other than `keyboard-quit'. But apparently
  28. ;; some functions read input directly in C code, and redefining
  29. ;; `read-event' has no effect on those. So the suboptimal solution
  30. ;; is to rely on C-g.
  31. (declare (indent 1))
  32. `(let* ((key-sequence (listify-key-sequence (kbd ,keys)))
  33. (C-g-key-sequence
  34. (listify-key-sequence
  35. ;; We *really* want to trigger `keyboard-quit' if we reach
  36. ;; the end of the input.
  37. (kbd "C-g C-g C-g C-g C-g C-g C-g")))
  38. (unread-command-events
  39. (append key-sequence C-g-key-sequence)))
  40. (when (member (car C-g-key-sequence) key-sequence)
  41. (error "KEYS must not include C-g"))
  42. (condition-case nil
  43. (progn ,@body)
  44. (quit
  45. (error "Reached end of simulated input while evaluating body")))))
  46. (defmacro with-mode (mode arg &rest body)
  47. "Eval (MODE ARG), then body, then restore previous status of MODE.
  48. This will only work on modes that respect the normal conventions
  49. for activation and deactivation."
  50. (declare (indent 2))
  51. `(let* ((orig-status ,mode)
  52. (restore-arg (if orig-status 1 0)))
  53. (unwind-protect
  54. (progn
  55. (,mode ,arg)
  56. ,@body)
  57. (message "Restoring mode %s to %s" ',mode restore-arg)
  58. (,mode restore-arg))))
  59. (defmacro with-ido-ubiquitous-standard-env (&rest body)
  60. "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."
  61. (declare (indent 0))
  62. (let*
  63. ((ido-ubiquitous-options
  64. '(ido-ubiquitous-allow-on-functional-collection
  65. ido-ubiquitous-command-overrides
  66. ido-ubiquitous-debug-mode
  67. ido-ubiquitous-default-state
  68. ido-ubiquitous-function-overrides
  69. ido-cr+-fallback-function
  70. ido-cr+-max-items
  71. ido-cr+-replace-completely
  72. ido-confirm-unique-completion))
  73. (idu-bindings
  74. (cl-loop for var in ido-ubiquitous-options collect
  75. (list var
  76. (list 'quote
  77. (eval (car (get var 'standard-value))))))))
  78. `(with-mode ido-ubiquitous-mode 1
  79. (let ,idu-bindings ,@body))))
  80. (defmacro collection-as-function (collection)
  81. "Return a function equivalent to COLLECTION.
  82. The returned function will work equivalently to COLLECTION when
  83. passed to `all-completions' and `try-completion'."
  84. `(completion-table-dynamic (lambda (string) (all-completions string ,collection))))
  85. (cl-defmacro should-with-tag (form &key tag)
  86. "Equivalent to `(should FORM)' but with a TAG on the output.
  87. This is useful if the same `should' form will be called multiple
  88. times in different contexts. Each test can pass a different tag
  89. so it's clear in the ERT output which context is causing the
  90. failure.
  91. Note that although this is a macro, the TAG argument is evaluated normally."
  92. `(let ((tagvalue ,tag))
  93. (condition-case err
  94. (should ,form)
  95. (ert-test-failed
  96. (message "Error symbol: %S" (car err))
  97. (message "Error data: %S" (cdr err))
  98. (when tagvalue
  99. (setf (cadr err) (append (cadr err) (list :tag tagvalue))))
  100. (message "New error data: %S" (cdr err))
  101. (signal (car err) (cdr err))))))
  102. (defun plist-delete (plist property)
  103. "Delete PROPERTY from PLIST.
  104. This is in contrast to merely setting it to 0."
  105. (let (p)
  106. (while plist
  107. (if (not (eq property (car plist)))
  108. (setq p (plist-put p (car plist) (nth 1 plist))))
  109. (setq plist (cddr plist)))
  110. p))
  111. (cl-defmacro should-error-with-tag (form &rest other-keys &key tag &allow-other-keys)
  112. "Equivalent to `(should FORM)' but with a TAG on the output.
  113. See `should-with-tag'.
  114. Note that although this is a macro, the TAG argument is evaluated normally."
  115. (setq other-keys (plist-delete other-keys :tag))
  116. `(let ((tagvalue ,tag))
  117. (condition-case err
  118. (should-error ,form ,@other-keys)
  119. (ert-test-failed
  120. (message "Error symbol: %S" (car err))
  121. (message "Error data: %S" (cdr err))
  122. (when tagvalue
  123. (setf (cadr err) (append (cadr err) (list :tag tagvalue))))
  124. (message "New error data: %S" (cdr err))
  125. (signal (car err) (cdr err))))))
  126. ;; TODO: Add test for empty collection and too-large collection
  127. (defun test-ido-ubiquitous-expected-mode (override &optional tag)
  128. "Test whether observed ido-ubiquitous behavior matches OVERRIDE."
  129. (declare (indent 1))
  130. (if (eq override 'disable)
  131. (progn
  132. (should-with-tag
  133. ;; Verify that we get standard completion
  134. (string=
  135. "g"
  136. (with-simulated-input "g RET"
  137. (completing-read "Prompt: " '("blue" "yellow" "green"))))
  138. :tag tag)
  139. (should-with-tag
  140. (string=
  141. "green"
  142. (with-simulated-input "g RET"
  143. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  144. :tag tag)
  145. ;; Standard completion should refuse to finish with incomplete
  146. ;; input if match is required
  147. (should-error-with-tag
  148. (with-simulated-input "b RET"
  149. (completing-read "Prompt: " '("brown" "blue" "yellow" "green") nil t))
  150. :type 'error
  151. :tag tag))
  152. ;; Common tests whenever ido-ubiquitous is enabled in any way
  153. (should-with-tag
  154. ;; Verify that ido completion is active
  155. (string=
  156. "green"
  157. (with-simulated-input "g RET"
  158. (completing-read "Prompt: " '("blue" "yellow" "green"))))
  159. :tag tag)
  160. ;; Verify that C-j is working correctly
  161. (should-with-tag
  162. (string=
  163. "g"
  164. (with-simulated-input "g C-j"
  165. (completing-read "Prompt: " '("blue" "yellow" "green"))))
  166. :tag tag)
  167. (let ((collection '("brown" "blue" "yellow" "green")))
  168. (should-with-tag
  169. (member
  170. (with-simulated-input "b RET"
  171. (completing-read "Prompt: " collection))
  172. (all-completions "b" collection))
  173. :tag tag))
  174. (cl-case override
  175. (enable
  176. ;; Test for new style
  177. (should-with-tag
  178. (string=
  179. "blue"
  180. (with-simulated-input "RET"
  181. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  182. :tag tag)
  183. (should-with-tag
  184. (string=
  185. ""
  186. (with-simulated-input "C-j"
  187. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  188. :tag tag))
  189. (enable-old
  190. (should-with-tag
  191. (string=
  192. ""
  193. (with-simulated-input "RET"
  194. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  195. :tag tag)
  196. (should-with-tag
  197. (string=
  198. "blue"
  199. (with-simulated-input "C-j"
  200. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  201. :tag tag)
  202. ;; Verify that doing other stuff reverts RET and C-j to standard
  203. ;; meanings
  204. (should-with-tag
  205. (string=
  206. "blue"
  207. (with-simulated-input "g DEL RET"
  208. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  209. :tag tag)
  210. (should-with-tag
  211. (string=
  212. "blue"
  213. (with-simulated-input "<right> <left> RET"
  214. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  215. :tag tag)
  216. (should-with-tag
  217. (string=
  218. ""
  219. (with-simulated-input "g DEL C-j"
  220. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  221. :tag tag)
  222. (should-with-tag
  223. (string=
  224. ""
  225. (with-simulated-input "<right> <left> C-j"
  226. (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
  227. :tag tag))
  228. (otherwise (error "Unknown override %S" override)))))
  229. (defvar original-completing-read (symbol-function #'completing-read))
  230. (defun test-ido-ubiquitous-expected-mode-on-functional-collection (override &optional tag)
  231. "Test whether observed ido-ubiquitous behavior on functional collection matches OVERRIDE."
  232. (declare (indent 1))
  233. ;; This just temporarily replaces `completing-read' with a wrapper
  234. ;; that always converts the collection argument to an equivalent
  235. ;; function. That way, any use of `completing-read' will always see
  236. ;; a functional collection.
  237. (cl-letf (((symbol-function 'completing-read)
  238. (lambda (prompt collection &rest args)
  239. (apply original-completing-read prompt
  240. (collection-as-function collection)
  241. args))))
  242. (test-ido-ubiquitous-expected-mode override tag)))
  243. (ert-deftest ido-ubiquitous-test-simple ()
  244. :tags '(ido ido-ubiquitous)
  245. "Test that basic ido-ubiquitous functionality is working."
  246. (with-ido-ubiquitous-standard-env
  247. (ido-ubiquitous-mode 1)
  248. (test-ido-ubiquitous-expected-mode 'enable
  249. :simple-enable)
  250. (ido-ubiquitous-mode 0)
  251. (test-ido-ubiquitous-expected-mode 'disable
  252. :simple-disable)))
  253. (ert-deftest ido-ubiquitous-test-oldstyle ()
  254. :tags '(ido ido-ubiquitous)
  255. "Test whether old-style completion works as expected."
  256. (with-ido-ubiquitous-standard-env
  257. (let ((ido-ubiquitous-default-state 'enable-old))
  258. (test-ido-ubiquitous-expected-mode 'enable-old
  259. :simple-oldstyle))))
  260. (ert-deftest ido-ubiquitous-test-maxitems ()
  261. :tags '(ido ido-ubiquitous)
  262. "Test whether the large-collection fallback works."
  263. (with-ido-ubiquitous-standard-env
  264. (let ((ido-cr+-max-items -1))
  265. (test-ido-ubiquitous-expected-mode 'disable
  266. :maxitems))))
  267. (ert-deftest ido-ubiquitous-test-override ()
  268. :tags '(ido ido-ubiquitous)
  269. "Test whether ido-ubiquitous overrides work."
  270. (with-ido-ubiquitous-standard-env
  271. (ido-ubiquitous-with-override 'enable
  272. (test-ido-ubiquitous-expected-mode 'enable
  273. :override-enable))
  274. (ido-ubiquitous-with-override 'enable-old
  275. (test-ido-ubiquitous-expected-mode 'enable-old
  276. :override-enable-old))
  277. (ido-ubiquitous-with-override 'disable
  278. (test-ido-ubiquitous-expected-mode 'disable
  279. :override-disable))))
  280. (ert-deftest ido-ubiquitous-test-functional-collection ()
  281. :tags '(ido ido-ubiquitous)
  282. "Test whether ido-ubiquitous overrides work when collection is a function."
  283. (with-ido-ubiquitous-standard-env
  284. (test-ido-ubiquitous-expected-mode-on-functional-collection 'disable
  285. :collfunc)
  286. (ido-ubiquitous-with-override 'enable
  287. (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable
  288. :override-enable-collfunc))
  289. (ido-ubiquitous-with-override 'enable-old
  290. (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable-old
  291. :override-enable-old-collfunc))))
  292. (ert-deftest ido-cr+-require-match ()
  293. :tags '(ido ido-cr+)
  294. "Test whether require-match works."
  295. (with-ido-ubiquitous-standard-env
  296. ;; "C-j" should be allowed to return an empty string even if
  297. ;; require-match is non-nil, as long as default is nil
  298. (should
  299. (string=
  300. ""
  301. (with-simulated-input "C-j"
  302. (ido-completing-read+
  303. "Prompt: "
  304. '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))
  305. ;; "C-j" should NOT be allowed to return an empty string if
  306. ;; require-match and default are both non-nil.
  307. (should-error
  308. (with-simulated-input "C-j"
  309. (ido-completing-read+
  310. "Prompt: "
  311. '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t nil nil "yellow")))
  312. ;; Multiple presses of C-j won't just select the first match
  313. (should-error
  314. (with-simulated-input "b C-j C-j C-j"
  315. (ido-completing-read+
  316. "Prompt: "
  317. '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t)))
  318. ;; First press of C-j should complete unique common prefix after the
  319. ;; first b, but then get stuck on the choice for the second b.
  320. (should-error
  321. (with-simulated-input "b C-j b C-j C-j"
  322. (ido-completing-read+
  323. "Prompt: "
  324. '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t)))
  325. ;; This should complete to "blueberry" via 2 rounds of unique common
  326. ;; prefix completion, and then return on the 3rd "C-j"
  327. (should
  328. (string=
  329. "blueberry"
  330. (with-simulated-input "b C-j b C-j e C-j C-j"
  331. (ido-completing-read+
  332. "Prompt: "
  333. '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))
  334. ;; The "C-j" should complete to "bluegrass" and return, because
  335. ;; `ido-confirm-unique-completion is nil.
  336. (should
  337. (string=
  338. "bluegrass"
  339. (with-simulated-input "b l u e g C-j"
  340. (ido-completing-read+
  341. "Prompt: "
  342. '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))
  343. (let ((ido-confirm-unique-completion t))
  344. ;; Now the first "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-none-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. (with-ido-ubiquitous-standard-env
  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. (ert-deftest ido-ubiquitous-dot-prefix-empty-string ()
  506. :tags '(ido ido-ubiquitous)
  507. "Test whether ido-ubiquitous successfully works around a bug in ido.
  508. See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=26997 for more
  509. information on this bug."
  510. (with-ido-ubiquitous-standard-env
  511. (let ((ido-enable-dot-prefix t))
  512. (should
  513. (string=
  514. ""
  515. (with-simulated-input "RET"
  516. (completing-read "Pick: " '("" "aaa" "aab" "aac")))))
  517. (should
  518. (string=
  519. "aab"
  520. (with-simulated-input "a a b RET"
  521. (completing-read "Pick: " '("" "aaa" "aab" "aac"))))))))
  522. (defun ido-ubiquitous-run-all-tests ()
  523. (interactive)
  524. (ert "^ido-\\(ubiquitous\\|cr\\+\\)-"))
  525. (provide 'ido-ubiquitous-test)
  526. ;;; ido-ubiquitous-test.el ends here