diff options
| author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2025-02-21 14:05:46 +0000 | 
|---|---|---|
| committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2025-02-21 14:11:08 +0000 | 
| commit | 1edd618b42821f26b0a31ae63f393c09259c046b (patch) | |
| tree | 9ec1f025dc400750671fa3cad9183955214cf8b6 | |
| parent | dc6b2f701bd1cc36a55039f7fc36ac48a3d439df (diff) | |
| download | cantedraw-1edd618b42821f26b0a31ae63f393c09259c046b.tar.gz cantedraw-1edd618b42821f26b0a31ae63f393c09259c046b.tar.bz2 cantedraw-1edd618b42821f26b0a31ae63f393c09259c046b.zip  | |
Add unit tests for lib.functions.rev-map
| -rw-r--r-- | lib/functions.lisp | 4 | ||||
| -rw-r--r-- | tests/functions.lisp | 30 | 
2 files changed, 32 insertions, 2 deletions
diff --git a/lib/functions.lisp b/lib/functions.lisp index 073e34a..4e18a0a 100644 --- a/lib/functions.lisp +++ b/lib/functions.lisp @@ -37,11 +37,11 @@ each member is STEP distance apart."            (subseq lst n)))  (fn rev-map (indicator lst &key (key-eq #'eq)) -    (-> (function list &key (:key-eq function)) list) +    (-> (function sequence &key (:key-eq function)) list)    "Given LST and INDICATOR: LST -> A, return an association list A -> 2^LST  where key x in A has associations {y in LST : INDICATOR(y) = x}."    (loop :with assoc-list := nil -        :for element :in lst +        :for element :in (coerce lst 'list)          :for key := (funcall indicator element)          :if (assoc key assoc-list :test key-eq)            :do (->> (alist-val key assoc-list) diff --git a/tests/functions.lisp b/tests/functions.lisp index bfb7277..b629c1f 100644 --- a/tests/functions.lisp +++ b/tests/functions.lisp @@ -63,3 +63,33 @@    (is-values (split 5 "Hello World")      (string= "Hello")      (string= " World"))) + +(define-test (function-test rev-map) +  :depends-on (range) +  :compile-at :execute +  (fail (rev-map nil nil)) +  (fail (rev-map "a string" "another string" :key-eq "not a function")) +  (true (->> nil (rev-map #'identity) null)) +  (let ((res (rev-map #'evenp (range 1 7)))) +    (false (null res)) +    (is equal 2 (length res)) +    (is equal 3 (->> (assoc t res) cdr length)) +    (is equal 3 (->> (assoc nil res) cdr length)) +    (true (->> (assoc t res) cdr (every #'evenp))) +    (true (->> (assoc nil res) cdr (every #'oddp)))) +  (let* ((mod* (lambda (n) (mod n 3))) +         (res (rev-map mod* (range 1 12)))) +    (false (null res)) +    (is equal 3 (length res)) +    (is equal 3 (->> (assoc 0 res) cdr length)) +    (is equal 4 (->> (assoc 1 res) cdr length)) +    (is equal 4 (->> (assoc 2 res) cdr length)) +    (true (->> (assoc 0 res) cdr (every (lambda (x) (= (mod x 3) 0))))) +    (true (->> (assoc 1 res) cdr (every (lambda (x) (= (mod x 3) 1))))) +    (true (->> (assoc 2 res) cdr (every (lambda (x) (= (mod x 3) 2)))))) +  (let ((res (rev-map #'identity "lots of letters"))) +    (false (null res)) +    (is equal 2 (->> (assoc #\l res) cdr length)) +    (is equal 3 (->> (assoc #\t res) cdr length)) +    (is equal 2 (->> (assoc #\space res) cdr length)) +    (is equal 2 (->> (assoc #\s res) cdr length))))  | 
