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
| | ;;; marker-tests.el --- tests for marker.c functions -*- lexical-binding: t -*-
;; Copyright (C) 2016-2019 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)
;; The following three tests assert that Emacs survives operations
;; copying a marker whose character position differs from its byte
;; position into a buffer whose character size equals its byte size
;; (Bug#24368).
(ert-deftest marker-set-window-start-from-other-buffer ()
"`set-window-start' from other buffer's marker."
(let ((text-quoting-style 'curve))
(describe-function #'describe-function))
(let ((marker (with-current-buffer "*Help*"
(copy-marker (point-max)))))
(should (set-window-start (selected-window) marker))))
(ert-deftest marker-set-window-point-from-other-buffer ()
"`set-window-point' from another buffer's marker."
(let ((text-quoting-style 'curve))
(describe-function #'describe-function))
(let* ((help (get-buffer "*Help*"))
(marker (with-current-buffer help
(copy-marker (point-max)))))
(with-selected-window (get-buffer-window help)
(should (set-window-point (get-buffer-window "*scratch*") marker)))))
(ert-deftest marker-goto-char-from-other-buffer ()
"`goto-char' from another buffer's marker."
(let ((text-quoting-style 'curve))
(describe-function #'describe-function))
(let ((marker-1 (make-marker))
(marker-2 (make-marker)))
(describe-function #'describe-function)
(with-current-buffer "*Help*"
(set-marker marker-1 (point-max)))
(set-marker marker-2 marker-1)
(should (goto-char marker-2))))
(ert-deftest marker-list ()
"Test `marker-list' behavior."
(with-temp-buffer
;; No markers created yet.
(should-not (marker-list))
(insert "first\nsecond\n")
(forward-line -1)
(let ((markers (list (point-min-marker) (point-max-marker))))
;; Check marker arguments.
(should (equal (apply #'marker-list markers) markers))
(save-restriction
(narrow-to-region (point) (line-end-position))
;; Check accessible range of buffer.
(should-not (marker-list))
;; Check invalid region.
(should-error (apply #'marker-list markers)
:type 'args-out-of-range)))
;; Check single position and that mark is included.
(let ((marker (set-marker (mark-marker) (point))))
(should (equal (marker-list (point)) (list marker))))
;; Check that unchained markers are not included.
(dolist (marker (marker-list))
(set-marker marker nil))
(should-not (marker-list))))
(ert-deftest marker-list-buffer-change ()
"Test `marker-list' behavior across buffer changes."
(with-temp-buffer
(let ((marker (point-marker))
(markers (marker-list)))
(with-temp-buffer
(set-marker marker (point))
(should (equal (marker-list) (list marker)))
(should (equal (mapcar #'marker-buffer markers)
(list (current-buffer)))))
(should-not (marker-list)))))
;;; marker-tests.el ends here.
|