;;; ivy-test.el --- tests for ivy ;; Copyright (C) 2015 Free Software Foundation, Inc. ;; Author: Oleh Krehel ;; This file is part of GNU Emacs. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 3, or (at your option) ;; any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; For a full copy of the GNU General Public License ;; see . (require 'ert) ;; useful for #'ivy-read-remap. It must arrive before (require 'ivy) (define-key global-map (kbd "") #'end-of-buffer) (require 'ivy) (require 'counsel) (defvar ivy-expr nil "Holds a test expression to evaluate with `ivy-eval'.") (defvar ivy-result nil "Holds the eval result of `ivy-expr' by `ivy-eval'.") (defun ivy-eval () "Evaluate `ivy-expr'." (interactive) (setq ivy-result (eval ivy-expr))) (global-set-key (kbd "C-c e") 'ivy-eval) (defun ivy-with (expr keys) "Evaluate EXPR followed by KEYS." (let ((ivy-expr expr)) (execute-kbd-macro (vconcat (kbd "C-c e") (kbd keys))) ivy-result)) (ert-deftest ivy-read () (should (equal (ivy-with '(ivy-read "pattern: " '("blue" "yellow")) "C-m") "blue")) (should (equal (ivy-with '(ivy-read "pattern: " '("blue" "yellow")) "y C-m") "yellow")) (should (equal (ivy-with '(ivy-read "pattern: " '("blue" "yellow")) "y DEL b C-m") "blue")) (should (equal (ivy-with '(ivy-read "pattern: " '("blue" "yellow")) "z C-m") "z")) (should (equal (ivy-with '(ivy-read "pattern: " '("blue" "yellow")) "y C-m") "blue")) (should (equal (ivy-with '(let ((ivy-re-builders-alist '((t . ivy--regex-fuzzy)))) (ivy-read "pattern: " '("package-list-packages" "something-else"))) "plp C-m") "package-list-packages")) (should (equal (ivy-with '(ivy-read "test" '("aaab" "aaac")) "a C-n C-m") "aaac")) (should (equal (ivy-with '(ivy-read "test" '(("foo" . "bar"))) "asdf C-m") "asdf")) (should (equal (ivy-with '(with-output-to-string (ivy-read "test" '(("foo" . "bar")) :action (lambda (x) (prin1 x)))) "f C-m") "\"bar\"")) (should (equal (ivy-with '(with-output-to-string (ivy-read "test" '(("foo" . "bar")) :action (lambda (x) (prin1 x)))) "asdf C-m") "\"asdf\"")) (should (equal (ivy-with '(ivy-read "pattern: " '("can do" "can" "can't do")) "can C-m") "can"))) (ert-deftest ivy-read-remap () (should (equal (ivy-with '(ivy-read "pattern: " '("blue" "yellow" "red")) " C-m") "red"))) (ert-deftest swiper--re-builder () (setq swiper--width 4) (should (string= (swiper--re-builder "^") ".")) (should (string= (swiper--re-builder "^a") "^ ?\\(a\\)")) (should (string= (swiper--re-builder "^a b") "^ \\(a\\).*?\\(b\\)"))) (ert-deftest ivy--split () (should (equal (ivy--split "King of the who?") '("King" "of" "the" "who?"))) (should (equal (ivy--split "The Brittons.") '("The Brittons."))) (should (equal (ivy--split "Who are the Brittons?") '("Who are" "the Brittons?"))) (should (equal (ivy--split "We're all Britons and I am your king.") '("We're all Britons" "and I am" "your king."))) (should (equal (ivy--split "^[^ ]") '("^[^ ]"))) (should (equal (ivy--split "^[^ ] bar") '("^[^ ]" "bar")))) (ert-deftest ivy--regex () (should (equal (ivy--regex "\\(?:interactive\\|swiper\\) \\(?:list\\|symbol\\)") "\\(\\(?:interactive\\|swiper\\)\\).*?\\(\\(?:list\\|symbol\\)\\)"))) (ert-deftest ivy--regex-fuzzy () (should (string= (ivy--regex-fuzzy "tmux") "\\(t\\).*\\(m\\).*\\(u\\).*\\(x\\)")) (should (string= (ivy--regex-fuzzy "^tmux") "^\\(t\\).*\\(m\\).*\\(u\\).*\\(x\\)")) (should (string= (ivy--regex-fuzzy "^tmux$") "^\\(t\\).*\\(m\\).*\\(u\\).*\\(x\\)$")) (should (string= (ivy--regex-fuzzy "") "")) (should (string= (ivy--regex-fuzzy "^") "^")) (should (string= (ivy--regex-fuzzy "$") "$"))) (ert-deftest ivy--regex-ignore-order () (should (equal (ivy--regex-ignore-order "tmux") '(("tmux" . t)))) (should (equal (ivy--regex-ignore-order "^tmux") '(("^tmux" . t)))) (should (equal (ivy--regex-ignore-order "^tmux$") '(("^tmux$" . t)))) (should (equal (ivy--regex-ignore-order "") "")) (should (equal (ivy--regex-ignore-order "^") '(("^" . t)))) (should (equal (ivy--regex-ignore-order "$") '(("$" . t)))) (should (equal (ivy--regex-ignore-order "one two") '(("one" . t) ("two" . t)))) (should (equal (ivy--regex-ignore-order "one two !three") '(("one" . t) ("two" . t) ("three")))) (should (equal (ivy--regex-ignore-order "one two !three four") '(("one" . t) ("two" . t) ("three") ("four")))) (should (equal (ivy--regex-ignore-order "!three four") '(("" . t) (("three") ("four")))))) (ert-deftest ivy--format () (should (string= (let ((ivy--index 10) (ivy-format-function (lambda (x) (mapconcat #'identity x "\n"))) (cands '("NAME" "SYNOPSIS" "DESCRIPTION" "FUNCTION LETTERS" "SWITCHES" "DIAGNOSTICS" "EXAMPLE 1" "EXAMPLE 2" "EXAMPLE 3" "SEE ALSO" "AUTHOR"))) (ivy--format cands)) #("\nDESCRIPTION\nFUNCTION LETTERS\nSWITCHES\nDIAGNOSTICS\nEXAMPLE 1\nEXAMPLE 2\nEXAMPLE 3\nSEE ALSO\nAUTHOR" 0 90 (read-only nil) 90 96 (face ivy-current-match read-only nil))))) (ert-deftest ivy--filter () (setq ivy-last (make-ivy-state)) (should (equal (ivy--filter "the" '("foo" "the" "The")) '("the" "The"))) (should (equal (ivy--filter "The" '("foo" "the" "The")) '("The")))) (ert-deftest counsel-unquote-regex-parens () (should (equal (counsel-unquote-regex-parens (ivy--regex "foo bar")) "(foo).*?(bar)")) (should (equal (counsel-unquote-regex-parens (ivy--regex "(foo bar")) "(\\(foo).*?(bar)")))