test-framework.lisp - clic - Clic is an command line interactive client for gopher written in Common LISP (HTM) git clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/ (DIR) Log (DIR) Files (DIR) Refs (DIR) Tags (DIR) README (DIR) LICENSE --- test-framework.lisp (1935B) --- 1 (in-package :trivial-gray-streams-test) 2 3 ;;; test framework 4 5 #| 6 Used like this: 7 8 (list (test (add) (assert (= 5 (+ 2 2)))) 9 (test (mul) (assert (= 4 (* 2 2)))) 10 (test (subst) (assert (= 3 (- 4 2))))) 11 12 => ;; list of test results, 2 failed 1 passed 13 (#<TEST-RESULT ADD :FAIL The assertion (= 5 (+ 2 2)) failed.> 14 #<TEST-RESULT MUL :OK> 15 #<TEST-RESULT SUBST :FAIL The assertion (= 3 (- 4 2)) failed.>) 16 17 |# 18 19 (defclass test-result () 20 ((name :type symbol 21 :initarg :name 22 :initform (error ":name is requierd") 23 :accessor name) 24 (status :type (or (eql :ok) (eql :fail)) 25 :initform :ok 26 :initarg :status 27 :accessor status) 28 (cause :type (or null condition) 29 :initform nil 30 :initarg :cause 31 :accessor cause))) 32 33 (defun failed-p (test-result) 34 (eq (status test-result) :fail)) 35 36 (defmethod print-object ((r test-result) stream) 37 (print-unreadable-object (r stream :type t) 38 (format stream "~S ~S~@[ ~A~]" (name r) (status r) (cause r)))) 39 40 (defparameter *allow-debugger* nil) 41 42 (defun test-impl (name body-fn) 43 (flet ((make-result (status &optional cause) 44 (make-instance 'test-result :name name :status status :cause cause))) 45 (handler-bind ((serious-condition 46 (lambda (c) 47 (unless *allow-debugger* 48 (format t "FAIL: ~A~%" c) 49 (let ((result (make-result :fail c))) 50 (return-from test-impl result)))))) 51 (format t "Running test ~S... " name) 52 (funcall body-fn) 53 (format t "OK~%") 54 (make-result :ok)))) 55 56 (defmacro test ((name) &body body) 57 "If the BODY signals a SERIOUS-CONDITION 58 this macro returns a failed TEST-RESULT; otherwise 59 returns a successfull TEST-RESULT." 60 `(test-impl (quote ,name) (lambda () ,@body)))