1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-17 11:20:39 -08:00
emacs/test/lisp/eshell/em-prompt-tests.el
Jim Porter ab7c2f8092 Ensure that Eshell users can run lines of command output as input
Previously, this failed to work properly because any additional input
the user entered would have no 'field' property, confusing
'eshell-get-old-input'.  To fix this, we simply ensure that any
user-entered text in the output field retains said output field
(bug#61310).

* lisp/eshell/esh-util.el (eshell-command-output-properties): New
variable.
(eshell--mark-as-output, eshell--mark-yanked-as-output): New
functions, mostly copied from comint.

* lisp/eshell/esh-proc.el (eshell-interactive-process-filter):
* lisp/eshell/esh-mode.el (eshell-interactive-print): Call
'eshell--mark-as-output'.
(eshell-get-old-input): Remove properties from the returned string
just to be safe.

* test/lisp/eshell/eshell-tests.el (eshell-test-value): New variable.
(eshell-test/get-old-input/rerun-command)
(eshell-test/get-old-input/run-output): New tests.

* test/lisp/eshell/em-prompt-tests.el
(em-prompt-test/field-properties)
(em-prompt-test/field-properties/no-highlight): Use
'eshell-command-output-properties'.
2023-02-09 22:32:51 -08:00

120 lines
4.8 KiB
EmacsLisp

;;; em-prompt-tests.el --- em-prompt test suite -*- lexical-binding:t -*-
;; Copyright (C) 2023 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/>.
;;; Commentary:
;; Tests for Eshell's prompt support.
;;; Code:
(require 'ert)
(require 'eshell)
(require 'em-prompt)
(require 'eshell-tests-helpers
(expand-file-name "eshell-tests-helpers"
(file-name-directory (or load-file-name
default-directory))))
;;; Tests:
(ert-deftest em-prompt-test/field-properties ()
"Check that field properties are properly set on Eshell output/prompts."
(with-temp-eshell
(eshell-insert-command "echo hello")
(let ((last-prompt (field-string (1- eshell-last-input-start)))
(last-input (field-string (1+ eshell-last-input-start)))
(last-output (field-string (1+ eshell-last-input-end))))
(should (equal-including-properties
last-prompt
(propertize
(format "%s %s " (directory-file-name default-directory)
(if (= (file-user-uid) 0) "#" "$"))
'read-only t
'field 'prompt
'font-lock-face 'eshell-prompt
'front-sticky '(read-only field font-lock-face)
'rear-nonsticky '(read-only field font-lock-face))))
(should (equal last-input "echo hello\n"))
(should (equal-including-properties
last-output
(apply #'propertize "hello\n"
eshell-command-output-properties))))))
(ert-deftest em-prompt-test/field-properties/no-highlight ()
"Check that field properties are properly set on Eshell output/prompts.
This tests the case when `eshell-highlight-prompt' is nil."
(let ((eshell-highlight-prompt nil))
(with-temp-eshell
(eshell-insert-command "echo hello")
(let ((last-prompt (field-string (1- eshell-last-input-start)))
(last-input (field-string (1+ eshell-last-input-start)))
(last-output (field-string (1+ eshell-last-input-end))))
(should (equal-including-properties
last-prompt
(propertize
(format "%s %s " (directory-file-name default-directory)
(if (= (file-user-uid) 0) "#" "$"))
'field 'prompt
'front-sticky '(field)
'rear-nonsticky '(field))))
(should (equal last-input "echo hello\n"))
(should (equal-including-properties
last-output
(apply #'propertize "hello\n"
eshell-command-output-properties)))))))
(ert-deftest em-prompt-test/next-previous-prompt ()
"Check that navigating forward/backward through old prompts works correctly."
(with-temp-eshell
(eshell-insert-command "echo one")
(eshell-insert-command "echo two")
(eshell-insert-command "echo three")
(insert "echo fou") ; A partially-entered command.
;; Go back one prompt.
(eshell-previous-prompt 1)
(should (equal (eshell-get-old-input) "echo three"))
;; Go back two prompts, starting from the end of this line.
(end-of-line)
(eshell-previous-prompt 2)
(should (equal (eshell-get-old-input) "echo one"))
;; Go forward three prompts.
(eshell-next-prompt 3)
(should (equal (eshell-get-old-input) "echo fou"))))
(ert-deftest em-prompt-test/forward-backward-matching-input ()
"Check that navigating forward/backward via regexps works correctly."
(with-temp-eshell
(eshell-insert-command "echo one")
(eshell-insert-command "printnl something else")
(eshell-insert-command "echo two")
(eshell-insert-command "echo three")
(insert "echo fou") ; A partially-entered command.
;; Go back one prompt.
(eshell-backward-matching-input "echo" 1)
(should (equal (eshell-get-old-input) "echo three"))
;; Go back two prompts, starting from the end of this line.
(end-of-line)
(eshell-backward-matching-input "echo" 2)
(should (equal (eshell-get-old-input) "echo one"))
;; Go forward three prompts.
(eshell-forward-matching-input "echo" 3)
(should (equal (eshell-get-old-input) "echo fou"))))
;;; em-prompt-tests.el ends here