emacs/test/lisp/mh-e/mh-thread-tests.el

132 lines
5.7 KiB
EmacsLisp

;;; mh-thread-tests.el --- tests for mh-thread.el -*- lexical-binding: t -*-
;; Copyright (C) 2021-2024 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:
(require 'ert)
(require 'mh-thread)
(eval-when-compile (require 'cl-lib))
(defun mh-thread-tests-before-from ()
"Generate the fields of a scan line up to where the \"From\" field would start.
The exact contents are not important, but the number of characters is."
(concat (make-string mh-cmd-note ?9)
(make-string mh-scan-cmd-note-width ?A)
(make-string mh-scan-destination-width ?t)
(make-string mh-scan-date-width ?/)
(make-string mh-scan-date-flag-width ?*)))
;;; Tests of support routines
(ert-deftest mh-thread-current-indentation-level ()
"Test that `mh-thread-current-indentation-level' identifies the level."
(with-temp-buffer
(insert (mh-thread-tests-before-from) "[Sender One] Subject of msg 1\n")
(insert (mh-thread-tests-before-from) " [Sender Two] Subject of msg 2\n")
(goto-char (point-min))
(should (equal 0 (mh-thread-current-indentation-level)))
(forward-line)
(should (equal 2 (mh-thread-current-indentation-level)))))
(ert-deftest mh-thread-find-children ()
"Test `mh-thread-find-children'."
(let (expected-start expected-end)
(with-temp-buffer
(insert (mh-thread-tests-before-from) "[Sender One] line 1\n")
(setq expected-start (point))
(insert (mh-thread-tests-before-from) " [Sender Two] line 2\n")
(insert (mh-thread-tests-before-from) " [Sender Three] line 3\n")
(insert (mh-thread-tests-before-from) " [Sender Four] line 4\n")
(setq expected-end (1- (point)))
(insert (mh-thread-tests-before-from) " [Sender Five] line 5\n")
(goto-char (1+ expected-start))
(should (equal (list expected-start expected-end)
(mh-thread-find-children))))))
(ert-deftest mh-thread-immediate-ancestor ()
"Test that `mh-thread-immediate-ancestor' moves to the correct message."
(with-temp-buffer
(insert (mh-thread-tests-before-from) "[Sender Other] line 1\n")
(insert (mh-thread-tests-before-from) "[Sender One] line 2\n")
(insert (mh-thread-tests-before-from) " [Sender Two] line 3\n")
(insert (mh-thread-tests-before-from) " [Sender Three] line 4\n")
(insert (mh-thread-tests-before-from) " [Sender Four] line 5\n")
(insert (mh-thread-tests-before-from) " [Sender Five] line 6\n")
(forward-line -1)
(should (equal (line-number-at-pos) 6))
(mh-thread-immediate-ancestor)
(should (equal (line-number-at-pos) 4)) ;skips over sibling
(mh-thread-immediate-ancestor)
(should (equal (line-number-at-pos) 3)) ;goes up only one level at a time
(mh-thread-immediate-ancestor)
(should (equal (line-number-at-pos) 2))
(mh-thread-immediate-ancestor)
(should (equal (line-number-at-pos) 2)))) ;no further motion at thread root
;;; Tests of MH-Folder Commands
(ert-deftest mh-thread-sibling-and-ancestor ()
"Test motion by `mh-thread-ancestor' and `mh-thread-next-sibling'."
(with-temp-buffer
(insert (mh-thread-tests-before-from) "[Sender Other] line 1\n")
(insert (mh-thread-tests-before-from) "[Sender One] line 2\n")
(insert (mh-thread-tests-before-from) " [Sender Two] line 3\n")
(insert (mh-thread-tests-before-from) " [Sender Three] line 4\n")
(insert (mh-thread-tests-before-from) " [Sender Four] line 5\n")
(insert (mh-thread-tests-before-from) " [Sender Five] line 6\n")
(forward-line -1)
(let ((mh-view-ops '(unthread))
(show-count 0))
(cl-letf (((symbol-function 'mh-maybe-show)
(lambda ()
(setq show-count (1+ show-count)))))
(should (equal (line-number-at-pos) 6))
;; test mh-thread-ancestor
(mh-thread-ancestor)
(should (equal (line-number-at-pos) 4)) ;skips over sibling
(should (equal show-count 1))
(mh-thread-ancestor t)
(should (equal (line-number-at-pos) 2)) ;root flag skips to root
(should (equal show-count 2))
(mh-thread-ancestor)
(should (equal (line-number-at-pos) 2)) ;do not move from root
(should (equal show-count 2)) ;do not re-show at root
;; test mh-thread-sibling
(mh-thread-next-sibling)
(should (equal (line-number-at-pos) 2)) ;no next sibling, no motion
(should (equal show-count 2)) ;no sibling, no show
(mh-thread-next-sibling t)
(should (equal (line-number-at-pos) 1))
(should (equal show-count 3))
(mh-thread-next-sibling t)
(should (equal (line-number-at-pos) 1)) ;no previous sibling
(should (equal show-count 3))
(goto-char (point-max))
(forward-line -1)
(should (equal (line-number-at-pos) 6))
(mh-thread-next-sibling t)
(should (equal (line-number-at-pos) 5))
(should (equal show-count 4))
(mh-thread-next-sibling t)
(should (equal (line-number-at-pos) 5)) ;no previous sibling
(should (equal show-count 4))
))))
;;; mh-thread-tests.el ends here