1 ;; SPDX-License-Identifier: BSD-3-Clause
5 (defun normalize-whitespace (str)
6 (substitute #\Space
#\Newline
(substitute #\Space
#\Tab str
)))
8 (defun same-space-between-statements (code)
9 (let ((cl-ppcre:*use-bmh-matchers
* nil
))
10 (cl-ppcre:regex-replace-all
"\\s*;\\s*" code
"; ")))
12 (defun remove-duplicate-spaces (str)
13 (labels ((spacep (char) (and char
(char= char
#\Space
)))
17 ((and (spacep (first list
))
18 (spacep (second list
)))
19 (rds (cons #\Space
(cddr list
))))
21 (cons (car list
) (rds (cdr list
)))))))
22 (coerce (rds (coerce str
'list
)) 'string
)))
24 (defun trim-spaces (str)
25 (string-trim '(#\Space
) str
))
27 (defun remove-spaces-near-brackets (str)
28 (let ((cl-ppcre:*use-bmh-matchers
* nil
))
29 (reduce (lambda (str rex-pair
)
30 (cl-ppcre:regex-replace-all
(first rex-pair
) str
(second rex-pair
)))
31 (cons str
'(("\\[ " "[") (" \\]" "]") ("\\( " "(") (" \\)" ")"))))))
33 (defun normalize-js-code (str)
34 (remove-spaces-near-brackets
36 (remove-duplicate-spaces
37 (same-space-between-statements
38 (normalize-whitespace str
))))))
40 (defmacro test-ps-js
(testname parenscript javascript
41 &key
(js-target-version *js-target-version
*))
43 (is (string= (normalize-js-code ,javascript
)
45 (let ((*js-target-version
* ,js-target-version
))
46 (ps-doc* ',parenscript
)))))))
48 (defun jsarray (contents)
50 (make-array (length contents
)
51 :initial-contents
(mapcar (lambda (x)
58 (defmacro %test-js-eval
(testname parenscript test-statement
)
61 (let ((js-result (cl-js:run-js
(ps-doc* ',parenscript
))))
64 (defmacro test-js-eval
(testname parenscript result
)
65 `(%test-js-eval
,testname
,parenscript
69 `(jsarray ,result
))))))
71 (defmacro test-js-eval-epsilon
(testname parenscript result
)
72 `(%test-js-eval
,testname
,parenscript
73 (is (< (abs (- js-result
,result
)) 0.0001))))
75 (def-suite parenscript-tests
)
76 (def-suite output-tests
:in parenscript-tests
)
77 (def-suite package-system-tests
:in parenscript-tests
)
78 (def-suite eval-tests
:in parenscript-tests
)
81 (format t
"Running output tests:~&")
83 (format t
"Running package system tests:~&")
84 (run! 'package-system-tests
)
85 (format t
"Running CL-JavaScript eval tests:~&")