aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorBasil L. Contovounesios2020-05-29 19:56:14 +0100
committerBasil L. Contovounesios2020-06-18 12:46:21 +0100
commit0185d76e7426eb1b58a9b60b0d18e763ddf57dea (patch)
tree68e6f560b1751902e98a241a3bf732b9fd596364 /test
parent97d1f672ac1529ac07a999405f630cb19a1010eb (diff)
downloademacs-0185d76e7426eb1b58a9b60b0d18e763ddf57dea.tar.gz
emacs-0185d76e7426eb1b58a9b60b0d18e763ddf57dea.zip
Fix and extend format-spec (bug#41758)
* lisp/format-spec.el: Use lexical-binding. Remove dependence on subr-x.el. (format-spec-make): Clarify docstring. (format-spec--parse-modifiers): Rename to... (format-spec--parse-flags): ...this and simplify. In particular, don't bother parsing :space-pad which is redundant and unused. (format-spec--pad): Remove, replacing with... (format-spec--do-flags): ...this new helper function which performs more of format-spec's supported text manipulation. (format-spec): Autoload. Allow optional argument to take on special values 'ignore' and 'delete' for more control over what happens when a replacement for a format specification isn't provided. Bring back proper support for a precision modifier similar to that of 'format'. * lisp/battery.el (battery-format): Rewrite in terms of format-spec. (battery-echo-area-format, battery-mode-line-format): Mention support of format-spec syntax in docstrings. * doc/lispref/strings.texi (Custom Format Strings): * etc/NEWS: Document and announce these changes. * lisp/dired-aux.el (dired-do-compress-to): * lisp/erc/erc-match.el (erc-log-matches): * lisp/erc/erc.el (erc-update-mode-line-buffer): * lisp/gnus/gnus-sieve.el (gnus-sieve-update): * lisp/gnus/gssapi.el (open-gssapi-stream): * lisp/gnus/mail-source.el (mail-source-fetch-file) (mail-source-fetch-directory, mail-source-fetch-pop) (mail-source-fetch-imap): * lisp/gnus/message.el (message-insert-formatted-citation-line): * lisp/image-dired.el: * lisp/net/eww.el: * lisp/net/imap.el (imap-kerberos4-open, imap-gssapi-open) (imap-shell-open): * lisp/net/network-stream.el (network-stream-open-shell): * lisp/obsolete/tls.el (open-tls-stream): * lisp/textmodes/tex-mode.el: Remove extraneous loads and autoloads of format-spec now that it is autoloaded and simplify its uses where possible. * test/lisp/battery-tests.el (battery-format): Test new format-spec support. * test/lisp/format-spec-tests.el (test-format-spec): Rename to... (format-spec) ...this, extending test cases. (test-format-unknown): Rename to... (format-spec-unknown): ...this, extending test cases. (test-format-modifiers): Rename to... (format-spec-flags): ...this. (format-spec-make, format-spec-parse-flags, format-spec-do-flags) (format-spec-do-flags-truncate, format-spec-do-flags-pad) (format-spec-do-flags-chop, format-spec-do-flags-case): New tests.
Diffstat (limited to 'test')
-rw-r--r--test/lisp/battery-tests.el4
-rw-r--r--test/lisp/format-spec-tests.el135
2 files changed, 131 insertions, 8 deletions
diff --git a/test/lisp/battery-tests.el b/test/lisp/battery-tests.el
index 052ae49a800..4cb7470d884 100644
--- a/test/lisp/battery-tests.el
+++ b/test/lisp/battery-tests.el
@@ -52,7 +52,7 @@
52 "Test `battery-format'." 52 "Test `battery-format'."
53 (should (equal (battery-format "" ()) "")) 53 (should (equal (battery-format "" ()) ""))
54 (should (equal (battery-format "" '((?b . "-"))) "")) 54 (should (equal (battery-format "" '((?b . "-"))) ""))
55 (should (equal (battery-format "%a%b%p%%" '((?b . "-") (?p . "99"))) 55 (should (equal (battery-format "%2a%-3b%.1p%%" '((?b . "-") (?p . "99")))
56 "-99%"))) 56 "- 9%")))
57 57
58;;; battery-tests.el ends here 58;;; battery-tests.el ends here
diff --git a/test/lisp/format-spec-tests.el b/test/lisp/format-spec-tests.el
index 23ee88c5269..11882217afb 100644
--- a/test/lisp/format-spec-tests.el
+++ b/test/lisp/format-spec-tests.el
@@ -22,22 +22,145 @@
22(require 'ert) 22(require 'ert)
23(require 'format-spec) 23(require 'format-spec)
24 24
25(ert-deftest test-format-spec () 25(ert-deftest format-spec-make ()
26 "Test `format-spec-make'."
27 (should-not (format-spec-make))
28 (should-error (format-spec-make ?b))
29 (should (equal (format-spec-make ?b "b") '((?b . "b"))))
30 (should-error (format-spec-make ?b "b" ?a))
31 (should (equal (format-spec-make ?b "b" ?a 'a)
32 '((?b . "b")
33 (?a . a)))))
34
35(ert-deftest format-spec-parse-flags ()
36 "Test `format-spec--parse-flags'."
37 (should-not (format-spec--parse-flags nil))
38 (should-not (format-spec--parse-flags ""))
39 (should (equal (format-spec--parse-flags "-") '(:pad-right)))
40 (should (equal (format-spec--parse-flags " 0") '(:pad-zero)))
41 (should (equal (format-spec--parse-flags " -x0y< >^_z ")
42 '(:pad-right :pad-zero :chop-left :chop-right
43 :upcase :downcase))))
44
45(ert-deftest format-spec-do-flags ()
46 "Test `format-spec--do-flags'."
47 (should (equal (format-spec--do-flags "" () nil nil) ""))
48 (dolist (flag '(:pad-zero :pad-right :upcase :downcase
49 :chop-left :chop-right))
50 (should (equal (format-spec--do-flags "" (list flag) nil nil) "")))
51 (should (equal (format-spec--do-flags "FOOBAR" '(:downcase :chop-right) 5 2)
52 " fo"))
53 (should (equal (format-spec--do-flags
54 "foobar" '(:pad-zero :pad-right :upcase :chop-left) 5 2)
55 "AR000")))
56
57(ert-deftest format-spec-do-flags-truncate ()
58 "Test `format-spec--do-flags' truncation."
59 (let (flags)
60 (should (equal (format-spec--do-flags "" flags nil 0) ""))
61 (should (equal (format-spec--do-flags "" flags nil 1) ""))
62 (should (equal (format-spec--do-flags "a" flags nil 0) ""))
63 (should (equal (format-spec--do-flags "a" flags nil 1) "a"))
64 (should (equal (format-spec--do-flags "a" flags nil 2) "a"))
65 (should (equal (format-spec--do-flags "asd" flags nil 0) ""))
66 (should (equal (format-spec--do-flags "asd" flags nil 1) "a")))
67 (let ((flags '(:chop-left)))
68 (should (equal (format-spec--do-flags "" flags nil 0) ""))
69 (should (equal (format-spec--do-flags "" flags nil 1) ""))
70 (should (equal (format-spec--do-flags "a" flags nil 0) ""))
71 (should (equal (format-spec--do-flags "a" flags nil 1) "a"))
72 (should (equal (format-spec--do-flags "a" flags nil 2) "a"))
73 (should (equal (format-spec--do-flags "asd" flags nil 0) ""))
74 (should (equal (format-spec--do-flags "asd" flags nil 1) "d"))))
75
76(ert-deftest format-spec-do-flags-pad ()
77 "Test `format-spec--do-flags' padding."
78 (let (flags)
79 (should (equal (format-spec--do-flags "" flags 0 nil) ""))
80 (should (equal (format-spec--do-flags "" flags 1 nil) " "))
81 (should (equal (format-spec--do-flags "a" flags 0 nil) "a"))
82 (should (equal (format-spec--do-flags "a" flags 1 nil) "a"))
83 (should (equal (format-spec--do-flags "a" flags 2 nil) " a")))
84 (let ((flags '(:pad-zero)))
85 (should (equal (format-spec--do-flags "" flags 0 nil) ""))
86 (should (equal (format-spec--do-flags "" flags 1 nil) "0"))
87 (should (equal (format-spec--do-flags "a" flags 0 nil) "a"))
88 (should (equal (format-spec--do-flags "a" flags 1 nil) "a"))
89 (should (equal (format-spec--do-flags "a" flags 2 nil) "0a")))
90 (let ((flags '(:pad-right)))
91 (should (equal (format-spec--do-flags "" flags 0 nil) ""))
92 (should (equal (format-spec--do-flags "" flags 1 nil) " "))
93 (should (equal (format-spec--do-flags "a" flags 0 nil) "a"))
94 (should (equal (format-spec--do-flags "a" flags 1 nil) "a"))
95 (should (equal (format-spec--do-flags "a" flags 2 nil) "a ")))
96 (let ((flags '(:pad-right :pad-zero)))
97 (should (equal (format-spec--do-flags "" flags 0 nil) ""))
98 (should (equal (format-spec--do-flags "" flags 1 nil) "0"))
99 (should (equal (format-spec--do-flags "a" flags 0 nil) "a"))
100 (should (equal (format-spec--do-flags "a" flags 1 nil) "a"))
101 (should (equal (format-spec--do-flags "a" flags 2 nil) "a0"))))
102
103(ert-deftest format-spec-do-flags-chop ()
104 "Test `format-spec--do-flags' chopping."
105 (let ((flags '(:chop-left)))
106 (should (equal (format-spec--do-flags "a" flags 0 nil) ""))
107 (should (equal (format-spec--do-flags "a" flags 1 nil) "a"))
108 (should (equal (format-spec--do-flags "asd" flags 0 nil) ""))
109 (should (equal (format-spec--do-flags "asd" flags 1 nil) "d")))
110 (let ((flags '(:chop-right)))
111 (should (equal (format-spec--do-flags "a" flags 0 nil) ""))
112 (should (equal (format-spec--do-flags "a" flags 1 nil) "a"))
113 (should (equal (format-spec--do-flags "asd" flags 0 nil) ""))
114 (should (equal (format-spec--do-flags "asd" flags 1 nil) "a"))))
115
116(ert-deftest format-spec-do-flags-case ()
117 "Test `format-spec--do-flags' case fiddling."
118 (dolist (flag '(:pad-zero :pad-right :chop-left :chop-right))
119 (let ((flags (list flag)))
120 (should (equal (format-spec--do-flags "a" flags nil nil) "a"))
121 (should (equal (format-spec--do-flags "A" flags nil nil) "A")))
122 (let ((flags (list flag :downcase)))
123 (should (equal (format-spec--do-flags "a" flags nil nil) "a"))
124 (should (equal (format-spec--do-flags "A" flags nil nil) "a")))
125 (let ((flags (list flag :upcase)))
126 (should (equal (format-spec--do-flags "a" flags nil nil) "A"))
127 (should (equal (format-spec--do-flags "A" flags nil nil) "A")))))
128
129(ert-deftest format-spec ()
130 (should (equal (format-spec "" ()) ""))
131 (should (equal (format-spec "a" ()) "a"))
132 (should (equal (format-spec "b" '((?b . "bar"))) "b"))
133 (should (equal (format-spec "%%%b%%b%b%%" '((?b . "bar"))) "%bar%bbar%"))
26 (should (equal (format-spec "foo %b zot" `((?b . "bar"))) 134 (should (equal (format-spec "foo %b zot" `((?b . "bar")))
27 "foo bar zot")) 135 "foo bar zot"))
28 (should (equal (format-spec "foo %-10b zot" '((?b . "bar"))) 136 (should (equal (format-spec "foo %-10b zot" '((?b . "bar")))
29 "foo bar zot")) 137 "foo bar zot"))
30 (should (equal (format-spec "foo %10b zot" '((?b . "bar"))) 138 (should (equal (format-spec "foo %10b zot" '((?b . "bar")))
31 "foo bar zot"))) 139 "foo bar zot"))
140 (should (equal-including-properties
141 (format-spec (propertize "a" 'a 'b) '((?a . "foo")))
142 #("a" 0 1 (a b))))
143 (let ((fmt (concat (propertize "%a" 'a 'b)
144 (propertize "%%" 'c 'd)
145 "%b"
146 (propertize "%b" 'e 'f))))
147 (should (equal-including-properties
148 (format-spec fmt '((?b . "asd") (?a . "fgh")))
149 #("fgh%asdasd" 0 3 (a b) 3 4 (c d) 7 10 (e f))))))
32 150
33(ert-deftest test-format-unknown () 151(ert-deftest format-spec-unknown ()
34 (should-error (format-spec "foo %b %z zot" '((?b . "bar")))) 152 (should-error (format-spec "foo %b %z zot" '((?b . "bar"))))
153 (should-error (format-spec "foo %b %%%z zot" '((?b . "bar"))))
35 (should (equal (format-spec "foo %b %z zot" '((?b . "bar")) t) 154 (should (equal (format-spec "foo %b %z zot" '((?b . "bar")) t)
36 "foo bar %z zot")) 155 "foo bar %z zot"))
37 (should (equal (format-spec "foo %b %z %% zot" '((?b . "bar")) t) 156 (should (equal (format-spec "foo %4b %%%4z %%4 zot" '((?b . "bar")) t)
38 "foo bar %z %% zot"))) 157 "foo bar %%%4z %%4 zot"))
158 (should (equal (format-spec "foo %4b %%%4z %%4 zot" '((?b . "bar")) 'ignore)
159 "foo bar %%4z %4 zot"))
160 (should (equal (format-spec "foo %4b %%%4z %%4 zot" '((?b . "bar")) 'delete)
161 "foo bar % %4 zot")))
39 162
40(ert-deftest test-format-modifiers () 163(ert-deftest format-spec-flags ()
41 (should (equal (format-spec "foo %10b zot" '((?b . "bar"))) 164 (should (equal (format-spec "foo %10b zot" '((?b . "bar")))
42 "foo bar zot")) 165 "foo bar zot"))
43 (should (equal (format-spec "foo % 10b zot" '((?b . "bar"))) 166 (should (equal (format-spec "foo % 10b zot" '((?b . "bar")))