test.lisp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. (in-package :trivial-gray-streams-test)
  2. ;;; assert-invoked - a tool to check that specified method with parameters has
  3. ;;; been invoked during execution of a code body
  4. (define-condition invoked ()
  5. ((method :type (or symbol cons) ;; cons is for (setf method)
  6. :accessor method
  7. :initarg :method
  8. :initform (error ":method is required"))
  9. (args :type list
  10. :accessor args
  11. :initarg :args
  12. :initform nil)))
  13. (defun assert-invoked-impl (method args body-fn)
  14. (let ((expected-invocation (cons method args))
  15. (actual-invocations nil))
  16. (handler-bind ((invoked (lambda (i)
  17. (let ((invocation (cons (method i) (args i))))
  18. (when (equalp invocation expected-invocation)
  19. (return-from assert-invoked-impl nil))
  20. (push invocation actual-invocations)))))
  21. (funcall body-fn))
  22. (let ((*package* (find-package :keyword))) ; ensures package prefixes are printed
  23. (error "expected invocation: ~(~S~) actual: ~{~(~S~)~^, ~}"
  24. expected-invocation (reverse actual-invocations)))))
  25. (defmacro assert-invoked ((method &rest args) &body body)
  26. "If during execution of the BODY the specified METHOD with ARGS
  27. hasn't been invoked, signals an ERROR."
  28. `(assert-invoked-impl (quote ,method) (list ,@args) (lambda () ,@body)))
  29. (defun invoked (method &rest args)
  30. (signal 'invoked :method method :args args))
  31. ;;; end assert-invoked
  32. (defclass test-stream (fundamental-binary-input-stream
  33. fundamental-binary-output-stream
  34. fundamental-character-input-stream
  35. fundamental-character-output-stream)
  36. ())
  37. (defclass test-stream2 (test-stream) ())
  38. (defmethod stream-read-char ((stream test-stream))
  39. (invoked 'stream-read-char stream))
  40. (defmethod stream-unread-char ((stream test-stream) char)
  41. (invoked 'stream-unread-char stream char))
  42. (defmethod stream-read-char-no-hang ((stream test-stream))
  43. (invoked 'stream-read-char-no-hang stream))
  44. (defmethod stream-peek-char ((stream test-stream))
  45. (invoked 'stream-peek-char stream))
  46. (defmethod stream-listen ((stream test-stream))
  47. (invoked 'stream-listen stream))
  48. (defmethod stream-read-line ((stream test-stream))
  49. (invoked 'stream-read-line stream))
  50. (defmethod stream-clear-input ((stream test-stream))
  51. (invoked 'stream-clear-input stream))
  52. (defmethod stream-write-char ((stream test-stream) char)
  53. (invoked 'stream-write-char stream char))
  54. (defmethod stream-line-column ((stream test-stream))
  55. (invoked 'stream-line-column stream))
  56. (defmethod stream-start-line-p ((stream test-stream))
  57. (invoked 'stream-start-line-p stream))
  58. (defmethod stream-write-string ((stream test-stream) string &optional start end)
  59. (invoked 'stream-write-string stream string start end))
  60. (defmethod stream-terpri ((stream test-stream))
  61. (invoked 'stream-terpri stream))
  62. (defmethod stream-fresh-line ((stream test-stream2))
  63. (invoked 'stream-fresh-line stream))
  64. (defmethod stream-finish-output ((stream test-stream))
  65. (invoked 'stream-finish-output stream))
  66. (defmethod stream-force-output ((stream test-stream))
  67. (invoked 'stream-force-output stream))
  68. (defmethod stream-clear-output ((stream test-stream))
  69. (invoked 'stream-clear-output stream))
  70. (defmethod stream-advance-to-column ((stream test-stream2) column)
  71. (invoked 'stream-advance-to-column stream column))
  72. (defmethod stream-read-byte ((stream test-stream))
  73. (invoked 'stream-read-byte stream))
  74. (defmethod stream-write-byte ((stream test-stream) byte)
  75. (invoked 'stream-write-byte stream byte))
  76. (defmethod stream-read-sequence ((s test-stream) seq start end &key)
  77. (invoked 'stream-read-sequence s seq :start start :end end))
  78. (defmethod stream-write-sequence ((s test-stream) seq start end &key)
  79. (invoked 'stream-write-sequence s seq :start start :end end))
  80. (defmethod stream-file-position ((s test-stream))
  81. (invoked 'stream-file-position s))
  82. (defmethod (setf stream-file-position) (newval (s test-stream))
  83. (invoked '(setf stream-file-position) newval s))
  84. ;; Convinience macro, used when we want to name
  85. ;; the test case with the same name as of the gray streams method we test.
  86. (defmacro test-invoked ((method &rest args) &body body)
  87. `(test (,method)
  88. (assert-invoked (,method ,@args)
  89. ,@body)))
  90. #|
  91. cl:format ~t or cl:pprint -> stream-advance-to-column -> stream-line-column
  92. stream-write-char
  93. cl:fresh-line -> stream-fresh-line -> stream-start-line-p
  94. stream-terpri
  95. STREAM-START-LINE-P: expected invocation: (ccl:stream-start-line-p #<trivial-gray-streams-test::test-stream #x21012fe62d>)
  96. actual: (ccl:stream-fresh-line #<trivial-gray-streams-test::test-stream #x21012fe62d>)
  97. STREAM-TERPRI: expected invocation: (ccl:stream-terpri #<trivial-gray-streams-test::test-stream #x21012fe62d>)
  98. actual: (ccl:stream-write-char #<trivial-gray-streams-test::test-stream #x21012fe62d> #\newline)
  99. STREAM-ADVANCE-TO-COLUMN: expected invocation: (ccl:stream-advance-to-column #<trivial-gray-streams-test::test-stream #x21012fe62d> 11)
  100. actual: (ccl:stream-line-column #<trivial-gray-streams-test::test-stream #x21012fe62d>)
  101. |#
  102. (defun run-tests ()
  103. (let ((s (make-instance 'test-stream))
  104. (s2 (make-instance 'test-stream2)))
  105. (list
  106. (test-invoked (stream-read-char s)
  107. (read-char s))
  108. (test-invoked (stream-unread-char s #\a)
  109. (unread-char #\a s))
  110. (test-invoked (stream-read-char-no-hang s)
  111. (read-char-no-hang s))
  112. (test-invoked (stream-peek-char s)
  113. (peek-char nil s))
  114. (test-invoked (stream-listen s)
  115. (listen s))
  116. (test-invoked (stream-read-line s)
  117. (read-line s))
  118. (test-invoked (stream-clear-input s)
  119. (clear-input s))
  120. (test-invoked (stream-write-char s #\b)
  121. (write-char #\b s))
  122. (test-invoked (stream-line-column s)
  123. (format s "~10,t"))
  124. (test-invoked (stream-start-line-p s)
  125. (fresh-line s))
  126. (test-invoked (stream-write-string s "hello" 1 7)
  127. (write-string "hello" s :start 1 :end 7))
  128. (test-invoked (stream-terpri s)
  129. (fresh-line s))
  130. (test-invoked (stream-fresh-line s2)
  131. (fresh-line s2))
  132. (test-invoked (stream-finish-output s)
  133. (finish-output s))
  134. (test-invoked (stream-force-output s)
  135. (force-output s))
  136. ;; sbcl bug https://bugs.launchpad.net/sbcl/+bug/1153257
  137. (test-invoked (stream-clear-output s)
  138. (clear-output s))
  139. ;; not used by SBCL
  140. (test-invoked (stream-advance-to-column s2 10)
  141. (format s2 "~10,t"))
  142. (test-invoked (stream-read-byte s)
  143. (read-byte s))
  144. (test-invoked (stream-write-byte s 1)
  145. (write-byte 1 s))
  146. ;; extensions
  147. (test-invoked (stream-read-sequence s #(1 2) :start 0 :end 1)
  148. (read-sequence #(1 2) s :start 0 :end 1))
  149. (test-invoked (stream-write-sequence s #(1 2) :start 0 :end 1)
  150. (write-sequence #(1 2) s :start 0 :end 1))
  151. (test-invoked (stream-file-position s)
  152. (file-position s))
  153. (test (setf-stream-file-position)
  154. (assert-invoked ((setf stream-file-position) 9 s)
  155. (file-position s 9))))))
  156. (defun failed-tests (results)
  157. (remove-if-not (complement #'failed-p) results))
  158. (defun failed-test-names (results)
  159. (mapcar (lambda (result)
  160. (string-downcase (name result)))
  161. (failed-tests results)))
  162. #|
  163. (failed-test-names (run-tests))
  164. (setf *allow-debugger* nil))
  165. |#