/quick-test/quick-test.reds

http://github.com/dockimbel/Red · Redscript · 224 lines · 200 code · 24 blank · 0 comment · 10 complexity · 6b41779bae2a62222d0b2529fb24c63e MD5 · raw file

  1. Red/System [
  2. Title: "Red/System simple testing framework"
  3. Author: "Peter W A Wood"
  4. File: %quick-test.reds
  5. Version: 0.4.2
  6. Tabs: 4
  7. Rights: "Copyright (C) 2011-2015 Peter W A Wood. All rights reserved."
  8. License: "BSD-3 - https://github.com/red/red/blob/master/BSD-3-License.txt"
  9. ]
  10. ;; allocate string memory
  11. qt-run-name: "123456789012345678901234567890"
  12. qt-file-name: "123456789012345678901234567890"
  13. qt-group-name: "123456789012345678901234567890"
  14. qt-test-name: "123456789012345678901234567890"
  15. ;; counters
  16. qt-run: declare struct! [
  17. tests [integer!]
  18. asserts [integer!]
  19. passes [integer!]
  20. failures [integer!]
  21. ]
  22. qt-file: declare struct! [
  23. tests [integer!]
  24. asserts [integer!]
  25. passes [integer!]
  26. failures [integer!]
  27. ]
  28. ;; group switches
  29. qt-group-name-not-printed: true
  30. qt-group?: false
  31. _qt-init-group: does [
  32. qt-group-name-not-printed: true
  33. qt-group?: false
  34. qt-group-name: ""
  35. ]
  36. qt-init-run: func [] [
  37. qt-run/tests: 0
  38. qt-run/asserts: 0
  39. qt-run/passes: 0
  40. qt-run/failures: 0
  41. _qt-init-group
  42. ]
  43. qt-init-file: func [] [
  44. qt-file/tests: 0
  45. qt-file/asserts: 0
  46. qt-file/passes: 0
  47. qt-file/failures: 0
  48. _qt-init-group
  49. ]
  50. ***start-run***: func[
  51. title [c-string!]
  52. ][
  53. qt-init-run
  54. qt-run-name: title
  55. print ["***Starting*** " title lf lf]
  56. ]
  57. ~~~start-file~~~: func [
  58. title [c-string!]
  59. ][
  60. qt-init-file
  61. print ["~~~started test~~~ " title lf]
  62. qt-file-name: title
  63. qt-group?: false
  64. ]
  65. ===start-group===: func [
  66. title [c-string!]
  67. ][
  68. qt-group-name: title
  69. qt-group?: true
  70. ]
  71. --test--: func [
  72. title [c-string!]
  73. ][
  74. qt-test-name: title
  75. qt-file/tests: qt-file/tests + 1
  76. ]
  77. --assert: func [
  78. assertion [logic!]
  79. ][
  80. qt-file/asserts: qt-file/asserts + 1
  81. either assertion [
  82. qt-file/passes: qt-file/passes + 1
  83. ][
  84. qt-file/failures: qt-file/failures + 1
  85. if qt-group? [
  86. if qt-group-name-not-printed [
  87. print [lf "===group=== " qt-group-name lf]
  88. qt-group-name-not-printed: false
  89. ]
  90. ]
  91. print ["--test-- " qt-test-name " FAILED**************" lf]
  92. ]
  93. ]
  94. --assertf~=: func[
  95. x [float!]
  96. y [float!]
  97. e [float!]
  98. /local
  99. diff [float!]
  100. e1 [float!]
  101. e2 [float!]
  102. ][
  103. ;; calculate tolerance to use
  104. ;; as e * max (1, x, y)
  105. either x > 0.0 [
  106. e1: x * e
  107. ][
  108. e1: -1.0 * x * e
  109. ]
  110. if e > e1 [e1: e]
  111. either y > 0.0 [
  112. e2: y * e
  113. ][
  114. e2: -1.0 * y * e
  115. ]
  116. if e1 > e2 [e2: e1]
  117. ;; perform almost equal check
  118. either x > y [
  119. diff: x - y
  120. ][
  121. diff: y - x
  122. ]
  123. either diff > e2 [
  124. --assert false
  125. ][
  126. --assert true
  127. ]
  128. ]
  129. --assertf32~=: func[
  130. x [float32!]
  131. y [float32!]
  132. e [float32!]
  133. /local
  134. diff [float32!]
  135. e1 [float32!]
  136. e2 [float32!]
  137. ][
  138. ;; calculate tolerance to use
  139. ;; as e * max (1, x, y)
  140. either x > as float32! 0.0 [
  141. e1: x * e
  142. ][
  143. e1: as float32! -1.0 * x * e
  144. ]
  145. if e > e1 [e1: e]
  146. either y > as float32! 0.0 [
  147. e2: y * e
  148. ][
  149. e2: as float32! -1.0 * y * e
  150. ]
  151. if e1 > e2 [e2: e1]
  152. ;; perform almost equal check
  153. either x > y [
  154. diff: x - y
  155. ][
  156. diff: y - x
  157. ]
  158. either diff > e2 [
  159. --assert false
  160. ][
  161. --assert true
  162. ]
  163. ]
  164. ===end-group===: func [] [
  165. _qt-init-group
  166. ]
  167. ~~~end-file~~~: func [] [
  168. print ["~~~finished test~~~ " qt-file-name lf]
  169. qt-print-totals qt-file/tests
  170. qt-file/asserts
  171. qt-file/passes
  172. qt-file/failures
  173. print lf
  174. ;; update run totals
  175. qt-run/passes: qt-run/passes + qt-file/passes
  176. qt-run/asserts: qt-run/asserts + qt-file/asserts
  177. qt-run/failures: qt-run/failures + qt-file/failures
  178. qt-run/tests: qt-run/tests + qt-file/tests
  179. ]
  180. ***end-run***: func [][
  181. print ["***Finished*** " qt-run-name lf]
  182. qt-print-totals qt-run/tests
  183. qt-run/asserts
  184. qt-run/passes
  185. qt-run/failures
  186. ]
  187. qt-print-totals: func [
  188. tests [integer!]
  189. asserts [integer!]
  190. passes [integer!]
  191. failures [integer!]
  192. ][
  193. print [" Number of Tests Performed: " tests lf]
  194. print [" Number of Assertions Performed: " asserts lf]
  195. print [" Number of Assertions Passed: " passes lf]
  196. print [" Number of Assertions Failed: " failures lf]
  197. if failures <> 0 [
  198. print ["****************TEST FAILURES****************" lf]
  199. ]
  200. ]