aboutsummaryrefslogtreecommitdiff
path: root/tests/functions.lisp
blob: ac8599d5d841a24de3a00c53d0871802ce89dc64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
;;; functions.lisp - 2025-02-20

;; Copyright (C) 2025 Aryadev Chavali

;; This program 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 Version 2 for
;; details.

;; You may distribute and modify this code under the terms of the GNU General
;; Public License Version 2, which you should have received a copy of along with
;; this program.  If not, please go to <https://www.gnu.org/licenses/>.

;;; Code:

(defpackage cantedraw/tests/functions
  (:use
   :cl :parachute :cantedraw.lib.macros
   :cantedraw.lib.functions))

(in-package :cantedraw/tests/functions)

(define-test function-test
  :depends-on ((cantedraw/tests/macros macro-test)))

(define-test (function-test "parse-integer*")
  :compile-at :execute
  (is eq 2    (parse-integer* "2"))
  (is eq 2048 (parse-integer* "2048abcdef"))
  (is eq nil    (parse-integer* "a2048abcdef"))
  (is eq nil    (parse-integer* "garbage"))
  (fail       (parse-integer* nil)))

(define-test (function-test range)
  :compile-at :execute
  (fail (range 1 0))
  (fail (range nil nil))
  (fail (range "a" "b"))
  (true (null (range 1 1)))
  (is equal '(1 2 3 4)    (range 1 5))
  (is equal '(-3 -2 -1 0) (range -3 1)))

(define-test (function-test take)
  :compile-at :execute
  (fail (take nil nil))
  (fail (take 100 nil))
  (fail (take nil 100))
  (true (->> (list 1 2 3 4) (take 0) null))
  (is equal "H" (take 1 "Hello"))
  (is equal '(1 2) (take 2 '(1 2 3 4 5))))

(define-test (function-test split)
  :compile-at :execute
  (fail (split nil nil))
  (fail (split 100 nil))
  (fail (split nil 100))
  (is-values (split 0 '(1 2 3 4))
    (eq nil)
    (equal '(1 2 3 4)))
  (is-values (split 1 '(1 2 3 4))
    (equal '(1))
    (equal '(2 3 4)))
  (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))))

(define-test (function-test remove-at-indices)
  :depends-on (range)
  :compile-at :execute
  (fail (remove-at-indices "a string" "another string"))
  (true (null (remove-at-indices nil nil)))
  (is equal '(1 2 3) (remove-at-indices nil '(1 2 3)))
  (is equal '(2) (remove-at-indices '(0 2) '(1 2 3)))
  (let* ((inp (range 100 200))
         (t1 (remove-at-indices (range 0 100 2) inp))
         (t2 (remove-at-indices (range 1 100 2) inp)))
    (is equal 50 (length t1))
    (is equal 50 (length t2))
    (true (every (lambda (n) (not (member n t2))) t1))
    (true (every (lambda (n) (not (member n t1))) t2)))
  (let* ((indices (list 0 5 6 7 8 9 10))
         (str-lst (remove-at-indices indices "Hello World"))
         (ret (coerce str-lst 'string)))
    (is string= "ello" ret)))