;;; Code:
+(eval-when-compile
+ (require 'cl-lib))
+
(require 'ert)
(require 'ert-x)
(require 'em-hist)
(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.
+Additonally, 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 again 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-readonly-history ()
+(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)))
(propertize "echo foo" 'read-only t))
(ring-insert eshell-history-ring
(propertize "echo bar" 'read-only t))
- (eshell-write-history histfile))))
-
-(ert-deftest em-hist-test/history-append ()
- "Test 'history -a'."
- (ert-with-temp-file histfile
- (with-temp-eshell
- (let ((eshell-history-file-name histfile))
- (eshell-insert-command "echo hi")
- (eshell-insert-command "history -w")
- (eshell-insert-command "history -a")
- (eshell-insert-command "echo bye")
- (eshell-insert-command "history -a")
- (eshell-insert-command "history -r")
- (should (equal (ring-elements eshell-history-ring)
- '("history -a" "echo bye"
- "history -a" "history -w" "echo hi")))))))
-
-(ert-deftest em-hist-test/history-read ()
- "Test 'history -r'."
- (ert-with-temp-file histfile
- (with-temp-eshell
- (let ((eshell-history-file-name histfile))
- (eshell-insert-command "echo hi")
- (eshell-insert-command "echo bye")
- (eshell-insert-command "echo bye")
- (eshell-insert-command "echo hi")
- (eshell-insert-command "history -w")
- (let ((eshell-hist-ignoredups t))
- (eshell-insert-command "history -r")
- (should (equal (ring-elements eshell-history-ring)
- '("history -w" "echo hi" "echo bye" "echo hi"))))
- (let ((eshell-hist-ignoredups 'erase))
- (eshell-insert-command "history -r")
- (should (equal (ring-elements eshell-history-ring)
- '("history -w" "echo hi" "echo bye"))))))))
+ (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."