diff options
| author | Stefan Monnier | 2015-01-14 14:37:10 -0500 |
|---|---|---|
| committer | Stefan Monnier | 2015-01-14 14:37:10 -0500 |
| commit | 9def17e92bbb61e877bf092b562a92946cf43210 (patch) | |
| tree | 5af1af25989bb45fcf7029fbf9ebf66281466232 /test | |
| parent | e7db8e8d5de70be5e047c961cdfbf692d52e33c6 (diff) | |
| download | emacs-9def17e92bbb61e877bf092b562a92946cf43210.tar.gz emacs-9def17e92bbb61e877bf092b562a92946cf43210.zip | |
* lisp/emacs-lisp/cl-generic.el: New file.
* lisp/emacs-lisp/cl-macs.el (cl-flet): Allow (FUN EXP) forms.
(cl-load-time-value, cl-labels): Use closures rather than
backquoted lambdas.
(cl-macrolet): Use `eval' to create the function value, and support CL
style arguments in for the defined macros.
* test/automated/cl-generic-tests.el: New file.
Diffstat (limited to 'test')
| -rw-r--r-- | test/ChangeLog | 4 | ||||
| -rw-r--r-- | test/automated/cl-generic-tests.el | 131 |
2 files changed, 135 insertions, 0 deletions
diff --git a/test/ChangeLog b/test/ChangeLog index 83bb8bf00c7..211a06c2cbd 100644 --- a/test/ChangeLog +++ b/test/ChangeLog | |||
| @@ -1,3 +1,7 @@ | |||
| 1 | 2015-01-14 Stefan Monnier <monnier@iro.umontreal.ca> | ||
| 2 | |||
| 3 | * automated/cl-generic-tests.el: New file. | ||
| 4 | |||
| 1 | 2015-01-08 Stefan Monnier <monnier@iro.umontreal.ca> | 5 | 2015-01-08 Stefan Monnier <monnier@iro.umontreal.ca> |
| 2 | 6 | ||
| 3 | * automated/eieio-tests.el (eieio-test-23-inheritance-check): Don't use | 7 | * automated/eieio-tests.el (eieio-test-23-inheritance-check): Don't use |
diff --git a/test/automated/cl-generic-tests.el b/test/automated/cl-generic-tests.el new file mode 100644 index 00000000000..5c5e5d1c7ce --- /dev/null +++ b/test/automated/cl-generic-tests.el | |||
| @@ -0,0 +1,131 @@ | |||
| 1 | ;;; cl-generic-tests.el --- Tests for cl-generic.el functionality -*- lexical-binding: t; -*- | ||
| 2 | |||
| 3 | ;; Copyright (C) 2015 Stefan Monnier | ||
| 4 | |||
| 5 | ;; Author: Stefan Monnier <monnier@iro.umontreal.ca> | ||
| 6 | |||
| 7 | ;; This program is free software; you can redistribute it and/or modify | ||
| 8 | ;; it under the terms of the GNU General Public License as published by | ||
| 9 | ;; the Free Software Foundation, either version 3 of the License, or | ||
| 10 | ;; (at your option) any later version. | ||
| 11 | |||
| 12 | ;; This program is distributed in the hope that it will be useful, | ||
| 13 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | ;; GNU General Public License for more details. | ||
| 16 | |||
| 17 | ;; You should have received a copy of the GNU General Public License | ||
| 18 | ;; along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 19 | |||
| 20 | ;;; Commentary: | ||
| 21 | |||
| 22 | ;;; Code: | ||
| 23 | |||
| 24 | (require 'ert) | ||
| 25 | (require 'cl-lib) | ||
| 26 | |||
| 27 | (cl-defgeneric cl--generic-1 (x y)) | ||
| 28 | (cl-defgeneric (setf cl--generic-1) (v y z) "My generic doc.") | ||
| 29 | |||
| 30 | (ert-deftest cl-generic-test-0 () | ||
| 31 | (cl-defgeneric cl--generic-1 (x y)) | ||
| 32 | (cl-defmethod cl--generic-1 ((x t) y) (cons x y)) | ||
| 33 | (should (equal (cl--generic-1 'a 'b) '(a . b)))) | ||
| 34 | |||
| 35 | (ert-deftest cl-generic-test-1-eql () | ||
| 36 | (cl-defgeneric cl--generic-1 (x y)) | ||
| 37 | (cl-defmethod cl--generic-1 ((x t) y) (cons x y)) | ||
| 38 | (cl-defmethod cl--generic-1 ((_x (eql 4)) _y) | ||
| 39 | (cons "quatre" (cl-call-next-method))) | ||
| 40 | (cl-defmethod cl--generic-1 ((_x (eql 5)) _y) | ||
| 41 | (cons "cinq" (cl-call-next-method))) | ||
| 42 | (cl-defmethod cl--generic-1 ((_x (eql 6)) y) | ||
| 43 | (cons "six" (cl-call-next-method 'a y))) | ||
| 44 | (should (equal (cl--generic-1 'a nil) '(a))) | ||
| 45 | (should (equal (cl--generic-1 4 nil) '("quatre" 4))) | ||
| 46 | (should (equal (cl--generic-1 5 nil) '("cinq" 5))) | ||
| 47 | (should (equal (cl--generic-1 6 nil) '("six" a)))) | ||
| 48 | |||
| 49 | (cl-defstruct cl-generic-struct-parent a b) | ||
| 50 | (cl-defstruct (cl-generic-struct-child1 (:include cl-generic-struct-parent)) c) | ||
| 51 | (cl-defstruct (cl-generic-struct-child11 (:include cl-generic-struct-child1)) d) | ||
| 52 | (cl-defstruct (cl-generic-struct-child2 (:include cl-generic-struct-parent)) e) | ||
| 53 | |||
| 54 | (ert-deftest cl-generic-test-2-struct () | ||
| 55 | (cl-defgeneric cl--generic-1 (x y) "My doc.") | ||
| 56 | (cl-defmethod cl--generic-1 ((x t) y) "Doc 1." (cons x y)) | ||
| 57 | (cl-defmethod cl--generic-1 ((_x cl-generic-struct-parent) y) | ||
| 58 | "Doc 2." (cons "parent" (cl-call-next-method 'a y))) | ||
| 59 | (cl-defmethod cl--generic-1 ((_x cl-generic-struct-child1) _y) | ||
| 60 | (cons "child1" (cl-call-next-method))) | ||
| 61 | (cl-defmethod cl--generic-1 :around ((_x t) _y) | ||
| 62 | (cons "around" (cl-call-next-method))) | ||
| 63 | (cl-defmethod cl--generic-1 :around ((_x cl-generic-struct-child11) _y) | ||
| 64 | (cons "child11" (cl-call-next-method))) | ||
| 65 | (cl-defmethod cl--generic-1 ((_x cl-generic-struct-child2) _y) | ||
| 66 | (cons "child2" (cl-call-next-method))) | ||
| 67 | (should (equal (cl--generic-1 (make-cl-generic-struct-child1) nil) | ||
| 68 | '("around" "child1" "parent" a))) | ||
| 69 | (should (equal (cl--generic-1 (make-cl-generic-struct-child2) nil) | ||
| 70 | '("around""child2" "parent" a))) | ||
| 71 | (should (equal (cl--generic-1 (make-cl-generic-struct-child11) nil) | ||
| 72 | '("child11" "around""child1" "parent" a)))) | ||
| 73 | |||
| 74 | (ert-deftest cl-generic-test-3-setf () | ||
| 75 | (cl-defmethod (setf cl--generic-1) (v (y t) z) (list v y z)) | ||
| 76 | (cl-defmethod (setf cl--generic-1) (v (_y (eql 4)) z) (list v "four" z)) | ||
| 77 | (should (equal (setf (cl--generic-1 'a 'b) 'v) '(v a b))) | ||
| 78 | (should (equal (setf (cl--generic-1 4 'b) 'v) '(v "four" b))) | ||
| 79 | (let ((x ())) | ||
| 80 | (should (equal (setf (cl--generic-1 (progn (push 1 x) 'a) | ||
| 81 | (progn (push 2 x) 'b)) | ||
| 82 | (progn (push 3 x) 'v)) | ||
| 83 | '(v a b))) | ||
| 84 | (should (equal x '(3 2 1))))) | ||
| 85 | |||
| 86 | (ert-deftest cl-generic-test-4-overlapping-tagcodes () | ||
| 87 | (cl-defgeneric cl--generic-1 (x y) "My doc.") | ||
| 88 | (cl-defmethod cl--generic-1 ((y t) z) (list y z)) | ||
| 89 | (cl-defmethod cl--generic-1 ((_y (eql 4)) _z) | ||
| 90 | (cons "four" (cl-call-next-method))) | ||
| 91 | (cl-defmethod cl--generic-1 ((_y integer) _z) | ||
| 92 | (cons "integer" (cl-call-next-method))) | ||
| 93 | (cl-defmethod cl--generic-1 ((_y number) _z) | ||
| 94 | (cons "number" (cl-call-next-method))) | ||
| 95 | (should (equal (cl--generic-1 'a 'b) '(a b))) | ||
| 96 | (should (equal (cl--generic-1 1 'b) '("integer" "number" 1 b))) | ||
| 97 | (should (equal (cl--generic-1 4 'b) '("four" "integer" "number" 4 b)))) | ||
| 98 | |||
| 99 | (ert-deftest cl-generic-test-5-alias () | ||
| 100 | (cl-defgeneric cl--generic-1 (x y) "My doc.") | ||
| 101 | (defalias 'cl--generic-2 #'cl--generic-1) | ||
| 102 | (cl-defmethod cl--generic-1 ((y t) z) (list y z)) | ||
| 103 | (cl-defmethod cl--generic-2 ((_y (eql 4)) _z) | ||
| 104 | (cons "four" (cl-call-next-method))) | ||
| 105 | (should (equal (cl--generic-1 4 'b) '("four" 4 b)))) | ||
| 106 | |||
| 107 | (ert-deftest cl-generic-test-6-multiple-dispatch () | ||
| 108 | (cl-defgeneric cl--generic-1 (x y) "My doc.") | ||
| 109 | (cl-defmethod cl--generic-1 (x y) (list x y)) | ||
| 110 | (cl-defmethod cl--generic-1 (_x (_y integer)) | ||
| 111 | (cons "y-int" (cl-call-next-method))) | ||
| 112 | (cl-defmethod cl--generic-1 ((_x integer) _y) | ||
| 113 | (cons "x-int" (cl-call-next-method))) | ||
| 114 | (cl-defmethod cl--generic-1 ((_x integer) (_y integer)) | ||
| 115 | (cons "x&y-int" (cl-call-next-method))) | ||
| 116 | (should (equal (cl--generic-1 1 2) '("x&y-int" "x-int" "y-int" 1 2)))) | ||
| 117 | |||
| 118 | (ert-deftest cl-generic-test-7-apo () | ||
| 119 | (cl-defgeneric cl--generic-1 (x y) | ||
| 120 | (:documentation "My doc.") (:argument-precedence-order y x)) | ||
| 121 | (cl-defmethod cl--generic-1 (x y) (list x y)) | ||
| 122 | (cl-defmethod cl--generic-1 (_x (_y integer)) | ||
| 123 | (cons "y-int" (cl-call-next-method))) | ||
| 124 | (cl-defmethod cl--generic-1 ((_x integer) _y) | ||
| 125 | (cons "x-int" (cl-call-next-method))) | ||
| 126 | (cl-defmethod cl--generic-1 ((_x integer) (_y integer)) | ||
| 127 | (cons "x&y-int" (cl-call-next-method))) | ||
| 128 | (should (equal (cl--generic-1 1 2) '("x&y-int" "y-int" "x-int" 1 2)))) | ||
| 129 | |||
| 130 | (provide 'cl-generic-tests) | ||
| 131 | ;;; cl-generic-tests.el ends here | ||