2016-08-05 19:59:52 -04:00
|
|
|
;;; cl-extra-tests.el --- tests for emacs-lisp/cl-extra.el -*- lexical-binding:t -*-
|
|
|
|
|
2023-01-01 05:31:12 -05:00
|
|
|
;; Copyright (C) 2013-2023 Free Software Foundation, Inc.
|
2016-08-05 19:59:52 -04:00
|
|
|
|
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
|
2021-02-08 09:03:27 +01:00
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
|
|
|
;; it under the terms of the GNU General Public License as published by
|
|
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
|
|
;; (at your option) any later version.
|
|
|
|
|
|
|
|
;; GNU Emacs is distributed in the hope that it will be useful,
|
|
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
;; GNU General Public License for more details.
|
|
|
|
|
2016-08-05 19:59:52 -04:00
|
|
|
;; You should have received a copy of the GNU General Public License
|
2021-02-08 09:03:27 +01:00
|
|
|
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
2016-08-05 19:59:52 -04:00
|
|
|
|
|
|
|
;;; Code:
|
|
|
|
|
|
|
|
(require 'cl-lib)
|
|
|
|
(require 'ert)
|
|
|
|
|
|
|
|
(ert-deftest cl-get ()
|
|
|
|
(put 'cl-get-test 'x 1)
|
|
|
|
(put 'cl-get-test 'y nil)
|
|
|
|
(should (eq (cl-get 'cl-get-test 'x) 1))
|
|
|
|
(should (eq (cl-get 'cl-get-test 'y :none) nil))
|
|
|
|
(should (eq (cl-get 'cl-get-test 'z :none) :none)))
|
|
|
|
|
|
|
|
(ert-deftest cl-getf ()
|
|
|
|
(let ((plist '(x 1 y nil)))
|
|
|
|
(should (eq (cl-getf plist 'x) 1))
|
Audit some plist uses with new predicate argument
* doc/lispref/lists.texi (Plist Access): Improve description of
default predicate.
* lisp/emacs-lisp/cl-extra.el (cl-getf, cl--set-getf): Assume
plist-member always returns a cons.
* lisp/emacs-lisp/gv.el (plist-get): Support new optional predicate
argument (bug#47425#91).
* lisp/emacs-lisp/map.el: Bump minor version.
(map--dispatch): Remove now that bug#58563 is fixed. Break two
remaining uses out into corresponding cl-defmethods.
(map--plist-p): Add docstring.
(map--plist-has-predicate, map--plist-member-1, map--plist-member)
(map--plist-put-1, map--plist-put): New definitions for supporting
predicate argument backward compatibly.
(map-elt): Fix generalized variable getter under a
predicate (bug#58531). Use predicate when given a plist.
(map-put): Avoid gratuitous warnings when called without the hidden
predicate argument. Improve obsoletion message.
(map-put!): Use predicate when given a plist.
(map-contains-key): Ditto. Declare forgotten
advertised-calling-convention (bug#58531#19).
(map--put): Group definition in file together with that of map-put!.
* lisp/files-x.el (connection-local-normalize-criteria): Simplify
using mapcan + plist-get.
* lisp/net/eudc.el (eudc--plist-member): New convenience function.
(eudc-plist-member, eudc-plist-get, eudc-lax-plist-get): Use it
instead of open-coding plist-member.
* src/fns.c (Fplist_get, plist_get, Fplist_put, plist_put): Pass the
plist element as the first argument to the predicate, for
consistency with assoc + alist-get.
(Fplist_member, plist_member): Move from widget to plist section.
Open-code the EQ case in plist_member, and call it from
Fplist_member in that case, rather than the other way around.
* test/lisp/apropos-tests.el (apropos-tests-format-plist): Avoid
polluting obarray.
* test/lisp/emacs-lisp/cl-extra-tests.el (cl-getf): Extend test with
generalized variables, degenerate plists, and improper lists.
* test/lisp/emacs-lisp/gv-tests.el: Byte-compile file; in the
meantime bug#24402 seems to have been fixed or worked around.
(gv-setter-edebug): Inhibit printing messages.
(gv-plist-get): Avoid modifying constant literals. Also test with a
predicate argument.
* test/lisp/emacs-lisp/map-tests.el (with-maps-do): Simplify
docstring.
(test-map-elt-testfn): Rename...
(test-map-elt-testfn-alist): ...to this. Also test with a predicate
argument.
(test-map-elt-testfn-plist, test-map-elt-gv, test-map-elt-signature)
(test-map-put!-plist, test-map-put!-signature)
(test-map-contains-key-signature, test-map-plist-member)
(test-map-plist-put): New tests.
(test-map-contains-key-testfn): Also test with a predicate argument.
(test-map-setf-alist-overwrite-key, test-map-setf-plist-insert-key)
(test-map-setf-plist-overwrite-key): Avoid modifying constant
literals.
(test-hash-table-setf-insert-key)
(test-hash-table-setf-overwrite-key): Fix indentation.
(test-setf-map-with-function): Make test more precise.
* test/lisp/net/eudc-tests.el: New file.
* test/lisp/subr-tests.el (test-plistp): Extend test with circular
list.
* test/src/fns-tests.el (test-cycle-equal, test-cycle-nconc): Move
from plist section to circular list section.
(plist-put/odd-number-of-elements): Avoid modifying constant
literals.
(plist-member/improper-list): Simplify.
(test-plist): Move to plist section. Also test with a predicate
argument.
2022-08-20 16:32:33 +03:00
|
|
|
(should-not (cl-getf plist 'y :none))
|
|
|
|
(should (eq (cl-getf plist 'z :none) :none))
|
|
|
|
(should (eq (cl-incf (cl-getf plist 'x 10) 2) 3))
|
|
|
|
(should (equal plist '(x 3 y nil)))
|
|
|
|
(should-error (cl-incf (cl-getf plist 'y 10) 4) :type 'wrong-type-argument)
|
|
|
|
(should (equal plist '(x 3 y nil)))
|
|
|
|
(should (eq (cl-incf (cl-getf plist 'z 10) 5) 15))
|
|
|
|
(should (equal plist '(z 15 x 3 y nil))))
|
|
|
|
(let ((plist '(x 1 y)))
|
|
|
|
(should (eq (cl-getf plist 'x) 1))
|
|
|
|
(should (eq (cl-getf plist 'y :none) :none))
|
|
|
|
(should (eq (cl-getf plist 'z :none) :none))
|
|
|
|
(should (eq (cl-incf (cl-getf plist 'x 10) 2) 3))
|
|
|
|
(should (equal plist '(x 3 y)))
|
|
|
|
(should (eq (cl-incf (cl-getf plist 'y 10) 4) 14))
|
|
|
|
(should (equal plist '(y 14 x 3 y))))
|
|
|
|
(let ((plist '(x 1 y . 2)))
|
|
|
|
(should (eq (cl-getf plist 'x) 1))
|
|
|
|
(should (eq (cl-incf (cl-getf plist 'x 10) 2) 3))
|
|
|
|
(should (equal plist '(x 3 y . 2)))
|
|
|
|
(should-error (cl-getf plist 'y :none) :type 'wrong-type-argument)
|
|
|
|
(should-error (cl-getf plist 'z :none) :type 'wrong-type-argument)))
|
2016-08-05 19:59:52 -04:00
|
|
|
|
2017-02-27 16:32:10 +09:00
|
|
|
(ert-deftest cl-extra-test-mapc ()
|
|
|
|
(let ((lst '(a b c))
|
|
|
|
(lst2 '(d e f))
|
|
|
|
(lst3 '(1 2 3))
|
|
|
|
(fn1 (lambda (_x) nil))
|
|
|
|
(fn2 (lambda (_x _y) nil))
|
|
|
|
(fn3 (lambda (_x _y _z) nil)))
|
|
|
|
(should (equal lst (cl-mapc fn1 lst)))
|
|
|
|
(should (equal lst (cl-mapc fn2 lst lst2)))
|
|
|
|
(should (equal lst (cl-mapc fn3 lst lst2 lst3)))))
|
|
|
|
|
|
|
|
(ert-deftest cl-extra-test-mapl ()
|
|
|
|
(let ((lst '(a b c))
|
|
|
|
(lst2 '(d e f))
|
|
|
|
(lst3 '(1 2 3))
|
|
|
|
(fn1 (lambda (x) (should (consp x))))
|
|
|
|
(fn2 (lambda (x y) (should (and (consp x) (consp y)))))
|
|
|
|
(fn3 (lambda (x y z) (should (and (consp x) (consp y) (consp z))))))
|
|
|
|
(should (equal lst (cl-mapl fn1 lst)))
|
|
|
|
(should (equal lst (cl-mapl fn2 lst lst2)))
|
|
|
|
(should (equal lst (cl-mapl fn3 lst lst2 lst3)))))
|
|
|
|
|
|
|
|
(ert-deftest cl-extra-test-mapcar ()
|
|
|
|
(let ((lst '(a b c))
|
|
|
|
(lst2 '(d e f))
|
|
|
|
(lst3 '(1 2 3))
|
|
|
|
(fn1 (lambda (x) x))
|
|
|
|
(fn2 (lambda (_x y) y))
|
|
|
|
(fn3 (lambda (_x _y z) z)))
|
|
|
|
(should (equal lst (cl-mapcar fn1 lst)))
|
|
|
|
(should (equal lst2 (cl-mapcar fn2 lst lst2)))
|
|
|
|
(should (equal lst3 (cl-mapcar fn3 lst lst2 lst3)))))
|
|
|
|
|
|
|
|
(ert-deftest cl-extra-test-map ()
|
|
|
|
(let ((lst '(a b c))
|
|
|
|
(lst2 '(d e f))
|
|
|
|
(lst3 '(1 2 3))
|
|
|
|
(fn1 (lambda (x) x))
|
|
|
|
(fn2 (lambda (_x y) y))
|
|
|
|
(fn3 (lambda (x _y _z) (string-to-char (format "%S" x)))))
|
|
|
|
(should (equal lst (cl-map 'list fn1 lst)))
|
|
|
|
(should (equal (vconcat lst2) (cl-map 'vector fn2 lst lst2)))
|
2022-09-08 16:08:42 -04:00
|
|
|
(should (equal (mapconcat (lambda (x) (format "%S" x)) lst)
|
2017-02-27 16:32:10 +09:00
|
|
|
(cl-map 'string fn3 lst lst2 lst3)))))
|
|
|
|
|
|
|
|
(ert-deftest cl-extra-test-maplist ()
|
|
|
|
(let ((lst '(a b c))
|
|
|
|
(lst2 '(d e f))
|
|
|
|
(lst3 '(1 2 3))
|
|
|
|
(fn1 (lambda (x) (should (consp x)) x))
|
|
|
|
(fn2 (lambda (x y) (should (and (consp x) (consp y))) y))
|
|
|
|
(fn3 (lambda (x y z) (should (and (consp x) (consp y) (consp z))) z)))
|
|
|
|
(should (equal (list lst (cdr lst) (cddr lst))
|
|
|
|
(cl-maplist fn1 lst)))
|
|
|
|
(should (equal (list lst2 (cdr lst2) (cddr lst2))
|
|
|
|
(cl-maplist fn2 lst lst2)))
|
|
|
|
(should (equal (list lst3 (cdr lst3) (cddr lst3))
|
|
|
|
(cl-maplist fn3 lst lst2 lst3)))))
|
|
|
|
|
2018-12-19 13:42:21 -08:00
|
|
|
(ert-deftest cl-extra-test-cl-make-random-state ()
|
|
|
|
(let ((s (cl-make-random-state)))
|
|
|
|
;; Test for Bug#33731.
|
|
|
|
(should-not (eq s (cl-make-random-state s)))))
|
|
|
|
|
2020-03-22 07:48:14 -04:00
|
|
|
(ert-deftest cl-concatenate ()
|
|
|
|
(should (equal (cl-concatenate 'list '(1 2 3) '(4 5 6))
|
|
|
|
'(1 2 3 4 5 6)))
|
|
|
|
(should (equal (cl-concatenate 'vector [1 2 3] [4 5 6])
|
|
|
|
[1 2 3 4 5 6]))
|
|
|
|
(should (equal (cl-concatenate 'string "123" "456")
|
|
|
|
"123456")))
|
|
|
|
|
2016-08-05 19:59:52 -04:00
|
|
|
;;; cl-extra-tests.el ends here
|