Guest User

Untitled

a guest
Jun 20th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.87 KB | None | 0 0
  1. (defpackage net.phorni.unit-test
  2. (:use :cl)
  3. (:shadow cl:assert)
  4. (:nicknames :utest)
  5. (:export test-error
  6. assert
  7. define-condition
  8. do-as-test
  9. *unit-test-error-port*
  10. *default-assert-error-message*
  11. *continue-on-test-error*
  12. *assert-count*
  13. *assert-error-count*
  14. *assert-error-report-function*
  15. *coverage-p*
  16. *coverage-files*
  17. *coverage-path*))
  18.  
  19. (in-package :utest)
  20.  
  21. (define-condition test-error (condition)
  22. ((msg :accessor message-of :initarg :message)
  23. (form :accessor form-of :initarg :form)
  24. (result :accessor result-of :initarg :result))
  25. (:default-initargs :message "" :form nil :result nil))
  26.  
  27. (defun make-test-error (msg form result)
  28. (cerror "continue to eval forms"
  29. 'test-error
  30. :message msg
  31. :form form
  32. :result result))
  33.  
  34. (defvar *unit-test-error-port* *standard-output*)
  35. (defparameter *default-assert-error-message*
  36. "Assertion failed")
  37. (defparameter *continue-on-test-error* nil)
  38. (defparameter *assert-count* 0)
  39. (defparameter *assert-error-count* 0)
  40. (defparameter *coverage-p* nil)
  41. (defparameter *coverage-files* nil)
  42. (defparameter *coverage-path* nil)
  43.  
  44. (defparameter *assert-error-report-function*
  45. (lambda (msg form result)
  46. (format *unit-test-error-port*
  47. "Assert failed: ~S~%form: ~S~%result: ~S"
  48. msg form result)))
  49.  
  50. (defun compile-and-load (path)
  51. (compile-file path)
  52. (load path))
  53.  
  54. (defun coverage-p ()
  55. #+(and SBCL SB-COVER) *coverage-p*
  56. #+CCL *coverage-p*
  57. #+OPEM-MCL *coverage-p*)
  58.  
  59. #+(and SBCL SB-COVER)
  60. (defun start-coverage-sbcl ()
  61. (declaim (optimize sb-cover:store-coverage-data))
  62. (dolist (file *coverage-files*)
  63. (compile-and-load file)))
  64.  
  65. #+(and SBCL SB-COVER)
  66. (defun report-coverage-sbcl ()
  67. ;; *coverage-path* is file-path
  68. (sb-cover:report *coverage-path*))
  69.  
  70. #+CCL
  71. (defun start-coverage-ccl ()
  72. (setf ccl:*compile-code-coverage* t)
  73. (dolist (file *coverage-files*)
  74. (compile-and-load file)))
  75.  
  76. #+CCL
  77. (defun report-coverage-ccl ()
  78. ;; *coverage-files* is directory-path
  79. (ccl:report-coverage *coverage-path*))
  80.  
  81.  
  82.  
  83.  
  84. (defun report-test ()
  85. (format *unit-test-error-port*
  86. "Assertion ~A, Success ~A, Fail ~A~%"
  87. *assert-count*
  88. (- *assert-count* *assert-error-count*)
  89. *assert-error-count*)
  90. (when (and (coverage-p) *coverage-files*)
  91. #+SBCL (report-coverage-sbcl)
  92. #+CCL (report-coverage-ccl)))
  93.  
  94. (defun handler-test-error (e)
  95. (incf *assert-error-count*)
  96. (funcall *assert-error-report-function*
  97. (message-of e)
  98. (form-of e)
  99. (result-of e))
  100. (when *continue-on-test-error*
  101. (continue)))
  102.  
  103. (defmacro define-test-case (name lambda-list &body body)
  104. `(defun ,name ,lambda-list
  105. (format *unit-test-error-port*
  106. "Run test case: ~A~%"
  107. ',name)
  108. (handler-bind ((test-error #'handler-test-error))
  109. ,@body)))
  110.  
  111. (defmacro assert (&whole form test-form &optional msg-fmt &rest args)
  112. (let ((sym (gensym)))
  113. `(progn
  114. (incf *assert-count*)
  115. (let ((,sym ,test-form))
  116. (unless ,sym
  117. (make-test-error
  118. (format nil (or ,msg-fmt *default-assert-error-message*) ,@args)
  119. ',form
  120. ,sym))
  121. ,sym))))
  122.  
  123. (defmacro do-as-test
  124. ((&key error-port continue-on-test-error-p
  125. assert-error-report-function coverage-p
  126. coverage-path coverage-files)
  127. &body body)
  128. `(let ((*unit-test-error-port* (or ,error-port *unit-test-error-port*))
  129. (*continue-on-test-error*
  130. (or ,continue-on-test-error-p *continue-on-test-error*))
  131. (*assert-error-report-function*
  132. (or ,assert-error-report-function *assert-error-report-function*))
  133. (*assert-error-count* 0)
  134. (*assert-count* 0)
  135. (*coverage-path* (or ,coverage-path *coverage-path*))
  136. (*coverage-p* (or ,coverage-p *coverage-p*))
  137. (*coverage-files* (or ,coverage-files *coverage-files*)))
  138. (when (and (coverage-p) *coverage-files*)
  139. #+SBCL (start-coverage-sbcl)
  140. #+CCL (start-coverage-ccl))
  141. (unwind-protect
  142. (handler-bind ((test-error #'handler-test-error))
  143. ,@body)
  144. (report-test))))
Add Comment
Please, Sign In to add comment