author | Stefan Vogel <sv@exept.de> |
Thu, 18 Aug 2005 14:34:52 +0200 | |
changeset 124 | 8a12b0ff1d13 |
parent 122 | 61e456491017 |
child 128 | f132025aca4e |
permissions | -rw-r--r-- |
0 | 1 |
"{ Package: 'stx:goodies/sunit' }" |
2 |
||
3 |
Object subclass:#TestCase |
|
4 |
instanceVariableNames:'testSelector' |
|
5 |
classVariableNames:'' |
|
6 |
poolDictionaries:'' |
|
6
78bb1397e43d
added rerun-defect tests; fixed button enable bug
Claus Gittinger <cg@exept.de>
parents:
4
diff
changeset
|
7 |
category:'SUnit-Base' |
0 | 8 |
! |
9 |
||
87
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
10 |
TestCase class instanceVariableNames:'lastTestRunResultOrNil lastTestRunsFailedTests' |
81 | 11 |
|
12 |
" |
|
13 |
No other class instance variables are inherited by this class. |
|
14 |
" |
|
15 |
! |
|
16 |
||
103 | 17 |
TestCase comment:'A TestCase is a Command representing the future running of a test case. Create one with the class method #selector: aSymbol, passing the name of the method to be run when the test case runs. |
18 |
||
19 |
When you discover a new fixture, subclass TestCase, declare instance variables for the objects in the fixture, override #setUp to initialize the variables, and possibly override# tearDown to deallocate any external resources allocated in #setUp. |
|
20 |
||
21 |
When you are writing a test case method, send #assert: aBoolean when you want to check for an expected value. For example, you might say "self assert: socket isOpen" to test whether or not a socket is open at a point in a test.' |
|
22 |
! |
|
23 |
||
12 | 24 |
|
2 | 25 |
!TestCase class methodsFor:'initialization'! |
26 |
||
27 |
initialize |
|
124 | 28 |
ResumableTestFailure autoload |
2 | 29 |
|
30 |
" |
|
31 |
self initialize |
|
4 | 32 |
" |
33 |
! ! |
|
2 | 34 |
|
68 | 35 |
!TestCase class methodsFor:'instance creation'! |
0 | 36 |
|
37 |
debug: aSymbol |
|
103 | 38 |
|
6
78bb1397e43d
added rerun-defect tests; fixed button enable bug
Claus Gittinger <cg@exept.de>
parents:
4
diff
changeset
|
39 |
^(self selector: aSymbol) debug |
103 | 40 |
|
6
78bb1397e43d
added rerun-defect tests; fixed button enable bug
Claus Gittinger <cg@exept.de>
parents:
4
diff
changeset
|
41 |
! |
0 | 42 |
|
43 |
run: aSymbol |
|
103 | 44 |
|
6
78bb1397e43d
added rerun-defect tests; fixed button enable bug
Claus Gittinger <cg@exept.de>
parents:
4
diff
changeset
|
45 |
^(self selector: aSymbol) run |
103 | 46 |
|
6
78bb1397e43d
added rerun-defect tests; fixed button enable bug
Claus Gittinger <cg@exept.de>
parents:
4
diff
changeset
|
47 |
! |
0 | 48 |
|
49 |
selector: aSymbol |
|
103 | 50 |
|
6
78bb1397e43d
added rerun-defect tests; fixed button enable bug
Claus Gittinger <cg@exept.de>
parents:
4
diff
changeset
|
51 |
^self new setTestSelector: aSymbol |
103 | 52 |
|
6
78bb1397e43d
added rerun-defect tests; fixed button enable bug
Claus Gittinger <cg@exept.de>
parents:
4
diff
changeset
|
53 |
! |
0 | 54 |
|
55 |
suite |
|
56 |
||
103 | 57 |
^self buildSuite |
58 |
||
0 | 59 |
! ! |
60 |
||
66 | 61 |
!TestCase class methodsFor:'accessing'! |
62 |
||
63 |
allTestSelectors |
|
103 | 64 |
|
65 |
^ (self allSelectors select: [:each | 'test*' match: each]) asOrderedCollection sort |
|
66 | 66 |
! |
67 |
||
81 | 68 |
forgetLastTestRunResult |
87
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
69 |
lastTestRunResultOrNil ~~ nil ifTrue:[ |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
70 |
lastTestRunResultOrNil := nil. |
82 | 71 |
Smalltalk changed:#lastTestRunResult with:self. |
72 |
self changed:#lastTestRunResult. |
|
73 |
] |
|
81 | 74 |
! |
75 |
||
87
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
76 |
lastTestRunResultOrNil |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
77 |
^ lastTestRunResultOrNil |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
78 |
! |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
79 |
|
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
80 |
rememberFailedTest:selector |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
81 |
lastTestRunsFailedTests isNil ifTrue:[ |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
82 |
lastTestRunsFailedTests := Set new. |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
83 |
]. |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
84 |
lastTestRunsFailedTests add:selector. |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
85 |
self rememberFailedTestRun |
81 | 86 |
! |
87 |
||
88 |
rememberFailedTestRun |
|
87
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
89 |
lastTestRunResultOrNil ~~ false ifTrue:[ |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
90 |
lastTestRunResultOrNil := false. |
82 | 91 |
Smalltalk changed:#lastTestRunResult with:self. |
92 |
self changed:#lastTestRunResult. |
|
93 |
] |
|
81 | 94 |
! |
95 |
||
87
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
96 |
rememberFailedTestRunWithResult:result |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
97 |
self rememberFailedTestRun. |
103 | 98 |
(result failures union:result errors) do:[:eachFailedTest | |
87
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
99 |
|sel| |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
100 |
|
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
101 |
sel := eachFailedTest selector. |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
102 |
self rememberFailedTest:sel. |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
103 |
]. |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
104 |
! |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
105 |
|
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
106 |
rememberPassedTest:selector |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
107 |
lastTestRunsFailedTests notNil ifTrue:[ |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
108 |
lastTestRunsFailedTests remove:selector ifAbsent:nil. |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
109 |
lastTestRunsFailedTests isEmpty ifTrue:[ |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
110 |
lastTestRunsFailedTests := nil |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
111 |
] |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
112 |
]. |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
113 |
! |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
114 |
|
81 | 115 |
rememberPassedTestRun |
87
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
116 |
lastTestRunResultOrNil ~~ true ifTrue:[ |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
117 |
lastTestRunResultOrNil := true. |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
118 |
lastTestRunsFailedTests := nil. |
82 | 119 |
Smalltalk changed:#lastTestRunResult with:self. |
120 |
self changed:#lastTestRunResult. |
|
121 |
] |
|
81 | 122 |
! |
123 |
||
66 | 124 |
resources |
103 | 125 |
|
66 | 126 |
^#() |
103 | 127 |
|
128 |
! |
|
129 |
||
130 |
sunitVersion |
|
131 |
^'3.1' |
|
132 |
||
66 | 133 |
! |
134 |
||
87
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
135 |
testSelectorFailed:selector |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
136 |
^ lastTestRunsFailedTests notNil and:[lastTestRunsFailedTests includes:selector] |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
137 |
! |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
138 |
|
66 | 139 |
testSelectors |
103 | 140 |
|
141 |
^ (self selectors select: [:each | 'test*' match: each]) asOrderedCollection sort |
|
66 | 142 |
! ! |
143 |
||
103 | 144 |
!TestCase class methodsFor:'building suites'! |
68 | 145 |
|
146 |
buildSuite |
|
103 | 147 |
| suite | |
148 |
^self isAbstract |
|
149 |
ifTrue: |
|
150 |
[suite := self suiteClass named: self name asString. |
|
151 |
self allSubclasses |
|
152 |
do: [:each | each isAbstract ifFalse: [suite addTest: each buildSuiteFromSelectors]]. |
|
153 |
suite] |
|
154 |
ifFalse: [self buildSuiteFromSelectors] |
|
155 |
||
68 | 156 |
! |
157 |
||
158 |
buildSuiteFromAllSelectors |
|
103 | 159 |
|
68 | 160 |
^self buildSuiteFromMethods: self allTestSelectors |
103 | 161 |
|
68 | 162 |
! |
163 |
||
164 |
buildSuiteFromLocalSelectors |
|
103 | 165 |
|
68 | 166 |
^self buildSuiteFromMethods: self testSelectors |
103 | 167 |
|
68 | 168 |
! |
169 |
||
103 | 170 |
buildSuiteFromMethods: testMethods |
171 |
||
172 |
^testMethods |
|
173 |
inject: (self suiteClass named: self name asString) |
|
174 |
into: [:suite :selector | |
|
68 | 175 |
suite |
176 |
addTest: (self selector: selector); |
|
177 |
yourself] |
|
103 | 178 |
|
68 | 179 |
! |
180 |
||
181 |
buildSuiteFromSelectors |
|
103 | 182 |
|
68 | 183 |
^self shouldInheritSelectors |
184 |
ifTrue: [self buildSuiteFromAllSelectors] |
|
185 |
ifFalse: [self buildSuiteFromLocalSelectors] |
|
103 | 186 |
|
187 |
! |
|
188 |
||
189 |
suiteClass |
|
190 |
^TestSuite |
|
191 |
||
68 | 192 |
! ! |
193 |
||
66 | 194 |
!TestCase class methodsFor:'testing'! |
50 | 195 |
|
196 |
isAbstract |
|
103 | 197 |
"Override to true if a TestCase subclass is Abstract and should not have |
198 |
TestCase instances built from it" |
|
199 |
||
200 |
^ self name = #TestCase |
|
50 | 201 |
! |
202 |
||
87
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
203 |
runTests |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
204 |
|result| |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
205 |
|
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
206 |
result := self suite run. |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
207 |
|
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
208 |
result hasPassed ifTrue:[ |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
209 |
self rememberPassedTestRun |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
210 |
] ifFalse:[ |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
211 |
self rememberFailedTestRunWithResult:result |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
212 |
]. |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
213 |
! |
24e88e7f5d88
remember individual failed cases.
Claus Gittinger <cg@exept.de>
parents:
82
diff
changeset
|
214 |
|
50 | 215 |
shouldInheritSelectors |
103 | 216 |
"I should inherit from an Abstract superclass but not from a concrete one by default, unless I have no testSelectors in which case I must be expecting to inherit them from my superclass. If a test case with selectors wants to inherit selectors from a concrete superclass, override this to true in that subclass." |
217 |
||
218 |
^self superclass isAbstract |
|
219 |
or: [self testSelectors isEmpty] |
|
220 |
||
221 |
"$QA Ignore:Sends system method(superclass)$" |
|
222 |
||
223 |
! ! |
|
224 |
||
225 |
!TestCase methodsFor:'accessing'! |
|
50 | 226 |
|
103 | 227 |
resources |
228 |
| allResources resourceQueue | |
|
229 |
allResources := Set new. |
|
230 |
resourceQueue := OrderedCollection new. |
|
231 |
resourceQueue addAll: self class resources. |
|
232 |
[resourceQueue isEmpty] whileFalse: [ |
|
233 |
| next | |
|
234 |
next := resourceQueue removeFirst. |
|
235 |
allResources add: next. |
|
236 |
resourceQueue addAll: next resources]. |
|
237 |
^allResources |
|
238 |
||
239 |
! |
|
240 |
||
241 |
selector |
|
242 |
^testSelector |
|
243 |
||
50 | 244 |
! ! |
245 |
||
97 | 246 |
!TestCase methodsFor:'accessing & queries'! |
247 |
||
248 |
unfinished |
|
249 |
||
250 |
"indicates an unfinished test" |
|
251 |
! ! |
|
252 |
||
253 |
!TestCase methodsFor:'assertions'! |
|
66 | 254 |
|
255 |
assert: aBoolean |
|
256 |
"fail, if the argument is not true" |
|
257 |
||
103 | 258 |
"/ aBoolean ifFalse: [self signalFailure: 'Assertion failed'] |
69 | 259 |
|
260 |
self assert: aBoolean message:'Assertion failed' |
|
261 |
! |
|
262 |
||
97 | 263 |
assert:aBlock completesInSeconds:aNumber |
264 |
"fail, if aBlock does not finish its work in aNumber seconds" |
|
265 |
||
266 |
|done process semaphore| |
|
267 |
||
268 |
done := false. |
|
269 |
semaphore := Semaphore new. |
|
270 |
[ |
|
271 |
process := Processor activeProcess. |
|
272 |
aBlock value. |
|
273 |
done := true. |
|
274 |
semaphore signal |
|
275 |
] fork. |
|
276 |
semaphore waitWithTimeout: aNumber. |
|
277 |
process terminate. |
|
278 |
self assert: done |
|
279 |
||
280 |
" |
|
281 |
self new assert:[Delay waitForSeconds:2] completesInSeconds:1 |
|
282 |
" |
|
283 |
" |
|
284 |
self new assert:[Delay waitForSeconds:1] completesInSeconds:2 |
|
285 |
" |
|
286 |
! |
|
287 |
||
103 | 288 |
assert: aBoolean description: aString |
289 |
aBoolean ifFalse: [ |
|
290 |
self logFailure: aString. |
|
291 |
self signalFailure: aString] |
|
292 |
! |
|
293 |
||
294 |
assert: aBoolean description: aString resumable: resumableBoolean |
|
295 |
||
296 |
aBoolean |
|
297 |
ifFalse: |
|
298 |
[self logFailure: aString. |
|
299 |
self signalFailure:aString resumable:resumableBoolean] |
|
300 |
! |
|
301 |
||
69 | 302 |
assert: aBoolean message:messageIfFailing |
303 |
"fail, if the argument is not true" |
|
304 |
||
66 | 305 |
"check the testCase itself" |
306 |
(aBoolean isBoolean) ifFalse:[ self error:'non boolean assertion' ]. |
|
69 | 307 |
aBoolean ifFalse: [self signalFailure: messageIfFailing] |
66 | 308 |
|
309 |
"Modified: / 21.6.2000 / 10:00:05 / Sames" |
|
310 |
! |
|
311 |
||
312 |
assertFalse:aBoolean |
|
313 |
^ self assert:aBoolean not |
|
314 |
! |
|
315 |
||
316 |
assertFalse:aBoolean named:testName |
|
317 |
^ self assert:aBoolean not |
|
318 |
! |
|
319 |
||
320 |
assertTrue:aBoolean |
|
321 |
^ self assert:aBoolean |
|
322 |
! |
|
323 |
||
324 |
assertTrue:aBoolean named:testName |
|
325 |
^ self assert:aBoolean |
|
326 |
! |
|
327 |
||
103 | 328 |
deny:aBoolean |
66 | 329 |
"fail, if the argument is not false" |
103 | 330 |
|
331 |
self assert:aBoolean not |
|
332 |
! |
|
66 | 333 |
|
103 | 334 |
deny: aBoolean description: aString |
335 |
self assert: aBoolean not description: aString |
|
336 |
||
66 | 337 |
! |
338 |
||
103 | 339 |
deny: aBoolean description: aString resumable: resumableBoolean |
340 |
self |
|
341 |
assert: aBoolean not |
|
342 |
description: aString |
|
343 |
resumable: resumableBoolean |
|
344 |
||
66 | 345 |
! |
346 |
||
103 | 347 |
should:aBlock |
348 |
"fail, if the block does not evaluate to true" |
|
349 |
||
350 |
self assert:aBlock value |
|
66 | 351 |
! |
352 |
||
103 | 353 |
should: aBlock description: aString |
354 |
self assert: aBlock value description: aString |
|
355 |
||
66 | 356 |
! |
357 |
||
103 | 358 |
should:aBlock raise:anExceptionalEvent |
66 | 359 |
"fail, if the block does not raise the given event" |
103 | 360 |
|
361 |
^ self assert:(self executeShould:aBlock inScopeOf:anExceptionalEvent) |
|
66 | 362 |
! |
363 |
||
103 | 364 |
should: aBlock raise: anExceptionalEvent description: aString |
365 |
^self assert: (self executeShould: aBlock inScopeOf: anExceptionalEvent) |
|
366 |
description: aString |
|
367 |
||
66 | 368 |
! |
369 |
||
103 | 370 |
shouldnt:aBlock |
371 |
"fail, if the block does evaluate to true" |
|
372 |
||
373 |
self deny:aBlock value |
|
374 |
! |
|
66 | 375 |
|
103 | 376 |
shouldnt: aBlock description: aString |
377 |
self deny: aBlock value description: aString |
|
378 |
||
66 | 379 |
! |
380 |
||
103 | 381 |
shouldnt:aBlock raise:anExceptionalEvent |
382 |
"fail, if the block does raise the given event" |
|
383 |
||
384 |
^ self |
|
385 |
assert:(self executeShould:aBlock inScopeOf:anExceptionalEvent) not |
|
386 |
! |
|
66 | 387 |
|
103 | 388 |
shouldnt: aBlock raise: anExceptionalEvent description: aString |
389 |
^self assert: (self executeShould: aBlock inScopeOf: anExceptionalEvent) not description: aString |
|
390 |
||
66 | 391 |
! ! |
392 |
||
67 | 393 |
!TestCase methodsFor:'dependencies'! |
394 |
||
395 |
addDependentToHierachy: anObject |
|
396 |
"an empty method. for Composite compability with TestSuite" |
|
103 | 397 |
|
398 |
||
399 |
||
67 | 400 |
! |
401 |
||
402 |
removeDependentFromHierachy: anObject |
|
403 |
"an empty method. for Composite compability with TestSuite" |
|
103 | 404 |
|
405 |
||
406 |
||
67 | 407 |
! ! |
408 |
||
409 |
!TestCase methodsFor:'printing'! |
|
410 |
||
411 |
name |
|
412 |
^ self class name. |
|
413 |
! |
|
414 |
||
415 |
printOn: aStream |
|
416 |
||
103 | 417 |
"/ aStream |
418 |
"/ nextPutAll: self class printString; |
|
419 |
"/ nextPutAll: '>>#'; |
|
420 |
"/ nextPutAll: testSelector |
|
421 |
||
422 |
aStream nextPutAll: self name. |
|
423 |
aStream nextPutAll: '>>'. |
|
118
9464f408680f
care for printing uninitialized testcases
Claus Gittinger <cg@exept.de>
parents:
103
diff
changeset
|
424 |
testSelector printOn: aStream |
122 | 425 |
! |
426 |
||
427 |
testName |
|
428 |
^ testSelector. |
|
67 | 429 |
! ! |
430 |
||
431 |
!TestCase methodsFor:'private'! |
|
432 |
||
433 |
executeShould: aBlock inScopeOf: anExceptionalEvent |
|
103 | 434 |
"/ ^[aBlock value. |
435 |
"/ false] sunitOn: anExceptionalEvent |
|
436 |
"/ do: [:ex | ex sunitExitWith: true] |
|
437 |
||
438 |
"/ [[aBlock value] |
|
439 |
"/ on: anExceptionalEvent |
|
440 |
"/ do: [:ex | ^true]] |
|
441 |
"/ on: TestResult exError |
|
442 |
"/ do: [:ex | ^false]. |
|
443 |
[aBlock value] |
|
101 | 444 |
on: anExceptionalEvent |
103 | 445 |
do: [:ex | ^true]. |
446 |
||
101 | 447 |
^false. |
67 | 448 |
! |
449 |
||
450 |
performTest |
|
103 | 451 |
|
67 | 452 |
self perform: testSelector asSymbol |
453 |
! |
|
454 |
||
455 |
setTestSelector: aSymbol |
|
456 |
testSelector := aSymbol |
|
103 | 457 |
|
458 |
! |
|
459 |
||
460 |
signalFailure: aString |
|
461 |
||
462 |
"/ TestResult failure sunitSignalWith: aString |
|
463 |
TestResult failure raiseErrorString:aString in:thisContext sender sender . |
|
464 |
! |
|
465 |
||
466 |
signalFailure:aString resumable:isResumable |
|
467 |
"/ TestResult failure sunitSignalWith: aString |
|
468 |
||
469 |
isResumable ifTrue:[ |
|
470 |
TestResult resumableFailure |
|
471 |
raiseRequestWith:nil |
|
472 |
errorString:aString |
|
473 |
in:thisContext sender sender |
|
474 |
] ifFalse:[ |
|
475 |
TestResult failure raiseErrorString:aString in:thisContext sender sender |
|
476 |
]. |
|
477 |
! |
|
478 |
||
479 |
signalUnavailableResources |
|
480 |
||
481 |
self resources do:[:res | |
|
482 |
res isAvailable ifFalse:[ |
|
483 |
^ res signalInitializationError |
|
484 |
] |
|
485 |
]. |
|
67 | 486 |
! ! |
487 |
||
122 | 488 |
!TestCase methodsFor:'queries'! |
489 |
||
490 |
isTestCase |
|
491 |
^ true |
|
492 |
! |
|
493 |
||
494 |
isTestSuite |
|
495 |
^ false |
|
496 |
! ! |
|
497 |
||
67 | 498 |
!TestCase methodsFor:'running'! |
499 |
||
500 |
debug |
|
103 | 501 |
|
502 |
"/ self signalUnavailableResources. |
|
503 |
"/ [(self class selector: testSelector) runCase] |
|
504 |
"/ sunitEnsure: [self resources do: [:each | each reset]] |
|
67 | 505 |
self debugUsing:#runCase. |
506 |
! |
|
507 |
||
508 |
debugAsFailure |
|
103 | 509 |
|semaphore| |
510 |
||
511 |
self signalUnavailableResources. |
|
512 |
semaphore := Semaphore new. |
|
513 |
[ |
|
514 |
semaphore wait. |
|
515 |
self resources do:[:each | |
|
516 |
each reset |
|
517 |
] |
|
518 |
] fork. |
|
519 |
(self class selector:testSelector) runCaseAsFailure:semaphore. |
|
67 | 520 |
! |
521 |
||
103 | 522 |
debugUsing:aSymbol |
523 |
self signalUnavailableResources. |
|
524 |
[ |
|
525 |
(self class selector:testSelector) perform:aSymbol |
|
526 |
] ensure:[ |
|
527 |
self resources do:[:each | |
|
528 |
each reset |
|
529 |
] |
|
530 |
] |
|
531 |
! |
|
532 |
||
533 |
failureLog |
|
534 |
^SUnitNameResolver class >> #defaultLogDevice |
|
535 |
! |
|
536 |
||
537 |
isLogging |
|
538 |
"By default, we're not logging failures. If you override this in |
|
539 |
a subclass, make sure that you override #failureLog" |
|
540 |
^false |
|
541 |
||
542 |
! |
|
543 |
||
544 |
logFailure: aString |
|
545 |
self isLogging ifTrue: [ |
|
546 |
self failureLog |
|
547 |
cr; |
|
548 |
nextPutAll: aString; |
|
549 |
flush] |
|
550 |
||
67 | 551 |
! |
552 |
||
553 |
openDebuggerOnFailingTestMethod |
|
103 | 554 |
"SUnit has halted one step in front of the failing test method. Step over the 'self halt' and |
555 |
send into 'self perform: testSelector' to see the failure from the beginning" |
|
67 | 556 |
|
103 | 557 |
self |
558 |
"halt;" |
|
559 |
performTest |
|
67 | 560 |
! |
561 |
||
562 |
run |
|
563 |
| result | |
|
564 |
result := TestResult new. |
|
565 |
self run: result. |
|
566 |
^result |
|
103 | 567 |
|
67 | 568 |
! |
569 |
||
570 |
run: aResult |
|
571 |
aResult runCase: self |
|
103 | 572 |
|
67 | 573 |
! |
574 |
||
575 |
run: aResult afterEachDo:block2 |
|
576 |
aResult runCase: self. |
|
577 |
block2 value:self value:aResult. |
|
578 |
! |
|
579 |
||
580 |
run: aResult beforeEachDo:block1 afterEachDo:block2 |
|
581 |
block1 value:self value:aResult. |
|
122 | 582 |
aResult runCase: self. |
583 |
block2 value:self value:aResult. |
|
584 |
! |
|
585 |
||
586 |
run: aResult beforeEachTestCaseDo:block1 afterEachTestCaseDo:block2 |
|
587 |
block1 value:self value:aResult. |
|
67 | 588 |
aResult runCase: self. |
589 |
block2 value:self value:aResult. |
|
590 |
! |
|
591 |
||
592 |
runCase |
|
593 |
||
103 | 594 |
[self setUp. |
595 |
self performTest] ensure: [self tearDown] |
|
67 | 596 |
! |
597 |
||
598 |
runCaseAsFailure |
|
599 |
self setUp. |
|
600 |
[[self openDebuggerOnFailingTestMethod] ensure: [self tearDown]] fork |
|
601 |
||
602 |
"Modified: / 21.6.2000 / 10:04:33 / Sames" |
|
603 |
! |
|
604 |
||
103 | 605 |
runCaseAsFailure: aSemaphore |
606 |
[self setUp. |
|
607 |
self openDebuggerOnFailingTestMethod] ensure: [ |
|
608 |
self tearDown. |
|
609 |
aSemaphore signal] |
|
610 |
! |
|
611 |
||
67 | 612 |
setUp |
103 | 613 |
|
67 | 614 |
! |
615 |
||
616 |
tearDown |
|
103 | 617 |
|
50 | 618 |
! ! |
619 |
||
12 | 620 |
!TestCase class methodsFor:'documentation'! |
621 |
||
622 |
version |
|
124 | 623 |
^ '$Header: /cvs/stx/stx/goodies/sunit/TestCase.st,v 1.39 2005-08-18 12:34:52 stefan Exp $' |
12 | 624 |
! ! |
81 | 625 |
|
2 | 626 |
TestCase initialize! |