Add basic unit tests to user-side compiler

This commit is contained in:
John Lorentzson 2025-07-09 16:00:54 +02:00
parent 83fdb01368
commit d25f3795f5
17 changed files with 68 additions and 1 deletions

View file

@ -7,8 +7,8 @@
(defpackage #:user-side-compiler
(:nicknames #:usc)
(:local-nicknames (#:tlk #:user-side-compiler/toolkit))
(:use #:cl)
(:export #:usc-init #:compile-string-to-bytes
;; Errors
#:usc-error #:tokenizer-error #:missing-function-error
#:parser-error))
(:use #:cl))

View file

@ -0,0 +1 @@
dbg_print(5 => 3)

View file

@ -0,0 +1,4 @@
(cl:in-package #:cl-user)
(defpackage #:user-side-compiler/test
(:use #:cl #:parachute))

View file

@ -0,0 +1,2 @@
# Should fail due to the missing commas
dbg_print(5 3 1)

View file

@ -0,0 +1,2 @@
# Should fail due to the lack of closing parentheses
test_2((5 + 6 + 7

View file

@ -0,0 +1 @@
x = 1 + 5 + 6 + if

View file

@ -0,0 +1,3 @@
for x from 0 to 12 do
test()
end

View file

@ -0,0 +1,3 @@
if x == 5 then
test()
en

View file

@ -0,0 +1,39 @@
(in-package #:user-side-compiler/test)
(eval-when (:compile-toplevel :load-toplevel :execute)
(use-package '#:parachute))
(defun load-example (name)
(uiop:read-file-string
(let ((default (asdf:system-relative-pathname
'#:user-side-compiler/test name)))
(make-pathname
:defaults default
:directory (append (pathname-directory default) '("tests"))))))
(define-test should-compile ()
(let ((*debug-io* (make-string-output-stream)))
(loop :for test :in '("example-1.c6l" "example-2.c6l" "example-3.c6l"
"example-4.c6l" "example-5.c6l" "example-6.c6l")
:do (true
(> (length (handler-bind
((usc:missing-function-error #'continue))
(usc:compile-string-to-bytes (load-example test))))
0)
test))))
(define-test should-not-compile)
(define-test syntax-errors
:parent should-not-compile
(let ((*debug-io* (make-string-output-stream)))
(loop :for test :in '("syntax-error-1.c6l" "syntax-error-2.c6l"
"syntax-error-3.c6l" "syntax-error-4.c6l"
"syntax-error-5.c6l")
:do (multiple-value-bind (ignore condition)
(ignore-errors
(handler-bind
((usc:missing-function-error #'continue))
(usc:compile-string-to-bytes (load-example test))))
(declare (ignore ignore))
(of-type usc:parser-error condition test)))))

View file

@ -3,6 +3,7 @@
(defsystem #:user-side-compiler
:serial t
:depends-on (#:closer-mop #:alexandria #:trivial-backtrace)
:in-order-to ((asdf:test-op (asdf:test-op #:user-side-compiler/test)))
:components
((:file "package")
(:file "error-handling")
@ -39,3 +40,14 @@
(:file "code-generator")))
(:file "interface")
(:file "binary-test-build")))
(defsystem #:user-side-compiler/test
:depends-on (#:user-side-compiler #:parachute)
:perform (asdf:test-op
(op c)
(uiop:symbol-call :parachute :test :user-side-compiler/test))
:components
((:module "tests"
:serial t
:components ((:file "package")
(:file "unit-tests")))))