SUnit-Tests.st 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  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. fakeNonLifoReturn
  79. flag := 'bad'.
  80. self timeout: 30.
  81. flag := (self async: [ flag := 'ok'. ^ 'non-lifo' ]) valueWithTimeout: 20
  82. !
  83. fakeTimeout
  84. self timeout: 10.
  85. (self async: [ self finished ]) valueWithTimeout: 20
  86. ! !
  87. !SUnitAsyncTest methodsFor: 'private'!
  88. selectorSetOf: aCollection
  89. ^ (aCollection collect: [ :each | each selector ]) asSet
  90. ! !
  91. !SUnitAsyncTest methodsFor: 'running'!
  92. setUp
  93. flag := 'ok'
  94. !
  95. tearDown
  96. self assert: 'ok' equals: flag
  97. ! !
  98. !SUnitAsyncTest methodsFor: 'tests'!
  99. testAsyncErrorsAndFailures
  100. | suite runner result assertBlock |
  101. suite := #(fakeError fakeErrorFailingInTearDown fakeFailure testPass) collect: [ :each | self class selector: each ].
  102. runner := TestSuiteRunner on: suite.
  103. self timeout: 200.
  104. result := runner result.
  105. assertBlock := self async: [
  106. self assert: (self selectorSetOf: result errors) equals: #(fakeError) asSet.
  107. self assert: (self selectorSetOf: result failures) equals: #(fakeErrorFailingInTearDown fakeFailure) asSet.
  108. self finished
  109. ].
  110. runner announcer on: ResultAnnouncement do: [ :ann |
  111. (ann result == result and: [ result runs = result total ]) ifTrue: assertBlock ].
  112. runner run
  113. !
  114. testAsyncNeedsTimeout
  115. self should: [ self async: [ ] ] raise: Error.
  116. self timeout: 0.
  117. self shouldnt: [ self async: [ ] ] raise: Error.
  118. self finished
  119. !
  120. testFinishedNeedsTimeout
  121. self should: [ self finished ] raise: Error.
  122. self timeout: 0.
  123. self shouldnt: [ self finished ] raise: Error.
  124. !
  125. testIsAsyncReturnsCorrectValues
  126. self deny: self isAsync.
  127. self timeout: 0.
  128. self assert: self isAsync.
  129. self finished.
  130. self deny: self isAsync
  131. !
  132. testNonLifo
  133. | suite runner result assertBlock |
  134. suite := #(fakeNonLifoReturn 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: #(fakeNonLifoReturn) asSet.
  140. self assert: (self selectorSetOf: result failures) equals: Set new.
  141. "TODO check that error is indeed a correct NonLifoReturn"
  142. self finished
  143. ].
  144. runner announcer on: ResultAnnouncement do: [ :ann |
  145. (ann result == result and: [ result runs = result total ]) ifTrue: assertBlock ].
  146. runner run
  147. !
  148. testPass
  149. flag := 'bad'.
  150. self timeout: 10.
  151. flag := (self async: [ self assert: true. self finished. flag := 'ok' ]) valueWithTimeout: 5
  152. !
  153. testTimeouts
  154. | suite runner result assertBlock |
  155. suite := #(fakeTimeout fakeMultipleTimeoutFailing fakeMultipleTimeoutPassing testPass) collect: [ :each | self class selector: each ].
  156. runner := TestSuiteRunner on: suite.
  157. self timeout: 200.
  158. result := runner result.
  159. assertBlock := self async: [
  160. self assert: (self selectorSetOf: result errors) equals: Set new.
  161. self assert: (self selectorSetOf: result failures) equals: #(fakeMultipleTimeoutFailing fakeTimeout) asSet.
  162. self finished
  163. ].
  164. runner announcer on: ResultAnnouncement do: [ :ann |
  165. (ann result == result and: [ result runs = result total ]) ifTrue: assertBlock ].
  166. runner run
  167. !
  168. testTwoAsyncPassesWithFinishedOnlyOneIsRun
  169. | x |
  170. flag := 'bad'.
  171. self timeout: 10.
  172. x := 0.
  173. flag := (self async: [ self finished. flag := 'ok'. x := x+1. self assert: x equals: 1 ]) valueWithTimeout: 0.
  174. flag := (self async: [ self finished. flag := 'ok'. x := x+1. self assert: x equals: 1 ]) valueWithTimeout: 0.
  175. ! !
  176. TestCase subclass: #SUnitPromiseTest
  177. slots: {#flag}
  178. package: 'SUnit-Tests'!
  179. !SUnitPromiseTest methodsFor: 'helpers'!
  180. fakeError
  181. flag := 'bad'.
  182. self timeout: 30.
  183. flag := Promise delayMilliseconds: 20.
  184. ^ flag then: [ flag := 'ok'. self error: 'Intentional' ]
  185. !
  186. fakeErrorFailingInTearDown
  187. flag := 'bad'.
  188. self timeout: 30.
  189. flag := Promise delayMilliseconds: 20.
  190. ^ flag then: [ self error: 'Intentional' ]
  191. !
  192. fakeFailure
  193. flag := 'bad'.
  194. self timeout: 30.
  195. flag := Promise delayMilliseconds: 20.
  196. ^ flag then: [ flag := 'ok'. self assert: false ]
  197. !
  198. fakeMultipleTimeoutFailing
  199. self timeout: 100.
  200. ^ (Promise delayMilliseconds: 20) then: [ self timeout: 20. Promise delayMilliseconds: 30 ]
  201. !
  202. fakeMultipleTimeoutPassing
  203. self timeout: 20.
  204. ^ (Promise delayMilliseconds: 10) then: [ self timeout: 40. Promise delayMilliseconds: 20 ]
  205. !
  206. fakeNonLifoReturn
  207. flag := 'bad'.
  208. self timeout: 30.
  209. flag := Promise delayMilliseconds: 20.
  210. ^ flag then: [ flag := 'ok'. ^ 'non-lifo' ]
  211. !
  212. fakePromiseWithoutTimeout
  213. ^ Promise delayMilliseconds: 10
  214. !
  215. fakeTimeout
  216. self timeout: 10.
  217. ^ Promise delayMilliseconds: 20
  218. !
  219. fakeTimeoutSendOnly
  220. self timeout: 10
  221. ! !
  222. !SUnitPromiseTest methodsFor: 'private'!
  223. selectorSetOf: aCollection
  224. ^ (aCollection collect: [ :each | each selector ]) asSet
  225. ! !
  226. !SUnitPromiseTest methodsFor: 'running'!
  227. setUp
  228. flag := 'ok'
  229. !
  230. tearDown
  231. self assert: 'ok' equals: flag
  232. ! !
  233. !SUnitPromiseTest methodsFor: 'tests'!
  234. testIsAsyncReturnsCorrectValues
  235. self deny: self isAsync.
  236. self timeout: 0.
  237. self assert: self isAsync.
  238. "self finished.
  239. self deny: self isAsync"
  240. ^ Promise new
  241. !
  242. testNonLifo
  243. | suite runner result |
  244. suite := #(fakeNonLifoReturn testPass) collect: [ :each | self class selector: each ].
  245. runner := TestSuiteRunner on: suite.
  246. self timeout: 200.
  247. result := runner result.
  248. ^ Promise new: [ :model |
  249. runner announcer on: ResultAnnouncement do: [ :ann |
  250. (ann result == result and: [ result runs = result total ]) ifTrue: [ model do: [
  251. self assert: (self selectorSetOf: result errors) equals: #(fakeNonLifoReturn) asSet.
  252. self assert: (self selectorSetOf: result failures) equals: Set new.
  253. "TODO check that error is indeed a correct NonLifoReturn"
  254. ] ] ].
  255. runner run ]
  256. !
  257. testPass
  258. flag := 'bad'.
  259. self timeout: 10.
  260. flag := Promise delayMilliseconds: 5.
  261. ^ flag then: [ self assert: true. flag := 'ok' ]
  262. !
  263. testPromiseErrorsAndFailures
  264. | suite runner result |
  265. suite := #(fakeError fakeErrorFailingInTearDown fakeFailure testPass) collect: [ :each | self class selector: each ].
  266. runner := TestSuiteRunner on: suite.
  267. self timeout: 200.
  268. result := runner result.
  269. ^ Promise new: [ :model |
  270. runner announcer on: ResultAnnouncement do: [ :ann |
  271. (ann result == result and: [ result runs = result total ]) ifTrue: [ model do: [
  272. self assert: (self selectorSetOf: result errors) equals: #(fakeError) asSet.
  273. self assert: (self selectorSetOf: result failures) equals: #(fakeErrorFailingInTearDown fakeFailure) asSet ] ] ].
  274. runner run ]
  275. !
  276. testTimeouts
  277. | suite runner result |
  278. suite := #(fakeTimeout fakeMultipleTimeoutFailing fakeMultipleTimeoutPassing fakeTimeoutSendOnly fakePromiseWithoutTimeout testPass) collect: [ :each | self class selector: each ].
  279. runner := TestSuiteRunner on: suite.
  280. self timeout: 200.
  281. result := runner result.
  282. ^ Promise new: [ :model |
  283. runner announcer on: ResultAnnouncement do: [ :ann |
  284. (ann result == result and: [ result runs = result total ]) ifTrue: [ model do: [
  285. self assert: (self selectorSetOf: result errors) equals: #() asSet.
  286. self assert: (self selectorSetOf: result failures) equals: #(fakeMultipleTimeoutFailing fakeTimeout fakeTimeoutSendOnly fakePromiseWithoutTimeout) asSet ] ] ].
  287. runner run ]
  288. ! !