diff options
| author | Basil L. Contovounesios | 2020-05-29 19:56:14 +0100 |
|---|---|---|
| committer | Basil L. Contovounesios | 2020-06-18 12:46:21 +0100 |
| commit | 0185d76e7426eb1b58a9b60b0d18e763ddf57dea (patch) | |
| tree | 68e6f560b1751902e98a241a3bf732b9fd596364 /test | |
| parent | 97d1f672ac1529ac07a999405f630cb19a1010eb (diff) | |
| download | emacs-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.el | 4 | ||||
| -rw-r--r-- | test/lisp/format-spec-tests.el | 135 |
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"))) |