Guest User

Untitled

a guest
Jun 23rd, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.05 KB | None | 0 0
  1. REBOL [
  2. Title: "Simple testing framework"
  3. Author: "Peter W A Wood"
  4. File: %quick-test.reb
  5. Version: 0.1.1
  6. Rights: "Copyright (C) 2011-2016 Peter W A Wood. All rights reserved."
  7. License: "BSD-3"
  8. ]
  9.  
  10. qt: make object! [
  11.  
  12. ;; switches
  13. batch: false
  14. logging: false
  15. quiet: false
  16.  
  17. ;; set up alternate print functions
  18. sys-print: :print
  19. sys-prin: :prin
  20.  
  21. ;; set-up alternative now
  22. sys-now: :now
  23.  
  24. test-prin: func [v] [
  25. unless batch [sys-prin v]
  26. if logging [write-log v]
  27. ]
  28. output: copy ""
  29. set 'print func [v][append output rejoin [v "^/"]]
  30. set 'prin func [v][append output reduce v]
  31.  
  32. ;; set up log
  33. sys-write: :write
  34. log-file: join system/options/home %qt.log
  35. write-log: func[v][
  36. sys-write/append log-file v
  37. ]
  38.  
  39. ;; text fields
  40. run-name: copy ""
  41. file-name: copy ""
  42. group-name: copy ""
  43. test-name: copy ""
  44.  
  45. ;; counters
  46. data: make object! [
  47. tests: 0
  48. passes: 0
  49. failures: 0
  50. ]
  51. run: make data []
  52. file: make data []
  53. asserts: make data []
  54.  
  55. ;; group switches
  56. group-name-not-prined: true
  57. group?: false
  58.  
  59. ;; helper functions
  60.  
  61. end-test: does [
  62. either equal? asserts/failures 0 [
  63. file/passes: file/passes + 1
  64. ][
  65. file/failures: file/failures + 1
  66. ]
  67. ]
  68.  
  69. init-group: does [
  70. group-name-not-prined: true
  71. group?: false
  72. group-name: ""
  73. ]
  74.  
  75. init-data: func [
  76. data [object!]
  77. ][
  78. data/tests: 0
  79. data/passes: 0
  80. data/failures: 0
  81. ]
  82.  
  83. init-run: does [
  84. init-data run
  85. init-group
  86. if logging [sys-write log-file ""]
  87. ]
  88.  
  89. init-file: does [
  90. init-data file
  91. init-group
  92. ]
  93.  
  94. print-totals: func [
  95. data [object!]
  96. ][
  97. test-prin compose [" Number of Tests Performed: " (data/tests) "^/"]
  98. test-prin compose [" Number of Tests Passed: " (data/passes) "^/"]
  99. test-prin compose [" Number of Tests Failed: " (data/failures) "^/"]
  100. if data/failures <> 0 [
  101. test-prin ["****************TEST FAILURES****************" "^/"]
  102. ]
  103. ]
  104.  
  105. ;; testing dialect functions
  106.  
  107. start-file: func [
  108. title [string!]
  109. ][
  110. init-file
  111. test-prin compose ["~~~Started Test~~~ " (title) "^/"]
  112. file-name: title
  113. group?: false
  114. init-data asserts
  115. ]
  116.  
  117. start-group: func [
  118. title [string!]
  119. ][
  120. group-name: title
  121. group?: true
  122. ]
  123.  
  124. start-test: func [
  125. title [string!]
  126. ][
  127. unless equal? file/tests 0 [end-test]
  128. test-name: title
  129. file/tests: file/tests + 1
  130. output: copy ""
  131. init-data asserts
  132. ]
  133.  
  134. assert: func [
  135. assertion [logic!]
  136. ][
  137. asserts/tests: asserts/tests + 1
  138. either assertion [
  139. asserts/passes: asserts/passes + 1
  140. ][
  141. asserts/failures: asserts/failures + 1
  142. if group? [
  143. if group-name-not-prined [
  144. test-prin compose ["^/" "===group=== " (group-name) "^/"]
  145. group-name-not-prined: false
  146. ]
  147. ]
  148. test-prin compose["--test-- " (test-name) " assertion " (asserts/tests)
  149. " FAILED**************" "^/"]
  150.  
  151. ]
  152. ]
  153.  
  154. assert-printed?: func [msg] [
  155. assert found? find output msg
  156. ]
  157.  
  158. assert~=: func[
  159. x [number!]
  160. y [number!]
  161. e [number!]
  162. /local
  163. diff e1 e2
  164. ][
  165. ;; calculate tolerance to use
  166. ;; as e * max (1, x, y)
  167. either x > 0.0 [
  168. e1: x * e
  169. ][
  170. e1: -1.0 * x * e
  171. ]
  172. if e > e1 [e1: e]
  173. either y > 0.0 [
  174. e2: y * e
  175. ][
  176. e2: -1.0 * y * e
  177. ]
  178. if e1 > e2 [e2: e1]
  179.  
  180. ;; perform almost equal check
  181. either x > y [
  182. diff: x - y
  183. ][
  184. diff: y - x
  185. ]
  186. either diff > e2 [
  187. assert false
  188. ][
  189. assert true
  190. ]
  191. ]
  192.  
  193. end-group: func [] [
  194. init-group
  195. ]
  196.  
  197. end-file: func [] [
  198. if 0 <> (asserts/passes + asserts/failures) [end-test] ; end last test
  199. test-prin compose ["~~~Finished Test~~~ " (file-name) "^/"]
  200. print-totals file
  201. test-prin "^/"
  202.  
  203. ;; update run totals
  204. run/passes: run/passes + file/passes
  205. run/failures: run/failures + file/failures
  206. run/tests: run/tests + file/tests
  207. ]
  208.  
  209. ;; test runner dialect functions
  210.  
  211. set-log-file: func [log-file [file!]] [
  212. qt/log-file: log-file
  213. ]
  214.  
  215. start-run: func [
  216. title [string!]
  217. ][
  218. init-run
  219. run-name: title
  220. test-prin compose ["***Started*** " (title) " at " (qt/sys-now/precise) "^/" "^/"]
  221. ]
  222.  
  223. start-run-batch: func [
  224. title [string!]
  225. ][
  226. batch: true
  227. logging: true
  228. start-run title
  229. ]
  230.  
  231. run-test: func[ file [file!]][
  232. do file
  233. ]
  234.  
  235. end-run: func [][
  236. test-prin compose ["***Finished*** " (run-name) " at " (qt/sys-now/precise) "^/"]
  237. print-totals run
  238. set 'print :sys-print
  239. set 'prin :sys-prin
  240. set 'now :sys-now
  241. if logging [logging: false]
  242. if batch [
  243. batch: false
  244. quit/return min run/failures 1
  245. ]
  246. ]
  247.  
  248. ;; create the testing "dialect"
  249. set '~~~start-file~~~ :start-file
  250. set '===start-group=== :start-group
  251. set '--test-- :start-test
  252. set '--assert :assert
  253. set '--assert-printed? :assert-printed?
  254. set '--assert~= :assert~=
  255. set '===end-group=== :end-group
  256. set '~~~end-file~~~ :end-file
  257.  
  258. ;; create the test runner "dialect"
  259. set '--set-log-file :set-log-file
  260. set '***start-run*** :start-run
  261. set '***start-run-batch*** :start-run-batch
  262. set '--run-test :run-test
  263. set '***end-run*** :end-run
  264.  
  265. ]
Add Comment
Please, Sign In to add comment