summaryrefslogtreecommitdiff
path: root/test/lisp/cus-edit-tests.el
blob: 535711e02cf668d81ff121f1cabe225ebd93dfcf (plain)
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
;;; cus-edit-tests.el --- Tests for cus-edit.el  -*- lexical-binding: t -*-

;; Copyright (C) 2020-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/>.

;;; Commentary:

;;; Code:

(require 'ert)
(require 'ert-x)
(eval-when-compile (require 'cl-lib))
(require 'cus-edit)

(defmacro with-cus-edit-test (buffer &rest body)
  (declare (indent 1))
  `(save-window-excursion
     (unwind-protect
         (progn ,@body)
       (when-let ((buf (get-buffer ,buffer)))
         (kill-buffer buf)))))


;;;; showing/hiding obsolete options

(defgroup cus-edit-tests nil "Test."
  :group 'test-group)

(defcustom cus-edit-tests--obsolete-option-tag nil
  "This should never be removed; it is obsolete for testing purposes."
  :type 'boolean
  :version "917.10") ; a super high version number
(make-obsolete-variable 'cus-edit-tests--obsolete-option-tag nil "X.X-test")
(defconst cus-edit-tests--obsolete-option-tag
  (custom-unlispify-tag-name 'cus-edit-tests--obsolete-option-tag))

(ert-deftest cus-edit-tests-customize-apropos/hide-obsolete ()
  (with-cus-edit-test "*Customize Apropos*"
    (customize-apropos "cus-edit-tests")
    (should-not (search-forward cus-edit-tests--obsolete-option-tag nil t))))

(ert-deftest cus-edit-tests-customize-changed/hide-obsolete ()
  (with-cus-edit-test "*Customize Changed Options*"
    (customize-changed "917.2") ;; Some future version.
    (should-not (search-forward cus-edit-tests--obsolete-option-tag nil t))))

(ert-deftest cus-edit-tests-customize-group/hide-obsolete ()
  "Check that obsolete variables do not show up."
  (with-cus-edit-test "*Customize Group: Cus Edit Tests*"
    (customize-group 'cus-edit-tests)
    (should-not (search-forward cus-edit-tests--obsolete-option-tag nil t))))

(ert-deftest cus-edit-tests-customize-option/show-obsolete ()
  (with-cus-edit-test "*Customize Option: Cus Edit Tests Obsolete Option Tag*"
    (customize-option 'cus-edit-tests--obsolete-option-tag)
    (goto-char (point-min))
    (should (search-forward cus-edit-tests--obsolete-option-tag nil t))))

(ert-deftest cus-edit-tests-customize-saved/show-obsolete ()
  (with-cus-edit-test "*Customize Saved*"
    (cl-letf (((get 'cus-edit-tests--obsolete-option-tag 'saved-value) '(t)))
      (customize-saved)
      (should (search-forward cus-edit-tests--obsolete-option-tag nil t)))))

(defcustom cus-edit-test-foo1 0
  ""
  :type 'number)

(ert-deftest test-setopt ()
  (should (= (setopt cus-edit-test-foo1 1) 1))
  (should (= cus-edit-test-foo1 1))
  (let* ((text-quoting-style 'grave)
         (warn-txt
          (with-current-buffer (get-buffer-create "*Warnings*")
            (let ((inhibit-read-only t))
              (erase-buffer))
            (setopt cus-edit-test-foo1 :foo)
            (buffer-substring-no-properties (point-min) (point-max)))))
    (should (string-search "Value `:foo' does not match type number"
                           warn-txt))))

(defcustom cus-edit-test-bug63290-option nil
  "Choice option for testing Bug#63290."
  :type '(choice (alist
                  :key-type (string :tag "key")
                  :value-type (string :tag "value"))
                 (const :tag "auto" auto)))

(defcustom cus-edit-test-bug63290-option2 'some
  "Choice option for testing Bug#63290."
  :type '(choice
          (const :tag "some" some)
          (alist
           :key-type (string :tag "key")
           :value-type (string :tag "value"))))

(ert-deftest cus-edit-test-bug63290 ()
  "Test that changing a choice value back to an alist respects its nil value."
  (customize-variable 'cus-edit-test-bug63290-option)
  (search-forward "Value")
  ;; Simulate changing the value.
  (let* ((choice (widget-at))
         (args (widget-get choice :args))
         (list-opt (car (widget-get choice :children)))
         (const-opt (nth 1 args)))
    (widget-put choice :explicit-choice const-opt)
    (widget-value-set choice (widget-default-get const-opt))
    (widget-put choice :explicit-choice list-opt)
    (widget-value-set choice (widget-default-get list-opt)))
  ;; No empty key/value pairs should show up.
  (should-not (search-forward "key" nil t))
  (customize-variable 'cus-edit-test-bug63290-option2)
  (search-forward "Value")
  ;; Simulate changing the value.
  (let* ((choice (widget-at))
         (args (widget-get choice :args))
         (list-opt (nth 1 args)))
    (widget-put choice :explicit-choice list-opt)
    (widget-value-set choice (widget-default-get list-opt)))
  ;; No empty key/value pairs should show up.
  (should-not (search-forward "key" nil t)))

(provide 'cus-edit-tests)
;;; cus-edit-tests.el ends here