branch: externals/compat
commit cb4fb51ad75d747e1b0d8b572e443ca2fe570e3c
Author: Daniel Mendler <[email protected]>
Commit: Daniel Mendler <[email protected]>
Simplify the test suite
---
compat-macs.el | 21 +-
compat-tests.el | 3791 +++++++++++++++++++++++++++----------------------------
2 files changed, 1882 insertions(+), 1930 deletions(-)
diff --git a/compat-macs.el b/compat-macs.el
index 4fc6019f1a..f778703cf8 100644
--- a/compat-macs.el
+++ b/compat-macs.el
@@ -37,7 +37,7 @@
`(eval-after-load ,feature `(funcall ',(lambda () ,body)))
body))
-(defvar compat--generate-function #'compat--generate-default
+(defun compat--generate (name def-fn install-fn check-fn attr)
"Function used to generate compatibility code.
The function must take six arguments: NAME, DEF-FN, INSTALL-FN,
CHECK-FN and ATTR. The resulting body is constructed by invoking
@@ -72,12 +72,7 @@ ignored:
the compatibility definition (symbol).
- :explicit :: Add a `compat-' prefix to the name, and define the
- compatibility code unconditionally.")
-
-(defun compat--generate-default (name def-fn install-fn check-fn attr)
- "Generate a leaner compatibility definition.
-See `compat--generate-function' for details on the arguments NAME,
-DEF-FN, INSTALL-FN, CHECK-FN and ATTR."
+ compatibility code unconditionally."
(let* ((min-version (plist-get attr :min-version))
(max-version (plist-get attr :max-version))
(feature (plist-get attr :feature))
@@ -125,7 +120,7 @@ TYPE is one of `func', for functions and `macro' for
macros, and
`advice' ARGLIST is passed on directly to the definition, and
DOCSTRING is prepended with a compatibility note. REST contains
the remaining definition, that may begin with a property list of
-attributes (see `compat--generate-function')."
+attributes (see `compat--generate')."
(let ((oldname name) (body rest))
(while (keywordp (car body))
(setq body (cddr body)))
@@ -143,7 +138,7 @@ attributes (see `compat--generate-function')."
;; Check if we want an explicitly prefixed function
(when (plist-get rest :explicit)
(setq name (intern (format "compat-%s" name))))
- (funcall compat--generate-function
+ (compat--generate
name
(lambda (realname version)
`(progn
@@ -206,7 +201,7 @@ If this is not documented on yourself system, you can check
\
"Define NAME with arguments ARGLIST as a compatibility function.
The function must be documented in DOCSTRING. REST may begin
with a plist, that is interpreted by the macro but not passed on
-to the actual function. See `compat--generate-function' for a
+to the actual function. See `compat--generate' for a
listing of attributes.
The definition will only be installed, if the version this
@@ -223,7 +218,7 @@ attribute, is greater than the current Emacs version."
"Define NAME with arguments ARGLIST as a compatibility macro.
The macro must be documented in DOCSTRING. REST may begin
with a plist, that is interpreted by this macro but not passed on
-to the actual macro. See `compat--generate-function' for a
+to the actual macro. See `compat--generate' for a
listing of attributes.
The definition will only be installed, if the version this
@@ -237,7 +232,7 @@ attribute, is greater than the current Emacs version."
The obligatory documentation string DOCSTRING must be given.
The remaining arguments ATTR form a plist, modifying the
-behaviour of this macro. See `compat--generate-function' for a
+behaviour of this macro. See `compat--generate' for a
listing of attributes. Furthermore, `compat-defvar' also handles
the attribute `:local' that either makes the variable permanent
local with a value of `permanent' or just buffer local with any
@@ -246,7 +241,7 @@ non-nil value."
(doc-string 3) (indent 2))
(when (or (plist-get attr :explicit) (plist-get attr :realname))
(error ":explicit cannot be specified for compatibility variables"))
- (funcall compat--generate-function
+ (compat--generate
name
(lambda (realname version)
(let ((localp (plist-get attr :local)))
diff --git a/compat-tests.el b/compat-tests.el
index f992fa6eba..e3d6b8d2bb 100644
--- a/compat-tests.el
+++ b/compat-tests.el
@@ -30,140 +30,8 @@
;;; Code:
(require 'ert)
-(require 'compat-macs)
-
-(setq ert-quiet t)
-
-(defun compat--generate-testable (name def-fn install-fn check-fn attr)
- "Generate a more verbose compatibility definition, fit for testing.
-See `compat-generate-function' for details on the arguments NAME,
-DEF-FN, INSTALL-FN, CHECK-FN and ATTR."
- (let* ((min-version (plist-get attr :min-version))
- (max-version (plist-get attr :max-version))
- (feature (plist-get attr :feature))
- (cond (plist-get attr :cond))
- (version (or (plist-get attr :version)
- compat--current-version))
- (realname (or (plist-get attr :realname)
- (intern (format "compat--t-%S" name))))
- (body `(progn
- (unless (or (null (get ',name 'compat-def))
- (eq (get ',name 'compat-def) ',realname))
- (error "Duplicate compatibility definition: %s (was %s,
now %s)"
- ',name (get ',name 'compat-def) ',realname))
- (put ',name 'compat-def ',realname)
- ,(funcall install-fn realname version)))
- (check (cond
- ((or (and min-version
- (version< emacs-version min-version))
- (and max-version
- (version< max-version emacs-version)))
- nil)
- ((plist-get attr :explicit)
- '(progn))
- ((and version (version<= version emacs-version) (not cond))
- nil)
- (`(when (and ,(if cond cond t)
- ,(funcall check-fn)))))))
- `(progn
- (put ',realname 'compat-version ,version)
- (put ',realname 'compat-min-version ,min-version)
- (put ',realname 'compat-max-version ,max-version)
- ,(funcall def-fn realname version)
- ,(and check (compat--with-feature feature `(,@check ,body))))))
-
-(setq compat--generate-function #'compat--generate-testable)
-
(require 'compat)
-
-(defvar compat-test-counter)
-
-(defun compat--ought (name compat)
- "Implementation for the `ought' macro for NAME.
-COMPAT is the name of the compatibility function the behaviour is
-being compared against."
- (lambda (result &rest args)
- (let ((real-test (intern (format "%s-%04d-actual/ought" compat
compat-test-counter)))
- (comp-test (intern (format "%s-%04d-compat/ought" compat
compat-test-counter))))
- (setq compat-test-counter (1+ compat-test-counter))
- (macroexp-progn
- (list (and (fboundp name)
- (or (not (get compat 'compat-version))
- (version<= emacs-version (get compat 'compat-version)))
- `(ert-set-test
- ',real-test
- (make-ert-test
- :name ',real-test
- :tags '(,name)
- :body (lambda () (should (equal ,result (,name
,@args)))))))
- (and (fboundp compat)
- `(ert-set-test
- ',comp-test
- (make-ert-test
- :name ',comp-test
- :tags '(,name)
- :body (lambda () (should (equal ,result (,compat
,@args))))))))))))
-
-(defun compat--expect (name compat)
- "Implementation for the `expect' macro for NAME.
-COMPAT is the name of the compatibility function the behaviour is
-being compared against."
- (lambda (error-spec &rest args)
- (let ((real-test (intern (format "%s-%04d-actual/expect" compat
compat-test-counter)))
- (comp-test (intern (format "%s-%04d-compat/expect" compat
compat-test-counter)))
- (error-type (if (consp error-spec) (car error-spec) error-spec)))
- (setq compat-test-counter (1+ compat-test-counter))
- (macroexp-progn
- (list (and (fboundp name)
- (or (not (get compat 'compat-version))
- (version<= emacs-version (get compat 'compat-version)))
- `(ert-set-test
- ',real-test
- (make-ert-test
- :name ',real-test
- :tags '(,name)
- :body (lambda ()
- (should
- (let ((res (should-error (,name ,@args) :type
',error-type)))
- (should
- ,(if (consp error-spec)
- `(equal res ',error-spec)
- `(eq (car res) ',error-spec)))))))))
- (and (fboundp compat)
- `(ert-set-test
- ',comp-test
- (make-ert-test
- :name ',comp-test
- :tags '(,name)
- :body (lambda ()
- (should
- (let ((res (should-error (,name ,@args) :type
',error-type)))
- (should
- ,(if (consp error-spec)
- `(equal res ',error-spec)
- `(eq (car res) ',error-spec))))))))))))))
-
-(defmacro compat-deftests (name &rest body)
- "Test NAME in BODY."
- (declare (debug (sexp &rest body))
- (indent 1))
- (let* ((compat-test-counter 0)
- (real-name (if (consp name) (car name) name))
- (compat-name (if (consp name)
- (cadr name)
- (intern (format "compat--t-%s" real-name))))
- (env (list
- (cons 'ought (compat--ought real-name compat-name))
- (cons 'expect (compat--expect real-name compat-name)))))
- (and (or (not (get compat-name 'compat-min-version))
- (version< (get compat-name 'compat-min-version) emacs-version))
- (or (not (get compat-name 'compat-max-version))
- (version< emacs-version (get compat-name 'compat-max-version)))
- (macroexpand-all
- (macroexp-progn body)
- (append env macroexpand-all-environment)))))
-
-
+(setq ert-quiet t)
(ert-deftest compat-call ()
(let (list)
@@ -173,1790 +41,1879 @@ being compared against."
(should (eq (compat-call plist-get list "first" #'string=) 10))
(should (eq (compat-call plist-get list "second" #'string=) 2))))
-(compat-deftests string-search
- ;; Find needle at the beginning of a haystack:
- (ought 0 "a" "abb")
- ;; Find needle at the begining of a haystack, with more potential
- ;; needles that could be found:
- (ought 0 "a" "abba")
- ;; Find needle with more than one charachter at the beginning of
- ;; a line:
- (ought 0 "aa" "aabbb")
- ;; Find a needle midstring:
- (ought 1 "a" "bab")
- ;; Find a needle at the end:
- (ought 2 "a" "bba")
- ;; Find a longer needle midstring:
- (ought 1 "aa" "baab")
- ;; Find a longer needle at the end:
- (ought 2 "aa" "bbaa")
- ;; Find a case-sensitive needle:
- (ought 2 "a" "AAa")
- ;; Find another case-sensitive needle:
- (ought 2 "aa" "AAaa")
- ;; Test regular expression quoting (1):
- (ought 5 "." "abbbb.b")
- ;; Test regular expression quoting (2):
- (ought 5 ".*" "abbbb.*b")
- ;; Attempt to find non-existent needle:
- (ought nil "a" "bbb")
- ;; Attempt to find non-existent needle that has the form of a
- ;; regular expression:
- (ought nil "." "bbb")
- ;; Handle empty string as needle:
- (ought 0 "" "abc")
- ;; Handle empty string as haystack:
- (ought nil "a" "")
- ;; Handle empty string as needle and haystack:
- (ought 0 "" "")
- ;; Handle START argument:
- (ought 3 "a" "abba" 1)
- ;; Additional test copied from:
- (ought 6 "zot" "foobarzot")
- (ought 0 "foo" "foobarzot")
- (ought nil "fooz" "foobarzot")
- (ought nil "zot" "foobarzo")
- (ought 0 "ab" "ab")
- (ought nil "ab\0" "ab")
- (ought 4 "ab" "abababab" 3)
- (ought nil "ab" "ababac" 3)
- (ought nil "aaa" "aa")
- ;; The `make-string' calls with three arguments have been replaced
- ;; here with the result of their evaluation, to avoid issues with
- ;; older versions of Emacs that only support two arguments.
- (ought 5
- (make-string 2 130)
- ;; Per (concat "helló" (make-string 5 130 t) "bár")
- "hellóbár")
- (ought 5
- (make-string 2 127)
- ;; Per (concat "helló" (make-string 5 127 t) "bár")
- "hellóbár")
- (ought 1 "\377" "a\377ø")
- (ought 1 "\377" "a\377a")
- (ought nil (make-string 1 255) "a\377ø")
- (ought nil (make-string 1 255) "a\377a")
- (ought 3 "fóo" "zotfóo")
- (ought nil "\303" "aøb")
- (ought nil "\270" "aøb")
- (ought nil "ø" "\303\270")
- (ought nil "ø" (make-string 32 ?a))
- (ought nil "ø" (string-to-multibyte (make-string 32 ?a)))
- (ought 14 "o" (string-to-multibyte
- (apply #'string (number-sequence ?a ?z))))
- (ought 2 "a\U00010f98z" "a\U00010f98a\U00010f98z")
- (expect (args-out-of-range -1) "a" "abc" -1)
- (expect (args-out-of-range 4) "a" "abc" 4)
- (expect (args-out-of-range 100000000000)
- "a" "abc" 100000000000)
- (ought nil "a" "aaa" 3)
- (ought nil "aa" "aa" 1)
- (ought nil "\0" "")
- (ought 0 "" "")
- (expect (args-out-of-range 1) "" "" 1)
- (ought 0 "" "abc")
- (ought 2 "" "abc" 2)
- (ought 3 "" "abc" 3)
- (expect (args-out-of-range 4) "" "abc" 4)
- (expect (args-out-of-range -1) "" "abc" -1)
- (ought nil "ø" "foo\303\270")
- (ought nil "\303\270" "ø")
- (ought nil "\370" "ø")
- (ought nil (string-to-multibyte "\370") "ø")
- (ought nil "ø" "\370")
- (ought nil "ø" (string-to-multibyte "\370"))
- (ought nil "\303\270" "\370")
- (ought nil (string-to-multibyte "\303\270") "\370")
- (ought nil "\303\270" (string-to-multibyte "\370"))
- (ought nil
- (string-to-multibyte "\303\270")
- (string-to-multibyte "\370"))
- (ought nil "\370" "\303\270")
- (ought nil (string-to-multibyte "\370") "\303\270")
- (ought nil "\370" (string-to-multibyte "\303\270"))
- (ought nil
- (string-to-multibyte "\370")
- (string-to-multibyte "\303\270"))
- (ought 3 "\303\270" "foo\303\270")
- (when (version<= "27" emacs-version)
- ;; FIXME The commit a1f76adfb03c23bb4242928e8efe6193c301f0c1 in
- ;; emacs.git fixes the behaviour of regular expressions matching
- ;; raw bytes. The compatibility functions should updated to
- ;; backport this behaviour.
- (ought 2 (string-to-multibyte "\377") "ab\377c")
- (ought 2
- (string-to-multibyte "o\303\270")
- "foo\303\270")))
-
-(compat-deftests string-replace
- (ought "bba" "aa" "bb" "aaa")
- (ought "AAA" "aa" "bb" "AAA")
- ;; Additional test copied from subr-tests.el:
- (ought "zot" "foo" "bar" "zot")
- (ought "barzot" "foo" "bar" "foozot")
- (ought "barbarzot" "foo" "bar" "barfoozot")
- (ought "barfoobar" "zot" "bar" "barfoozot")
- (ought "barfoobarot" "z" "bar" "barfoozot")
- (ought "zat" "zot" "bar" "zat")
- (ought "zat" "azot" "bar" "zat")
- (ought "bar" "azot" "bar" "azot")
- (ought "foozotbar" "azot" "bar" "foozotbar")
- (ought "labarbarbarzot" "fo" "bar" "lafofofozot")
- (ought "axb" "\377" "x" "a\377b")
- (ought "axø" "\377" "x" "a\377ø")
- (when (version<= "27" emacs-version)
- ;; FIXME The commit a1f76adfb03c23bb4242928e8efe6193c301f0c1
- ;; in emacs.git fixes the behaviour of regular
- ;; expressions matching raw bytes. The compatibility
- ;; functions should updated to backport this
- ;; behaviour.
- (ought "axb" (string-to-multibyte "\377") "x" "a\377b")
- (ought "axø" (string-to-multibyte "\377") "x" "a\377ø"))
- (ought "ANAnas" "ana" "ANA" "ananas")
- (ought "" "a" "" "")
- (ought "" "a" "" "aaaaa")
- (ought "" "ab" "" "ababab")
- (ought "ccc" "ab" "" "abcabcabc")
- (ought "aaaaaa" "a" "aa" "aaa")
- (ought "defg" "abc" "defg" "abc")
- (when (version<= "24.4" emacs-version)
- ;; FIXME: Emacs 24.3 do not know of `wrong-length-argument' and
- ;; therefore fail this test, even if the right symbol is being
- ;; thrown.
- (expect wrong-length-argument "" "x" "abc")))
-
-(compat-deftests length=
- (ought t '() 0) ;empty list
- (ought t '(1) 1) ;single element
- (ought t '(1 2 3) 3) ;multiple elements
- (ought nil '(1 2 3) 2) ;less than
- (ought nil '(1) 0)
- (ought nil '(1 2 3) 4) ;more than
- (ought nil '(1) 2)
- (ought nil '() 1)
- (ought t [] 0) ;empty vector
- (ought t [1] 1) ;single element vector
- (ought t [1 2 3] 3) ;multiple element vector
- (ought nil [1 2 3] 2) ;less than
- (ought nil [1 2 3] 4) ;more than
- (expect wrong-type-argument 3 nil))
-
-(compat-deftests length<
- (ought nil '(1) 0) ;single element
- (ought nil '(1 2 3) 2) ;multiple elements
- (ought nil '(1 2 3) 3) ;equal length
- (ought nil '(1) 1)
- (ought t '(1 2 3) 4) ;more than
- (ought t '(1) 2)
- (ought t '() 1)
- (ought nil [1] 0) ;single element vector
- (ought nil [1 2 3] 2) ;multiple element vector
- (ought nil [1 2 3] 3) ;equal length
- (ought t [1 2 3] 4) ;more than
- (expect wrong-type-argument 3 nil))
-
-(compat-deftests length>
- (ought t '(1) 0) ;single element
- (ought t '(1 2 3) 2) ;multiple elements
- (ought nil '(1 2 3) 3) ;equal length
- (ought nil '(1) 1)
- (ought nil '(1 2 3) 4) ;more than
- (ought nil '(1) 2)
- (ought nil '() 1)
- (ought t [1] 0) ;single element vector
- (ought t [1 2 3] 2) ;multiple element vector
- (ought nil [1 2 3] 3) ;equal length
- (ought nil [1 2 3] 4) ;more than
- (expect wrong-type-argument 3 nil))
-
-(compat-deftests always
- (ought t) ;no arguments
- (ought t 1) ;single argument
- (ought t 1 2 3 4)) ;multiple arguments
-
-(ert-deftest compat-insert-into-buffer ()
- "Check if `insert-into-buffer' was implemented correctly."
- ;; Without optional compat--arguments
- (with-temp-buffer
- (let ((other (current-buffer)))
- (insert "abc")
- (with-temp-buffer
- (insert "def")
- (compat--t-insert-into-buffer other))
- (should (string= (buffer-string) "abcdef"))))
- (when (fboundp 'insert-into-buffer)
- (with-temp-buffer
- (let ((other (current-buffer)))
- (insert "abc")
- (with-temp-buffer
- (insert "def")
- (insert-into-buffer other))
- (should (string= (buffer-string) "abcdef")))))
- ;; With one optional argument
- (with-temp-buffer
- (let ((other (current-buffer)))
- (insert "abc")
- (with-temp-buffer
- (insert "def")
- (compat--t-insert-into-buffer other 2))
- (should (string= (buffer-string) "abcef"))))
- (when (fboundp 'insert-into-buffer)
- (with-temp-buffer
- (let ((other (current-buffer)))
- (insert "abc")
- (with-temp-buffer
- (insert "def")
- (insert-into-buffer other 2))
- (should (string= (buffer-string) "abcef")))))
- ;; With two optional arguments
- (with-temp-buffer
- (let ((other (current-buffer)))
- (insert "abc")
- (with-temp-buffer
- (insert "def")
- (compat--t-insert-into-buffer other 2 3))
- (should (string= (buffer-string) "abce"))))
- (when (fboundp 'insert-into-buffer)
- (with-temp-buffer
- (let ((other (current-buffer)))
- (insert "abc")
- (with-temp-buffer
- (insert "def")
- (insert-into-buffer other 2 3))
- (should (string= (buffer-string) "abce"))))))
-
-(compat-deftests file-name-with-extension
- (ought "file.ext" "file" "ext")
- (ought "file.ext" "file" ".ext")
- (ought "file.ext" "file." ".ext")
- (ought "file..ext" "file.." ".ext")
- (ought "file..ext" "file." "..ext")
- (ought "file...ext" "file.." "..ext")
- (ought "/abs/file.ext" "/abs/file" "ext")
- (ought "/abs/file.ext" "/abs/file" ".ext")
- (ought "/abs/file.ext" "/abs/file." ".ext")
- (ought "/abs/file..ext" "/abs/file.." ".ext")
- (ought "/abs/file..ext" "/abs/file." "..ext")
- (ought "/abs/file...ext" "/abs/file.." "..ext")
- (expect error "file" "")
- (expect error "" "ext")
- (expect error "file" "")
- (expect error "rel/" "ext")
- (expect error "/abs/" "ext"))
-
-(compat-deftests compat-string-width
- (ought 0 "")
- (ought 3 "abc") ;no argument
- (ought 5 "abcあ")
- (ought (1+ tab-width) "a ")
- (ought 2 "abc" 1) ;with from
- (ought 4 "abcあ" 1)
- (ought tab-width "a " 1)
- (ought 2 "abc" 0 2) ;with to
- (ought 3 "abcあ" 0 3)
- (ought 1 "a " 0 1)
- (ought 1 "abc" 1 2) ;with from and to
- (ought 2 "abcあ" 3 4)
- (ought 0 "a " 1 1))
-
-(compat-deftests ensure-list
- (ought nil nil) ;empty list
- (ought '(1) '(1)) ;single element list
- (ought '(1 2 3) '(1 2 3)) ;multiple element list
- (ought '(1) 1)) ;atom
-
-(compat-deftests proper-list-p
- (ought 0 ()) ;empty list
- (ought 1 '(1)) ;single element
- (ought 3 '(1 2 3)) ;multiple elements
- (ought nil '(1 . 2)) ;cons
- (ought nil '(1 2 . 3)) ;dotted
- (ought nil (let ((l (list 1 2 3))) ;circular
- (setf (nthcdr 3 l) l)
- l))
- (ought nil 1) ;non-lists
- (ought nil "")
- (ought nil "abc")
- (ought nil [])
- (ought nil [1 2 3]))
-
-(compat-deftests flatten-tree
- ;; Example from docstring:
- (ought '(1 2 3 4 5 6 7) '(1 (2 . 3) nil (4 5 (6)) 7))
- ;; Trivial example
- (ought nil ())
- ;; Simple examples
- (ought '(1) '(1))
- (ought '(1 2) '(1 2))
- (ought '(1 2 3) '(1 2 3))
- ;; Regular sublists
- (ought '(1) '((1)))
- (ought '(1 2) '((1) (2)))
- (ought '(1 2 3) '((1) (2) (3)))
- ;; Complex examples
- (ought '(1) '(((((1))))))
- (ought '(1 2 3 4) '((1) nil 2 ((3 4))))
- (ought '(1 2 3 4) '(((1 nil)) 2 (((3 nil nil) 4)))))
-
-(compat-deftests xor
- (ought t t nil)
- (ought t nil t)
- (ought nil nil nil)
- (ought nil t t))
-
-(compat-deftests string-distance
- (ought 3 "kitten" "sitting") ;from wikipedia
- (if (version<= "28" emacs-version) ;trivial examples
- (ought 0 "" "")
- ;; Up until Emacs 28, `string-distance' had a bug
- ;; when comparing two empty strings. This was fixed
- ;; in the following commit:
- ;; https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=c44190c
- ;;
- ;; Therefore, we must make sure, that the test
- ;; doesn't fail because of this bug:
- (should (= (compat--t-string-distance "" "") 0)))
- (ought 0 "a" "a")
- (ought 1 "" "a")
- (ought 1 "b" "a")
- (ought 2 "aa" "bb")
- (ought 2 "aa" "bba")
- (ought 2 "aaa" "bba")
- (ought 3 "a" "あ" t) ;byte example
- (ought 1 "a" "あ"))
-
-(ert-deftest compat-regexp-unmatchable ()
- "Check if `compat--string-distance' was implemented correctly."
- (dolist (str '("" ;empty string
- "a" ;simple string
- "aaa" ;longer string
- ))
- (should-not (string-match-p (with-no-warnings
compat--t-regexp-unmatchable) str))
- (when (boundp 'regexp-unmatchable)
- (should-not (string-match-p regexp-unmatchable str)))))
-
-(compat-deftests compat-regexp-opt
- ;; Ensure `compat--regexp-opt' doesn't change the existing
- ;; behaviour:
- (ought (regexp-opt '("a" "b" "c")) '("a" "b" "c"))
- (ought (regexp-opt '("abc" "def" "ghe")) '("abc" "def" "ghe"))
- (ought (regexp-opt '("a" "b" "c") 'words) '("a" "b" "c") 'words)
- ;; Test empty list:
- (ought "\\(?:\\`a\\`\\)" '())
- (ought "\\<\\(\\`a\\`\\)\\>" '() 'words))
-
-(ert-deftest compat-regexp-opt ()
- "Check if `compat--regexp-opt' advice was defined correctly."
- (let ((unmatchable "\\(?:\\`a\\`\\)"))
- (dolist (str '("" ;empty string
- "a" ;simple string
- "aaa" ;longer string
- ))
- (should-not (string-match-p unmatchable str)))))
-
-(compat-deftests compat-assoc
- ;; Fallback behaviour:
- (ought nil 1 nil) ;empty list
- (ought '(1) 1 '((1))) ;single element list
- (ought nil 1 '(1))
- (ought '(2) 2 '((1) (2) (3))) ;multiple element list
- (ought nil 2 '(1 2 3))
- (ought '(2) 2 '(1 (2) 3))
- (ought nil 2 '((1) 2 (3)))
- (ought '(1) 1 '((3) (2) (1)))
- (ought '("a") "a" '(("a") ("b") ("c"))) ;non-primitive elements
- (ought '("a" 0) "a" '(("c" . "a") "b" ("a" 0)))
- ;; With testfn (advised behaviour):
- (ought '(1) 3 '((10) (4) (1) (9)) #'<)
- (ought '("a") "b" '(("c") ("a") ("b")) #'string-lessp)
- (ought '("b") "a" '(("a") ("a") ("b"))
- (lambda (s1 s2) (not (string= s1 s2))))
- (ought
- '("\\.el\\'" . emacs-lisp-mode)
- "file.el"
- '(("\\.c\\'" . c-mode)
- ("\\.p\\'" . pascal-mode)
- ("\\.el\\'" . emacs-lisp-mode)
- ("\\.awk\\'" . awk-mode))
- #'string-match-p))
-
-;; (when (fboundp 'alist-get)
-;; (ert-deftest compat-alist-get-1 ()
-;; "Check if `compat--alist-get' was advised correctly."
-;; (compat-deftests compat-alist-get
-;; ;; Fallback behaviour:
-;; (ought nil 1 nil) ;empty list
-;; (ought 'a 1 '((1 . a))) ;single element list
-;; (ought nil 1 '(1))
-;; (ought 'b 2 '((1 . a) (2 . b) (3 . c))) ;multiple element list
-;; (ought nil 2 '(1 2 3))
-;; (ought 'b 2 '(1 (2 . b) 3))
-;; (ought nil 2 '((1 . a) 2 (3 . c)))
-;; (ought 'a 1 '((3 . c) (2 . b) (1 . a)))
-;; (ought nil "a" '(("a" . 1) ("b" . 2) ("c" . 3))) ;non-primitive
elements
-
-;; ;; With testfn (advised behaviour):
-;; (ought 1 "a" '(("a" . 1) ("b" . 2) ("c" . 3)) nil nil #'equal)
-;; (ought 1 3 '((10 . 10) (4 . 4) (1 . 1) (9 . 9)) nil nil #'<)
-;; (ought '(a) "b" '(("c" c) ("a" a) ("b" b)) nil nil #'string-lessp)
-;; (ought 'c "a" '(("a" . a) ("a" . b) ("b" . c)) nil nil
-;; (lambda (s1 s2) (not (string= s1 s2))))
-;; (ought 'emacs-lisp-mode
-;; "file.el"
-;; '(("\\.c\\'" . c-mode)
-;; ("\\.p\\'" . pascal-mode)
-;; ("\\.el\\'" . emacs-lisp-mode)
-;; ("\\.awk\\'" . awk-mode))
-;; nil nil #'string-match-p)
-;; (ought 'd 0 '((1 . a) (2 . b) (3 . c)) 'd) ;default value
-;; (ought 'd 2 '((1 . a) (2 . b) (3 . c)) 'd nil #'ignore))))
-
-(compat-deftests (alist-get compat--alist-get-full-elisp)
- ;; Fallback behaviour:
- (ought nil 1 nil) ;empty list
- (ought 'a 1 '((1 . a))) ;single element list
- (ought nil 1 '(1))
- (ought 'b 2 '((1 . a) (2 . b) (3 . c))) ;multiple element list
- (ought nil 2 '(1 2 3))
- (ought 'b 2 '(1 (2 . b) 3))
- (ought nil 2 '((1 . a) 2 (3 . c)))
- (ought 'a 1 '((3 . c) (2 . b) (1 . a)))
- (ought nil "a" '(("a" . 1) ("b" . 2) ("c" . 3))) ;non-primitive elements
- ;; With testfn (advised behaviour):
- (ought 1 "a" '(("a" . 1) ("b" . 2) ("c" . 3)) nil nil #'equal)
- (ought 1 3 '((10 . 10) (4 . 4) (1 . 1) (9 . 9)) nil nil #'<)
- (ought '(a) "b" '(("c" c) ("a" a) ("b" b)) nil nil #'string-lessp)
- (ought 'c "a" '(("a" . a) ("a" . b) ("b" . c)) nil nil
- (lambda (s1 s2) (not (string= s1 s2))))
- (ought 'emacs-lisp-mode
- "file.el"
- '(("\\.c\\'" . c-mode)
- ("\\.p\\'" . pascal-mode)
- ("\\.el\\'" . emacs-lisp-mode)
- ("\\.awk\\'" . awk-mode))
- nil nil #'string-match-p)
- (ought 'd 0 '((1 . a) (2 . b) (3 . c)) 'd) ;default value
- (ought 'd 2 '((1 . a) (2 . b) (3 . c)) 'd nil #'ignore))
-
-(ert-deftest compat-call-alist-get-gv ()
- "Test if the `compat-call alist-get' can be used as a generalised variable."
- (let ((alist-1 (list (cons 1 "one")
- (cons 2 "two")
- (cons 3 "three")))
- (alist-2 (list (cons "one" 1)
- (cons "two" 2)
- (cons "three" 3))))
- (setf (compat-call alist-get 1 alist-1) "eins")
- (should (equal (compat-call alist-get 1 alist-1) "eins"))
- (setf (compat-call alist-get 2 alist-1 nil 'remove) nil)
- (should (equal alist-1 '((1 . "eins") (3 . "three"))))
- (setf (compat-call alist-get "one" alist-2 nil nil #'string=) "eins")
- (should (equal (compat-call alist-get "one" alist-2 nil nil #'string=)
- "eins"))))
-
-(ert-deftest compat-alist-get-gv ()
- "Test if the `compat-alist-get' can be used as a generalised variable."
- (let ((alist-1 (list (cons 1 "one")
- (cons 2 "two")
- (cons 3 "three")))
- (alist-2 (list (cons "one" 1)
- (cons "two" 2)
- (cons "three" 3))))
- (setf (compat-alist-get 1 alist-1) "eins")
- (should (equal (compat-alist-get 1 alist-1) "eins"))
- (setf (compat-alist-get 2 alist-1 nil 'remove) nil)
- (should (equal alist-1 '((1 . "eins") (3 . "three"))))
- (setf (compat-alist-get "one" alist-2 nil nil #'string=) "eins")
- (should (equal (compat-alist-get "one" alist-2 nil nil #'string=)
- "eins"))))
-
-(compat-deftests string-trim-left
- (ought "" "") ;empty string
- (ought "a" "a") ;"full" string
- (ought "aaa" "aaa")
- (ought "へっろ" "へっろ")
- (ought "hello world" "hello world")
- (ought "a " "a ") ;right trailing
- (ought "aaa " "aaa ")
- (ought "a " "a ")
- (ought "a\t\t" "a\t\t")
- (ought "a\n \t" "a\n \t")
- (ought "a" " a") ;left trailing
- (ought "aaa" " aaa")
- (ought "a" "a")
- (ought "a" "\t\ta")
- (ought "a" "\n \ta")
- (ought "a " " a ") ;both trailing
- (ought "aaa " " aaa ")
- (ought "a\t\n" "\t\ta\t\n")
- (ought "a \n" "\n \ta \n"))
-
-(compat-deftests string-trim-right
- (ought "" "") ;empty string
- (ought "a" "a") ;"full" string
- (ought "aaa" "aaa")
- (ought "へっろ" "へっろ")
- (ought "hello world" "hello world")
- (ought "a" "a") ;right trailing
- (ought "aaa" "aaa")
- (ought "a" "a ")
- (ought "a" "a\t\t")
- (ought "a" "a\n \t")
- (ought " a" " a") ;left trailing
- (ought " aaa" " aaa")
- (ought "a" "a")
- (ought "\t\ta" "\t\ta")
- (ought "\n \ta" "\n \ta")
- (ought " a" " a ") ;both trailing
- (ought " aaa" " aaa")
- (ought "\t\ta" "\t\ta\t\n")
- (ought "\n \ta" "\n \ta \n"))
-
-(compat-deftests string-trim
- (ought "" "") ;empty string
- (ought "a" "a") ;"full" string
- (ought "aaa" "aaa")
- (ought "へっろ" "へっろ")
- (ought "hello world" "hello world")
- (ought "a" "a ") ;right trailing
- (ought "aaa" "aaa ")
- (ought "a" "a ")
- (ought "a" "a\t\t")
- (ought "a" "a\n \t")
- (ought "a" " a") ;left trailing
- (ought "aaa" " aaa")
- (ought "a" "a")
- (ought "a" "\t\ta")
- (ought "a" "\n \ta")
- (ought "a" " a ") ;both trailing
- (ought "aaa" " aaa ")
- (ought "t\ta" "t\ta\t\n")
- (ought "a" "\n \ta \n"))
-
-(compat-deftests mapcan
- (ought nil #'identity nil)
- (ought (list 1)
- #'identity
- (list (list 1)))
- (ought (list 1 2 3 4)
- #'identity
- (list (list 1) (list 2 3) (list 4)))
- (ought (list (list 1) (list 2 3) (list 4))
- #'list
- (list (list 1) (list 2 3) (list 4)))
- (ought (list 1 2 3 4)
- #'identity
- (list (list 1) (list) (list 2 3) (list 4)))
- (ought (list (list 1) (list) (list 2 3) (list 4))
- #'list
- (list (list 1) (list) (list 2 3) (list 4)))
- (ought (list)
- #'identity
- (list (list) (list) (list) (list))))
-
-;; Note: as the cXXX+r implementations are relatively trivial, their
-;; tests are not as extensive.
-
-(defvar compat-cXXXr-test
- '(((a . b) . (c . d)) . ((e . f) . (g . h)))
- "Testcase for cXXXr functions.")
-
-(defvar compat-cXXXXr-test
- '((((a . b) . (c . d)) . ((e . f) . (g . h))) .
- (((i . j) . (k . l)) . ((m . j) . (o . p))))
- "Testcase for cXXXXr functions.")
-
-(compat-deftests caaar
- (ought nil ())
- (ought 'a compat-cXXXr-test))
-
-(compat-deftests caadr
- (ought nil ())
- (ought 'e compat-cXXXr-test))
-
-(compat-deftests cadar
- (ought nil ())
- (ought 'c compat-cXXXr-test))
-
-(compat-deftests caddr
- (ought nil ())
- (ought 'g compat-cXXXr-test))
-
-(compat-deftests cdaar
- (ought nil ())
- (ought 'b compat-cXXXr-test))
-
-(compat-deftests cdadr
- (ought nil ())
- (ought 'f compat-cXXXr-test))
-
-(compat-deftests cddar
- (ought nil ())
- (ought 'd compat-cXXXr-test))
-
-(compat-deftests cdddr
- (ought nil ())
- (ought 'h compat-cXXXr-test)
- #'cdddr)
-
-(compat-deftests caaaar
- (ought nil ())
- (ought 'a compat-cXXXXr-test))
-
-(compat-deftests caaadr
- (ought nil ())
- (ought 'i compat-cXXXXr-test))
-
-(compat-deftests caadar
- (ought nil ())
- (ought 'e compat-cXXXXr-test))
-
-(compat-deftests caaddr
- (ought nil ())
- (ought 'm compat-cXXXXr-test))
-
-(compat-deftests cadaar
- (ought nil ())
- (ought 'c compat-cXXXXr-test))
-
-(compat-deftests cadadr
- (ought nil ())
- (ought 'k compat-cXXXXr-test))
-
-(compat-deftests caddar
- (ought nil ())
- (ought 'g compat-cXXXXr-test))
-
-(compat-deftests cadddr
- (ought nil ())
- (ought 'o compat-cXXXXr-test))
-
-(compat-deftests cdaaar
- (ought nil ())
- (ought 'b compat-cXXXXr-test))
-
-(compat-deftests cdaadr
- (ought nil ())
- (ought 'j compat-cXXXXr-test))
-
-(compat-deftests cdadar
- (ought nil ())
- (ought 'f compat-cXXXXr-test))
-
-(compat-deftests cdaddr
- (ought nil ())
- (ought 'j compat-cXXXXr-test))
-
-(compat-deftests cddaar
- (ought nil ())
- (ought 'd compat-cXXXXr-test))
-
-(compat-deftests cddadr
- (ought nil ())
- (ought 'l compat-cXXXXr-test))
-
-(compat-deftests cdddar
- (ought nil ())
- (ought 'h compat-cXXXXr-test))
-
-(compat-deftests string-greaterp
- (ought t "b" "a")
- (ought nil "a" "b")
- (ought t "aaab" "aaaa")
- (ought nil "aaaa" "aaab"))
-
-(compat-deftests compat-sort
- (ought (list 1 2 3) (list 1 2 3) #'<)
- (ought (list 1 2 3) (list 3 2 1) #'<)
- (ought '[1 2 3] '[1 2 3] #'<)
- (ought '[1 2 3] '[3 2 1] #'<))
-
-(compat-deftests compat-=
- (ought t 0 0)
- (ought t 0 0 0)
- (ought t 0 0 0 0)
- (ought t 0 0 0 0 0)
- (ought t 0.0 0.0)
- (ought t +0.0 -0.0)
- (ought t 0.0 0.0 0.0)
- (ought t 0.0 0.0 0.0 0.0)
- (ought nil 0 1)
- (ought nil 0 0 1)
- (ought nil 0 0 0 0 1)
- (expect wrong-type-argument 0 0 'a)
- (ought nil 0 1 'a)
- (ought nil 0.0 0.0 0.0 0.1))
-
-(compat-deftests compat-<
- (ought nil 0 0)
- (ought nil 0 0 0)
- (ought nil 0 0 0 0)
- (ought nil 0 0 0 0 0)
- (ought nil 0.0 0.0)
- (ought nil +0.0 -0.0)
- (ought nil 0.0 0.0 0.0)
- (ought nil 0.0 0.0 0.0 0.0)
- (ought t 0 1)
- (ought nil 1 0)
- (ought nil 0 0 1)
- (ought t 0 1 2)
- (ought nil 2 1 0)
- (ought nil 0 0 0 0 1)
- (ought t 0 1 2 3 4)
- (expect wrong-type-argument 0 1 'a)
- (ought nil 0 0 'a)
- (ought nil 0.0 0.0 0.0 0.1)
- (ought t -0.1 0.0 0.2 0.4)
- (ought t -0.1 0 0.2 0.4))
-
-(compat-deftests compat->
- (ought nil 0 0)
- (ought nil 0 0 0)
- (ought nil 0 0 0 0)
- (ought nil 0 0 0 0 0)
- (ought nil 0.0 0.0)
- (ought nil +0.0 -0.0)
- (ought nil 0.0 0.0 0.0)
- (ought nil 0.0 0.0 0.0 0.0)
- (ought t 1 0)
- (ought nil 1 0 0)
- (ought nil 0 1 2)
- (ought t 2 1 0)
- (ought nil 1 0 0 0 0)
- (ought t 4 3 2 1 0)
- (ought nil 4 3 2 1 1)
- (expect wrong-type-argument 1 0 'a)
- (ought nil 0 0 'a)
- (ought nil 0.1 0.0 0.0 0.0)
- (ought t 0.4 0.2 0.0 -0.1)
- (ought t 0.4 0.2 0 -0.1))
-
-(compat-deftests compat-<=
- (ought t 0 0)
- (ought t 0 0 0)
- (ought t 0 0 0 0)
- (ought t 0 0 0 0 0)
- (ought t 0.0 0.0)
- (ought t +0.0 -0.0)
- (ought t 0.0 0.0 0.0)
- (ought t 0.0 0.0 0.0 0.0)
- (ought nil 1 0)
- (ought nil 1 0 0)
- (ought t 0 1 2)
- (ought nil 2 1 0)
- (ought nil 1 0 0 0 0)
- (ought nil 4 3 2 1 0)
- (ought nil 4 3 2 1 1)
- (ought t 0 1 2 3 4)
- (ought t 1 1 2 3 4)
- (expect wrong-type-argument 0 0 'a)
- (expect wrong-type-argument 0 1 'a)
- (ought nil 1 0 'a)
- (ought nil 0.1 0.0 0.0 0.0)
- (ought t 0.0 0.0 0.0 0.1)
- (ought t -0.1 0.0 0.2 0.4)
- (ought t -0.1 0.0 0.0 0.2 0.4)
- (ought t -0.1 0.0 0 0.2 0.4)
- (ought t -0.1 0 0.2 0.4)
- (ought nil 0.4 0.2 0.0 -0.1)
- (ought nil 0.4 0.2 0.0 0.0 -0.1)
- (ought nil 0.4 0.2 0 0.0 0.0 -0.1)
- (ought nil 0.4 0.2 0 -0.1))
-
-(compat-deftests compat->=
- (ought t 0 0)
- (ought t 0 0 0)
- (ought t 0 0 0 0)
- (ought t 0 0 0 0 0)
- (ought t 0.0 0.0)
- (ought t +0.0 -0.0)
- (ought t 0.0 0.0 0.0)
- (ought t 0.0 0.0 0.0 0.0)
- (ought t 1 0)
- (ought t 1 0 0)
- (ought nil 0 1 2)
- (ought t 2 1 0)
- (ought t 1 0 0 0 0)
- (ought t 4 3 2 1 0)
- (ought t 4 3 2 1 1)
- (expect wrong-type-argument 0 0 'a)
- (expect wrong-type-argument 1 0 'a)
- (ought nil 0 1 'a)
- (ought t 0.1 0.0 0.0 0.0)
- (ought nil 0.0 0.0 0.0 0.1)
- (ought nil -0.1 0.0 0.2 0.4)
- (ought nil -0.1 0.0 0.0 0.2 0.4)
- (ought nil -0.1 0.0 0 0.2 0.4)
- (ought nil -0.1 0 0.2 0.4)
- (ought t 0.4 0.2 0.0 -0.1)
- (ought t 0.4 0.2 0.0 0.0 -0.1)
- (ought t 0.4 0.2 0 0.0 0.0 -0.1)
- (ought t 0.4 0.2 0 -0.1))
-
-(compat-deftests special-form-p
- (ought t 'if)
- (ought t 'cond)
- (ought nil 'when)
- (ought nil 'defun)
- (ought nil '+)
- (ought nil nil)
- (ought nil "macro")
- (ought nil '(macro . +)))
-
-(compat-deftests macrop
- (ought t 'lambda)
- (ought t 'defun)
- (ought t 'defmacro)
- (ought nil 'defalias)
- (ought nil 'foobar)
- (ought nil 'if)
- (ought nil '+)
- (ought nil 1)
- (ought nil nil)
- (ought nil "macro")
- (ought t '(macro . +)))
-
-(compat-deftests string-suffix-p
- (ought t "a" "abba")
- (ought t "ba" "abba")
- (ought t "abba" "abba")
- (ought nil "a" "ABBA")
- (ought nil "bA" "ABBA")
- (ought nil "aBBA" "ABBA")
- (ought nil "c" "ABBA")
- (ought nil "c" "abba")
- (ought nil "cddc" "abba")
- (ought nil "aabba" "abba"))
-
-(compat-deftests compat-split-string
- (ought '("a" "b" "c") "a b c")
- (ought '("..a.." "..b.." "..c..") "..a.. ..b.. ..c..")
- (ought '("a" "b" "c") "..a.. ..b.. ..c.." nil nil "\\.+"))
-
-(compat-deftests delete-consecutive-dups
- (ought '(1 2 3 4) '(1 2 3 4))
- (ought '(1 2 3 4) '(1 2 2 3 4 4))
- (ought '(1 2 3 2 4) '(1 2 2 3 2 4 4)))
-
-(compat-deftests string-clean-whitespace
- (ought "a b c" "a b c")
- (ought "a b c" " a b c")
- (ought "a b c" "a b c ")
- (ought "a b c" "a b c")
- (ought "a b c" "a b c")
- (ought "a b c" "a b c")
- (ought "a b c" " a b c")
- (ought "a b c" "a b c ")
- (ought "a b c" " a b c ")
- (ought "aa bb cc" "aa bb cc")
- (ought "aa bb cc" " aa bb cc")
- (ought "aa bb cc" "aa bb cc ")
- (ought "aa bb cc" "aa bb cc")
- (ought "aa bb cc" "aa bb cc")
- (ought "aa bb cc" "aa bb cc")
- (ought "aa bb cc" " aa bb cc")
- (ought "aa bb cc" "aa bb cc ")
- (ought "aa bb cc" " aa bb cc "))
-
-(compat-deftests string-fill
- (ought "a a a a a" "a a a a a" 9)
- (ought "a a a a a" "a a a a a" 10)
- (ought "a a a a\na" "a a a a a" 8)
- (ought "a a a a\na" "a a a a a" 8)
- (ought "a a\na a\na" "a a a a a" 4)
- (ought "a\na\na\na\na" "a a a a a" 2)
- (ought "a\na\na\na\na" "a a a a a" 1))
-
-(compat-deftests string-lines
- (ought '("a" "b" "c") "a\nb\nc")
- (ought '("a" "b" "c" "") "a\nb\nc\n")
- (ought '("a" "b" "c") "a\nb\nc\n" t)
- (ought '("abc" "bcd" "cde") "abc\nbcd\ncde")
- (ought '(" abc" " bcd " "cde ") " abc\n bcd \ncde "))
-
-(compat-deftests string-pad
- (ought "a " "a" 4)
- (ought "aaaa" "aaaa" 4)
- (ought "aaaaaa" "aaaaaa" 4)
- (ought "a..." "a" 4 ?.)
- (ought " a" "a" 4 nil t)
- (ought "...a" "a" 4 ?. t))
-
-(compat-deftests string-chop-newline
- (ought "" "")
- (ought "" "\n")
- (ought "aaa" "aaa")
- (ought "aaa" "aaa\n")
- (ought "aaa\n" "aaa\n\n"))
-
-(compat-deftests macroexpand-1
- (ought '(if a b c) '(if a b c))
- (ought '(if a (progn b)) '(when a b))
- (ought '(if a (progn (unless b c))) '(when a (unless b c))))
-
-(compat-deftests compat-file-size-human-readable
- (ought "1000" 1000)
- (ought "1k" 1024)
- (ought "1M" (* 1024 1024))
- (ought "1G" (expt 1024 3))
- (ought "1T" (expt 1024 4))
- (ought "1k" 1000 'si)
- (ought "1KiB" 1024 'iec)
- (ought "1KiB" 1024 'iec)
- (ought "1 KiB" 1024 'iec " ")
- (ought "1KiA" 1024 'iec nil "A")
- (ought "1 KiA" 1024 'iec " " "A")
- (ought "1kA" 1000 'si nil "A")
- (ought "1 k" 1000 'si " ")
- (ought "1 kA" 1000 'si " " "A"))
-
-(compat-deftests format-prompt
- (ought "Prompt: " "Prompt" nil)
- (ought "Prompt: " "Prompt" "")
- (ought "Prompt (default ): " "Prompt" " ")
- (ought "Prompt (default 3): " "Prompt" 3)
- (ought "Prompt (default abc): " "Prompt" "abc")
- (ought "Prompt (default abc def): " "Prompt" "abc def")
- (ought "Prompt 10: " "Prompt %d" nil 10)
- (ought "Prompt \"abc\" (default 3): " "Prompt %S" 3 "abc"))
-
-(ert-deftest compat-named-let ()
- "Check if `compat--t-named-let' was implemented properly."
- (should (= (compat--t-named-let l ((i 0)) (if (= i 8) i (l (1+ i))))
- 8))
- (should (= (compat--t-named-let l ((i 0)) (if (= i 100000) i (l (1+ i))))
- 100000))
- (should (= (compat--t-named-let l ((i 0))
- (cond
- ((= i 100000) i)
- ((= (mod i 2) 0)
- (l (+ i 2)))
- ((l (+ i 3)))))
- 100000))
- (should (= (compat--t-named-let l ((i 0) (x 1)) (if (= i 8) x (l (1+ i) (* x
2))))
- (expt 2 8)))
- (should (eq (compat--t-named-let lop ((x 1))
- (if (> x 0)
- (condition-case nil
- (lop (1- x))
- (arith-error 'ok))
- (/ 1 x)))
- 'ok))
- (should (eq (compat--t-named-let lop ((n 10000))
- (if (> n 0)
- (condition-case nil
- (/ n 0)
- (arith-error (lop (1- n))))
- 'ok))
- 'ok))
- (should (eq (compat--t-named-let lop ((x nil))
- (cond (x)
- (t 'ok)))
- 'ok))
- (should (eq (compat--t-named-let lop ((x 100000))
- (cond ((= x 0) 'ok)
- ((lop (1- x)))))
- 'ok))
- (should (eq (compat--t-named-let lop ((x 100000))
- (cond
- ((= x -1) nil)
- ((= x 0) 'ok)
- ((lop -1))
- ((lop (1- x)))))
- 'ok))
- (should (eq (compat--t-named-let lop ((x 10000))
- (cond ((= x 0) 'ok)
- ((and t (lop (1- x))))))
- 'ok))
- (should (eq (let ((b t))
- (compat--t-named-let lop ((i 0))
- (cond ((null i) nil) ((= i 10000) 'ok)
- ((lop (and (setq b (not b)) (1+ i))))
- ((lop (and (setq b (not b)) (1+ i)))))))
- 'ok)))
-
-;; TODO fix broken test
-;;(compat-deftests directory-files-recursively
-;; (should (equal
-;; (compat-sort (directory-files-recursively "." "make\\|copying")
#'string<)
-;; '("./.github/workflows/makefile.yml" "./COPYING" "./Makefile"))))
-
-(compat-deftests directory-name-p
- (ought t "/")
- (ought nil "/file")
- (ought nil "/dir/file")
- (ought t "/dir/")
- (ought nil "/dir")
- (ought t "/dir/subdir/")
- (ought nil "/dir/subdir")
- (ought t "dir/")
- (ought nil "file")
- (ought nil "dir/file")
- (ought t "dir/subdir/")
- (ought nil "dir/subdir"))
-
-(ert-deftest compat-if-let* ()
- "Check if `compat--t-if-let*' was implemented properly."
- (should
- (compat--t-if-let*
- ((x 3)
- (y 2)
- (z (+ x y))
- ((= z 5))
- (true t))
- true nil))
- (should-not
- (compat--t-if-let* (((= 5 6))) t nil)))
-
-(ert-deftest compat-if-let ()
- "Check if `compat--t-if-let' was implemented properly."
- (should (compat--t-if-let ((e (memq 0 '(1 2 3 0 5 6))))
- e))
- (should-not (compat--t-if-let ((e (memq 0 '(1 2 3 5 6)))
- (d (memq 0 '(1 2 3 0 5 6))))
- t))
- (should-not (compat--t-if-let ((d (memq 0 '(1 2 3 0 5 6)))
- (e (memq 0 '(1 2 3 5 6))))
- t))
- (should-not
- (compat--t-if-let (((= 5 6))) t nil)))
-
-(ert-deftest compat-and-let* ()
- "Check if `compat--t-and-let*' was implemented properly."
- (should ;trivial body
- (compat--t-and-let*
- ((x 3)
- (y 2)
- (z (+ x y))
- ((= z 5))
- (true t))
- true))
- (should ;no body
- (compat--t-and-let*
- ((x 3)
- (y 2)
- (z (+ x y))
- ((= z 5))
- (true t))))
- (should-not
- (compat--t-and-let* (((= 5 6))) t)))
-
-(compat-deftests compat-json-parse-string
- (ought 0 "0")
- (ought 1 "1")
- (ought 0.5 "0.5")
- (ought [1 2 3] "[1,2,3]")
- (ought ["a" 2 3] "[\"a\",2,3]")
- (ought [["a" 2] 3] "[[\"a\",2],3]")
- (ought '(("a" 2) 3) "[[\"a\",2],3]" :array-type 'list)
- (ought 'foo "null" :null-object 'foo)
- (ought ["false" t] "[false, true]" :false-object "false"))
-
-(ert-deftest compat-json-parse-string ()
- "Check if `compat--t-json-parse-string' was implemented properly."
- (let ((input "{\"key\":[\"abc\", 2], \"yek\": null}"))
- (let ((obj (json-parse-string input :object-type 'alist)))
- (should (equal (cdr (assq 'key obj)) ["abc" 2]))
- (should (equal (cdr (assq 'yek obj)) :null)))
- (let ((obj (json-parse-string input :object-type 'plist)))
- (should (equal (plist-get obj :key) ["abc" 2]))
- (should (equal (plist-get obj :yek) :null)))
- (let ((obj (json-parse-string input)))
- (should (equal (gethash "key" obj) ["abc" 2]))
- (should (equal (gethash "yek" obj) :null)))))
-
-(ert-deftest compat-json-insert ()
- (with-temp-buffer
- (compat--t-json-insert '((:key . ["abc" 2]) (yek . t)))
- (should (equal (buffer-string) "{\":key\":[\"abc\",2],\"yek\":true}"))))
-
-(ert-deftest compat-json-serialize ()
- "Check if `json-serialize' was implemented properly."
- (let ((input-1 '((:key . ["abc" 2]) (yek . t)))
- (input-2 '(:key ["abc" 2] yek t))
- (input-3 (let ((ht (make-hash-table)))
- (puthash "key" ["abc" 2] ht)
- (puthash "yek" t ht)
- ht)))
- (should (equal (json-serialize input-1)
- "{\":key\":[\"abc\",2],\"yek\":true}"))
- (should (equal (json-serialize input-2)
- "{\"key\":[\"abc\",2],\"yek\":true}"))
- (should (member (json-serialize input-2)
- '("{\"key\":[\"abc\",2],\"yek\":true}"
- "{\"yek\":true,\"key\":[\"abc\",2]}")))
- (should-error (json-serialize '(("a" . 1)))
- :type '(wrong-type-argument symbolp "a"))
- (should-error (json-serialize '("a" 1))
- :type '(wrong-type-argument symbolp "a"))
- (should-error (json-serialize '("a" 1 2))
- :type '(wrong-type-argument symbolp "a"))
- (should-error (json-serialize '(:a 1 2))
- :type '(wrong-type-argument consp nil))
- (should-error (json-serialize
- (let ((ht (make-hash-table)))
- (puthash 'a 1 ht)
- ht))
- :type '(wrong-type-argument stringp a))
- (when (fboundp 'json-serialize)
- (should (equal (json-serialize input-1)
- "{\":key\":[\"abc\",2],\"yek\":true}"))
- (should (equal (json-serialize input-2)
- "{\"key\":[\"abc\",2],\"yek\":true}"))
- (should (member (json-serialize input-2)
- '("{\"key\":[\"abc\",2],\"yek\":true}"
- "{\"yek\":true,\"key\":[\"abc\",2]}")))
- (should-error (json-serialize '(("a" . 1)))
- :type '(wrong-type-argument symbolp "a"))
- (should-error (json-serialize '("a" 1))
- :type '(wrong-type-argument symbolp "a"))
- (should-error (json-serialize '("a" 1 2))
- :type '(wrong-type-argument symbolp "a"))
- (should-error (json-serialize '(:a 1 2))
- :type '(wrong-type-argument consp nil))
- (should-error (json-serialize
- (let ((ht (make-hash-table)))
- (puthash 'a 1 ht)
- ht))
- :type '(wrong-type-argument stringp a)))))
-
-(compat-deftests compat-lookup-key
- (let ((a-map (make-sparse-keymap))
- (b-map (make-sparse-keymap)))
- (define-key a-map "x" 'foo)
- (define-key b-map "x" 'bar)
- (ought 'foo a-map "x")
- (ought 'bar b-map "x")
- (ought 'foo (list a-map b-map) "x")
- (ought 'bar (list b-map a-map) "x")))
-
-(ert-deftest compat-hash-table-keys ()
- (let ((ht (make-hash-table)))
- (should (null (compat--t-hash-table-keys ht)))
- (puthash 1 'one ht)
- (should (equal '(1) (compat--t-hash-table-keys ht)))
- (puthash 1 'one ht)
- (should (equal '(1) (compat--t-hash-table-keys ht)))
- (puthash 2 'two ht)
- (should (memq 1 (compat--t-hash-table-keys ht)))
- (should (memq 2 (compat--t-hash-table-keys ht)))
- (should (= 2 (length (compat--t-hash-table-keys ht))))
- (remhash 1 ht)
- (should (equal '(2) (compat--t-hash-table-keys ht)))))
-
-(ert-deftest compat-hash-table-values ()
- (let ((ht (make-hash-table)))
- (should (null (compat--t-hash-table-values ht)))
- (puthash 1 'one ht)
- (should (equal '(one) (compat--t-hash-table-values ht)))
- (puthash 1 'one ht)
- (should (equal '(one) (compat--t-hash-table-values ht)))
- (puthash 2 'two ht)
- (should (memq 'one (compat--t-hash-table-values ht)))
- (should (memq 'two (compat--t-hash-table-values ht)))
- (should (= 2 (length (compat--t-hash-table-values ht))))
- (remhash 1 ht)
- (should (equal '(two) (compat--t-hash-table-values ht)))))
-
-(compat-deftests string-empty-p
- (ought t "")
- (ought nil " ")
- (ought t (make-string 0 ?x))
- (ought nil (make-string 1 ?x)))
-
-(compat-deftests string-join
- (ought "" '(""))
- (ought "" '("") " ")
- (ought "a" '("a"))
- (ought "a" '("a") " ")
- (ought "abc" '("a" "b" "c"))
- (ought "a b c" '("a" "b" "c") " "))
-
-(compat-deftests string-blank-p
- (ought 0 "")
- (ought 0 " ")
- (ought 0 (make-string 0 ?x))
- (ought nil (make-string 1 ?x)))
-
-(compat-deftests string-remove-prefix
- (ought "" "" "")
- (ought "a" "" "a")
- (ought "" "a" "")
- (ought "bc" "a" "abc")
- (ought "abc" "c" "abc")
- (ought "bbcc" "aa" "aabbcc")
- (ought "aabbcc" "bb" "aabbcc")
- (ought "aabbcc" "cc" "aabbcc")
- (ought "aabbcc" "dd" "aabbcc"))
-
-(compat-deftests string-remove-suffix
- (ought "" "" "")
- (ought "a" "" "a")
- (ought "" "a" "")
- (ought "abc" "a" "abc")
- (ought "ab" "c" "abc")
- (ought "aabbcc" "aa" "aabbcc")
- (ought "aabbcc" "bb" "aabbcc")
- (ought "aabb" "cc" "aabbcc")
- (ought "aabbcc" "dd" "aabbcc"))
-
-(let ((a (bool-vector t t nil nil))
- (b (bool-vector t nil t nil)))
- (compat-deftests bool-vector-exclusive-or
- (ought (bool-vector nil t t nil) a b)
- (ought (bool-vector nil t t nil) b a)
- (ert-deftest compat-bool-vector-exclusive-or-sideeffect ()
- (let ((c (make-bool-vector 4 nil)))
- (compat--t-bool-vector-exclusive-or a b c)
- (should (equal (bool-vector nil t t nil) c))
- (should (equal (bool-vector nil t t nil) c))))
- (when (version<= "24.4" emacs-version)
- (expect wrong-length-argument a (bool-vector))
- (expect wrong-length-argument a b (bool-vector)))
- (expect wrong-type-argument (bool-vector) (vector))
- (expect wrong-type-argument (vector) (bool-vector))
- (expect wrong-type-argument (vector) (vector))
- (expect wrong-type-argument (bool-vector) (bool-vector) (vector))
- (expect wrong-type-argument (bool-vector) (vector) (vector))
- (expect wrong-type-argument (vector) (bool-vector) (vector))
- (expect wrong-type-argument (vector) (vector) (vector))))
-
-(let ((a (bool-vector t t nil nil))
- (b (bool-vector t nil t nil)))
- (compat-deftests bool-vector-union
- (ought (bool-vector t t t nil) a b)
- (ought (bool-vector t t t nil) b a)
- (ert-deftest compat-bool-vector-union-sideeffect ()
- (let ((c (make-bool-vector 4 nil)))
- (compat--t-bool-vector-union a b c)
- (should (equal (bool-vector t t t nil) c))))
- (when (version<= "24.4" emacs-version)
- (expect wrong-length-argument a (bool-vector))
- (expect wrong-length-argument a b (bool-vector)))
- (expect wrong-type-argument (bool-vector) (vector))
- (expect wrong-type-argument (vector) (bool-vector))
- (expect wrong-type-argument (vector) (vector))
- (expect wrong-type-argument (bool-vector) (bool-vector) (vector))
- (expect wrong-type-argument (bool-vector) (vector) (vector))
- (expect wrong-type-argument (vector) (bool-vector) (vector))
- (expect wrong-type-argument (vector) (vector) (vector))))
-
-(let ((a (bool-vector t t nil nil))
- (b (bool-vector t nil t nil)))
- (compat-deftests bool-vector-intersection
- (ought (bool-vector t nil nil nil) a b)
- (ought (bool-vector t nil nil nil) b a)
- (ert-deftest compat-bool-vector-intersection-sideeffect ()
- (let ((c (make-bool-vector 4 nil)))
- (compat--t-bool-vector-intersection a b c)
- (should (equal (bool-vector t nil nil nil) c))))
- (when (version<= "24.4" emacs-version)
- (expect wrong-length-argument a (bool-vector))
- (expect wrong-length-argument a b (bool-vector)))
- (expect wrong-type-argument (bool-vector) (vector))
- (expect wrong-type-argument (vector) (bool-vector))
- (expect wrong-type-argument (vector) (vector))
- (expect wrong-type-argument (bool-vector) (bool-vector) (vector))
- (expect wrong-type-argument (bool-vector) (vector) (vector))
- (expect wrong-type-argument (vector) (bool-vector) (vector))
- (expect wrong-type-argument (vector) (vector) (vector))))
-
-(let ((a (bool-vector t t nil nil))
- (b (bool-vector t nil t nil)))
- (compat-deftests bool-vector-set-difference
- (ought (bool-vector nil t nil nil) a b)
- (ought (bool-vector nil nil t nil) b a)
- (ert-deftest compat-bool-vector-set-difference-sideeffect ()
- (let ((c (make-bool-vector 4 nil)))
- (compat--t-bool-vector-set-difference a b c)
- (should (equal (bool-vector nil t nil nil) c)))
- (let ((c (make-bool-vector 4 nil)))
- (compat--t-bool-vector-set-difference b a c)
- (should (equal (bool-vector nil nil t nil) c))))
- (when (version<= "24.4" emacs-version)
- (expect wrong-length-argument a (bool-vector))
- (expect wrong-length-argument a b (bool-vector)))
- (expect wrong-type-argument (bool-vector) (vector))
- (expect wrong-type-argument (vector) (bool-vector))
- (expect wrong-type-argument (vector) (vector))
- (expect wrong-type-argument (bool-vector) (bool-vector) (vector))
- (expect wrong-type-argument (bool-vector) (vector) (vector))
- (expect wrong-type-argument (vector) (bool-vector) (vector))
- (expect wrong-type-argument (vector) (vector) (vector))))
-
-(compat-deftests bool-vector-not
- (ought (bool-vector) (bool-vector))
- (ought (bool-vector t) (bool-vector nil))
- (ought (bool-vector nil) (bool-vector t))
- (ought (bool-vector t t) (bool-vector nil nil))
- (ought (bool-vector t nil) (bool-vector nil t))
- (ought (bool-vector nil t) (bool-vector t nil))
- (ought (bool-vector nil nil) (bool-vector t t))
- (expect wrong-type-argument (vector))
- (expect wrong-type-argument (vector) (vector)))
-
-(compat-deftests bool-vector-subsetp
- (ought t (bool-vector) (bool-vector))
- (ought t (bool-vector t) (bool-vector t))
- (ought t (bool-vector nil) (bool-vector t))
- (ought nil (bool-vector t) (bool-vector nil))
- (ought t (bool-vector nil) (bool-vector nil))
- (ought t (bool-vector t t) (bool-vector t t))
- (ought t (bool-vector nil nil) (bool-vector t t))
- (ought t (bool-vector nil nil) (bool-vector t nil))
- (ought t (bool-vector nil nil) (bool-vector nil t))
- (ought nil (bool-vector t nil) (bool-vector nil nil))
- (ought nil (bool-vector nil t) (bool-vector nil nil))
- (when (version<= "24.4" emacs-version)
- (expect wrong-length-argument (bool-vector nil) (bool-vector nil nil)))
- (expect wrong-type-argument (bool-vector) (vector))
- (expect wrong-type-argument (vector) (bool-vector))
- (expect wrong-type-argument (vector) (vector)))
-
-(compat-deftests bool-vector-count-consecutive
- (ought 0 (bool-vector nil) (bool-vector nil) 0)
- (ought 0 (make-bool-vector 10 nil) t 0)
- (ought 10 (make-bool-vector 10 nil) nil 0)
- (ought 0 (make-bool-vector 10 nil) t 1)
- (ought 9 (make-bool-vector 10 nil) nil 1)
- (ought 0 (make-bool-vector 10 nil) t 1)
- (ought 9 (make-bool-vector 10 t) t 1)
- (ought 0 (make-bool-vector 10 nil) t 8)
- (ought 2 (make-bool-vector 10 nil) nil 8)
- (ought 2 (make-bool-vector 10 t) t 8)
- (ought 10 (make-bool-vector 10 t) (make-bool-vector 10 t) 0)
- (ought 4 (bool-vector t t t t nil t t t t t) t 0)
- (ought 0 (bool-vector t t t t nil t t t t t) t 4)
- (ought 5 (bool-vector t t t t nil t t t t t) t 5)
- (expect wrong-type-argument (vector) nil 0))
-
-(compat-deftests bool-vector-count-population
- (ought 0 (bool-vector))
- (ought 0 (make-bool-vector 10 nil))
- (ought 10 (make-bool-vector 10 t))
- (ought 1 (bool-vector nil nil t nil))
- (ought 1 (bool-vector nil nil nil t))
- (ought 1 (bool-vector t nil nil nil))
- (ought 2 (bool-vector t nil nil t))
- (ought 2 (bool-vector t nil t nil))
- (ought 3 (bool-vector t nil t t))
- (expect wrong-type-argument (vector)))
-
-(compat-deftests compat-assoc-delete-all
- (ought (list) 0 (list))
- ;; Test `eq'
- (ought '((1 . one)) 0 (list (cons 1 'one)))
- (ought '((1 . one) a) 0 (list (cons 1 'one) 'a))
- (ought '((1 . one)) 0 (list (cons 0 'zero) (cons 1 'one)))
- (ought '((1 . one)) 0 (list (cons 0 'zero) (cons 0 'zero) (cons 1 'one)))
- (ought '((1 . one)) 0 (list (cons 0 'zero) (cons 1 'one) (cons 0 'zero)))
- (ought '((1 . one) a) 0 (list (cons 0 'zero) (cons 1 'one) 'a (cons 0
'zero)))
- (ought '(a (1 . one)) 0 (list 'a (cons 0 'zero) (cons 1 'one) (cons 0
'zero)))
- ;; Test `equal'
- (ought '(("one" . one)) "zero" (list (cons "one" 'one)))
- (ought '(("one" . one) a) "zero" (list (cons "one" 'one) 'a))
- (ought '(("one" . one)) "zero" (list (cons "zero" 'zero) (cons "one" 'one)))
- (ought '(("one" . one)) "zero" (list (cons "zero" 'zero) (cons "zero" 'zero)
(cons "one" 'one)))
- (ought '(("one" . one)) "zero" (list (cons "zero" 'zero) (cons "one" 'one)
(cons "zero" 'zero)))
- (ought '(("one" . one) a) "zero" (list (cons "zero" 'zero) (cons "one" 'one)
'a (cons "zero" 'zero)))
- (ought '(a ("one" . one)) "zero" (list 'a (cons "zero" 'zero) (cons "one"
'one) (cons "zero" 'zero)))
- ;; Test custom predicate
- (ought '() 0 (list (cons 1 'one)) #'/=)
- (ought '(a) 0 (list (cons 1 'one) 'a) #'/=)
- (ought '((0 . zero)) 0 (list (cons 0 'zero) (cons 1 'one)) #'/=)
- (ought '((0 . zero) (0 . zero)) 0 (list (cons 0 'zero) (cons 0 'zero) (cons
1 'one)) #'/=)
- (ought '((0 . zero) (0 . zero)) 0 (list (cons 0 'zero) (cons 1 'one) (cons 0
'zero)) #'/=)
- (ought '((0 . zero) a (0 . zero)) 0 (list (cons 0 'zero) (cons 1 'one) 'a
(cons 0 'zero)) #'/=)
- (ought '(a (0 . zero) (0 . zero)) 0 (list 'a (cons 0 'zero) (cons 1 'one)
(cons 0 'zero)) #'/=))
-
-(compat-deftests color-values-from-color-spec
- ;; #RGB notation
- (ought '(0 0 0) "#000")
- (ought '(0 0 0) "#000000")
- (ought '(0 0 0) "#000000000")
- (ought '(0 0 0) "#000000000000")
- (ought '(0 0 65535) "#00F")
- (ought '(0 0 65535) "#0000FF")
- (ought '(0 0 65535) "#000000FFF")
- (ought '(0 0 65535) "#00000000FFFF")
- (ought '(0 0 65535) "#00f")
- (ought '(0 0 65535) "#0000ff")
- (ought '(0 0 65535) "#000000fff")
- (ought '(0 0 65535) "#00000000ffff")
- (ought '(0 0 65535) "#00000000ffFF")
- (ought '(#xffff #x0000 #x5555) "#f05")
- (ought '(#x1f1f #xb0b0 #xc5c5) "#1fb0C5")
- (ought '(#x1f83 #xb0ad #xc5e2) "#1f83b0ADC5e2")
- (ought nil "")
- (ought nil "#")
- (ought nil "#0")
- (ought nil "#00")
- (ought nil "#0000FG")
- (ought nil "#0000FFF")
- (ought nil "#0000FFFF")
- (ought '(0 4080 65535) "#0000FFFFF")
- (ought nil "#000FF")
- (ought nil "#0000F")
- (ought nil " #000000")
- (ought nil "#000000 ")
- (ought nil " #000000 ")
- (ought nil "#1f83b0ADC5e2g")
- (ought nil "#1f83b0ADC5e20")
- (ought nil "#12345")
- ;; rgb: notation
- (ought '(0 0 0) "rgb:0/0/0")
- (ought '(0 0 0) "rgb:0/0/00")
- (ought '(0 0 0) "rgb:0/00/000")
- (ought '(0 0 0) "rgb:0/000/0000")
- (ought '(0 0 0) "rgb:000/0000/0")
- (ought '(0 0 65535) "rgb:000/0000/F")
- (ought '(65535 0 65535) "rgb:FFF/0000/F")
- (ought '(65535 0 65535) "rgb:FFFF/0000/FFFF")
- (ought '(0 255 65535) "rgb:0/00FF/FFFF")
- (ought '(#xffff #x2323 #x28a2) "rgb:f/23/28a")
- (ought '(#x1234 #x5678 #x09ab) "rgb:1234/5678/09ab")
- (ought nil "rgb:/0000/FFFF")
- (ought nil "rgb:0000/0000/FFFG")
- (ought nil "rgb:0000/0000/FFFFF")
- (ought nil "rgb:0000/0000")
- (ought nil "rg:0000/0000/0000")
- (ought nil "rgb: 0000/0000/0000")
- (ought nil "rgbb:0000/0000/0000")
- (ought nil "rgb:0000/0000/0000 ")
- (ought nil " rgb:0000/0000/0000 ")
- (ought nil " rgb:0000/0000/0000")
- (ought nil "rgb:0000/ 0000 /0000")
- (ought nil "rgb: 0000 /0000 /0000")
- (ought nil "rgb:0//0")
- ;; rgbi: notation
- (ought '(0 0 0) "rgbi:0/0/0")
- (ought '(0 0 0) "rgbi:0.0/0.0/0.0")
- (ought '(0 0 0) "rgbi:0.0/0/0")
- (ought '(0 0 0) "rgbi:0.0/0/0")
- (ought '(0 0 0) "rgbi:0/0/0.")
- (ought '(0 0 0) "rgbi:0/0/0.0000")
- (ought '(0 0 0) "rgbi:0/0/.0")
- (ought '(0 0 0) "rgbi:0/0/.0000")
- (ought '(65535 0 0) "rgbi:1/0/0.0000")
- (ought '(65535 0 0) "rgbi:1./0/0.0000")
- (ought '(65535 0 0) "rgbi:1.0/0/0.0000")
- (ought '(65535 32768 0) "rgbi:1.0/0.5/0.0000")
- (ought '(6554 21843 65469) "rgbi:0.1/0.3333/0.999")
- (ought '(0 32768 6554) "rgbi:0/0.5/0.1")
- (ought '(66 655 65535) "rgbi:1e-3/1.0e-2/1e0")
- (ought '(6554 21843 65469) "rgbi:1e-1/+0.3333/0.00999e2")
- (ought nil "rgbi:1.0001/0/0")
- (ought nil "rgbi:2/0/0")
- (ought nil "rgbi:0.a/0/0")
- (ought nil "rgbi:./0/0")
- (ought nil "rgbi:./0/0")
- (ought nil " rgbi:0/0/0")
- (ought nil "rgbi:0/0/0 ")
- (ought nil " rgbi:0/0/0 ")
- (ought nil "rgbi:0 /0/ 0")
- (ought nil "rgbi:0/ 0 /0")
- (ought nil "rgbii:0/0/0")
- (ought nil "rgbi :0/0/0")
- ;; strtod ignores leading whitespace, making these legal colour
- ;; specifications:
- ;;
- ;; (ought nil "rgbi: 0/0/0")
- ;; (ought nil "rgbi: 0/ 0/ 0")
- (ought nil "rgbi : 0/0/0")
- (ought nil "rgbi:0/0.5/10"))
-
-(compat-deftests file-modes-number-to-symbolic
- (ought "-rwx------" #o700)
- (ought "-rwxrwx---" #o770)
- (ought "-rwx---rwx" #o707)
- (ought "-rw-r-xr--" #o654)
- (ought "--wx-w---x" #o321)
- (ought "drwx------" #o700 ?d)
- (ought "?rwx------" #o700 ??)
- (ought "lrwx------" #o120700)
- (ought "prwx------" #o10700)
- (ought "-rwx------" #o30700))
-
-(compat-deftests file-local-name
- (ought "" "")
- (ought "foo" "foo")
- (ought "/bar/foo" "/bar/foo")
- ;; These tests fails prior to Emacs 26, because /ssh:foo was a valid
- ;; TRAMP path back then.
- ;;
- ;; (ought "/ssh:foo" "/ssh:foo")
- ;; (ought "/ssh:/bar/foo" "/ssh:/bar/foo")
- (ought "foo" "/ssh::foo")
- (ought "/bar/foo" "/ssh::/bar/foo")
- (ought ":foo" "/ssh:::foo")
- (ought ":/bar/foo" "/ssh:::/bar/foo"))
-
-(compat-deftests file-name-quoted-p
- (ought nil "")
- (ought t "/:")
- (ought nil "//:")
- (ought t "/::")
- (ought nil "/ssh::")
- (ought nil "/ssh::a")
- (ought t "/ssh::/:a")
- ;; These tests fails prior to Emacs 26, because /ssh:foo was a valid
- ;; TRAMP path back then.
- ;;
- ;; (ought nil "/ssh:/:a")
- )
-
-(compat-deftests file-name-quote
- (ought "/:" "")
- (ought "/::" ":")
- (ought "/:/" "/")
- (ought "/:" "/:")
- (ought "/:a" "a")
- (ought "/::a" ":a")
- (ought "/:/a" "/a")
- (ought "/:a" "/:a")
- (ought (concat "/ssh:" (system-name) ":/:a") "/ssh::a"))
-
-(compat-deftests make-lock-file-name
- (ought (expand-file-name ".#") "")
- (ought (expand-file-name ".#a") "a")
- (ought (expand-file-name ".#foo") "foo")
- (ought (expand-file-name ".#.") ".")
- (ought (expand-file-name ".#.#") ".#")
- (ought (expand-file-name ".#.a") ".a")
- (ought (expand-file-name ".#.#") ".#")
- (ought (expand-file-name "a/.#") "a/")
- (ought (expand-file-name "a/.#b") "a/b")
- (ought (expand-file-name "a/.#.#") "a/.#")
- (ought (expand-file-name "a/.#.") "a/.")
- (ought (expand-file-name "a/.#.b") "a/.b")
- (ought (expand-file-name "a/.#foo") "a/foo")
- (ought (expand-file-name "bar/.#b") "bar/b")
- (ought (expand-file-name "bar/.#foo") "bar/foo"))
-
-(compat-deftests time-equal-p
- (ought t nil nil)
-
- ;; FIXME: Testing these values can be tricky, because the timestamp
- ;; might change between evaluating (current-time) and evaluating
- ;; `time-equal-p', especially in the interpreted compatibility
- ;; version.
-
- ;; (ought t (current-time) nil)
- ;; (ought t nil (current-time))
-
- ;; While `sleep-for' returns nil, indicating the current time, this
- ;; behaviour seems to be undefined. Relying on it is therefore not
- ;; advised.
- (ought nil (current-time) (ignore (sleep-for 0.01)))
- (ought nil (current-time) (progn
- (sleep-for 0.01)
- (current-time)))
- (ought t '(1 2 3 4) '(1 2 3 4))
- (ought nil '(1 2 3 4) '(1 2 3 5))
- (ought nil '(1 2 3 5) '(1 2 3 4))
- (ought nil '(1 2 3 4) '(1 2 4 4))
- (ought nil '(1 2 4 4) '(1 2 3 4))
- (ought nil '(1 2 3 4) '(1 3 3 4))
- (ought nil '(1 3 3 4) '(1 2 3 4))
- (ought nil '(1 2 3 4) '(2 2 3 4))
- (ought nil '(2 2 3 4) '(1 2 3 4)))
-
-(compat-deftests date-days-in-month
- (ought 31 2020 1)
- (ought 30 2020 4)
- (ought 29 2020 2)
- (ought 28 2021 2))
-
-(compat-deftests decoded-time-period
- (ought 0 '())
- (ought 0 '(0))
- (ought 1 '(1))
- (ought 0.125 '((1 . 8)))
-
- (ought 60 '(0 1))
- (ought 61 '(1 1))
- (ought -59 '(1 -1))
-
- (ought (* 60 60) '(0 0 1))
- (ought (+ (* 60 60) 60) '(0 1 1))
- (ought (+ (* 60 60) 120 1) '(1 2 1))
-
- (ought (* 60 60 24) '(0 0 0 1))
- (ought (+ (* 60 60 24) 1) '(1 0 0 1))
- (ought (+ (* 60 60 24) (* 60 60) 60 1) '(1 1 1 1))
- (ought (+ (* 60 60 24) (* 60 60) 120 1) '(1 2 1 1))
-
- (ought (* 60 60 24 30) '(0 0 0 0 1))
- (ought (+ (* 60 60 24 30) 1) '(1 0 0 0 1))
- (ought (+ (* 60 60 24 30) 60 1) '(1 1 0 0 1))
- (ought (+ (* 60 60 24 30) (* 60 60) 60 1)
- '(1 1 1 0 1))
- (ought (+ (* 60 60 24 30) (* 60 60 24) (* 60 60) 120 1)
- '(1 2 1 1 1))
-
- (ought (* 60 60 24 365) '(0 0 0 0 0 1))
- (ought (+ (* 60 60 24 365) 1)
- '(1 0 0 0 0 1))
- (ought (+ (* 60 60 24 365) 60 1)
- '(1 1 0 0 0 1))
- (ought (+ (* 60 60 24 365) (* 60 60) 60 1)
- '(1 1 1 0 0 1))
- (ought (+ (* 60 60 24 365) (* 60 60 24) (* 60 60) 60 1)
- '(1 1 1 1 0 1))
- (ought (+ (* 60 60 24 365)
- (* 60 60 24 30)
- (* 60 60 24)
- (* 60 60)
- 120 1)
- '(1 2 1 1 1 1))
-
- (expect wrong-type-argument 'a)
- (expect wrong-type-argument '(0 a))
- (expect wrong-type-argument '(0 0 a))
- (expect wrong-type-argument '(0 0 0 a))
- (expect wrong-type-argument '(0 0 0 0 a))
- (expect wrong-type-argument '(0 0 0 0 0 a)))
-
-;; TODO func-arity seems broken
-;; (compat-deftests func-arity
-;; (should (equal '(0 . 0) (func-arity (lambda ()))))
-;; (should (equal '(1 . 1) (func-arity (lambda (x) x))))
-;; (should (equal '(1 . 2) (func-arity (lambda (x &optional _) x))))
-;; (should (equal '(0 . many) (func-arity (lambda (&rest _)))))
-;; (ought '(1 . 1) 'identity)
-;; (ought '(0 . many) 'ignore)
-;; (ought '(2 . many) 'defun)
-;; (ought '(2 . 3) 'defalias)
-;; (ought '(1 . unevalled) 'defvar))
-
-(compat-deftests subr-primitive-p
- (ought t (symbol-function 'identity)) ;function from fns.c
- (unless (fboundp 'subr-native-elisp-p)
- (ought nil (symbol-function 'match-string))) ;function from subr.el
- (ought nil (symbol-function 'defun)) ;macro from subr.el
- (ought nil nil))
-
-(compat-deftests file-name-absolute-p ;assuming unix
- (ought t "/")
- (ought t "/a")
- (ought nil "a")
- (ought nil "a/b")
- (ought nil "a/b/")
- (ought t "~")
- (when (version< "27.1" emacs-version)
- (ought t "~/foo")
- (ought nil "~foo")
- (ought nil "~foo/"))
- (ought t "~root")
- (ought t "~root/")
- (ought t "~root/file"))
-
-(let ((one (make-symbol "1"))
- (two (make-symbol "2"))
- (three (make-symbol "3"))
- (one.5 (make-symbol "1.5"))
- (eins (make-symbol "𝟙")))
- (put two 'derived-mode-parent one)
- (put one.5 'derived-mode-parent one)
- (put three 'derived-mode-parent two)
- (compat-deftests provided-mode-derived-p
- (ought one one one)
- (ought one two one)
- (ought one three one)
- (ought nil one eins)
- (ought nil two eins)
- (ought nil two one.5)
- (ought one two one.5 one)
- (ought two two one.5 two)
- (ought one three one.5 one)
- (ought two three one.5 one two)
- (ought two three one.5 two one)
- (ought three three one.5 two one three)
- (ought three three one.5 three two one)))
-
-(unless (fboundp 'make-prop-match)
- (defalias 'make-prop-match
- (if (version< emacs-version "26.1")
- #'compat--make-prop-match-with-vector
- #'compat--make-prop-match-with-record)))
-
-(ert-deftest compat-text-property-search-forward ()
- (when (fboundp 'text-property-search-forward)
- (with-temp-buffer
- (insert "one "
- (propertize "two " 'prop 'val)
- "three "
- (propertize "four " 'prop 'wert)
- "five ")
- (goto-char (point-min))
- (let ((match (text-property-search-forward 'prop)))
- (should (eq (prop-match-beginning match) 5))
- (should (eq (prop-match-end match) 9))
- (should (eq (prop-match-value match) 'val)))
- (let ((match (text-property-search-forward 'prop)))
- (should (eq (prop-match-beginning match) 15))
- (should (eq (prop-match-end match) 20))
- (should (eq (prop-match-value match) 'wert)))
- (should (null (text-property-search-forward 'prop)))
- (goto-char (point-min))
- (should (null (text-property-search-forward 'non-existant)))))
- (with-temp-buffer
- (insert "one "
- (propertize "two " 'prop 'val)
- "three "
- (propertize "four " 'prop 'wert)
- "five ")
- (goto-char (point-min))
- (let ((match (compat--t-text-property-search-forward 'prop)))
- (should (eq (compat--t-prop-match-beginning match) 5))
- (should (eq (compat--t-prop-match-end match) 9))
- (should (eq (compat--t-prop-match-value match) 'val)))
- (let ((match (compat--t-text-property-search-forward 'prop)))
- (should (eq (compat--t-prop-match-beginning match) 15))
- (should (eq (compat--t-prop-match-end match) 20))
- (should (eq (compat--t-prop-match-value match) 'wert)))
- (should (null (compat--t-text-property-search-forward 'prop)))
- (goto-char (point-min))
- (should (null (compat--t-text-property-search-forward 'non-existant)))))
-
-(ert-deftest compat-text-property-search-backward ()
- (when (fboundp 'text-property-search-backward)
- (with-temp-buffer
- (insert "one "
- (propertize "two " 'prop 'val)
- "three "
- (propertize "four " 'prop 'wert)
- "five ")
- (goto-char (point-max))
- (let ((match (text-property-search-backward 'prop)))
- (should (eq (prop-match-beginning match) 15))
- (should (eq (prop-match-end match) 20))
- (should (eq (prop-match-value match) 'wert)))
- (let ((match (text-property-search-backward 'prop)))
- (should (eq (prop-match-beginning match) 5))
- (should (eq (prop-match-end match) 9))
- (should (eq (prop-match-value match) 'val)))
- (should (null (text-property-search-backward 'prop)))
- (goto-char (point-max))
- (should (null (text-property-search-backward 'non-existant)))))
- (with-temp-buffer
- (insert "one "
- (propertize "two " 'prop 'val)
- "three "
- (propertize "four " 'prop 'wert)
- "five ")
- (goto-char (point-max))
- (let ((match (compat--t-text-property-search-backward 'prop)))
- (should (eq (compat--t-prop-match-beginning match) 15))
- (should (eq (compat--t-prop-match-end match) 20))
- (should (eq (compat--t-prop-match-value match) 'wert)))
- (let ((match (compat--t-text-property-search-backward 'prop)))
- (should (eq (compat--t-prop-match-beginning match) 5))
- (should (eq (compat--t-prop-match-end match) 9))
- (should (eq (compat--t-prop-match-value match) 'val)))
- (should (null (compat--t-text-property-search-backward 'prop)))
- (goto-char (point-max))
- (should (null (compat--t-text-property-search-backward 'non-existant)))))
+;; (defvar compat-test-counter)
+
+;; (defun compat--ought (name compat)
+;; "Implementation for the `ought' macro for NAME.
+;; COMPAT is the name of the compatibility function the behaviour is
+;; being compared against."
+;; (lambda (result &rest args)
+;; (let ((real-test (intern (format "%s-%04d-actual/ought" compat
compat-test-counter)))
+;; (comp-test (intern (format "%s-%04d-compat/ought" compat
compat-test-counter))))
+;; (setq compat-test-counter (1+ compat-test-counter))
+;; (macroexp-progn
+;; (list (and (fboundp name)
+;; (or (not (get compat 'compat-version))
+;; (version<= emacs-version (get compat
'compat-version)))
+;; `(ert-set-test
+;; ',real-test
+;; (make-ert-test
+;; :name ',real-test
+;; :tags '(,name)
+;; :body (lambda () (should (equal ,result (,name
,@args)))))))
+;; (and (fboundp compat)
+;; `(ert-set-test
+;; ',comp-test
+;; (make-ert-test
+;; :name ',comp-test
+;; :tags '(,name)
+;; :body (lambda () (should (equal ,result (,compat
,@args))))))))))))
+
+;; (defun compat--expect (name compat)
+;; "Implementation for the `expect' macro for NAME.
+;; COMPAT is the name of the compatibility function the behaviour is
+;; being compared against."
+;; (lambda (error-spec &rest args)
+;; (let ((real-test (intern (format "%s-%04d-actual/expect" compat
compat-test-counter)))
+;; (comp-test (intern (format "%s-%04d-compat/expect" compat
compat-test-counter)))
+;; (error-type (if (consp error-spec) (car error-spec) error-spec)))
+;; (setq compat-test-counter (1+ compat-test-counter))
+;; (macroexp-progn
+;; (list (and (fboundp name)
+;; (or (not (get compat 'compat-version))
+;; (version<= emacs-version (get compat
'compat-version)))
+;; `(ert-set-test
+;; ',real-test
+;; (make-ert-test
+;; :name ',real-test
+;; :tags '(,name)
+;; :body (lambda ()
+;; (should
+;; (let ((res (should-error (,name ,@args) :type
',error-type)))
+;; (should
+;; ,(if (consp error-spec)
+;; `(equal res ',error-spec)
+;; `(eq (car res) ',error-spec)))))))))
+;; (and (fboundp compat)
+;; `(ert-set-test
+;; ',comp-test
+;; (make-ert-test
+;; :name ',comp-test
+;; :tags '(,name)
+;; :body (lambda ()
+;; (should
+;; (let ((res (should-error (,name ,@args) :type
',error-type)))
+;; (should
+;; ,(if (consp error-spec)
+;; `(equal res ',error-spec)
+;; `(eq (car res)
',error-spec))))))))))))))
+
+;; (defmacro compat-deftests (name &rest body)
+;; "Test NAME in BODY."
+;; (declare (debug (sexp &rest body))
+;; (indent 1))
+;; (let* ((compat-test-counter 0)
+;; (real-name (if (consp name) (car name) name))
+;; (compat-name (if (consp name)
+;; (cadr name)
+;; (intern (format "compat--t-%s" real-name))))
+;; (env (list
+;; (cons 'ought (compat--ought real-name compat-name))
+;; (cons 'expect (compat--expect real-name compat-name)))))
+;; (and (or (not (get compat-name 'compat-min-version))
+;; (version< (get compat-name 'compat-min-version) emacs-version))
+;; (or (not (get compat-name 'compat-max-version))
+;; (version< emacs-version (get compat-name 'compat-max-version)))
+;; (macroexpand-all
+;; (macroexp-progn body)
+;; (append env macroexpand-all-environment)))))
+
+;;
+
+;; (compat-deftests string-search
+;; ;; Find needle at the beginning of a haystack:
+;; (ought 0 "a" "abb")
+;; ;; Find needle at the begining of a haystack, with more potential
+;; ;; needles that could be found:
+;; (ought 0 "a" "abba")
+;; ;; Find needle with more than one charachter at the beginning of
+;; ;; a line:
+;; (ought 0 "aa" "aabbb")
+;; ;; Find a needle midstring:
+;; (ought 1 "a" "bab")
+;; ;; Find a needle at the end:
+;; (ought 2 "a" "bba")
+;; ;; Find a longer needle midstring:
+;; (ought 1 "aa" "baab")
+;; ;; Find a longer needle at the end:
+;; (ought 2 "aa" "bbaa")
+;; ;; Find a case-sensitive needle:
+;; (ought 2 "a" "AAa")
+;; ;; Find another case-sensitive needle:
+;; (ought 2 "aa" "AAaa")
+;; ;; Test regular expression quoting (1):
+;; (ought 5 "." "abbbb.b")
+;; ;; Test regular expression quoting (2):
+;; (ought 5 ".*" "abbbb.*b")
+;; ;; Attempt to find non-existent needle:
+;; (ought nil "a" "bbb")
+;; ;; Attempt to find non-existent needle that has the form of a
+;; ;; regular expression:
+;; (ought nil "." "bbb")
+;; ;; Handle empty string as needle:
+;; (ought 0 "" "abc")
+;; ;; Handle empty string as haystack:
+;; (ought nil "a" "")
+;; ;; Handle empty string as needle and haystack:
+;; (ought 0 "" "")
+;; ;; Handle START argument:
+;; (ought 3 "a" "abba" 1)
+;; ;; Additional test copied from:
+;; (ought 6 "zot" "foobarzot")
+;; (ought 0 "foo" "foobarzot")
+;; (ought nil "fooz" "foobarzot")
+;; (ought nil "zot" "foobarzo")
+;; (ought 0 "ab" "ab")
+;; (ought nil "ab\0" "ab")
+;; (ought 4 "ab" "abababab" 3)
+;; (ought nil "ab" "ababac" 3)
+;; (ought nil "aaa" "aa")
+;; ;; The `make-string' calls with three arguments have been replaced
+;; ;; here with the result of their evaluation, to avoid issues with
+;; ;; older versions of Emacs that only support two arguments.
+;; (ought 5
+;; (make-string 2 130)
+;; ;; Per (concat "helló" (make-string 5 130 t) "bár")
+;; "hellóbár")
+;; (ought 5
+;; (make-string 2 127)
+;; ;; Per (concat "helló" (make-string 5 127 t) "bár")
+;; "hellóbár")
+;; (ought 1 "\377" "a\377ø")
+;; (ought 1 "\377" "a\377a")
+;; (ought nil (make-string 1 255) "a\377ø")
+;; (ought nil (make-string 1 255) "a\377a")
+;; (ought 3 "fóo" "zotfóo")
+;; (ought nil "\303" "aøb")
+;; (ought nil "\270" "aøb")
+;; (ought nil "ø" "\303\270")
+;; (ought nil "ø" (make-string 32 ?a))
+;; (ought nil "ø" (string-to-multibyte (make-string 32 ?a)))
+;; (ought 14 "o" (string-to-multibyte
+;; (apply #'string (number-sequence ?a ?z))))
+;; (ought 2 "a\U00010f98z" "a\U00010f98a\U00010f98z")
+;; (expect (args-out-of-range -1) "a" "abc" -1)
+;; (expect (args-out-of-range 4) "a" "abc" 4)
+;; (expect (args-out-of-range 100000000000)
+;; "a" "abc" 100000000000)
+;; (ought nil "a" "aaa" 3)
+;; (ought nil "aa" "aa" 1)
+;; (ought nil "\0" "")
+;; (ought 0 "" "")
+;; (expect (args-out-of-range 1) "" "" 1)
+;; (ought 0 "" "abc")
+;; (ought 2 "" "abc" 2)
+;; (ought 3 "" "abc" 3)
+;; (expect (args-out-of-range 4) "" "abc" 4)
+;; (expect (args-out-of-range -1) "" "abc" -1)
+;; (ought nil "ø" "foo\303\270")
+;; (ought nil "\303\270" "ø")
+;; (ought nil "\370" "ø")
+;; (ought nil (string-to-multibyte "\370") "ø")
+;; (ought nil "ø" "\370")
+;; (ought nil "ø" (string-to-multibyte "\370"))
+;; (ought nil "\303\270" "\370")
+;; (ought nil (string-to-multibyte "\303\270") "\370")
+;; (ought nil "\303\270" (string-to-multibyte "\370"))
+;; (ought nil
+;; (string-to-multibyte "\303\270")
+;; (string-to-multibyte "\370"))
+;; (ought nil "\370" "\303\270")
+;; (ought nil (string-to-multibyte "\370") "\303\270")
+;; (ought nil "\370" (string-to-multibyte "\303\270"))
+;; (ought nil
+;; (string-to-multibyte "\370")
+;; (string-to-multibyte "\303\270"))
+;; (ought 3 "\303\270" "foo\303\270")
+;; (when (version<= "27" emacs-version)
+;; ;; FIXME The commit a1f76adfb03c23bb4242928e8efe6193c301f0c1 in
+;; ;; emacs.git fixes the behaviour of regular expressions matching
+;; ;; raw bytes. The compatibility functions should updated to
+;; ;; backport this behaviour.
+;; (ought 2 (string-to-multibyte "\377") "ab\377c")
+;; (ought 2
+;; (string-to-multibyte "o\303\270")
+;; "foo\303\270")))
+
+;; (compat-deftests string-replace
+;; (ought "bba" "aa" "bb" "aaa")
+;; (ought "AAA" "aa" "bb" "AAA")
+;; ;; Additional test copied from subr-tests.el:
+;; (ought "zot" "foo" "bar" "zot")
+;; (ought "barzot" "foo" "bar" "foozot")
+;; (ought "barbarzot" "foo" "bar" "barfoozot")
+;; (ought "barfoobar" "zot" "bar" "barfoozot")
+;; (ought "barfoobarot" "z" "bar" "barfoozot")
+;; (ought "zat" "zot" "bar" "zat")
+;; (ought "zat" "azot" "bar" "zat")
+;; (ought "bar" "azot" "bar" "azot")
+;; (ought "foozotbar" "azot" "bar" "foozotbar")
+;; (ought "labarbarbarzot" "fo" "bar" "lafofofozot")
+;; (ought "axb" "\377" "x" "a\377b")
+;; (ought "axø" "\377" "x" "a\377ø")
+;; (when (version<= "27" emacs-version)
+;; ;; FIXME The commit a1f76adfb03c23bb4242928e8efe6193c301f0c1
+;; ;; in emacs.git fixes the behaviour of regular
+;; ;; expressions matching raw bytes. The compatibility
+;; ;; functions should updated to backport this
+;; ;; behaviour.
+;; (ought "axb" (string-to-multibyte "\377") "x" "a\377b")
+;; (ought "axø" (string-to-multibyte "\377") "x" "a\377ø"))
+;; (ought "ANAnas" "ana" "ANA" "ananas")
+;; (ought "" "a" "" "")
+;; (ought "" "a" "" "aaaaa")
+;; (ought "" "ab" "" "ababab")
+;; (ought "ccc" "ab" "" "abcabcabc")
+;; (ought "aaaaaa" "a" "aa" "aaa")
+;; (ought "defg" "abc" "defg" "abc")
+;; (when (version<= "24.4" emacs-version)
+;; ;; FIXME: Emacs 24.3 do not know of `wrong-length-argument' and
+;; ;; therefore fail this test, even if the right symbol is being
+;; ;; thrown.
+;; (expect wrong-length-argument "" "x" "abc")))
+
+;; (compat-deftests length=
+;; (ought t '() 0) ;empty list
+;; (ought t '(1) 1) ;single element
+;; (ought t '(1 2 3) 3) ;multiple elements
+;; (ought nil '(1 2 3) 2) ;less than
+;; (ought nil '(1) 0)
+;; (ought nil '(1 2 3) 4) ;more than
+;; (ought nil '(1) 2)
+;; (ought nil '() 1)
+;; (ought t [] 0) ;empty vector
+;; (ought t [1] 1) ;single element vector
+;; (ought t [1 2 3] 3) ;multiple element vector
+;; (ought nil [1 2 3] 2) ;less than
+;; (ought nil [1 2 3] 4) ;more than
+;; (expect wrong-type-argument 3 nil))
+
+;; (compat-deftests length<
+;; (ought nil '(1) 0) ;single element
+;; (ought nil '(1 2 3) 2) ;multiple elements
+;; (ought nil '(1 2 3) 3) ;equal length
+;; (ought nil '(1) 1)
+;; (ought t '(1 2 3) 4) ;more than
+;; (ought t '(1) 2)
+;; (ought t '() 1)
+;; (ought nil [1] 0) ;single element vector
+;; (ought nil [1 2 3] 2) ;multiple element vector
+;; (ought nil [1 2 3] 3) ;equal length
+;; (ought t [1 2 3] 4) ;more than
+;; (expect wrong-type-argument 3 nil))
+
+;; (compat-deftests length>
+;; (ought t '(1) 0) ;single element
+;; (ought t '(1 2 3) 2) ;multiple elements
+;; (ought nil '(1 2 3) 3) ;equal length
+;; (ought nil '(1) 1)
+;; (ought nil '(1 2 3) 4) ;more than
+;; (ought nil '(1) 2)
+;; (ought nil '() 1)
+;; (ought t [1] 0) ;single element vector
+;; (ought t [1 2 3] 2) ;multiple element vector
+;; (ought nil [1 2 3] 3) ;equal length
+;; (ought nil [1 2 3] 4) ;more than
+;; (expect wrong-type-argument 3 nil))
+
+;; (compat-deftests always
+;; (ought t) ;no arguments
+;; (ought t 1) ;single argument
+;; (ought t 1 2 3 4)) ;multiple arguments
+
+;; (ert-deftest compat-insert-into-buffer ()
+;; "Check if `insert-into-buffer' was implemented correctly."
+;; ;; Without optional compat--arguments
+;; (with-temp-buffer
+;; (let ((other (current-buffer)))
+;; (insert "abc")
+;; (with-temp-buffer
+;; (insert "def")
+;; (compat--t-insert-into-buffer other))
+;; (should (string= (buffer-string) "abcdef"))))
+;; (when (fboundp 'insert-into-buffer)
+;; (with-temp-buffer
+;; (let ((other (current-buffer)))
+;; (insert "abc")
+;; (with-temp-buffer
+;; (insert "def")
+;; (insert-into-buffer other))
+;; (should (string= (buffer-string) "abcdef")))))
+;; ;; With one optional argument
+;; (with-temp-buffer
+;; (let ((other (current-buffer)))
+;; (insert "abc")
+;; (with-temp-buffer
+;; (insert "def")
+;; (compat--t-insert-into-buffer other 2))
+;; (should (string= (buffer-string) "abcef"))))
+;; (when (fboundp 'insert-into-buffer)
+;; (with-temp-buffer
+;; (let ((other (current-buffer)))
+;; (insert "abc")
+;; (with-temp-buffer
+;; (insert "def")
+;; (insert-into-buffer other 2))
+;; (should (string= (buffer-string) "abcef")))))
+;; ;; With two optional arguments
+;; (with-temp-buffer
+;; (let ((other (current-buffer)))
+;; (insert "abc")
+;; (with-temp-buffer
+;; (insert "def")
+;; (compat--t-insert-into-buffer other 2 3))
+;; (should (string= (buffer-string) "abce"))))
+;; (when (fboundp 'insert-into-buffer)
+;; (with-temp-buffer
+;; (let ((other (current-buffer)))
+;; (insert "abc")
+;; (with-temp-buffer
+;; (insert "def")
+;; (insert-into-buffer other 2 3))
+;; (should (string= (buffer-string) "abce"))))))
+
+;; (compat-deftests file-name-with-extension
+;; (ought "file.ext" "file" "ext")
+;; (ought "file.ext" "file" ".ext")
+;; (ought "file.ext" "file." ".ext")
+;; (ought "file..ext" "file.." ".ext")
+;; (ought "file..ext" "file." "..ext")
+;; (ought "file...ext" "file.." "..ext")
+;; (ought "/abs/file.ext" "/abs/file" "ext")
+;; (ought "/abs/file.ext" "/abs/file" ".ext")
+;; (ought "/abs/file.ext" "/abs/file." ".ext")
+;; (ought "/abs/file..ext" "/abs/file.." ".ext")
+;; (ought "/abs/file..ext" "/abs/file." "..ext")
+;; (ought "/abs/file...ext" "/abs/file.." "..ext")
+;; (expect error "file" "")
+;; (expect error "" "ext")
+;; (expect error "file" "")
+;; (expect error "rel/" "ext")
+;; (expect error "/abs/" "ext"))
+
+;; (compat-deftests compat-string-width
+;; (ought 0 "")
+;; (ought 3 "abc") ;no argument
+;; (ought 5 "abcあ")
+;; (ought (1+ tab-width) "a ")
+;; (ought 2 "abc" 1) ;with from
+;; (ought 4 "abcあ" 1)
+;; (ought tab-width "a " 1)
+;; (ought 2 "abc" 0 2) ;with to
+;; (ought 3 "abcあ" 0 3)
+;; (ought 1 "a " 0 1)
+;; (ought 1 "abc" 1 2) ;with from and to
+;; (ought 2 "abcあ" 3 4)
+;; (ought 0 "a " 1 1))
+
+;; (compat-deftests ensure-list
+;; (ought nil nil) ;empty list
+;; (ought '(1) '(1)) ;single element list
+;; (ought '(1 2 3) '(1 2 3)) ;multiple element list
+;; (ought '(1) 1)) ;atom
+
+;; (compat-deftests proper-list-p
+;; (ought 0 ()) ;empty list
+;; (ought 1 '(1)) ;single element
+;; (ought 3 '(1 2 3)) ;multiple elements
+;; (ought nil '(1 . 2)) ;cons
+;; (ought nil '(1 2 . 3)) ;dotted
+;; (ought nil (let ((l (list 1 2 3))) ;circular
+;; (setf (nthcdr 3 l) l)
+;; l))
+;; (ought nil 1) ;non-lists
+;; (ought nil "")
+;; (ought nil "abc")
+;; (ought nil [])
+;; (ought nil [1 2 3]))
+
+;; (compat-deftests flatten-tree
+;; ;; Example from docstring:
+;; (ought '(1 2 3 4 5 6 7) '(1 (2 . 3) nil (4 5 (6)) 7))
+;; ;; Trivial example
+;; (ought nil ())
+;; ;; Simple examples
+;; (ought '(1) '(1))
+;; (ought '(1 2) '(1 2))
+;; (ought '(1 2 3) '(1 2 3))
+;; ;; Regular sublists
+;; (ought '(1) '((1)))
+;; (ought '(1 2) '((1) (2)))
+;; (ought '(1 2 3) '((1) (2) (3)))
+;; ;; Complex examples
+;; (ought '(1) '(((((1))))))
+;; (ought '(1 2 3 4) '((1) nil 2 ((3 4))))
+;; (ought '(1 2 3 4) '(((1 nil)) 2 (((3 nil nil) 4)))))
+
+;; (compat-deftests xor
+;; (ought t t nil)
+;; (ought t nil t)
+;; (ought nil nil nil)
+;; (ought nil t t))
+
+;; (compat-deftests string-distance
+;; (ought 3 "kitten" "sitting") ;from wikipedia
+;; (if (version<= "28" emacs-version) ;trivial examples
+;; (ought 0 "" "")
+;; ;; Up until Emacs 28, `string-distance' had a bug
+;; ;; when comparing two empty strings. This was fixed
+;; ;; in the following commit:
+;; ;; https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=c44190c
+;; ;;
+;; ;; Therefore, we must make sure, that the test
+;; ;; doesn't fail because of this bug:
+;; (should (= (compat--t-string-distance "" "") 0)))
+;; (ought 0 "a" "a")
+;; (ought 1 "" "a")
+;; (ought 1 "b" "a")
+;; (ought 2 "aa" "bb")
+;; (ought 2 "aa" "bba")
+;; (ought 2 "aaa" "bba")
+;; (ought 3 "a" "あ" t) ;byte example
+;; (ought 1 "a" "あ"))
+
+;; (ert-deftest compat-regexp-unmatchable ()
+;; "Check if `compat--string-distance' was implemented correctly."
+;; (dolist (str '("" ;empty string
+;; "a" ;simple string
+;; "aaa" ;longer string
+;; ))
+;; (should-not (string-match-p (with-no-warnings
compat--t-regexp-unmatchable) str))
+;; (when (boundp 'regexp-unmatchable)
+;; (should-not (string-match-p regexp-unmatchable str)))))
+
+;; (compat-deftests compat-regexp-opt
+;; ;; Ensure `compat--regexp-opt' doesn't change the existing
+;; ;; behaviour:
+;; (ought (regexp-opt '("a" "b" "c")) '("a" "b" "c"))
+;; (ought (regexp-opt '("abc" "def" "ghe")) '("abc" "def" "ghe"))
+;; (ought (regexp-opt '("a" "b" "c") 'words) '("a" "b" "c") 'words)
+;; ;; Test empty list:
+;; (ought "\\(?:\\`a\\`\\)" '())
+;; (ought "\\<\\(\\`a\\`\\)\\>" '() 'words))
+
+;; (ert-deftest compat-regexp-opt ()
+;; "Check if `compat--regexp-opt' advice was defined correctly."
+;; (let ((unmatchable "\\(?:\\`a\\`\\)"))
+;; (dolist (str '("" ;empty string
+;; "a" ;simple string
+;; "aaa" ;longer string
+;; ))
+;; (should-not (string-match-p unmatchable str)))))
+
+;; (compat-deftests compat-assoc
+;; ;; Fallback behaviour:
+;; (ought nil 1 nil) ;empty list
+;; (ought '(1) 1 '((1))) ;single element list
+;; (ought nil 1 '(1))
+;; (ought '(2) 2 '((1) (2) (3))) ;multiple element list
+;; (ought nil 2 '(1 2 3))
+;; (ought '(2) 2 '(1 (2) 3))
+;; (ought nil 2 '((1) 2 (3)))
+;; (ought '(1) 1 '((3) (2) (1)))
+;; (ought '("a") "a" '(("a") ("b") ("c"))) ;non-primitive elements
+;; (ought '("a" 0) "a" '(("c" . "a") "b" ("a" 0)))
+;; ;; With testfn (advised behaviour):
+;; (ought '(1) 3 '((10) (4) (1) (9)) #'<)
+;; (ought '("a") "b" '(("c") ("a") ("b")) #'string-lessp)
+;; (ought '("b") "a" '(("a") ("a") ("b"))
+;; (lambda (s1 s2) (not (string= s1 s2))))
+;; (ought
+;; '("\\.el\\'" . emacs-lisp-mode)
+;; "file.el"
+;; '(("\\.c\\'" . c-mode)
+;; ("\\.p\\'" . pascal-mode)
+;; ("\\.el\\'" . emacs-lisp-mode)
+;; ("\\.awk\\'" . awk-mode))
+;; #'string-match-p))
+
+;; ;; (when (fboundp 'alist-get)
+;; ;; (ert-deftest compat-alist-get-1 ()
+;; ;; "Check if `compat--alist-get' was advised correctly."
+;; ;; (compat-deftests compat-alist-get
+;; ;; ;; Fallback behaviour:
+;; ;; (ought nil 1 nil) ;empty list
+;; ;; (ought 'a 1 '((1 . a))) ;single element list
+;; ;; (ought nil 1 '(1))
+;; ;; (ought 'b 2 '((1 . a) (2 . b) (3 . c))) ;multiple element list
+;; ;; (ought nil 2 '(1 2 3))
+;; ;; (ought 'b 2 '(1 (2 . b) 3))
+;; ;; (ought nil 2 '((1 . a) 2 (3 . c)))
+;; ;; (ought 'a 1 '((3 . c) (2 . b) (1 . a)))
+;; ;; (ought nil "a" '(("a" . 1) ("b" . 2) ("c" . 3))) ;non-primitive
elements
+
+;; ;; ;; With testfn (advised behaviour):
+;; ;; (ought 1 "a" '(("a" . 1) ("b" . 2) ("c" . 3)) nil nil #'equal)
+;; ;; (ought 1 3 '((10 . 10) (4 . 4) (1 . 1) (9 . 9)) nil nil #'<)
+;; ;; (ought '(a) "b" '(("c" c) ("a" a) ("b" b)) nil nil #'string-lessp)
+;; ;; (ought 'c "a" '(("a" . a) ("a" . b) ("b" . c)) nil nil
+;; ;; (lambda (s1 s2) (not (string= s1 s2))))
+;; ;; (ought 'emacs-lisp-mode
+;; ;; "file.el"
+;; ;; '(("\\.c\\'" . c-mode)
+;; ;; ("\\.p\\'" . pascal-mode)
+;; ;; ("\\.el\\'" . emacs-lisp-mode)
+;; ;; ("\\.awk\\'" . awk-mode))
+;; ;; nil nil #'string-match-p)
+;; ;; (ought 'd 0 '((1 . a) (2 . b) (3 . c)) 'd) ;default value
+;; ;; (ought 'd 2 '((1 . a) (2 . b) (3 . c)) 'd nil #'ignore))))
+
+;; (compat-deftests (alist-get compat--alist-get-full-elisp)
+;; ;; Fallback behaviour:
+;; (ought nil 1 nil) ;empty list
+;; (ought 'a 1 '((1 . a))) ;single element list
+;; (ought nil 1 '(1))
+;; (ought 'b 2 '((1 . a) (2 . b) (3 . c))) ;multiple element list
+;; (ought nil 2 '(1 2 3))
+;; (ought 'b 2 '(1 (2 . b) 3))
+;; (ought nil 2 '((1 . a) 2 (3 . c)))
+;; (ought 'a 1 '((3 . c) (2 . b) (1 . a)))
+;; (ought nil "a" '(("a" . 1) ("b" . 2) ("c" . 3))) ;non-primitive elements
+;; ;; With testfn (advised behaviour):
+;; (ought 1 "a" '(("a" . 1) ("b" . 2) ("c" . 3)) nil nil #'equal)
+;; (ought 1 3 '((10 . 10) (4 . 4) (1 . 1) (9 . 9)) nil nil #'<)
+;; (ought '(a) "b" '(("c" c) ("a" a) ("b" b)) nil nil #'string-lessp)
+;; (ought 'c "a" '(("a" . a) ("a" . b) ("b" . c)) nil nil
+;; (lambda (s1 s2) (not (string= s1 s2))))
+;; (ought 'emacs-lisp-mode
+;; "file.el"
+;; '(("\\.c\\'" . c-mode)
+;; ("\\.p\\'" . pascal-mode)
+;; ("\\.el\\'" . emacs-lisp-mode)
+;; ("\\.awk\\'" . awk-mode))
+;; nil nil #'string-match-p)
+;; (ought 'd 0 '((1 . a) (2 . b) (3 . c)) 'd) ;default value
+;; (ought 'd 2 '((1 . a) (2 . b) (3 . c)) 'd nil #'ignore))
+
+;; (ert-deftest compat-call-alist-get-gv ()
+;; "Test if the `compat-call alist-get' can be used as a generalised
variable."
+;; (let ((alist-1 (list (cons 1 "one")
+;; (cons 2 "two")
+;; (cons 3 "three")))
+;; (alist-2 (list (cons "one" 1)
+;; (cons "two" 2)
+;; (cons "three" 3))))
+;; (setf (compat-call alist-get 1 alist-1) "eins")
+;; (should (equal (compat-call alist-get 1 alist-1) "eins"))
+;; (setf (compat-call alist-get 2 alist-1 nil 'remove) nil)
+;; (should (equal alist-1 '((1 . "eins") (3 . "three"))))
+;; (setf (compat-call alist-get "one" alist-2 nil nil #'string=) "eins")
+;; (should (equal (compat-call alist-get "one" alist-2 nil nil #'string=)
+;; "eins"))))
+
+;; (ert-deftest compat-alist-get-gv ()
+;; "Test if the `compat-alist-get' can be used as a generalised variable."
+;; (let ((alist-1 (list (cons 1 "one")
+;; (cons 2 "two")
+;; (cons 3 "three")))
+;; (alist-2 (list (cons "one" 1)
+;; (cons "two" 2)
+;; (cons "three" 3))))
+;; (setf (compat-alist-get 1 alist-1) "eins")
+;; (should (equal (compat-alist-get 1 alist-1) "eins"))
+;; (setf (compat-alist-get 2 alist-1 nil 'remove) nil)
+;; (should (equal alist-1 '((1 . "eins") (3 . "three"))))
+;; (setf (compat-alist-get "one" alist-2 nil nil #'string=) "eins")
+;; (should (equal (compat-alist-get "one" alist-2 nil nil #'string=)
+;; "eins"))))
+
+;; (compat-deftests string-trim-left
+;; (ought "" "") ;empty string
+;; (ought "a" "a") ;"full" string
+;; (ought "aaa" "aaa")
+;; (ought "へっろ" "へっろ")
+;; (ought "hello world" "hello world")
+;; (ought "a " "a ") ;right trailing
+;; (ought "aaa " "aaa ")
+;; (ought "a " "a ")
+;; (ought "a\t\t" "a\t\t")
+;; (ought "a\n \t" "a\n \t")
+;; (ought "a" " a") ;left trailing
+;; (ought "aaa" " aaa")
+;; (ought "a" "a")
+;; (ought "a" "\t\ta")
+;; (ought "a" "\n \ta")
+;; (ought "a " " a ") ;both trailing
+;; (ought "aaa " " aaa ")
+;; (ought "a\t\n" "\t\ta\t\n")
+;; (ought "a \n" "\n \ta \n"))
+
+;; (compat-deftests string-trim-right
+;; (ought "" "") ;empty string
+;; (ought "a" "a") ;"full" string
+;; (ought "aaa" "aaa")
+;; (ought "へっろ" "へっろ")
+;; (ought "hello world" "hello world")
+;; (ought "a" "a") ;right trailing
+;; (ought "aaa" "aaa")
+;; (ought "a" "a ")
+;; (ought "a" "a\t\t")
+;; (ought "a" "a\n \t")
+;; (ought " a" " a") ;left trailing
+;; (ought " aaa" " aaa")
+;; (ought "a" "a")
+;; (ought "\t\ta" "\t\ta")
+;; (ought "\n \ta" "\n \ta")
+;; (ought " a" " a ") ;both trailing
+;; (ought " aaa" " aaa")
+;; (ought "\t\ta" "\t\ta\t\n")
+;; (ought "\n \ta" "\n \ta \n"))
+
+;; (compat-deftests string-trim
+;; (ought "" "") ;empty string
+;; (ought "a" "a") ;"full" string
+;; (ought "aaa" "aaa")
+;; (ought "へっろ" "へっろ")
+;; (ought "hello world" "hello world")
+;; (ought "a" "a ") ;right trailing
+;; (ought "aaa" "aaa ")
+;; (ought "a" "a ")
+;; (ought "a" "a\t\t")
+;; (ought "a" "a\n \t")
+;; (ought "a" " a") ;left trailing
+;; (ought "aaa" " aaa")
+;; (ought "a" "a")
+;; (ought "a" "\t\ta")
+;; (ought "a" "\n \ta")
+;; (ought "a" " a ") ;both trailing
+;; (ought "aaa" " aaa ")
+;; (ought "t\ta" "t\ta\t\n")
+;; (ought "a" "\n \ta \n"))
+
+;; (compat-deftests mapcan
+;; (ought nil #'identity nil)
+;; (ought (list 1)
+;; #'identity
+;; (list (list 1)))
+;; (ought (list 1 2 3 4)
+;; #'identity
+;; (list (list 1) (list 2 3) (list 4)))
+;; (ought (list (list 1) (list 2 3) (list 4))
+;; #'list
+;; (list (list 1) (list 2 3) (list 4)))
+;; (ought (list 1 2 3 4)
+;; #'identity
+;; (list (list 1) (list) (list 2 3) (list 4)))
+;; (ought (list (list 1) (list) (list 2 3) (list 4))
+;; #'list
+;; (list (list 1) (list) (list 2 3) (list 4)))
+;; (ought (list)
+;; #'identity
+;; (list (list) (list) (list) (list))))
+
+;; ;; Note: as the cXXX+r implementations are relatively trivial, their
+;; ;; tests are not as extensive.
+
+;; (defvar compat-cXXXr-test
+;; '(((a . b) . (c . d)) . ((e . f) . (g . h)))
+;; "Testcase for cXXXr functions.")
+
+;; (defvar compat-cXXXXr-test
+;; '((((a . b) . (c . d)) . ((e . f) . (g . h))) .
+;; (((i . j) . (k . l)) . ((m . j) . (o . p))))
+;; "Testcase for cXXXXr functions.")
+
+;; (compat-deftests caaar
+;; (ought nil ())
+;; (ought 'a compat-cXXXr-test))
+
+;; (compat-deftests caadr
+;; (ought nil ())
+;; (ought 'e compat-cXXXr-test))
+
+;; (compat-deftests cadar
+;; (ought nil ())
+;; (ought 'c compat-cXXXr-test))
+
+;; (compat-deftests caddr
+;; (ought nil ())
+;; (ought 'g compat-cXXXr-test))
+
+;; (compat-deftests cdaar
+;; (ought nil ())
+;; (ought 'b compat-cXXXr-test))
+
+;; (compat-deftests cdadr
+;; (ought nil ())
+;; (ought 'f compat-cXXXr-test))
+
+;; (compat-deftests cddar
+;; (ought nil ())
+;; (ought 'd compat-cXXXr-test))
+
+;; (compat-deftests cdddr
+;; (ought nil ())
+;; (ought 'h compat-cXXXr-test)
+;; #'cdddr)
+
+;; (compat-deftests caaaar
+;; (ought nil ())
+;; (ought 'a compat-cXXXXr-test))
+
+;; (compat-deftests caaadr
+;; (ought nil ())
+;; (ought 'i compat-cXXXXr-test))
+
+;; (compat-deftests caadar
+;; (ought nil ())
+;; (ought 'e compat-cXXXXr-test))
+
+;; (compat-deftests caaddr
+;; (ought nil ())
+;; (ought 'm compat-cXXXXr-test))
+
+;; (compat-deftests cadaar
+;; (ought nil ())
+;; (ought 'c compat-cXXXXr-test))
+
+;; (compat-deftests cadadr
+;; (ought nil ())
+;; (ought 'k compat-cXXXXr-test))
+
+;; (compat-deftests caddar
+;; (ought nil ())
+;; (ought 'g compat-cXXXXr-test))
+
+;; (compat-deftests cadddr
+;; (ought nil ())
+;; (ought 'o compat-cXXXXr-test))
+
+;; (compat-deftests cdaaar
+;; (ought nil ())
+;; (ought 'b compat-cXXXXr-test))
+
+;; (compat-deftests cdaadr
+;; (ought nil ())
+;; (ought 'j compat-cXXXXr-test))
+
+;; (compat-deftests cdadar
+;; (ought nil ())
+;; (ought 'f compat-cXXXXr-test))
+
+;; (compat-deftests cdaddr
+;; (ought nil ())
+;; (ought 'j compat-cXXXXr-test))
+
+;; (compat-deftests cddaar
+;; (ought nil ())
+;; (ought 'd compat-cXXXXr-test))
+
+;; (compat-deftests cddadr
+;; (ought nil ())
+;; (ought 'l compat-cXXXXr-test))
+
+;; (compat-deftests cdddar
+;; (ought nil ())
+;; (ought 'h compat-cXXXXr-test))
+
+;; (compat-deftests string-greaterp
+;; (ought t "b" "a")
+;; (ought nil "a" "b")
+;; (ought t "aaab" "aaaa")
+;; (ought nil "aaaa" "aaab"))
+
+;; (compat-deftests compat-sort
+;; (ought (list 1 2 3) (list 1 2 3) #'<)
+;; (ought (list 1 2 3) (list 3 2 1) #'<)
+;; (ought '[1 2 3] '[1 2 3] #'<)
+;; (ought '[1 2 3] '[3 2 1] #'<))
+
+;; (compat-deftests compat-=
+;; (ought t 0 0)
+;; (ought t 0 0 0)
+;; (ought t 0 0 0 0)
+;; (ought t 0 0 0 0 0)
+;; (ought t 0.0 0.0)
+;; (ought t +0.0 -0.0)
+;; (ought t 0.0 0.0 0.0)
+;; (ought t 0.0 0.0 0.0 0.0)
+;; (ought nil 0 1)
+;; (ought nil 0 0 1)
+;; (ought nil 0 0 0 0 1)
+;; (expect wrong-type-argument 0 0 'a)
+;; (ought nil 0 1 'a)
+;; (ought nil 0.0 0.0 0.0 0.1))
+
+;; (compat-deftests compat-<
+;; (ought nil 0 0)
+;; (ought nil 0 0 0)
+;; (ought nil 0 0 0 0)
+;; (ought nil 0 0 0 0 0)
+;; (ought nil 0.0 0.0)
+;; (ought nil +0.0 -0.0)
+;; (ought nil 0.0 0.0 0.0)
+;; (ought nil 0.0 0.0 0.0 0.0)
+;; (ought t 0 1)
+;; (ought nil 1 0)
+;; (ought nil 0 0 1)
+;; (ought t 0 1 2)
+;; (ought nil 2 1 0)
+;; (ought nil 0 0 0 0 1)
+;; (ought t 0 1 2 3 4)
+;; (expect wrong-type-argument 0 1 'a)
+;; (ought nil 0 0 'a)
+;; (ought nil 0.0 0.0 0.0 0.1)
+;; (ought t -0.1 0.0 0.2 0.4)
+;; (ought t -0.1 0 0.2 0.4))
+
+;; (compat-deftests compat->
+;; (ought nil 0 0)
+;; (ought nil 0 0 0)
+;; (ought nil 0 0 0 0)
+;; (ought nil 0 0 0 0 0)
+;; (ought nil 0.0 0.0)
+;; (ought nil +0.0 -0.0)
+;; (ought nil 0.0 0.0 0.0)
+;; (ought nil 0.0 0.0 0.0 0.0)
+;; (ought t 1 0)
+;; (ought nil 1 0 0)
+;; (ought nil 0 1 2)
+;; (ought t 2 1 0)
+;; (ought nil 1 0 0 0 0)
+;; (ought t 4 3 2 1 0)
+;; (ought nil 4 3 2 1 1)
+;; (expect wrong-type-argument 1 0 'a)
+;; (ought nil 0 0 'a)
+;; (ought nil 0.1 0.0 0.0 0.0)
+;; (ought t 0.4 0.2 0.0 -0.1)
+;; (ought t 0.4 0.2 0 -0.1))
+
+;; (compat-deftests compat-<=
+;; (ought t 0 0)
+;; (ought t 0 0 0)
+;; (ought t 0 0 0 0)
+;; (ought t 0 0 0 0 0)
+;; (ought t 0.0 0.0)
+;; (ought t +0.0 -0.0)
+;; (ought t 0.0 0.0 0.0)
+;; (ought t 0.0 0.0 0.0 0.0)
+;; (ought nil 1 0)
+;; (ought nil 1 0 0)
+;; (ought t 0 1 2)
+;; (ought nil 2 1 0)
+;; (ought nil 1 0 0 0 0)
+;; (ought nil 4 3 2 1 0)
+;; (ought nil 4 3 2 1 1)
+;; (ought t 0 1 2 3 4)
+;; (ought t 1 1 2 3 4)
+;; (expect wrong-type-argument 0 0 'a)
+;; (expect wrong-type-argument 0 1 'a)
+;; (ought nil 1 0 'a)
+;; (ought nil 0.1 0.0 0.0 0.0)
+;; (ought t 0.0 0.0 0.0 0.1)
+;; (ought t -0.1 0.0 0.2 0.4)
+;; (ought t -0.1 0.0 0.0 0.2 0.4)
+;; (ought t -0.1 0.0 0 0.2 0.4)
+;; (ought t -0.1 0 0.2 0.4)
+;; (ought nil 0.4 0.2 0.0 -0.1)
+;; (ought nil 0.4 0.2 0.0 0.0 -0.1)
+;; (ought nil 0.4 0.2 0 0.0 0.0 -0.1)
+;; (ought nil 0.4 0.2 0 -0.1))
+
+;; (compat-deftests compat->=
+;; (ought t 0 0)
+;; (ought t 0 0 0)
+;; (ought t 0 0 0 0)
+;; (ought t 0 0 0 0 0)
+;; (ought t 0.0 0.0)
+;; (ought t +0.0 -0.0)
+;; (ought t 0.0 0.0 0.0)
+;; (ought t 0.0 0.0 0.0 0.0)
+;; (ought t 1 0)
+;; (ought t 1 0 0)
+;; (ought nil 0 1 2)
+;; (ought t 2 1 0)
+;; (ought t 1 0 0 0 0)
+;; (ought t 4 3 2 1 0)
+;; (ought t 4 3 2 1 1)
+;; (expect wrong-type-argument 0 0 'a)
+;; (expect wrong-type-argument 1 0 'a)
+;; (ought nil 0 1 'a)
+;; (ought t 0.1 0.0 0.0 0.0)
+;; (ought nil 0.0 0.0 0.0 0.1)
+;; (ought nil -0.1 0.0 0.2 0.4)
+;; (ought nil -0.1 0.0 0.0 0.2 0.4)
+;; (ought nil -0.1 0.0 0 0.2 0.4)
+;; (ought nil -0.1 0 0.2 0.4)
+;; (ought t 0.4 0.2 0.0 -0.1)
+;; (ought t 0.4 0.2 0.0 0.0 -0.1)
+;; (ought t 0.4 0.2 0 0.0 0.0 -0.1)
+;; (ought t 0.4 0.2 0 -0.1))
+
+;; (compat-deftests special-form-p
+;; (ought t 'if)
+;; (ought t 'cond)
+;; (ought nil 'when)
+;; (ought nil 'defun)
+;; (ought nil '+)
+;; (ought nil nil)
+;; (ought nil "macro")
+;; (ought nil '(macro . +)))
+
+;; (compat-deftests macrop
+;; (ought t 'lambda)
+;; (ought t 'defun)
+;; (ought t 'defmacro)
+;; (ought nil 'defalias)
+;; (ought nil 'foobar)
+;; (ought nil 'if)
+;; (ought nil '+)
+;; (ought nil 1)
+;; (ought nil nil)
+;; (ought nil "macro")
+;; (ought t '(macro . +)))
+
+;; (compat-deftests string-suffix-p
+;; (ought t "a" "abba")
+;; (ought t "ba" "abba")
+;; (ought t "abba" "abba")
+;; (ought nil "a" "ABBA")
+;; (ought nil "bA" "ABBA")
+;; (ought nil "aBBA" "ABBA")
+;; (ought nil "c" "ABBA")
+;; (ought nil "c" "abba")
+;; (ought nil "cddc" "abba")
+;; (ought nil "aabba" "abba"))
+
+;; (compat-deftests compat-split-string
+;; (ought '("a" "b" "c") "a b c")
+;; (ought '("..a.." "..b.." "..c..") "..a.. ..b.. ..c..")
+;; (ought '("a" "b" "c") "..a.. ..b.. ..c.." nil nil "\\.+"))
+
+;; (compat-deftests delete-consecutive-dups
+;; (ought '(1 2 3 4) '(1 2 3 4))
+;; (ought '(1 2 3 4) '(1 2 2 3 4 4))
+;; (ought '(1 2 3 2 4) '(1 2 2 3 2 4 4)))
+
+;; (compat-deftests string-clean-whitespace
+;; (ought "a b c" "a b c")
+;; (ought "a b c" " a b c")
+;; (ought "a b c" "a b c ")
+;; (ought "a b c" "a b c")
+;; (ought "a b c" "a b c")
+;; (ought "a b c" "a b c")
+;; (ought "a b c" " a b c")
+;; (ought "a b c" "a b c ")
+;; (ought "a b c" " a b c ")
+;; (ought "aa bb cc" "aa bb cc")
+;; (ought "aa bb cc" " aa bb cc")
+;; (ought "aa bb cc" "aa bb cc ")
+;; (ought "aa bb cc" "aa bb cc")
+;; (ought "aa bb cc" "aa bb cc")
+;; (ought "aa bb cc" "aa bb cc")
+;; (ought "aa bb cc" " aa bb cc")
+;; (ought "aa bb cc" "aa bb cc ")
+;; (ought "aa bb cc" " aa bb cc "))
+
+;; (compat-deftests string-fill
+;; (ought "a a a a a" "a a a a a" 9)
+;; (ought "a a a a a" "a a a a a" 10)
+;; (ought "a a a a\na" "a a a a a" 8)
+;; (ought "a a a a\na" "a a a a a" 8)
+;; (ought "a a\na a\na" "a a a a a" 4)
+;; (ought "a\na\na\na\na" "a a a a a" 2)
+;; (ought "a\na\na\na\na" "a a a a a" 1))
+
+;; (compat-deftests string-lines
+;; (ought '("a" "b" "c") "a\nb\nc")
+;; (ought '("a" "b" "c" "") "a\nb\nc\n")
+;; (ought '("a" "b" "c") "a\nb\nc\n" t)
+;; (ought '("abc" "bcd" "cde") "abc\nbcd\ncde")
+;; (ought '(" abc" " bcd " "cde ") " abc\n bcd \ncde "))
+
+;; (compat-deftests string-pad
+;; (ought "a " "a" 4)
+;; (ought "aaaa" "aaaa" 4)
+;; (ought "aaaaaa" "aaaaaa" 4)
+;; (ought "a..." "a" 4 ?.)
+;; (ought " a" "a" 4 nil t)
+;; (ought "...a" "a" 4 ?. t))
+
+;; (compat-deftests string-chop-newline
+;; (ought "" "")
+;; (ought "" "\n")
+;; (ought "aaa" "aaa")
+;; (ought "aaa" "aaa\n")
+;; (ought "aaa\n" "aaa\n\n"))
+
+;; (compat-deftests macroexpand-1
+;; (ought '(if a b c) '(if a b c))
+;; (ought '(if a (progn b)) '(when a b))
+;; (ought '(if a (progn (unless b c))) '(when a (unless b c))))
+
+;; (compat-deftests compat-file-size-human-readable
+;; (ought "1000" 1000)
+;; (ought "1k" 1024)
+;; (ought "1M" (* 1024 1024))
+;; (ought "1G" (expt 1024 3))
+;; (ought "1T" (expt 1024 4))
+;; (ought "1k" 1000 'si)
+;; (ought "1KiB" 1024 'iec)
+;; (ought "1KiB" 1024 'iec)
+;; (ought "1 KiB" 1024 'iec " ")
+;; (ought "1KiA" 1024 'iec nil "A")
+;; (ought "1 KiA" 1024 'iec " " "A")
+;; (ought "1kA" 1000 'si nil "A")
+;; (ought "1 k" 1000 'si " ")
+;; (ought "1 kA" 1000 'si " " "A"))
+
+;; (compat-deftests format-prompt
+;; (ought "Prompt: " "Prompt" nil)
+;; (ought "Prompt: " "Prompt" "")
+;; (ought "Prompt (default ): " "Prompt" " ")
+;; (ought "Prompt (default 3): " "Prompt" 3)
+;; (ought "Prompt (default abc): " "Prompt" "abc")
+;; (ought "Prompt (default abc def): " "Prompt" "abc def")
+;; (ought "Prompt 10: " "Prompt %d" nil 10)
+;; (ought "Prompt \"abc\" (default 3): " "Prompt %S" 3 "abc"))
+
+;; (ert-deftest compat-named-let ()
+;; "Check if `compat--t-named-let' was implemented properly."
+;; (should (= (compat--t-named-let l ((i 0)) (if (= i 8) i (l (1+ i))))
+;; 8))
+;; (should (= (compat--t-named-let l ((i 0)) (if (= i 100000) i (l (1+ i))))
+;; 100000))
+;; (should (= (compat--t-named-let l ((i 0))
+;; (cond
+;; ((= i 100000) i)
+;; ((= (mod i 2) 0)
+;; (l (+ i 2)))
+;; ((l (+ i 3)))))
+;; 100000))
+;; (should (= (compat--t-named-let l ((i 0) (x 1)) (if (= i 8) x (l (1+ i)
(* x 2))))
+;; (expt 2 8)))
+;; (should (eq (compat--t-named-let lop ((x 1))
+;; (if (> x 0)
+;; (condition-case nil
+;; (lop (1- x))
+;; (arith-error 'ok))
+;; (/ 1 x)))
+;; 'ok))
+;; (should (eq (compat--t-named-let lop ((n 10000))
+;; (if (> n 0)
+;; (condition-case nil
+;; (/ n 0)
+;; (arith-error (lop (1- n))))
+;; 'ok))
+;; 'ok))
+;; (should (eq (compat--t-named-let lop ((x nil))
+;; (cond (x)
+;; (t 'ok)))
+;; 'ok))
+;; (should (eq (compat--t-named-let lop ((x 100000))
+;; (cond ((= x 0) 'ok)
+;; ((lop (1- x)))))
+;; 'ok))
+;; (should (eq (compat--t-named-let lop ((x 100000))
+;; (cond
+;; ((= x -1) nil)
+;; ((= x 0) 'ok)
+;; ((lop -1))
+;; ((lop (1- x)))))
+;; 'ok))
+;; (should (eq (compat--t-named-let lop ((x 10000))
+;; (cond ((= x 0) 'ok)
+;; ((and t (lop (1- x))))))
+;; 'ok))
+;; (should (eq (let ((b t))
+;; (compat--t-named-let lop ((i 0))
+;; (cond ((null i) nil) ((= i 10000) 'ok)
+;; ((lop (and (setq b (not b)) (1+ i))))
+;; ((lop (and (setq b (not b)) (1+ i)))))))
+;; 'ok)))
+
+;; ;; TODO fix broken test
+;; ;;(compat-deftests directory-files-recursively
+;; ;; (should (equal
+;; ;; (compat-sort (directory-files-recursively "."
"make\\|copying") #'string<)
+;; ;; '("./.github/workflows/makefile.yml" "./COPYING"
"./Makefile"))))
+
+;; (compat-deftests directory-name-p
+;; (ought t "/")
+;; (ought nil "/file")
+;; (ought nil "/dir/file")
+;; (ought t "/dir/")
+;; (ought nil "/dir")
+;; (ought t "/dir/subdir/")
+;; (ought nil "/dir/subdir")
+;; (ought t "dir/")
+;; (ought nil "file")
+;; (ought nil "dir/file")
+;; (ought t "dir/subdir/")
+;; (ought nil "dir/subdir"))
+
+;; (ert-deftest compat-if-let* ()
+;; "Check if `compat--t-if-let*' was implemented properly."
+;; (should
+;; (compat--t-if-let*
+;; ((x 3)
+;; (y 2)
+;; (z (+ x y))
+;; ((= z 5))
+;; (true t))
+;; true nil))
+;; (should-not
+;; (compat--t-if-let* (((= 5 6))) t nil)))
+
+;; (ert-deftest compat-if-let ()
+;; "Check if `compat--t-if-let' was implemented properly."
+;; (should (compat--t-if-let ((e (memq 0 '(1 2 3 0 5 6))))
+;; e))
+;; (should-not (compat--t-if-let ((e (memq 0 '(1 2 3 5 6)))
+;; (d (memq 0 '(1 2 3 0 5 6))))
+;; t))
+;; (should-not (compat--t-if-let ((d (memq 0 '(1 2 3 0 5 6)))
+;; (e (memq 0 '(1 2 3 5 6))))
+;; t))
+;; (should-not
+;; (compat--t-if-let (((= 5 6))) t nil)))
+
+;; (ert-deftest compat-and-let* ()
+;; "Check if `compat--t-and-let*' was implemented properly."
+;; (should ;trivial body
+;; (compat--t-and-let*
+;; ((x 3)
+;; (y 2)
+;; (z (+ x y))
+;; ((= z 5))
+;; (true t))
+;; true))
+;; (should ;no body
+;; (compat--t-and-let*
+;; ((x 3)
+;; (y 2)
+;; (z (+ x y))
+;; ((= z 5))
+;; (true t))))
+;; (should-not
+;; (compat--t-and-let* (((= 5 6))) t)))
+
+;; (compat-deftests compat-json-parse-string
+;; (ought 0 "0")
+;; (ought 1 "1")
+;; (ought 0.5 "0.5")
+;; (ought [1 2 3] "[1,2,3]")
+;; (ought ["a" 2 3] "[\"a\",2,3]")
+;; (ought [["a" 2] 3] "[[\"a\",2],3]")
+;; (ought '(("a" 2) 3) "[[\"a\",2],3]" :array-type 'list)
+;; (ought 'foo "null" :null-object 'foo)
+;; (ought ["false" t] "[false, true]" :false-object "false"))
+
+;; (ert-deftest compat-json-parse-string ()
+;; "Check if `compat--t-json-parse-string' was implemented properly."
+;; (let ((input "{\"key\":[\"abc\", 2], \"yek\": null}"))
+;; (let ((obj (json-parse-string input :object-type 'alist)))
+;; (should (equal (cdr (assq 'key obj)) ["abc" 2]))
+;; (should (equal (cdr (assq 'yek obj)) :null)))
+;; (let ((obj (json-parse-string input :object-type 'plist)))
+;; (should (equal (plist-get obj :key) ["abc" 2]))
+;; (should (equal (plist-get obj :yek) :null)))
+;; (let ((obj (json-parse-string input)))
+;; (should (equal (gethash "key" obj) ["abc" 2]))
+;; (should (equal (gethash "yek" obj) :null)))))
+
+;; (ert-deftest compat-json-insert ()
+;; (with-temp-buffer
+;; (compat--t-json-insert '((:key . ["abc" 2]) (yek . t)))
+;; (should (equal (buffer-string) "{\":key\":[\"abc\",2],\"yek\":true}"))))
+
+;; (ert-deftest compat-json-serialize ()
+;; "Check if `json-serialize' was implemented properly."
+;; (let ((input-1 '((:key . ["abc" 2]) (yek . t)))
+;; (input-2 '(:key ["abc" 2] yek t))
+;; (input-3 (let ((ht (make-hash-table)))
+;; (puthash "key" ["abc" 2] ht)
+;; (puthash "yek" t ht)
+;; ht)))
+;; (should (equal (json-serialize input-1)
+;; "{\":key\":[\"abc\",2],\"yek\":true}"))
+;; (should (equal (json-serialize input-2)
+;; "{\"key\":[\"abc\",2],\"yek\":true}"))
+;; (should (member (json-serialize input-2)
+;; '("{\"key\":[\"abc\",2],\"yek\":true}"
+;; "{\"yek\":true,\"key\":[\"abc\",2]}")))
+;; (should-error (json-serialize '(("a" . 1)))
+;; :type '(wrong-type-argument symbolp "a"))
+;; (should-error (json-serialize '("a" 1))
+;; :type '(wrong-type-argument symbolp "a"))
+;; (should-error (json-serialize '("a" 1 2))
+;; :type '(wrong-type-argument symbolp "a"))
+;; (should-error (json-serialize '(:a 1 2))
+;; :type '(wrong-type-argument consp nil))
+;; (should-error (json-serialize
+;; (let ((ht (make-hash-table)))
+;; (puthash 'a 1 ht)
+;; ht))
+;; :type '(wrong-type-argument stringp a))
+;; (when (fboundp 'json-serialize)
+;; (should (equal (json-serialize input-1)
+;; "{\":key\":[\"abc\",2],\"yek\":true}"))
+;; (should (equal (json-serialize input-2)
+;; "{\"key\":[\"abc\",2],\"yek\":true}"))
+;; (should (member (json-serialize input-2)
+;; '("{\"key\":[\"abc\",2],\"yek\":true}"
+;; "{\"yek\":true,\"key\":[\"abc\",2]}")))
+;; (should-error (json-serialize '(("a" . 1)))
+;; :type '(wrong-type-argument symbolp "a"))
+;; (should-error (json-serialize '("a" 1))
+;; :type '(wrong-type-argument symbolp "a"))
+;; (should-error (json-serialize '("a" 1 2))
+;; :type '(wrong-type-argument symbolp "a"))
+;; (should-error (json-serialize '(:a 1 2))
+;; :type '(wrong-type-argument consp nil))
+;; (should-error (json-serialize
+;; (let ((ht (make-hash-table)))
+;; (puthash 'a 1 ht)
+;; ht))
+;; :type '(wrong-type-argument stringp a)))))
+
+;; (compat-deftests compat-lookup-key
+;; (let ((a-map (make-sparse-keymap))
+;; (b-map (make-sparse-keymap)))
+;; (define-key a-map "x" 'foo)
+;; (define-key b-map "x" 'bar)
+;; (ought 'foo a-map "x")
+;; (ought 'bar b-map "x")
+;; (ought 'foo (list a-map b-map) "x")
+;; (ought 'bar (list b-map a-map) "x")))
+
+;; (ert-deftest compat-hash-table-keys ()
+;; (let ((ht (make-hash-table)))
+;; (should (null (compat--t-hash-table-keys ht)))
+;; (puthash 1 'one ht)
+;; (should (equal '(1) (compat--t-hash-table-keys ht)))
+;; (puthash 1 'one ht)
+;; (should (equal '(1) (compat--t-hash-table-keys ht)))
+;; (puthash 2 'two ht)
+;; (should (memq 1 (compat--t-hash-table-keys ht)))
+;; (should (memq 2 (compat--t-hash-table-keys ht)))
+;; (should (= 2 (length (compat--t-hash-table-keys ht))))
+;; (remhash 1 ht)
+;; (should (equal '(2) (compat--t-hash-table-keys ht)))))
+
+;; (ert-deftest compat-hash-table-values ()
+;; (let ((ht (make-hash-table)))
+;; (should (null (compat--t-hash-table-values ht)))
+;; (puthash 1 'one ht)
+;; (should (equal '(one) (compat--t-hash-table-values ht)))
+;; (puthash 1 'one ht)
+;; (should (equal '(one) (compat--t-hash-table-values ht)))
+;; (puthash 2 'two ht)
+;; (should (memq 'one (compat--t-hash-table-values ht)))
+;; (should (memq 'two (compat--t-hash-table-values ht)))
+;; (should (= 2 (length (compat--t-hash-table-values ht))))
+;; (remhash 1 ht)
+;; (should (equal '(two) (compat--t-hash-table-values ht)))))
+
+;; (compat-deftests string-empty-p
+;; (ought t "")
+;; (ought nil " ")
+;; (ought t (make-string 0 ?x))
+;; (ought nil (make-string 1 ?x)))
+
+;; (compat-deftests string-join
+;; (ought "" '(""))
+;; (ought "" '("") " ")
+;; (ought "a" '("a"))
+;; (ought "a" '("a") " ")
+;; (ought "abc" '("a" "b" "c"))
+;; (ought "a b c" '("a" "b" "c") " "))
+
+;; (compat-deftests string-blank-p
+;; (ought 0 "")
+;; (ought 0 " ")
+;; (ought 0 (make-string 0 ?x))
+;; (ought nil (make-string 1 ?x)))
+
+;; (compat-deftests string-remove-prefix
+;; (ought "" "" "")
+;; (ought "a" "" "a")
+;; (ought "" "a" "")
+;; (ought "bc" "a" "abc")
+;; (ought "abc" "c" "abc")
+;; (ought "bbcc" "aa" "aabbcc")
+;; (ought "aabbcc" "bb" "aabbcc")
+;; (ought "aabbcc" "cc" "aabbcc")
+;; (ought "aabbcc" "dd" "aabbcc"))
+
+;; (compat-deftests string-remove-suffix
+;; (ought "" "" "")
+;; (ought "a" "" "a")
+;; (ought "" "a" "")
+;; (ought "abc" "a" "abc")
+;; (ought "ab" "c" "abc")
+;; (ought "aabbcc" "aa" "aabbcc")
+;; (ought "aabbcc" "bb" "aabbcc")
+;; (ought "aabb" "cc" "aabbcc")
+;; (ought "aabbcc" "dd" "aabbcc"))
+
+;; (let ((a (bool-vector t t nil nil))
+;; (b (bool-vector t nil t nil)))
+;; (compat-deftests bool-vector-exclusive-or
+;; (ought (bool-vector nil t t nil) a b)
+;; (ought (bool-vector nil t t nil) b a)
+;; (ert-deftest compat-bool-vector-exclusive-or-sideeffect ()
+;; (let ((c (make-bool-vector 4 nil)))
+;; (compat--t-bool-vector-exclusive-or a b c)
+;; (should (equal (bool-vector nil t t nil) c))
+;; (should (equal (bool-vector nil t t nil) c))))
+;; (when (version<= "24.4" emacs-version)
+;; (expect wrong-length-argument a (bool-vector))
+;; (expect wrong-length-argument a b (bool-vector)))
+;; (expect wrong-type-argument (bool-vector) (vector))
+;; (expect wrong-type-argument (vector) (bool-vector))
+;; (expect wrong-type-argument (vector) (vector))
+;; (expect wrong-type-argument (bool-vector) (bool-vector) (vector))
+;; (expect wrong-type-argument (bool-vector) (vector) (vector))
+;; (expect wrong-type-argument (vector) (bool-vector) (vector))
+;; (expect wrong-type-argument (vector) (vector) (vector))))
+
+;; (let ((a (bool-vector t t nil nil))
+;; (b (bool-vector t nil t nil)))
+;; (compat-deftests bool-vector-union
+;; (ought (bool-vector t t t nil) a b)
+;; (ought (bool-vector t t t nil) b a)
+;; (ert-deftest compat-bool-vector-union-sideeffect ()
+;; (let ((c (make-bool-vector 4 nil)))
+;; (compat--t-bool-vector-union a b c)
+;; (should (equal (bool-vector t t t nil) c))))
+;; (when (version<= "24.4" emacs-version)
+;; (expect wrong-length-argument a (bool-vector))
+;; (expect wrong-length-argument a b (bool-vector)))
+;; (expect wrong-type-argument (bool-vector) (vector))
+;; (expect wrong-type-argument (vector) (bool-vector))
+;; (expect wrong-type-argument (vector) (vector))
+;; (expect wrong-type-argument (bool-vector) (bool-vector) (vector))
+;; (expect wrong-type-argument (bool-vector) (vector) (vector))
+;; (expect wrong-type-argument (vector) (bool-vector) (vector))
+;; (expect wrong-type-argument (vector) (vector) (vector))))
+
+;; (let ((a (bool-vector t t nil nil))
+;; (b (bool-vector t nil t nil)))
+;; (compat-deftests bool-vector-intersection
+;; (ought (bool-vector t nil nil nil) a b)
+;; (ought (bool-vector t nil nil nil) b a)
+;; (ert-deftest compat-bool-vector-intersection-sideeffect ()
+;; (let ((c (make-bool-vector 4 nil)))
+;; (compat--t-bool-vector-intersection a b c)
+;; (should (equal (bool-vector t nil nil nil) c))))
+;; (when (version<= "24.4" emacs-version)
+;; (expect wrong-length-argument a (bool-vector))
+;; (expect wrong-length-argument a b (bool-vector)))
+;; (expect wrong-type-argument (bool-vector) (vector))
+;; (expect wrong-type-argument (vector) (bool-vector))
+;; (expect wrong-type-argument (vector) (vector))
+;; (expect wrong-type-argument (bool-vector) (bool-vector) (vector))
+;; (expect wrong-type-argument (bool-vector) (vector) (vector))
+;; (expect wrong-type-argument (vector) (bool-vector) (vector))
+;; (expect wrong-type-argument (vector) (vector) (vector))))
+
+;; (let ((a (bool-vector t t nil nil))
+;; (b (bool-vector t nil t nil)))
+;; (compat-deftests bool-vector-set-difference
+;; (ought (bool-vector nil t nil nil) a b)
+;; (ought (bool-vector nil nil t nil) b a)
+;; (ert-deftest compat-bool-vector-set-difference-sideeffect ()
+;; (let ((c (make-bool-vector 4 nil)))
+;; (compat--t-bool-vector-set-difference a b c)
+;; (should (equal (bool-vector nil t nil nil) c)))
+;; (let ((c (make-bool-vector 4 nil)))
+;; (compat--t-bool-vector-set-difference b a c)
+;; (should (equal (bool-vector nil nil t nil) c))))
+;; (when (version<= "24.4" emacs-version)
+;; (expect wrong-length-argument a (bool-vector))
+;; (expect wrong-length-argument a b (bool-vector)))
+;; (expect wrong-type-argument (bool-vector) (vector))
+;; (expect wrong-type-argument (vector) (bool-vector))
+;; (expect wrong-type-argument (vector) (vector))
+;; (expect wrong-type-argument (bool-vector) (bool-vector) (vector))
+;; (expect wrong-type-argument (bool-vector) (vector) (vector))
+;; (expect wrong-type-argument (vector) (bool-vector) (vector))
+;; (expect wrong-type-argument (vector) (vector) (vector))))
+
+;; (compat-deftests bool-vector-not
+;; (ought (bool-vector) (bool-vector))
+;; (ought (bool-vector t) (bool-vector nil))
+;; (ought (bool-vector nil) (bool-vector t))
+;; (ought (bool-vector t t) (bool-vector nil nil))
+;; (ought (bool-vector t nil) (bool-vector nil t))
+;; (ought (bool-vector nil t) (bool-vector t nil))
+;; (ought (bool-vector nil nil) (bool-vector t t))
+;; (expect wrong-type-argument (vector))
+;; (expect wrong-type-argument (vector) (vector)))
+
+;; (compat-deftests bool-vector-subsetp
+;; (ought t (bool-vector) (bool-vector))
+;; (ought t (bool-vector t) (bool-vector t))
+;; (ought t (bool-vector nil) (bool-vector t))
+;; (ought nil (bool-vector t) (bool-vector nil))
+;; (ought t (bool-vector nil) (bool-vector nil))
+;; (ought t (bool-vector t t) (bool-vector t t))
+;; (ought t (bool-vector nil nil) (bool-vector t t))
+;; (ought t (bool-vector nil nil) (bool-vector t nil))
+;; (ought t (bool-vector nil nil) (bool-vector nil t))
+;; (ought nil (bool-vector t nil) (bool-vector nil nil))
+;; (ought nil (bool-vector nil t) (bool-vector nil nil))
+;; (when (version<= "24.4" emacs-version)
+;; (expect wrong-length-argument (bool-vector nil) (bool-vector nil nil)))
+;; (expect wrong-type-argument (bool-vector) (vector))
+;; (expect wrong-type-argument (vector) (bool-vector))
+;; (expect wrong-type-argument (vector) (vector)))
+
+;; (compat-deftests bool-vector-count-consecutive
+;; (ought 0 (bool-vector nil) (bool-vector nil) 0)
+;; (ought 0 (make-bool-vector 10 nil) t 0)
+;; (ought 10 (make-bool-vector 10 nil) nil 0)
+;; (ought 0 (make-bool-vector 10 nil) t 1)
+;; (ought 9 (make-bool-vector 10 nil) nil 1)
+;; (ought 0 (make-bool-vector 10 nil) t 1)
+;; (ought 9 (make-bool-vector 10 t) t 1)
+;; (ought 0 (make-bool-vector 10 nil) t 8)
+;; (ought 2 (make-bool-vector 10 nil) nil 8)
+;; (ought 2 (make-bool-vector 10 t) t 8)
+;; (ought 10 (make-bool-vector 10 t) (make-bool-vector 10 t) 0)
+;; (ought 4 (bool-vector t t t t nil t t t t t) t 0)
+;; (ought 0 (bool-vector t t t t nil t t t t t) t 4)
+;; (ought 5 (bool-vector t t t t nil t t t t t) t 5)
+;; (expect wrong-type-argument (vector) nil 0))
+
+;; (compat-deftests bool-vector-count-population
+;; (ought 0 (bool-vector))
+;; (ought 0 (make-bool-vector 10 nil))
+;; (ought 10 (make-bool-vector 10 t))
+;; (ought 1 (bool-vector nil nil t nil))
+;; (ought 1 (bool-vector nil nil nil t))
+;; (ought 1 (bool-vector t nil nil nil))
+;; (ought 2 (bool-vector t nil nil t))
+;; (ought 2 (bool-vector t nil t nil))
+;; (ought 3 (bool-vector t nil t t))
+;; (expect wrong-type-argument (vector)))
+
+;; (compat-deftests compat-assoc-delete-all
+;; (ought (list) 0 (list))
+;; ;; Test `eq'
+;; (ought '((1 . one)) 0 (list (cons 1 'one)))
+;; (ought '((1 . one) a) 0 (list (cons 1 'one) 'a))
+;; (ought '((1 . one)) 0 (list (cons 0 'zero) (cons 1 'one)))
+;; (ought '((1 . one)) 0 (list (cons 0 'zero) (cons 0 'zero) (cons 1 'one)))
+;; (ought '((1 . one)) 0 (list (cons 0 'zero) (cons 1 'one) (cons 0 'zero)))
+;; (ought '((1 . one) a) 0 (list (cons 0 'zero) (cons 1 'one) 'a (cons 0
'zero)))
+;; (ought '(a (1 . one)) 0 (list 'a (cons 0 'zero) (cons 1 'one) (cons 0
'zero)))
+;; ;; Test `equal'
+;; (ought '(("one" . one)) "zero" (list (cons "one" 'one)))
+;; (ought '(("one" . one) a) "zero" (list (cons "one" 'one) 'a))
+;; (ought '(("one" . one)) "zero" (list (cons "zero" 'zero) (cons "one"
'one)))
+;; (ought '(("one" . one)) "zero" (list (cons "zero" 'zero) (cons "zero"
'zero) (cons "one" 'one)))
+;; (ought '(("one" . one)) "zero" (list (cons "zero" 'zero) (cons "one"
'one) (cons "zero" 'zero)))
+;; (ought '(("one" . one) a) "zero" (list (cons "zero" 'zero) (cons "one"
'one) 'a (cons "zero" 'zero)))
+;; (ought '(a ("one" . one)) "zero" (list 'a (cons "zero" 'zero) (cons "one"
'one) (cons "zero" 'zero)))
+;; ;; Test custom predicate
+;; (ought '() 0 (list (cons 1 'one)) #'/=)
+;; (ought '(a) 0 (list (cons 1 'one) 'a) #'/=)
+;; (ought '((0 . zero)) 0 (list (cons 0 'zero) (cons 1 'one)) #'/=)
+;; (ought '((0 . zero) (0 . zero)) 0 (list (cons 0 'zero) (cons 0 'zero)
(cons 1 'one)) #'/=)
+;; (ought '((0 . zero) (0 . zero)) 0 (list (cons 0 'zero) (cons 1 'one)
(cons 0 'zero)) #'/=)
+;; (ought '((0 . zero) a (0 . zero)) 0 (list (cons 0 'zero) (cons 1 'one) 'a
(cons 0 'zero)) #'/=)
+;; (ought '(a (0 . zero) (0 . zero)) 0 (list 'a (cons 0 'zero) (cons 1 'one)
(cons 0 'zero)) #'/=))
+
+;; (compat-deftests color-values-from-color-spec
+;; ;; #RGB notation
+;; (ought '(0 0 0) "#000")
+;; (ought '(0 0 0) "#000000")
+;; (ought '(0 0 0) "#000000000")
+;; (ought '(0 0 0) "#000000000000")
+;; (ought '(0 0 65535) "#00F")
+;; (ought '(0 0 65535) "#0000FF")
+;; (ought '(0 0 65535) "#000000FFF")
+;; (ought '(0 0 65535) "#00000000FFFF")
+;; (ought '(0 0 65535) "#00f")
+;; (ought '(0 0 65535) "#0000ff")
+;; (ought '(0 0 65535) "#000000fff")
+;; (ought '(0 0 65535) "#00000000ffff")
+;; (ought '(0 0 65535) "#00000000ffFF")
+;; (ought '(#xffff #x0000 #x5555) "#f05")
+;; (ought '(#x1f1f #xb0b0 #xc5c5) "#1fb0C5")
+;; (ought '(#x1f83 #xb0ad #xc5e2) "#1f83b0ADC5e2")
+;; (ought nil "")
+;; (ought nil "#")
+;; (ought nil "#0")
+;; (ought nil "#00")
+;; (ought nil "#0000FG")
+;; (ought nil "#0000FFF")
+;; (ought nil "#0000FFFF")
+;; (ought '(0 4080 65535) "#0000FFFFF")
+;; (ought nil "#000FF")
+;; (ought nil "#0000F")
+;; (ought nil " #000000")
+;; (ought nil "#000000 ")
+;; (ought nil " #000000 ")
+;; (ought nil "#1f83b0ADC5e2g")
+;; (ought nil "#1f83b0ADC5e20")
+;; (ought nil "#12345")
+;; ;; rgb: notation
+;; (ought '(0 0 0) "rgb:0/0/0")
+;; (ought '(0 0 0) "rgb:0/0/00")
+;; (ought '(0 0 0) "rgb:0/00/000")
+;; (ought '(0 0 0) "rgb:0/000/0000")
+;; (ought '(0 0 0) "rgb:000/0000/0")
+;; (ought '(0 0 65535) "rgb:000/0000/F")
+;; (ought '(65535 0 65535) "rgb:FFF/0000/F")
+;; (ought '(65535 0 65535) "rgb:FFFF/0000/FFFF")
+;; (ought '(0 255 65535) "rgb:0/00FF/FFFF")
+;; (ought '(#xffff #x2323 #x28a2) "rgb:f/23/28a")
+;; (ought '(#x1234 #x5678 #x09ab) "rgb:1234/5678/09ab")
+;; (ought nil "rgb:/0000/FFFF")
+;; (ought nil "rgb:0000/0000/FFFG")
+;; (ought nil "rgb:0000/0000/FFFFF")
+;; (ought nil "rgb:0000/0000")
+;; (ought nil "rg:0000/0000/0000")
+;; (ought nil "rgb: 0000/0000/0000")
+;; (ought nil "rgbb:0000/0000/0000")
+;; (ought nil "rgb:0000/0000/0000 ")
+;; (ought nil " rgb:0000/0000/0000 ")
+;; (ought nil " rgb:0000/0000/0000")
+;; (ought nil "rgb:0000/ 0000 /0000")
+;; (ought nil "rgb: 0000 /0000 /0000")
+;; (ought nil "rgb:0//0")
+;; ;; rgbi: notation
+;; (ought '(0 0 0) "rgbi:0/0/0")
+;; (ought '(0 0 0) "rgbi:0.0/0.0/0.0")
+;; (ought '(0 0 0) "rgbi:0.0/0/0")
+;; (ought '(0 0 0) "rgbi:0.0/0/0")
+;; (ought '(0 0 0) "rgbi:0/0/0.")
+;; (ought '(0 0 0) "rgbi:0/0/0.0000")
+;; (ought '(0 0 0) "rgbi:0/0/.0")
+;; (ought '(0 0 0) "rgbi:0/0/.0000")
+;; (ought '(65535 0 0) "rgbi:1/0/0.0000")
+;; (ought '(65535 0 0) "rgbi:1./0/0.0000")
+;; (ought '(65535 0 0) "rgbi:1.0/0/0.0000")
+;; (ought '(65535 32768 0) "rgbi:1.0/0.5/0.0000")
+;; (ought '(6554 21843 65469) "rgbi:0.1/0.3333/0.999")
+;; (ought '(0 32768 6554) "rgbi:0/0.5/0.1")
+;; (ought '(66 655 65535) "rgbi:1e-3/1.0e-2/1e0")
+;; (ought '(6554 21843 65469) "rgbi:1e-1/+0.3333/0.00999e2")
+;; (ought nil "rgbi:1.0001/0/0")
+;; (ought nil "rgbi:2/0/0")
+;; (ought nil "rgbi:0.a/0/0")
+;; (ought nil "rgbi:./0/0")
+;; (ought nil "rgbi:./0/0")
+;; (ought nil " rgbi:0/0/0")
+;; (ought nil "rgbi:0/0/0 ")
+;; (ought nil " rgbi:0/0/0 ")
+;; (ought nil "rgbi:0 /0/ 0")
+;; (ought nil "rgbi:0/ 0 /0")
+;; (ought nil "rgbii:0/0/0")
+;; (ought nil "rgbi :0/0/0")
+;; ;; strtod ignores leading whitespace, making these legal colour
+;; ;; specifications:
+;; ;;
+;; ;; (ought nil "rgbi: 0/0/0")
+;; ;; (ought nil "rgbi: 0/ 0/ 0")
+;; (ought nil "rgbi : 0/0/0")
+;; (ought nil "rgbi:0/0.5/10"))
+
+;; (compat-deftests file-modes-number-to-symbolic
+;; (ought "-rwx------" #o700)
+;; (ought "-rwxrwx---" #o770)
+;; (ought "-rwx---rwx" #o707)
+;; (ought "-rw-r-xr--" #o654)
+;; (ought "--wx-w---x" #o321)
+;; (ought "drwx------" #o700 ?d)
+;; (ought "?rwx------" #o700 ??)
+;; (ought "lrwx------" #o120700)
+;; (ought "prwx------" #o10700)
+;; (ought "-rwx------" #o30700))
+
+;; (compat-deftests file-local-name
+;; (ought "" "")
+;; (ought "foo" "foo")
+;; (ought "/bar/foo" "/bar/foo")
+;; ;; These tests fails prior to Emacs 26, because /ssh:foo was a valid
+;; ;; TRAMP path back then.
+;; ;;
+;; ;; (ought "/ssh:foo" "/ssh:foo")
+;; ;; (ought "/ssh:/bar/foo" "/ssh:/bar/foo")
+;; (ought "foo" "/ssh::foo")
+;; (ought "/bar/foo" "/ssh::/bar/foo")
+;; (ought ":foo" "/ssh:::foo")
+;; (ought ":/bar/foo" "/ssh:::/bar/foo"))
+
+;; (compat-deftests file-name-quoted-p
+;; (ought nil "")
+;; (ought t "/:")
+;; (ought nil "//:")
+;; (ought t "/::")
+;; (ought nil "/ssh::")
+;; (ought nil "/ssh::a")
+;; (ought t "/ssh::/:a")
+;; ;; These tests fails prior to Emacs 26, because /ssh:foo was a valid
+;; ;; TRAMP path back then.
+;; ;;
+;; ;; (ought nil "/ssh:/:a")
+;; )
+
+;; (compat-deftests file-name-quote
+;; (ought "/:" "")
+;; (ought "/::" ":")
+;; (ought "/:/" "/")
+;; (ought "/:" "/:")
+;; (ought "/:a" "a")
+;; (ought "/::a" ":a")
+;; (ought "/:/a" "/a")
+;; (ought "/:a" "/:a")
+;; (ought (concat "/ssh:" (system-name) ":/:a") "/ssh::a"))
+
+;; (compat-deftests make-lock-file-name
+;; (ought (expand-file-name ".#") "")
+;; (ought (expand-file-name ".#a") "a")
+;; (ought (expand-file-name ".#foo") "foo")
+;; (ought (expand-file-name ".#.") ".")
+;; (ought (expand-file-name ".#.#") ".#")
+;; (ought (expand-file-name ".#.a") ".a")
+;; (ought (expand-file-name ".#.#") ".#")
+;; (ought (expand-file-name "a/.#") "a/")
+;; (ought (expand-file-name "a/.#b") "a/b")
+;; (ought (expand-file-name "a/.#.#") "a/.#")
+;; (ought (expand-file-name "a/.#.") "a/.")
+;; (ought (expand-file-name "a/.#.b") "a/.b")
+;; (ought (expand-file-name "a/.#foo") "a/foo")
+;; (ought (expand-file-name "bar/.#b") "bar/b")
+;; (ought (expand-file-name "bar/.#foo") "bar/foo"))
+
+;; (compat-deftests time-equal-p
+;; (ought t nil nil)
+
+;; ;; FIXME: Testing these values can be tricky, because the timestamp
+;; ;; might change between evaluating (current-time) and evaluating
+;; ;; `time-equal-p', especially in the interpreted compatibility
+;; ;; version.
+
+;; ;; (ought t (current-time) nil)
+;; ;; (ought t nil (current-time))
+
+;; ;; While `sleep-for' returns nil, indicating the current time, this
+;; ;; behaviour seems to be undefined. Relying on it is therefore not
+;; ;; advised.
+;; (ought nil (current-time) (ignore (sleep-for 0.01)))
+;; (ought nil (current-time) (progn
+;; (sleep-for 0.01)
+;; (current-time)))
+;; (ought t '(1 2 3 4) '(1 2 3 4))
+;; (ought nil '(1 2 3 4) '(1 2 3 5))
+;; (ought nil '(1 2 3 5) '(1 2 3 4))
+;; (ought nil '(1 2 3 4) '(1 2 4 4))
+;; (ought nil '(1 2 4 4) '(1 2 3 4))
+;; (ought nil '(1 2 3 4) '(1 3 3 4))
+;; (ought nil '(1 3 3 4) '(1 2 3 4))
+;; (ought nil '(1 2 3 4) '(2 2 3 4))
+;; (ought nil '(2 2 3 4) '(1 2 3 4)))
+
+;; (compat-deftests date-days-in-month
+;; (ought 31 2020 1)
+;; (ought 30 2020 4)
+;; (ought 29 2020 2)
+;; (ought 28 2021 2))
+
+;; (compat-deftests decoded-time-period
+;; (ought 0 '())
+;; (ought 0 '(0))
+;; (ought 1 '(1))
+;; (ought 0.125 '((1 . 8)))
+
+;; (ought 60 '(0 1))
+;; (ought 61 '(1 1))
+;; (ought -59 '(1 -1))
+
+;; (ought (* 60 60) '(0 0 1))
+;; (ought (+ (* 60 60) 60) '(0 1 1))
+;; (ought (+ (* 60 60) 120 1) '(1 2 1))
+
+;; (ought (* 60 60 24) '(0 0 0 1))
+;; (ought (+ (* 60 60 24) 1) '(1 0 0 1))
+;; (ought (+ (* 60 60 24) (* 60 60) 60 1) '(1 1 1 1))
+;; (ought (+ (* 60 60 24) (* 60 60) 120 1) '(1 2 1 1))
+
+;; (ought (* 60 60 24 30) '(0 0 0 0 1))
+;; (ought (+ (* 60 60 24 30) 1) '(1 0 0 0 1))
+;; (ought (+ (* 60 60 24 30) 60 1) '(1 1 0 0 1))
+;; (ought (+ (* 60 60 24 30) (* 60 60) 60 1)
+;; '(1 1 1 0 1))
+;; (ought (+ (* 60 60 24 30) (* 60 60 24) (* 60 60) 120 1)
+;; '(1 2 1 1 1))
+
+;; (ought (* 60 60 24 365) '(0 0 0 0 0 1))
+;; (ought (+ (* 60 60 24 365) 1)
+;; '(1 0 0 0 0 1))
+;; (ought (+ (* 60 60 24 365) 60 1)
+;; '(1 1 0 0 0 1))
+;; (ought (+ (* 60 60 24 365) (* 60 60) 60 1)
+;; '(1 1 1 0 0 1))
+;; (ought (+ (* 60 60 24 365) (* 60 60 24) (* 60 60) 60 1)
+;; '(1 1 1 1 0 1))
+;; (ought (+ (* 60 60 24 365)
+;; (* 60 60 24 30)
+;; (* 60 60 24)
+;; (* 60 60)
+;; 120 1)
+;; '(1 2 1 1 1 1))
+
+;; (expect wrong-type-argument 'a)
+;; (expect wrong-type-argument '(0 a))
+;; (expect wrong-type-argument '(0 0 a))
+;; (expect wrong-type-argument '(0 0 0 a))
+;; (expect wrong-type-argument '(0 0 0 0 a))
+;; (expect wrong-type-argument '(0 0 0 0 0 a)))
+
+;; ;; TODO func-arity seems broken
+;; ;; (compat-deftests func-arity
+;; ;; (should (equal '(0 . 0) (func-arity (lambda ()))))
+;; ;; (should (equal '(1 . 1) (func-arity (lambda (x) x))))
+;; ;; (should (equal '(1 . 2) (func-arity (lambda (x &optional _) x))))
+;; ;; (should (equal '(0 . many) (func-arity (lambda (&rest _)))))
+;; ;; (ought '(1 . 1) 'identity)
+;; ;; (ought '(0 . many) 'ignore)
+;; ;; (ought '(2 . many) 'defun)
+;; ;; (ought '(2 . 3) 'defalias)
+;; ;; (ought '(1 . unevalled) 'defvar))
+
+;; (compat-deftests subr-primitive-p
+;; (ought t (symbol-function 'identity)) ;function from fns.c
+;; (unless (fboundp 'subr-native-elisp-p)
+;; (ought nil (symbol-function 'match-string))) ;function from subr.el
+;; (ought nil (symbol-function 'defun)) ;macro from subr.el
+;; (ought nil nil))
+
+;; (compat-deftests file-name-absolute-p ;assuming unix
+;; (ought t "/")
+;; (ought t "/a")
+;; (ought nil "a")
+;; (ought nil "a/b")
+;; (ought nil "a/b/")
+;; (ought t "~")
+;; (when (version< "27.1" emacs-version)
+;; (ought t "~/foo")
+;; (ought nil "~foo")
+;; (ought nil "~foo/"))
+;; (ought t "~root")
+;; (ought t "~root/")
+;; (ought t "~root/file"))
+
+;; (let ((one (make-symbol "1"))
+;; (two (make-symbol "2"))
+;; (three (make-symbol "3"))
+;; (one.5 (make-symbol "1.5"))
+;; (eins (make-symbol "𝟙")))
+;; (put two 'derived-mode-parent one)
+;; (put one.5 'derived-mode-parent one)
+;; (put three 'derived-mode-parent two)
+;; (compat-deftests provided-mode-derived-p
+;; (ought one one one)
+;; (ought one two one)
+;; (ought one three one)
+;; (ought nil one eins)
+;; (ought nil two eins)
+;; (ought nil two one.5)
+;; (ought one two one.5 one)
+;; (ought two two one.5 two)
+;; (ought one three one.5 one)
+;; (ought two three one.5 one two)
+;; (ought two three one.5 two one)
+;; (ought three three one.5 two one three)
+;; (ought three three one.5 three two one)))
+
+;; (unless (fboundp 'make-prop-match)
+;; (defalias 'make-prop-match
+;; (if (version< emacs-version "26.1")
+;; #'compat--make-prop-match-with-vector
+;; #'compat--make-prop-match-with-record)))
+
+;; (ert-deftest compat-text-property-search-forward ()
+;; (when (fboundp 'text-property-search-forward)
+;; (with-temp-buffer
+;; (insert "one "
+;; (propertize "two " 'prop 'val)
+;; "three "
+;; (propertize "four " 'prop 'wert)
+;; "five ")
+;; (goto-char (point-min))
+;; (let ((match (text-property-search-forward 'prop)))
+;; (should (eq (prop-match-beginning match) 5))
+;; (should (eq (prop-match-end match) 9))
+;; (should (eq (prop-match-value match) 'val)))
+;; (let ((match (text-property-search-forward 'prop)))
+;; (should (eq (prop-match-beginning match) 15))
+;; (should (eq (prop-match-end match) 20))
+;; (should (eq (prop-match-value match) 'wert)))
+;; (should (null (text-property-search-forward 'prop)))
+;; (goto-char (point-min))
+;; (should (null (text-property-search-forward 'non-existant)))))
+;; (with-temp-buffer
+;; (insert "one "
+;; (propertize "two " 'prop 'val)
+;; "three "
+;; (propertize "four " 'prop 'wert)
+;; "five ")
+;; (goto-char (point-min))
+;; (let ((match (compat--t-text-property-search-forward 'prop)))
+;; (should (eq (compat--t-prop-match-beginning match) 5))
+;; (should (eq (compat--t-prop-match-end match) 9))
+;; (should (eq (compat--t-prop-match-value match) 'val)))
+;; (let ((match (compat--t-text-property-search-forward 'prop)))
+;; (should (eq (compat--t-prop-match-beginning match) 15))
+;; (should (eq (compat--t-prop-match-end match) 20))
+;; (should (eq (compat--t-prop-match-value match) 'wert)))
+;; (should (null (compat--t-text-property-search-forward 'prop)))
+;; (goto-char (point-min))
+;; (should (null (compat--t-text-property-search-forward 'non-existant)))))
+
+;; (ert-deftest compat-text-property-search-backward ()
+;; (when (fboundp 'text-property-search-backward)
+;; (with-temp-buffer
+;; (insert "one "
+;; (propertize "two " 'prop 'val)
+;; "three "
+;; (propertize "four " 'prop 'wert)
+;; "five ")
+;; (goto-char (point-max))
+;; (let ((match (text-property-search-backward 'prop)))
+;; (should (eq (prop-match-beginning match) 15))
+;; (should (eq (prop-match-end match) 20))
+;; (should (eq (prop-match-value match) 'wert)))
+;; (let ((match (text-property-search-backward 'prop)))
+;; (should (eq (prop-match-beginning match) 5))
+;; (should (eq (prop-match-end match) 9))
+;; (should (eq (prop-match-value match) 'val)))
+;; (should (null (text-property-search-backward 'prop)))
+;; (goto-char (point-max))
+;; (should (null (text-property-search-backward 'non-existant)))))
+;; (with-temp-buffer
+;; (insert "one "
+;; (propertize "two " 'prop 'val)
+;; "three "
+;; (propertize "four " 'prop 'wert)
+;; "five ")
+;; (goto-char (point-max))
+;; (let ((match (compat--t-text-property-search-backward 'prop)))
+;; (should (eq (compat--t-prop-match-beginning match) 15))
+;; (should (eq (compat--t-prop-match-end match) 20))
+;; (should (eq (compat--t-prop-match-value match) 'wert)))
+;; (let ((match (compat--t-text-property-search-backward 'prop)))
+;; (should (eq (compat--t-prop-match-beginning match) 5))
+;; (should (eq (compat--t-prop-match-end match) 9))
+;; (should (eq (compat--t-prop-match-value match) 'val)))
+;; (should (null (compat--t-text-property-search-backward 'prop)))
+;; (goto-char (point-max))
+;; (should (null (compat--t-text-property-search-backward
'non-existant)))))
(provide 'compat-tests)
;;; compat-tests.el ends here