ソースを参照

Update test suite

Ryan C. Thompson 8 年 前
コミット
f2322acdd6
3 ファイル変更464 行追加561 行削除
  1. 464 0
      test/ido-cr+-test.el
  2. 0 560
      test/ido-ubiquitous-test.el
  3. 0 1
      test/test-helper.el

+ 464 - 0
test/ido-cr+-test.el

@@ -0,0 +1,464 @@
+;;; -*- lexical-binding: t -*-
+
+(require 'ido-completing-read+)
+(require 'ert)
+(require 'cl-lib)
+
+;; This is a series of macros to facilitate the non-interactive
+;; testing of interactive functions by simulating user input.
+
+(defmacro keyboard-quit-to-error (&rest body)
+  "Evaluate BODY but signal an error on `keyboard-quit'."
+  `(condition-case nil
+       (progn ,@body)
+     (quit
+      (error "Caught `keyboard-quit'"))))
+
+(defmacro with-simulated-input (keys &rest body)
+  "Eval body with KEYS as simulated input.
+
+This macro is intended for testing normally interactive functions
+by simulating input. If BODY tries to read more input events than
+KEYS provides, `keyboard-quit' is invoked (by means of appending
+multple C-g keys to KEYS). This is to ensure that BODY will never
+block waiting for input, since this macro is intended for
+noninteractive use. As such, BODY should not invoke
+`keyboard-quit' under normal operation, and KEYS should not
+include C-g, or this macro will interpret it as reading past the
+end of input."
+  ;; It would be better to detect end-of-input by overriding
+  ;; `read-event' to throw an error, since theoretically C-g could be
+  ;; rebound to something other than `keyboard-quit'. But apparently
+  ;; some functions read input directly in C code, and redefining
+  ;; `read-event' has no effect on those. So the suboptimal solution
+  ;; is to rely on C-g.
+  (declare (indent 1))
+  `(let* ((key-sequence (listify-key-sequence (kbd ,keys)))
+          (C-g-key-sequence
+           (listify-key-sequence
+            ;; We *really* want to trigger `keyboard-quit' if we reach
+            ;; the end of the input.
+            (kbd "C-g C-g C-g C-g C-g C-g C-g")))
+          (unread-command-events
+           (append key-sequence C-g-key-sequence)))
+     (when (member (car C-g-key-sequence) key-sequence)
+       (error "KEYS must not include C-g"))
+     (condition-case nil
+         (progn ,@body)
+       (quit
+        (error "Reached end of simulated input while evaluating body")))))
+
+(defmacro with-mode (mode arg &rest body)
+  "Eval (MODE ARG), then body, then restore previous status of MODE.
+
+This will only work on modes that respect the normal conventions
+for activation and deactivation."
+  (declare (indent 2))
+  `(let* ((orig-status ,mode)
+          (restore-arg (if orig-status 1 0)))
+     (unwind-protect
+         (progn
+           (,mode ,arg)
+           ,@body)
+       (message "Restoring mode %s to %s" ',mode restore-arg)
+       (,mode restore-arg))))
+
+(defmacro with-ido-cr+-standard-env (&rest body)
+  "Execute BODY with standard ido-cr+ settings.
+
+All ido-cr+ options will be let-bound to their default values,
+and `ido-ubiquitous-mode' will be enabled. The values will all br
+restored to what they were previously after BODY exits."
+  (declare (indent 0))
+  (let*
+      ((options
+        '(ido-cr+-debug-mode
+          ido-cr+-fallback-function
+          ido-cr+-max-items
+          ido-cr+-function-blacklist
+          ido-cr+-function-whitelist
+          ido-confirm-unique-completion))
+       (bindings
+        (cl-loop for var in options collect
+                 (list var
+                       (list 'quote
+                             (eval (car (get var 'standard-value))))))))
+    `(with-mode ido-ubiquitous-mode 1
+       (let ,bindings ,@body))))
+
+(defmacro collection-as-function (collection)
+  "Return a function equivalent to COLLECTION.
+
+The returned function will work equivalently to COLLECTION when
+passed to `all-completions' and `try-completion'."
+  `(completion-table-dynamic (lambda (string) (all-completions string ,collection))))
+
+(ert-deftest ido-cr+-test-basic ()
+  :tags '(ido ido-cr+)
+  "Test that basic ido-cr+ functionality is working."
+  (with-ido-cr+-standard-env
+    ;; Verify that pressing RET selects a matching item
+    (should
+     (string=
+      "green"
+      (with-simulated-input "g RET"
+        (ido-completing-read+ "Prompt: " '("blue" "yellow" "green")))))
+
+    ;; Verify that pressing RET with multiple matches selects the
+    ;; first one
+    (should
+     (string=
+      "brown"
+      (with-simulated-input "b RET"
+        (ido-completing-read+ "Prompt: " '("brown" "blue" "yellow" "green")))))
+
+    ;; Verify that cycling with <left> and <right> works, including
+    ;; wrap-around
+    (should
+     (string=
+      "blue"
+      (with-simulated-input "b <right> <right> <right> <right> <left> RET"
+        (ido-completing-read+ "Prompt: " '("brown" "blue" "yellow" "green")))))
+
+    ;; Verify that RET or C-j on empty input returns "" when
+    ;; REQUIRE-MATCH is t
+    (should
+     (string=
+      ""
+      (with-simulated-input "RET"
+        (ido-completing-read+ "Prompt: " '("blue" "yellow" "green") nil t))))
+    (should
+     (string=
+      ""
+      (with-simulated-input "C-j"
+        (ido-completing-read+ "Prompt: " '("blue" "yellow" "green") nil t))))
+
+    ;; Verify that DEF works, whether or not it is an element of
+    ;; COLLECTION
+    (should
+     (string=
+      "green"
+      (with-simulated-input "RET"
+        (ido-completing-read+ "Prompt: " '("blue" "yellow" "green") nil nil nil nil "green"))))
+    (should
+     (string=
+      "green"
+      (with-simulated-input "RET"
+        (ido-completing-read+ "Prompt: " '("blue" "yellow" "green") nil t nil nil "green"))))
+    (should
+     (string=
+      "brown"
+      (with-simulated-input "RET"
+        (ido-completing-read+ "Prompt: " '("blue" "yellow" "brown") nil nil nil nil "brown"))))
+    (should
+     (string=
+      "brown"
+      (with-simulated-input "RET"
+        (ido-completing-read+ "Prompt: " '("blue" "yellow" "brown") nil t nil nil "brown"))))
+    (should
+     (string=
+      "brown"
+      (with-simulated-input "RET"
+        (ido-completing-read+ "Prompt: " '("blue" "yellow" "brown") nil t nil nil '("brown" "green")))))
+
+    ;; Verify that INITIAL-INPUT works
+    (should
+     (string=
+      "green"
+      (with-simulated-input "RET"
+        (ido-completing-read+ "Prompt: " '("blue" "yellow" "green") nil nil "gr"))))
+
+    ;; Verify that INITIAL-INPUT and DEF don't interfere with each other
+    (should
+     (string=
+      "green"
+      (with-simulated-input "RET"
+        (ido-completing-read+ "Prompt: " '("blue" "yellow" "green") nil nil "gr" nil "blue"))))
+    (should
+     (string=
+      "blue"
+      (with-simulated-input "DEL DEL RET"
+        (ido-completing-read+ "Prompt: " '("blue" "yellow" "green") nil nil "gr" nil "blue"))))
+
+    ;; Verify that ido-cr+ works on function collections
+    (should
+     (string=
+      "green"
+      (with-simulated-input "g RET"
+        (ido-completing-read+ "Prompt: " (collection-as-function '("blue" "yellow" "green"))))))))
+
+(ert-deftest ido-cr+-test-maxitems ()
+  :tags '(ido ido-cr+)
+  "Test whether the large-collection fallback works."
+  (with-ido-cr+-standard-env
+    ;; This should not fall back
+    (should
+     (string=
+      "green"
+      (with-simulated-input "g RET"
+        (ido-completing-read+ "Prompt: " '("blue" "yellow" "green")))))
+    (let ((ido-cr+-max-items -1))
+      ;; This should fall back because the collection is too large
+      (should
+       (string=
+        "g"
+        (with-simulated-input "g RET"
+          (ido-completing-read+ "Prompt: " '("blue" "yellow" "green"))))))))
+
+(ert-deftest ido-cr+-test-blacklist ()
+  :tags '(ido ido-cr+)
+  "Test whether `ido-ubiquitous-function-blacklist' works."
+  (with-ido-cr+-standard-env
+    (cl-letf (((symbol-function 'blacklisted-command)
+               (lambda (arg)
+                 (interactive (list (completing-read "Prompt: " '("blue" "yellow" "green"))))
+                 arg))
+              ((symbol-function 'blacklisted-function)
+               (lambda ()
+                 (completing-read "Prompt: " '("blue" "yellow" "green"))))
+              ((symbol-function 'cmd-that-calls-blacklisted-function)
+               (lambda ()
+                 (interactive)
+                 (funcall 'blacklisted-function)))
+              ((symbol-function 'blacklisted-collection)
+               (collection-as-function '("blue" "yellow" "green"))))
+      ;; First verify that they work normally before blacklisting them
+      (should
+       (string=
+        "green"
+        (with-simulated-input "g RET"
+          (call-interactively 'blacklisted-command))))
+      (should
+       (string=
+        "green"
+        (with-simulated-input "g RET"
+          (call-interactively 'cmd-that-calls-blacklisted-function))))
+      (should
+       (string=
+        "green"
+        (with-simulated-input "g RET"
+          (ido-completing-read+ "Prompt: " 'blacklisted-collection))))
+      ;; Now add them to the blacklist and try again
+      (let ((ido-cr+-function-blacklist
+             (append '(blacklisted-command
+                       blacklisted-function
+                       blacklisted-collection)
+                     ido-cr+-function-blacklist)))
+        ;; All should now have ido-cr+ disabled
+        (should
+         (string=
+          "g"
+          (with-simulated-input "g RET"
+            (call-interactively 'blacklisted-command))))
+        (should
+         (string=
+          "g"
+          (with-simulated-input "g RET"
+            (call-interactively 'cmd-that-calls-blacklisted-function))))
+        (should
+         (string=
+          "g"
+          (with-simulated-input "g RET"
+            (ido-completing-read+ "Prompt: " 'blacklisted-collection))))))))
+
+(ert-deftest ido-cr+-test-whitelist ()
+  :tags '(ido ido-cr+)
+  "Test whether `ido-ubiquitous-function-whitelist' works."
+  (with-ido-cr+-standard-env
+    (cl-letf (((symbol-function 'whitelisted-command)
+               (lambda (arg)
+                 (interactive (list (completing-read "Prompt: " '("blue" "yellow" "green"))))
+                 arg))
+              ((symbol-function 'whitelisted-function)
+               (lambda ()
+                 (completing-read "Prompt: " '("blue" "yellow" "green"))))
+              ((symbol-function 'cmd-that-calls-whitelisted-function)
+               (lambda ()
+                 (interactive)
+                 (funcall 'whitelisted-function)))
+              ((symbol-function 'whitelisted-collection)
+               (lambda (string pred action)
+                 (complete-with-action action '("blue" "yellow" "green") string pred))))
+      ;; Now add them to the whitelist
+      (let ((ido-cr+-function-whitelist
+             (append '(whitelisted-command
+                       whitelisted-function
+                       whitelisted-collection)
+                     ido-cr+-function-whitelist)))
+        ;; All should now have ido-cr+ enabled
+        (should
+         (string=
+          "green"
+          (with-simulated-input "g RET"
+            (call-interactively 'whitelisted-command))))
+        (should
+         (string=
+          "green"
+          (with-simulated-input "g RET"
+            (call-interactively 'cmd-that-calls-whitelisted-function))))
+        (should
+         (string=
+          "green"
+          (with-simulated-input "g RET"
+            (ido-completing-read+ "Prompt: " 'whitelisted-collection)))))
+      ;; Run again with nothing whitelisted
+      (let ((ido-cr+-function-whitelist '(nil)))
+        ;; All should now have ido-cr+ disabled
+        (should
+         (string=
+          "g"
+          (with-simulated-input "g RET"
+            (call-interactively 'whitelisted-command))))
+        (should
+         (string=
+          "g"
+          (with-simulated-input "g RET"
+            (call-interactively 'cmd-that-calls-whitelisted-function))))
+        (should
+         (string=
+          "g"
+          (with-simulated-input "g RET"
+            (ido-completing-read+ "Prompt: " 'whitelisted-collection))))))))
+
+(ert-deftest ido-cr+-require-match ()
+  :tags '(ido ido-cr+)
+  "Test whether REQUIRE-MATCH and DEF work as expected together."
+  (with-ido-cr+-standard-env
+    ;; "C-j" should be allowed to return an empty string even if
+    ;; require-match is non-nil, as long as default is nil
+    (should
+     (string=
+      ""
+      (with-simulated-input "C-j"
+        (ido-completing-read+
+         "Prompt: "
+         '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))
+    ;; "C-j" should NOT be allowed to return an empty string if
+    ;; require-match and default are both non-nil.
+    (should-error
+     (with-simulated-input "C-j"
+       (ido-completing-read+
+        "Prompt: "
+        '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t nil nil "yellow")))
+    ;; Multiple presses of C-j won't just select the first match
+    (should-error
+     (with-simulated-input "b C-j C-j C-j"
+       (ido-completing-read+
+        "Prompt: "
+        '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t)))
+    ;; First press of C-j should complete unique common prefix after the
+    ;; first b, but then get stuck on the choice for the second b.
+    (should-error
+     (with-simulated-input "b C-j b C-j C-j"
+       (ido-completing-read+
+        "Prompt: "
+        '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t)))
+    ;; This should complete to "blueberry" via 2 rounds of unique common
+    ;; prefix completion, and then return on the 3rd "C-j"
+    (should
+     (string=
+      "blueberry"
+      (with-simulated-input "b C-j b C-j e C-j C-j"
+        (ido-completing-read+
+         "Prompt: "
+         '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))
+    ;; The "C-j" should complete to "bluegrass" and return, because
+    ;; `ido-confirm-unique-completion is nil.
+    (should
+     (string=
+      "bluegrass"
+      (with-simulated-input "b l u e g C-j"
+        (ido-completing-read+
+         "Prompt: "
+         '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))
+    (let ((ido-confirm-unique-completion t))
+      ;; Now the first "C-j" should complete to "bluegrass" but should
+      ;; not return.
+      (should-error
+       (with-simulated-input "b l u e g C-j"
+         (ido-completing-read+
+          "Prompt: "
+          '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t)))
+      ;; The first "C-j" should complete to "bluegrass", and the second
+      ;; should return.
+      (should
+       (string=
+        "bluegrass"
+        (with-simulated-input "b l u e g C-j C-j"
+          (ido-completing-read+
+           "Prompt: "
+           '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t)))))
+    ;; Finally, a few tests for the expected wrong behavior without
+    ;; ido-cr+. If ido.el ever fixes this bug, it will cause this test
+    ;; to fail as a signal that the workaround can be phased out.
+    (should
+     (string=
+      ""
+      (with-simulated-input "C-j"
+        (ido-completing-read
+         "Prompt: "
+         '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))
+    (should
+     (string=
+      "b"
+      (with-simulated-input "b C-j"
+        (ido-completing-read
+         "Prompt: "
+         '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))))
+
+(ert-deftest ido-cr+-test-fallback ()
+  :tags '(ido ido-cr+)
+  "Test whether manually invoking fallback works."
+  (with-ido-cr+-standard-env
+    (should
+     ;; C-b/f not at beginning/end of input should not fall back
+     (string=
+      "green"
+      (with-simulated-input "g C-b C-f RET"
+        (completing-read "Prompt: " '("blue" "yellow" "green")))))
+    (should
+     ;; C-f at end of input should fall back
+     (string=
+      "g"
+      (with-simulated-input "g C-f RET"
+        (completing-read "Prompt: " '("blue" "yellow" "green")))))
+    (should
+     ;; Repeated C-b should not fall back
+     (string=
+      "green"
+      (with-simulated-input "g C-b C-b C-b C-b RET"
+        (completing-read "Prompt: " '("blue" "yellow" "green")))))
+    (should
+     ;; C-b at beginning of line should fall back (if previous action
+     ;; was not also C-b)
+     (string=
+      "g"
+      (with-simulated-input "g C-b x DEL C-b RET"
+        (completing-read "Prompt: " '("blue" "yellow" "green")))))))
+
+(ert-deftest ido-cr+-dot-prefix-empty-string ()
+  :tags '(ido ido-cr+)
+  "Test whether ido-ubiquitous successfully works around a bug in ido.
+
+See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=26997 for more
+information on this bug."
+  (with-ido-cr+-standard-env
+    (let ((ido-enable-dot-prefix t))
+      (should
+       (string=
+        ""
+        (with-simulated-input "RET"
+          (ido-completing-read+ "Pick: " '("" "aaa" "aab" "aac")))))
+      (should
+       (string=
+        "aab"
+        (with-simulated-input "a a b RET"
+          (ido-completing-read+ "Pick: " '("" "aaa" "aab" "aac"))))))))
+
+(defun ido-cr+-run-all-tests ()
+  (interactive)
+  (ert "^ido-cr\\+-"))
+
+(provide 'ido-ubiquitous-test)
+
+;;; ido-ubiquitous-test.el ends here

+ 0 - 560
test/ido-ubiquitous-test.el

@@ -1,560 +0,0 @@
-;;; -*- lexical-binding: t -*-
-
-(require 'ido-completing-read+)
-(require 'ido-ubiquitous)
-(require 'ert)
-(require 'cl-lib)
-
-;; This is a series of macros to facilitate the non-interactive
-;; testing of interactive functions by simulating user input.
-
-(defmacro keyboard-quit-to-error (&rest body)
-  "Evaluate BODY but signal an error on `keyboard-quit'."
-  `(condition-case nil
-       (progn ,@body)
-     (quit
-      (error "Caught `keyboard-quit'"))))
-
-(defmacro with-simulated-input (keys &rest body)
-  "Eval body with KEYS as simulated input.
-
-This macro is intended for testing normally interactive functions
-by simulating input. If BODY tries to read more input events than
-KEYS provides, `keyboard-quit' is invoked (by means of appending
-multple C-g keys to KEYS). This is to ensure that BODY will never
-block waiting for input, since this macro is intended for
-noninteractive use. As such, BODY should not invoke
-`keyboard-quit' under normal operation, and KEYS should not
-include C-g, or this macro will interpret it as reading past the
-end of input."
-  ;; It would be better to detect end-of-input by overriding
-  ;; `read-event' to throw an error, since theoretically C-g could be
-  ;; rebound to something other than `keyboard-quit'. But apparently
-  ;; some functions read input directly in C code, and redefining
-  ;; `read-event' has no effect on those. So the suboptimal solution
-  ;; is to rely on C-g.
-  (declare (indent 1))
-  `(let* ((key-sequence (listify-key-sequence (kbd ,keys)))
-          (C-g-key-sequence
-           (listify-key-sequence
-            ;; We *really* want to trigger `keyboard-quit' if we reach
-            ;; the end of the input.
-            (kbd "C-g C-g C-g C-g C-g C-g C-g")))
-          (unread-command-events
-           (append key-sequence C-g-key-sequence)))
-     (when (member (car C-g-key-sequence) key-sequence)
-       (error "KEYS must not include C-g"))
-     (condition-case nil
-         (progn ,@body)
-       (quit
-        (error "Reached end of simulated input while evaluating body")))))
-
-(defmacro with-mode (mode arg &rest body)
-  "Eval (MODE ARG), then body, then restore previous status of MODE.
-
-This will only work on modes that respect the normal conventions
-for activation and deactivation."
-  (declare (indent 2))
-  `(let* ((orig-status ,mode)
-          (restore-arg (if orig-status 1 0)))
-     (unwind-protect
-         (progn
-           (,mode ,arg)
-           ,@body)
-       (message "Restoring mode %s to %s" ',mode restore-arg)
-       (,mode restore-arg))))
-
-(defmacro with-ido-ubiquitous-standard-env (&rest body)
-  "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."
-  (declare (indent 0))
-  (let*
-      ((ido-ubiquitous-options
-        '(ido-ubiquitous-allow-on-functional-collection
-          ido-ubiquitous-command-overrides
-          ido-ubiquitous-debug-mode
-          ido-ubiquitous-default-state
-          ido-ubiquitous-function-overrides
-          ido-cr+-fallback-function
-          ido-cr+-max-items
-          ido-cr+-replace-completely
-          ido-confirm-unique-completion))
-       (idu-bindings
-        (cl-loop for var in ido-ubiquitous-options collect
-                 (list var
-                       (list 'quote
-                             (eval (car (get var 'standard-value))))))))
-    `(with-mode ido-ubiquitous-mode 1
-       (let ,idu-bindings ,@body))))
-
-(defmacro collection-as-function (collection)
-  "Return a function equivalent to COLLECTION.
-
-The returned function will work equivalently to COLLECTION when
-passed to `all-completions' and `try-completion'."
-  `(completion-table-dynamic (lambda (string) (all-completions string ,collection))))
-
-(cl-defmacro should-with-tag (form &key tag)
-  "Equivalent to `(should FORM)' but with a TAG on the output.
-
-This is useful if the same `should' form will be called multiple
-times in different contexts. Each test can pass a different tag
-so it's clear in the ERT output which context is causing the
-failure.
-
-Note that although this is a macro, the TAG argument is evaluated normally."
-  `(let ((tagvalue ,tag))
-     (condition-case err
-         (should ,form)
-       (ert-test-failed
-        (message "Error symbol: %S" (car err))
-        (message "Error data: %S" (cdr err))
-        (when tagvalue
-          (setf (cadr err) (append (cadr err) (list :tag tagvalue))))
-        (message "New error data: %S" (cdr err))
-        (signal (car err) (cdr err))))))
-
-(defun plist-delete (plist property)
-  "Delete PROPERTY from PLIST.
-This is in contrast to merely setting it to 0."
-  (let (p)
-    (while plist
-      (if (not (eq property (car plist)))
-          (setq p (plist-put p (car plist) (nth 1 plist))))
-      (setq plist (cddr plist)))
-    p))
-
-(cl-defmacro should-error-with-tag (form &rest other-keys &key tag &allow-other-keys)
-  "Equivalent to `(should FORM)' but with a TAG on the output.
-See `should-with-tag'.
-
-Note that although this is a macro, the TAG argument is evaluated normally."
-  (setq other-keys (plist-delete other-keys :tag))
-  `(let ((tagvalue ,tag))
-     (condition-case err
-         (should-error ,form ,@other-keys)
-       (ert-test-failed
-        (message "Error symbol: %S" (car err))
-        (message "Error data: %S" (cdr err))
-        (when tagvalue
-          (setf (cadr err) (append (cadr err) (list :tag tagvalue))))
-        (message "New error data: %S" (cdr err))
-        (signal (car err) (cdr err))))))
-
-;; TODO: Add test for empty collection and too-large collection
-(defun test-ido-ubiquitous-expected-mode (override &optional tag)
-  "Test whether observed ido-ubiquitous behavior matches OVERRIDE."
-  (declare (indent 1))
-  (if (eq override 'disable)
-      (progn
-        (should-with-tag
-         ;; Verify that we get standard completion
-         (string=
-          "g"
-          (with-simulated-input "g RET"
-            (completing-read "Prompt: " '("blue" "yellow" "green"))))
-         :tag tag)
-        (should-with-tag
-         (string=
-          "green"
-          (with-simulated-input "g RET"
-            (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
-         :tag tag)
-        ;; Standard completion should refuse to finish with incomplete
-        ;; input if match is required
-        (should-error-with-tag
-         (with-simulated-input "b RET"
-           (completing-read "Prompt: " '("brown" "blue" "yellow" "green") nil t))
-         :type 'error
-         :tag tag))
-    ;; Common tests whenever ido-ubiquitous is enabled in any way
-    (should-with-tag
-     ;; Verify that ido completion is active
-     (string=
-      "green"
-      (with-simulated-input "g RET"
-        (completing-read "Prompt: " '("blue" "yellow" "green"))))
-     :tag tag)
-    ;; Verify that C-j is working correctly
-    (should-with-tag
-     (string=
-      "g"
-      (with-simulated-input "g C-j"
-        (completing-read "Prompt: " '("blue" "yellow" "green"))))
-     :tag tag)
-    (let ((collection '("brown" "blue" "yellow" "green")))
-      (should-with-tag
-       (member
-        (with-simulated-input "b RET"
-          (completing-read "Prompt: " collection))
-        (all-completions "b" collection))
-       :tag tag))
-    (cl-case override
-      (enable
-       ;; Test for new style
-       (should-with-tag
-        (string=
-         "blue"
-         (with-simulated-input "RET"
-           (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
-        :tag tag)
-       (should-with-tag
-        (string=
-         ""
-         (with-simulated-input "C-j"
-           (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
-        :tag tag))
-      (enable-old
-       (should-with-tag
-        (string=
-         ""
-         (with-simulated-input "RET"
-           (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
-        :tag tag)
-       (should-with-tag
-        (string=
-         "blue"
-         (with-simulated-input "C-j"
-           (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
-        :tag tag)
-       ;; Verify that doing other stuff reverts RET and C-j to standard
-       ;; meanings
-       (should-with-tag
-        (string=
-         "blue"
-         (with-simulated-input "g DEL RET"
-           (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
-        :tag tag)
-       (should-with-tag
-        (string=
-         "blue"
-         (with-simulated-input "<right> <left> RET"
-           (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
-        :tag tag)
-       (should-with-tag
-        (string=
-         ""
-         (with-simulated-input "g DEL C-j"
-           (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
-        :tag tag)
-       (should-with-tag
-        (string=
-         ""
-         (with-simulated-input "<right> <left> C-j"
-           (completing-read "Prompt: " '("blue" "yellow" "green") nil t)))
-        :tag tag))
-      (otherwise (error "Unknown override %S" override)))))
-
-(defvar original-completing-read (symbol-function #'completing-read))
-
-(defun test-ido-ubiquitous-expected-mode-on-functional-collection (override &optional tag)
-  "Test whether observed ido-ubiquitous behavior on functional collection matches OVERRIDE."
-  (declare (indent 1))
-  ;; This just temporarily replaces `completing-read' with a wrapper
-  ;; that always converts the collection argument to an equivalent
-  ;; function. That way, any use of `completing-read' will always see
-  ;; a functional collection.
-  (cl-letf (((symbol-function 'completing-read)
-             (lambda (prompt collection &rest args)
-               (apply original-completing-read prompt
-                      (collection-as-function collection)
-                      args))))
-    (test-ido-ubiquitous-expected-mode override tag)))
-
-(ert-deftest ido-ubiquitous-test-simple ()
-  :tags '(ido ido-ubiquitous)
-  "Test that basic ido-ubiquitous functionality is working."
-  (with-ido-ubiquitous-standard-env
-    (ido-ubiquitous-mode 1)
-    (test-ido-ubiquitous-expected-mode 'enable
-      :simple-enable)
-    (ido-ubiquitous-mode 0)
-    (test-ido-ubiquitous-expected-mode 'disable
-      :simple-disable)))
-
-(ert-deftest ido-ubiquitous-test-oldstyle ()
-  :tags '(ido ido-ubiquitous)
-  "Test whether old-style completion works as expected."
-  (with-ido-ubiquitous-standard-env
-    (let ((ido-ubiquitous-default-state 'enable-old))
-      (test-ido-ubiquitous-expected-mode 'enable-old
-        :simple-oldstyle))))
-
-(ert-deftest ido-ubiquitous-test-maxitems ()
-  :tags '(ido ido-ubiquitous)
-  "Test whether the large-collection fallback works."
-  (with-ido-ubiquitous-standard-env
-    (let ((ido-cr+-max-items -1))
-      (test-ido-ubiquitous-expected-mode 'disable
-        :maxitems))))
-
-(ert-deftest ido-ubiquitous-test-override ()
-  :tags '(ido ido-ubiquitous)
-  "Test whether ido-ubiquitous overrides work."
-  (with-ido-ubiquitous-standard-env
-    (ido-ubiquitous-with-override 'enable
-      (test-ido-ubiquitous-expected-mode 'enable
-        :override-enable))
-    (ido-ubiquitous-with-override 'enable-old
-      (test-ido-ubiquitous-expected-mode 'enable-old
-        :override-enable-old))
-    (ido-ubiquitous-with-override 'disable
-      (test-ido-ubiquitous-expected-mode 'disable
-        :override-disable))))
-
-(ert-deftest ido-ubiquitous-test-functional-collection ()
-  :tags '(ido ido-ubiquitous)
-  "Test whether ido-ubiquitous overrides work when collection is a function."
-  (with-ido-ubiquitous-standard-env
-    (test-ido-ubiquitous-expected-mode-on-functional-collection 'disable
-      :collfunc)
-    (ido-ubiquitous-with-override 'enable
-      (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable
-        :override-enable-collfunc))
-    (ido-ubiquitous-with-override 'enable-old
-      (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable-old
-        :override-enable-old-collfunc))))
-
-(ert-deftest ido-cr+-require-match ()
-  :tags '(ido ido-cr+)
-  "Test whether require-match works."
-  (with-ido-ubiquitous-standard-env
-    ;; "C-j" should be allowed to return an empty string even if
-    ;; require-match is non-nil, as long as default is nil
-    (should
-     (string=
-      ""
-      (with-simulated-input "C-j"
-        (ido-completing-read+
-         "Prompt: "
-         '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))
-    ;; "C-j" should NOT be allowed to return an empty string if
-    ;; require-match and default are both non-nil.
-    (should-error
-     (with-simulated-input "C-j"
-       (ido-completing-read+
-        "Prompt: "
-        '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t nil nil "yellow")))
-    ;; Multiple presses of C-j won't just select the first match
-    (should-error
-     (with-simulated-input "b C-j C-j C-j"
-       (ido-completing-read+
-        "Prompt: "
-        '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t)))
-    ;; First press of C-j should complete unique common prefix after the
-    ;; first b, but then get stuck on the choice for the second b.
-    (should-error
-     (with-simulated-input "b C-j b C-j C-j"
-       (ido-completing-read+
-        "Prompt: "
-        '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t)))
-    ;; This should complete to "blueberry" via 2 rounds of unique common
-    ;; prefix completion, and then return on the 3rd "C-j"
-    (should
-     (string=
-      "blueberry"
-      (with-simulated-input "b C-j b C-j e C-j C-j"
-        (ido-completing-read+
-         "Prompt: "
-         '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))
-    ;; The "C-j" should complete to "bluegrass" and return, because
-    ;; `ido-confirm-unique-completion is nil.
-    (should
-     (string=
-      "bluegrass"
-      (with-simulated-input "b l u e g C-j"
-        (ido-completing-read+
-         "Prompt: "
-         '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))
-    (let ((ido-confirm-unique-completion t))
-      ;; Now the first "C-j" should complete to "bluegrass" but should
-      ;; not return.
-      (should-error
-       (with-simulated-input "b l u e g C-j"
-         (ido-completing-read+
-          "Prompt: "
-          '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t)))
-      ;; The first "C-j" should complete to "bluegrass", and the second
-      ;; should return.
-      (should
-       (string=
-        "bluegrass"
-        (with-simulated-input "b l u e g C-j C-j"
-          (ido-completing-read+
-           "Prompt: "
-           '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t)))))
-    ;; Finally, a few tests for the expected wrong behavior without
-    ;; ido-cr+. If ido.el ever fixes this bug, it will cause this test
-    ;; to fail as a signal that the workaround can be phased out.
-    (should
-     (string=
-      ""
-      (with-simulated-input "C-j"
-        (ido-completing-read
-         "Prompt: "
-         '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))
-    (should
-     (string=
-      "b"
-      (with-simulated-input "b C-j"
-        (ido-completing-read
-         "Prompt: "
-         '("bluebird" "blues" "bluegrass" "blueberry" "yellow ""green") nil t))))))
-
-;; Functions to define overrides on for testing
-(defun idu-no-override-testfunc ()
-  (test-ido-ubiquitous-expected-mode 'enable
-    :func-override-none)
-  (test-ido-ubiquitous-expected-mode-on-functional-collection 'disable
-    :func-override-none-collfunc))
-(defun idu-enabled-testfunc (&rest args)
-  (test-ido-ubiquitous-expected-mode 'enable
-    :func-override-enable)
-  (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable
-    :func-override-enable-collfunc))
-(defun idu-disabled-testfunc (&rest args)
-  (test-ido-ubiquitous-expected-mode 'disable
-    :func-override-disable)
-  (test-ido-ubiquitous-expected-mode-on-functional-collection 'disable
-    :func-override-disable-collfunc))
-(defun idu-enabled-oldstyle-testfunc (&rest args)
-  (test-ido-ubiquitous-expected-mode 'enable-old
-    :func-override-enable-old)
-  (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable-old
-    :func-override-enable-old-collfunc))
-
-;; commands to define overrides on for testing
-(defun idu-no-override-testcmd (&rest args)
-  (interactive
-   (list
-    (test-ido-ubiquitous-expected-mode 'enable
-      :cmd-override-none)
-    (test-ido-ubiquitous-expected-mode-on-functional-collection 'disable
-      :cmd-override-none-collfunc)))
-  (test-ido-ubiquitous-expected-mode 'enable
-    :cmd-override-none)
-  (test-ido-ubiquitous-expected-mode-on-functional-collection 'disable
-    :cmd-override-non-collfunc))
-(defun idu-enabled-testcmd (&rest args)
-  (interactive
-   (list
-    (test-ido-ubiquitous-expected-mode 'enable
-      :cmd-override-enable)
-    (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable
-      :cmd-override-enable-collfunc)))
-  (test-ido-ubiquitous-expected-mode 'enable
-    :cmd-override-enable)
-  (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable
-    :cmd-override-enable-collfunc))
-(defun idu-disabled-testcmd (&rest args)
-  (interactive
-   (list
-    (test-ido-ubiquitous-expected-mode 'disable
-      :cmd-override-disable)
-    (test-ido-ubiquitous-expected-mode-on-functional-collection 'disable
-      :cmd-override-disable-collfunc)))
-  (test-ido-ubiquitous-expected-mode 'disable
-    :cmd-override-disable)
-  (test-ido-ubiquitous-expected-mode-on-functional-collection 'disable
-    :cmd-override-disable-collfunc))
-(defun idu-enabled-oldstyle-testcmd (&rest args)
-  (interactive
-   (list
-    (test-ido-ubiquitous-expected-mode 'enable-old
-      :cmd-override-enable-old)
-    (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable-old
-      :cmd-override-enable-old-collfunc)))
-  (test-ido-ubiquitous-expected-mode 'enable-old
-    :cmd-override-enable-old)
-  (test-ido-ubiquitous-expected-mode-on-functional-collection 'enable-old
-    :cmd-override-enable-old-collfunc))
-
-(ert-deftest ido-ubiquitous-test-command-and-function-overrides ()
-  :tags '(ido ido-ubiquitous)
-  "Test whether command- and function-specific overrides work."
-  (let ((orig-func-overrides ido-ubiquitous-function-overrides)
-        (orig-cmd-overrides ido-ubiquitous-command-overrides))
-    (unwind-protect
-        (with-ido-ubiquitous-standard-env
-          (customize-set-variable
-           'ido-ubiquitous-function-overrides
-           (append ido-ubiquitous-function-overrides
-                   '((enable exact "idu-enabled-testfunc")
-                     (disable exact "idu-disabled-testfunc")
-                     (enable-old exact "idu-enabled-oldstyle-testfunc"))))
-          (cl-loop for func in
-                   '(idu-no-override-testfunc
-                     idu-enabled-testfunc
-                     idu-disabled-testfunc
-                     idu-enabled-oldstyle-testfunc)
-                   do (funcall func))
-          (customize-set-variable
-           'ido-ubiquitous-command-overrides
-           (append ido-ubiquitous-command-overrides
-                   '((enable exact "idu-enabled-testcmd")
-                     (disable exact "idu-disabled-testcmd")
-                     (enable-old exact "idu-enabled-oldstyle-testcmd"))))
-          (cl-loop for cmd in
-                   '(idu-no-override-testcmd
-                     idu-enabled-testcmd
-                     idu-disabled-testcmd
-                     idu-enabled-oldstyle-testcmd)
-                   do (call-interactively cmd)))
-      (customize-set-variable 'ido-ubiquitous-function-overrides orig-func-overrides)
-      (customize-set-variable 'ido-ubiquitous-command-overrides orig-cmd-overrides))))
-
-(ert-deftest ido-ubiquitous-test-fallback ()
-  :tags '(ido ido-ubiquitous)
-  "Test whether manually invoking fallback works."
-  (with-ido-ubiquitous-standard-env
-    (should
-     ;; C-b/f not at beginning/end of input should not fall back
-     (string=
-      "green"
-      (with-simulated-input "g C-b C-f RET"
-        (completing-read "Prompt: " '("blue" "yellow" "green")))))
-    (should
-     ;; C-f at end of input should fall back
-     (string=
-      "g"
-      (with-simulated-input "g C-f RET"
-        (completing-read "Prompt: " '("blue" "yellow" "green")))))
-    (should
-     ;; Repeated C-b should not fall back
-     (string=
-      "green"
-      (with-simulated-input "g C-b C-b C-b C-b RET"
-        (completing-read "Prompt: " '("blue" "yellow" "green")))))
-    (should
-     ;; C-b at beginning of line should fall back (if previous action
-     ;; was not also C-b)
-     (string=
-      "g"
-      (with-simulated-input "g C-b x DEL C-b RET"
-        (completing-read "Prompt: " '("blue" "yellow" "green")))))))
-
-(ert-deftest ido-ubiquitous-dot-prefix-empty-string ()
-  :tags '(ido ido-ubiquitous)
-  "Test whether ido-ubiquitous successfully works around a bug in ido.
-
-See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=26997 for more
-information on this bug."
-  (with-ido-ubiquitous-standard-env
-    (let ((ido-enable-dot-prefix t))
-      (should
-       (string=
-        ""
-        (with-simulated-input "RET"
-          (completing-read "Pick: " '("" "aaa" "aab" "aac")))))
-      (should
-       (string=
-        "aab"
-        (with-simulated-input "a a b RET"
-          (completing-read "Pick: " '("" "aaa" "aab" "aac"))))))))
-
-(defun ido-ubiquitous-run-all-tests ()
-  (interactive)
-  (ert "^ido-\\(ubiquitous\\|cr\\+\\)-"))
-
-(provide 'ido-ubiquitous-test)
-
-;;; ido-ubiquitous-test.el ends here

+ 0 - 1
test/test-helper.el

@@ -36,6 +36,5 @@
 (add-to-list 'load-path code-path)
 
 (require 'ido-completing-read+)
-(require 'ido-ubiquitous)
 
 ;;; test-helper.el ends here