SUnit-Tests.st 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. Smalltalk createPackage: 'SUnit-Tests'!
  2. TestCase subclass: #ExampleSetTest
  3. slots: {#empty. #full}
  4. package: 'SUnit-Tests'!
  5. !ExampleSetTest commentStamp!
  6. ExampleSetTest is taken from Pharo 1.4.
  7. THe purpose of this class is to demonstrate a simple use case of the test framework.!
  8. !ExampleSetTest methodsFor: 'running'!
  9. setUp
  10. empty := Set new.
  11. full := Set with: 5 with: #abc
  12. ! !
  13. !ExampleSetTest methodsFor: 'tests'!
  14. testAdd
  15. empty add: 5.
  16. self assert: (empty includes: 5)
  17. !
  18. testGrow
  19. empty addAll: (1 to: 100).
  20. self assert: empty size equals: 100
  21. !
  22. testIllegal
  23. self
  24. should: [ empty at: 5 ]
  25. raise: Error.
  26. self
  27. should: [ empty at: 5 put: #abc ]
  28. raise: Error
  29. !
  30. testIncludes
  31. self assert: (full includes: 5).
  32. self assert: (full includes: #abc)
  33. !
  34. testOccurrences
  35. self assert: (empty occurrencesOf: 0) equals: 0.
  36. self assert: (full occurrencesOf: 5) equals: 1.
  37. full add: 5.
  38. self assert: (full occurrencesOf: 5) equals: 1
  39. !
  40. testRemove
  41. full remove: 5.
  42. self assert: (full includes: #abc).
  43. self deny: (full includes: 5)
  44. ! !
  45. TestCase subclass: #SUnitAsyncTest
  46. slots: {#flag}
  47. package: 'SUnit-Tests'!
  48. !SUnitAsyncTest methodsFor: 'helpers'!
  49. fakeError
  50. flag := 'bad'.
  51. self timeout: 30.
  52. flag := (self async: [ flag := 'ok'. self error: 'Intentional' ]) valueWithTimeout: 20
  53. !
  54. fakeErrorFailingInTearDown
  55. flag := 'bad'.
  56. self timeout: 30.
  57. flag := (self async: [ self error: 'Intentional' ]) valueWithTimeout: 20
  58. !
  59. fakeFailure
  60. flag := 'bad'.
  61. self timeout: 30.
  62. flag := (self async: [ flag := 'ok'. self assert: false ]) valueWithTimeout: 20
  63. !
  64. fakeMultipleTimeoutFailing
  65. self timeout: 100.
  66. (self async: [
  67. self timeout: 20.
  68. (self async: [ self finished ]) valueWithTimeout: 30
  69. ]) valueWithTimeout: 20
  70. !
  71. fakeMultipleTimeoutPassing
  72. self timeout: 20.
  73. (self async: [
  74. self timeout: 40.
  75. (self async: [ self finished ]) valueWithTimeout: 20
  76. ]) valueWithTimeout: 10
  77. !
  78. fakeTimeout
  79. self timeout: 10.
  80. (self async: [ self finished ]) valueWithTimeout: 20
  81. ! !
  82. !SUnitAsyncTest methodsFor: 'private'!
  83. selectorSetOf: aCollection
  84. ^ (aCollection collect: [ :each | each selector ]) asSet
  85. ! !
  86. !SUnitAsyncTest methodsFor: 'running'!
  87. setUp
  88. flag := 'ok'
  89. !
  90. tearDown
  91. self assert: 'ok' equals: flag
  92. ! !
  93. !SUnitAsyncTest methodsFor: 'tests'!
  94. testAsyncErrorsAndFailures
  95. | suite runner result assertBlock |
  96. suite := #(fakeError fakeErrorFailingInTearDown fakeFailure testPass) collect: [ :each | self class selector: each ].
  97. runner := TestSuiteRunner on: suite.
  98. self timeout: 200.
  99. result := runner result.
  100. assertBlock := self async: [
  101. self assert: (self selectorSetOf: result errors) equals: #(fakeError) asSet.
  102. self assert: (self selectorSetOf: result failures) equals: #(fakeErrorFailingInTearDown fakeFailure) asSet.
  103. self finished
  104. ].
  105. runner announcer on: ResultAnnouncement do: [ :ann |
  106. (ann result == result and: [ result runs = result total ]) ifTrue: assertBlock ].
  107. runner run
  108. !
  109. testAsyncNeedsTimeout
  110. self should: [ self async: [ ] ] raise: Error.
  111. self timeout: 0.
  112. self shouldnt: [ self async: [ ] ] raise: Error.
  113. self finished
  114. !
  115. testFinishedNeedsTimeout
  116. self should: [ self finished ] raise: Error.
  117. self timeout: 0.
  118. self shouldnt: [ self finished ] raise: Error.
  119. !
  120. testIsAsyncReturnsCorrectValues
  121. self deny: self isAsync.
  122. self timeout: 0.
  123. self assert: self isAsync.
  124. self finished.
  125. self deny: self isAsync
  126. !
  127. testPass
  128. flag := 'bad'.
  129. self timeout: 10.
  130. flag := (self async: [ self assert: true. self finished. flag := 'ok' ]) valueWithTimeout: 5
  131. !
  132. testTimeouts
  133. | suite runner result assertBlock |
  134. suite := #(fakeTimeout fakeMultipleTimeoutFailing fakeMultipleTimeoutPassing testPass) collect: [ :each | self class selector: each ].
  135. runner := TestSuiteRunner on: suite.
  136. self timeout: 200.
  137. result := runner result.
  138. assertBlock := self async: [
  139. self assert: (self selectorSetOf: result errors) equals: Set new.
  140. self assert: (self selectorSetOf: result failures) equals: #(fakeMultipleTimeoutFailing fakeTimeout) asSet.
  141. self finished
  142. ].
  143. runner announcer on: ResultAnnouncement do: [ :ann |
  144. (ann result == result and: [ result runs = result total ]) ifTrue: assertBlock ].
  145. runner run
  146. !
  147. testTwoAsyncPassesWithFinishedOnlyOneIsRun
  148. | x |
  149. flag := 'bad'.
  150. self timeout: 10.
  151. x := 0.
  152. flag := (self async: [ self finished. flag := 'ok'. x := x+1. self assert: x equals: 1 ]) valueWithTimeout: 0.
  153. flag := (self async: [ self finished. flag := 'ok'. x := x+1. self assert: x equals: 1 ]) valueWithTimeout: 0.
  154. ! !
  155. TestCase subclass: #SUnitPromiseTest
  156. slots: {#flag}
  157. package: 'SUnit-Tests'!
  158. !SUnitPromiseTest methodsFor: 'helpers'!
  159. fakeError
  160. flag := 'bad'.
  161. self timeout: 30.
  162. flag := Promise delayMilliseconds: 20.
  163. ^ flag then: [ flag := 'ok'. self error: 'Intentional' ]
  164. !
  165. fakeErrorFailingInTearDown
  166. flag := 'bad'.
  167. self timeout: 30.
  168. flag := Promise delayMilliseconds: 20.
  169. ^ flag then: [ self error: 'Intentional' ]
  170. !
  171. fakeFailure
  172. flag := 'bad'.
  173. self timeout: 30.
  174. flag := Promise delayMilliseconds: 20.
  175. ^ flag then: [ flag := 'ok'. self assert: false ]
  176. !
  177. fakeMultipleTimeoutFailing
  178. self timeout: 100.
  179. ^ (Promise delayMilliseconds: 20) then: [ self timeout: 20. Promise delayMilliseconds: 30 ]
  180. !
  181. fakeMultipleTimeoutPassing
  182. self timeout: 20.
  183. ^ (Promise delayMilliseconds: 10) then: [ self timeout: 40. Promise delayMilliseconds: 20 ]
  184. !
  185. fakePromiseWithoutTimeout
  186. ^ Promise delayMilliseconds: 10
  187. !
  188. fakeTimeout
  189. self timeout: 10.
  190. ^ Promise delayMilliseconds: 20
  191. !
  192. fakeTimeoutSendOnly
  193. self timeout: 10
  194. ! !
  195. !SUnitPromiseTest methodsFor: 'private'!
  196. selectorSetOf: aCollection
  197. ^ (aCollection collect: [ :each | each selector ]) asSet
  198. ! !
  199. !SUnitPromiseTest methodsFor: 'running'!
  200. setUp
  201. flag := 'ok'
  202. !
  203. tearDown
  204. self assert: 'ok' equals: flag
  205. ! !
  206. !SUnitPromiseTest methodsFor: 'tests'!
  207. testIsAsyncReturnsCorrectValues
  208. self deny: self isAsync.
  209. self timeout: 0.
  210. self assert: self isAsync.
  211. "self finished.
  212. self deny: self isAsync"
  213. ^ Promise new
  214. !
  215. testPass
  216. flag := 'bad'.
  217. self timeout: 10.
  218. flag := Promise delayMilliseconds: 5.
  219. ^ flag then: [ self assert: true. flag := 'ok' ]
  220. !
  221. testPromiseErrorsAndFailures
  222. | suite runner result |
  223. suite := #(fakeError fakeErrorFailingInTearDown fakeFailure testPass) collect: [ :each | self class selector: each ].
  224. runner := TestSuiteRunner on: suite.
  225. self timeout: 200.
  226. result := runner result.
  227. ^ Promise new: [ :model |
  228. runner announcer on: ResultAnnouncement do: [ :ann |
  229. (ann result == result and: [ result runs = result total ]) ifTrue: [
  230. self assert: (self selectorSetOf: result errors) equals: #(fakeError) asSet.
  231. self assert: (self selectorSetOf: result failures) equals: #(fakeErrorFailingInTearDown fakeFailure) asSet.
  232. model value: nil ] ].
  233. runner run ]
  234. !
  235. testTimeouts
  236. | suite runner result |
  237. suite := #(fakeTimeout fakeMultipleTimeoutFailing fakeMultipleTimeoutPassing fakeTimeoutSendOnly fakePromiseWithoutTimeout testPass) collect: [ :each | self class selector: each ].
  238. runner := TestSuiteRunner on: suite.
  239. self timeout: 200.
  240. result := runner result.
  241. ^ Promise new: [ :model |
  242. runner announcer on: ResultAnnouncement do: [ :ann |
  243. console log: ann; log: ann result runs.
  244. (ann result == result and: [ result runs = result total ]) ifTrue: [
  245. self assert: (self selectorSetOf: result errors) equals: #() asSet.
  246. self assert: (self selectorSetOf: result failures) equals: #(fakeMultipleTimeoutFailing fakeTimeout fakeTimeoutSendOnly fakePromiseWithoutTimeout) asSet.
  247. model value: nil ] ].
  248. runner run ]
  249. ! !