changelog shortlog graph tags branches changeset files revisions annotate raw help

Mercurial > core / lisp/std/tests/pkg.lisp

changeset 698: 96958d3eb5b0
parent: f51b73f49946
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
1 ;;; tests.lisp --- std system tests
2 
3 ;;; Commentary:
4 
5 ;; TODO: fix false positives when using (eval-test)
6 
7 ;;; Code:
8 (in-package :std-int)
9 (defpkg :std/tests
10  (:use :cl :std :rt :sb-thread :std/fu))
11 (in-package :std/tests)
12 (defsuite :std)
13 (in-suite :std)
14 (in-readtable :std)
15 ;; prevent threadlocks
16 ;; (setf sb-unix::*on-dangerous-wait* :error)
17 
18 ;; TODO 2024-05-14: fix compilation order of std/fu vs std/readtables
19 (deftest readtables (:skip nil)
20  "Test :std readtable"
21  (is (typep #`(,a1 ,a1 ',a1 ,@a1) 'function))
22  (is (string= #"test "foo" "# "test \"foo\" "))
23  ;; from curry-compose-reader-macros test suite
24  (is (equal (funcall {list 1} 2) '(1 2))) ;; curry.1
25  (is (equal (mapcar {+ 1} '(1 2 3 4)) '(2 3 4 5))) ;; curry.2
26  (is (equal (funcall {1 list 1} 2) '(1 2))) ;; curry.fixed-arity
27  (is (equal (funcall {2 list _ 2} 3 4) '(3 4 2))) ;; curry.fixed-arity.2
28  (signals error
29  (let ((f {1 list 1}))
30  (progn (funcall f) nil))) ;; curry.fixed-arity.1
31  (signals error
32  (locally (declare (optimize safety))
33  (let ((f {1 list 1}))
34  (progn (funcall f 'a 'b) nil)))) ;; curry.fixed-arity-error.2
35  (is (equal (funcall {list _ 1} 2) '(2 1))) ;; rcurry.1
36  (is (equal (mapcar {- _ 1} '(1 2 3 4)) '(0 1 2 3))) ;; rcurry.2
37  (is (equal (funcall [{* 3} #'1+] 1) 6)) ;; compose.1
38  (is (equal (funcall ['1+ '1+] 1) 3)) ;; compose.2
39  (is (equal (funcall [#'1+] 1) 2)) ;; compose.3
40  (is (equal (funcall [#'values] 1 2 3) (values 1 2 3))) ;; compose.4
41  (is (equal (funcall «list {* 2} {* 3}» 4) '(8 12))) ;; join.1
42  (is (equal (mapcar «and {< 2} 'evenp (constantly t)» '(1 2 3 4)) (list nil nil nil t))) ;; join.2
43  ;; typecase-bracket
44  (is (equal (mapcar typecase (number #'1+) (string :str) '(1 "this" 2 "that")) '(2 :str 3 :str)))
45  ;; cond-bracket
46  (is (equal (mapcar cond (#'evenp {+ 100}) (#'oddp {+ 200}) '(1 2 3 4)) '(201 102 203 104)))
47  ;; if-bracket
48  (is (equal (mapcar if #'evenp {list :a} {list :b} '(1 2 3 4))
49  '((:b 1) (:a 2) (:b 3) (:a 4))))
50  ;; when-bracket
51  (is (equal (mapcar when 'evenp {+ 4} '(1 2 3 4)) (list nil 6 nil 8)))
52  ;; unless-bracket
53  (is (equal (mapcar unless 'evenp {+ 4} '(1 2 3 4)) (list 5 nil 7 nil))))
54 
55 (deftest sym ()
56  "Test standard symbol utils"
57  ;; gensyms
58  (is (not (equalp (make-gensym 'a) (make-gensym 'a))))
59  (is (eq 'std/tests::foo (format-symbol :std/tests "~A" 'foo)))
60  (is (eq (make-keyword 'fizz) :fizz)))
61 
62 ;;;; TODO
63 (deftest string ()
64  "Test standard string utils"
65  (is (typep "test" 'string-designator))
66  (is (typep 'test 'string-designator))
67  (is (typep #\C 'string-designator))
68  (is (not (typep 0 'string-designator))))
69 
70 (deftest list ()
71  "Test standard list utils"
72  ;; same object - a literal
73  (is (eq (ensure-car '(0)) (ensure-car 0)))
74  (is (eq (ensure-car '(nil)) (ensure-car nil)))
75  ;; different objects
76  (is (not (eq (ensure-cons 0) (ensure-cons 0))))
77  (is (equal (ensure-cons 0) (ensure-cons 0))))
78 
79 (deftest err ()
80  "Test standard error handlers"
81  (is (eql 'testing-err (deferror testing-err (std-error) nil (:auto t) (:documentation "testing")))))
82 
83 (deftest fmt ()
84  "Test standard formatters"
85  (is (string= (format nil "| 1 | 2 | 3 |~%") (fmt-row '(1 2 3))))
86  (is (string=
87  ;; note the read-time-eval..
88  #.(fmt-tree nil '(foobar (:a) (:b) (c) (d)) :layout :down)
89  #"FOOBAR
90  ├─ :A
91  ├─ :B
92  ├─ C
93  ╰─ D
94 "#))
95  ;; with plist option
96  (is (string=
97  #.(std:fmt-tree nil '(sk-project :name "foobar" :path "/a/b/c.asd" :vc :hg) :layout :down :plist t)
98  #"SK-PROJECT
99  ├─ :NAME
100  │ ╰─ "foobar"
101  ├─ :PATH
102  │ ╰─ "/a/b/c.asd"
103  ╰─ :VC
104  ╰─ :HG
105 "#)))
106 
107 (deftest ana ()
108  "Test standard anaphoric macros"
109  (is (= 8
110  (aif (+ 2 2)
111  (+ it it))))
112  (is (= 42 (awhen 42 it)))
113  (is (= 3 (acond ((1+ 1) (1+ it)))))
114  (loop for x in '(1 2 3)
115  for y in (funcall (alet ((a 1) (b 2) (c 3))
116  (lambda () (mapc #'1+ (list a b c)))))
117  collect (is (= x y))))
118 
119 (deftest pan ()
120  "Test standard pandoric macros"
121  (let ((p
122  (plambda (a) (b c)
123  (if (not a)
124  (setq b 0
125  c 0)
126  (progn (incf b a) (incf c a))))))
127  (with-pandoric (b c) p
128  (is (= 0 (funcall p nil)))
129  (is (= 1 (funcall p 1)))
130  (is (= 11 (funcall p 10)))
131  (is (= 0 (funcall p nil)))
132  )))
133 
134 (deftest alien ()
135  "Test standard alien utils"
136  (is (= 0 (foreign-int-to-integer 0 4)))
137  (is (= 1 (bool-to-foreign-int t))))
138 
139 (deftest curry ()
140  "Test curry functions from Alexandria, found in std/fu.
141 These tests are copied directly from the Alexandria test suite."
142  ;; curry.1
143  (let ((curried (curry '+ 3)))
144  (is (= (funcall curried 1 5) 9)))
145  ;; curry.2
146  (let ((curried (locally (declare (notinline curry))
147  (curry '* 2 3))))
148  (is (= (funcall curried 7) 42)))
149  ;; curry.3
150  (let ((curried-form (funcall (compiler-macro-function 'curry)
151  '(curry '/ 8)
152  nil)))
153  (let ((fun (funcall (compile nil `(lambda () ,curried-form)))))
154  (is (= (funcall fun 2) 4)))) ;; maybe fails?
155  ;; curry.4
156  (let* ((x 1)
157  (curried (curry (progn
158  (incf x)
159  (lambda (y z) (* x y z)))
160  3)))
161  (is (equal (list (funcall curried 7)
162  (funcall curried 7)
163  x)
164  '(42 42 2))))
165  ;; rcurry.1
166  (let ((r (rcurry '/ 2)))
167  (is (= (funcall r 8) 4)))
168  ;; rcurry.2
169  (let* ((x 1)
170  (curried (rcurry (progn
171  (incf x)
172  (lambda (y z) (* x y z)))
173  3)))
174  (is (equalp
175  (list (funcall curried 7) ;; 42
176  (funcall curried 7) ;; 42
177  x) ;; 2
178  '(42 42 2)))))
179 
180 (define-bitfield testbits
181  (a boolean)
182  (b (signed-byte 2))
183  (c (unsigned-byte 3) :initform 1)
184  (d (integer -100 100))
185  (e (member foo bar baz)))
186 
187 (deftest bits ()
188  (let ((bits (make-testbits)))
189  (is (not (testbits-a bits)))
190  (is (= 0 (testbits-b bits)))
191  (is (= 1 (testbits-c bits)))
192  (is (= -100 (testbits-d bits)))
193  (is (eql 'foo (testbits-e bits)))))