summaryrefslogtreecommitdiff
path: root/test/tester.lisp
diff options
context:
space:
mode:
authorriton <riton@riton.home>2025-07-14 21:45:47 +0300
committerriton <riton@riton.home>2025-07-14 21:45:47 +0300
commit1c90d9ae3b84f62168337f3c8b1c3854f6198330 (patch)
tree7dcc1dc41c2cfce5548876d53d8e83835b56b624 /test/tester.lisp
parent44efb492349025a195a3b402ec580623ad61723f (diff)
More refactoring of tests and packages
Squashed commit of the following: commit c4659d8be4d664ba7fd4b59d613536f2368cff0e Author: riton <riton@riton.home> Date: Mon Jul 14 21:44:48 2025 +0300 fix package name typo commit ec802339b838d059f4bc9e4da7cc370ab4d91a46 Author: riton <riton@riton.home> Date: Mon Jul 14 21:43:42 2025 +0300 seperate deftest from test instances commit 92d20e0b8405a4a51f01ff65f8bd81f4d25c1e21 Author: riton <riton@riton.home> Date: Mon Jul 14 21:29:47 2025 +0300 make a test system definition commit 125e5fe1e8c07230f32e762273c5c0dd259209e6 Author: riton <riton@riton.home> Date: Mon Jul 14 00:39:09 2025 +0300 compiler macro of as-token commit 0e39c32097783aa39e3fed479bb85b412065f597 Author: riton <riton@riton.home> Date: Mon Jul 14 00:21:46 2025 +0300 define new packages
Diffstat (limited to 'test/tester.lisp')
-rw-r--r--test/tester.lisp68
1 files changed, 68 insertions, 0 deletions
diff --git a/test/tester.lisp b/test/tester.lisp
new file mode 100644
index 0000000..2def1e0
--- /dev/null
+++ b/test/tester.lisp
@@ -0,0 +1,68 @@
+(in-package :monkey/test)
+
+(defparameter *tests* (make-hash-table))
+(defparameter *test-name* nil)
+
+(eval-always
+ (defun make-tokens (&rest tokens)
+ (loop :for token :in tokens
+ :if (consp token)
+ :collect (token:make (car token) (cadr token))
+ :if (typep token 'token:token-type)
+ :collect (token:as-token token)))
+
+ (defun test-lexer (str expected-tokens)
+ (labels ((expected-next ()
+ (prog1 (car expected-tokens)
+ (setf expected-tokens (cdr expected-tokens)))))
+ (format t "Testing ~s..." *test-name*)
+ (let* ((lexer (lexer:make str))
+ (tokens (lexer:lex lexer))
+ (expected-token (expected-next))
+ (ok t))
+ (loop :for token :in tokens
+ :for i :from 1
+ :if (not (token:token= token expected-token))
+ :do (format t "~&token ~d: expected ~a but got ~a~%" i expected-token token)
+ (setf ok nil)
+ :else :do (setf expected-token (expected-next)))
+ (unless (null ok)
+ (format t " ok~%")))))
+
+ (defun tokenize (designator)
+ (cond ((typep designator 'token:token-type)
+ (token:as-token designator))
+ ((stringp designator)
+ (token:make :t/ident designator))
+ ((integerp designator)
+ (token:make :t/int (princ-to-string designator)))
+ ((characterp designator)
+ (case designator
+ (#\( (token:as-token :t/lparen))
+ (#\) (token:as-token :t/rparen))
+ (#\; (token:as-token :t/semicolon))
+ (#\{ (token:as-token :t/lbrace))
+ (#\} (token:as-token :t/rbrace))))
+ ((consp designator)
+ (apply #'token:make designator))))
+
+ (defun define-lexer-test (name string tokens)
+ `(progn
+ (setf (gethash ',name *tests*) t)
+ (defun ,name ()
+ (let ((*test-name* ',name))
+ (test-lexer ,string (list ,@(mapcar (lambda (tok) `(tokenize ',tok))
+ tokens)))))))
+
+ (defmacro deftest ((type &optional name) &body args)
+ (case type
+ (:lexer (apply #'define-lexer-test
+ (or name (gensym "LEXER-TEST"))
+ args)))))
+
+(defun run-tests ()
+ (let ((ok t) key val)
+ (with-hash-table-iterator (it *tests*)
+ (loop :do (multiple-value-setq (ok key val) (it))
+ :while ok
+ :do (funcall (symbol-function key))))))