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