1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
|
;;; em-hist-tests.el --- em-hist test suite -*- lexical-binding:t -*-
;; Copyright (C) 2017-2025 Free Software Foundation, Inc.
;; This file is part of GNU Emacs.
;; GNU Emacs 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 of the License, or
;; (at your option) any later version.
;; GNU Emacs 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.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
(eval-when-compile
(require 'cl-lib))
(require 'ert)
(require 'ert-x)
(require 'em-hist)
(require 'eshell)
(require 'eshell-tests-helpers
(expand-file-name "eshell-tests-helpers"
(file-name-directory (or load-file-name
default-directory))))
(cl-defun em-hist-test/check-history-file (file-name expected &optional
(expected-ring t))
"Check that the contents of FILE-NAME match the EXPECTED history entries.
Additionally, check that after loading the file, the history ring
matches too. If EXPECTED-RING is a list, compare the ring
elements against that; if t (the default), check against EXPECTED."
(when (eq expected-ring t) (setq expected-ring expected))
;; First check the actual file.
(should (equal (with-temp-buffer
(insert-file-contents file-name)
(buffer-string))
(mapconcat (lambda (i) (concat i "\n")) expected)))
;; Now read the history ring and check that too.
(let (eshell-history-ring eshell-history-index eshell-hist--new-items)
(eshell-read-history file-name)
(should (equal (nreverse (ring-elements eshell-history-ring))
expected-ring))))
;;; Tests:
(ert-deftest em-hist-test/write-history/append ()
"Test appending new history to history file."
(ert-with-temp-file histfile
(with-temp-eshell
(em-hist-test/check-history-file histfile nil)
(eshell-insert-command "echo hi")
(eshell-write-history histfile 'append)
(em-hist-test/check-history-file histfile '("echo hi"))
(eshell-insert-command "echo bye")
(eshell-write-history histfile 'append)
(em-hist-test/check-history-file histfile '("echo hi" "echo bye")))))
(ert-deftest em-hist-test/write-history/append-multiple-eshells ()
"Test appending new history to history file from multiple Eshells."
(ert-with-temp-file histfile
(with-temp-eshell
(with-temp-eshell
;; Enter some commands and save them.
(eshell-insert-command "echo foo")
(eshell-insert-command "echo bar")
(eshell-write-history histfile 'append)
(em-hist-test/check-history-file histfile '("echo foo" "echo bar")))
;; Now do the same in the first Eshell buffer.
(eshell-insert-command "echo goat")
(eshell-insert-command "echo panda")
(eshell-write-history histfile 'append)
(em-hist-test/check-history-file
histfile '("echo foo" "echo bar" "echo goat" "echo panda")))))
(ert-deftest em-hist-test/write-history/overwrite ()
"Test overwriting history file."
(ert-with-temp-file histfile
(with-temp-eshell
(em-hist-test/check-history-file histfile nil)
(eshell-insert-command "echo hi")
(eshell-insert-command "echo bye")
(eshell-insert-command "echo bye")
(eshell-insert-command "echo hi")
(eshell-write-history histfile)
(em-hist-test/check-history-file
histfile '("echo hi" "echo bye" "echo bye" "echo hi"))
(let ((eshell-hist-ignoredups t))
(em-hist-test/check-history-file
histfile '("echo hi" "echo bye" "echo bye" "echo hi")
'("echo hi" "echo bye" "echo hi")))
(let ((eshell-hist-ignoredups 'erase))
(em-hist-test/check-history-file
histfile '("echo hi" "echo bye" "echo bye" "echo hi")
'("echo bye" "echo hi"))))))
(ert-deftest em-hist-test/write-history/overwrite-multiple-shells ()
"Test overwriting history file from multiple Eshells."
(ert-with-temp-file histfile
(with-temp-eshell
(with-temp-eshell
;; Enter some commands and save them.
(eshell-insert-command "echo foo")
(eshell-insert-command "echo bar")
(eshell-write-history histfile)
(em-hist-test/check-history-file histfile '("echo foo" "echo bar")))
;; Now do the same in the first Eshell buffer.
(eshell-insert-command "echo goat")
(eshell-insert-command "echo panda")
(eshell-write-history histfile)
(em-hist-test/check-history-file
histfile '("echo goat" "echo panda")))))
(ert-deftest em-hist-test/write-history/read-only ()
"Test that having read-only strings in history is okay."
(ert-with-temp-file histfile
(let ((eshell-history-ring (make-ring 2)))
(ring-insert eshell-history-ring
(propertize "echo foo" 'read-only t))
(ring-insert eshell-history-ring
(propertize "echo bar" 'read-only t))
(eshell-write-history histfile)
(em-hist-test/check-history-file histfile '("echo foo" "echo bar")))))
(ert-deftest em-hist-test/add-to-history/allow-dups ()
"Test adding to history, allowing dups."
(let ((eshell-hist-ignoredups nil))
(with-temp-eshell
(eshell-insert-command "echo hi")
(eshell-insert-command "echo bye")
(eshell-insert-command "echo bye")
(eshell-insert-command "echo hi")
(should (equal (ring-elements eshell-history-ring)
'("echo hi" "echo bye" "echo bye" "echo hi"))))))
(ert-deftest em-hist-test/add-to-history/no-consecutive-dups ()
"Test adding to history, ignoring consecutive dups."
(let ((eshell-hist-ignoredups t))
(with-temp-eshell
(eshell-insert-command "echo hi")
(eshell-insert-command "echo bye")
(eshell-insert-command "echo bye")
(eshell-insert-command "echo hi")
(should (equal (ring-elements eshell-history-ring)
'("echo hi" "echo bye" "echo hi"))))))
(ert-deftest em-hist-test/add-to-history/erase-dups ()
"Test adding to history, erasing any old dups."
(let ((eshell-hist-ignoredups 'erase))
(with-temp-eshell
(eshell-insert-command "echo hi")
(eshell-insert-command "echo bye")
(eshell-insert-command "echo bye")
(eshell-insert-command "echo hi")
(should (equal (ring-elements eshell-history-ring)
'("echo hi" "echo bye"))))))
(ert-deftest em-hist-test/add-to-history/erase-existing-dups ()
"Test adding to history, erasing any old dups after switching to 'erase."
(let ((eshell-hist-ignoredups nil))
(with-temp-eshell
(eshell-insert-command "echo hi")
(eshell-insert-command "echo bye")
(eshell-insert-command "echo bye")
(eshell-insert-command "echo hi")
(eshell-insert-command "echo bye")
(setq eshell-hist-ignoredups 'erase)
(eshell-insert-command "echo hi")
(should (equal (ring-elements eshell-history-ring)
'("echo hi" "echo bye" "echo bye" "echo bye")))
(eshell-insert-command "echo bye")
(should (equal (ring-elements eshell-history-ring)
'("echo bye" "echo hi"))))))
(provide 'em-hist-test)
;;; em-hist-tests.el ends here
|