TestResource.st
author Claus Gittinger <cg@exept.de>
Sun, 01 Jul 2018 12:52:19 +0200
changeset 719 2c96860ad5cb
parent 684 dde8533d69c9
permissions -rw-r--r--
#FEATURE by cg class: TestCase::Should class definition added: #assertSelector #beInstanceOf: #equal: #not #raise: changed: #be:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:goodies/sunit' }"
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
638
51b8edf986fc class: RBAbstractClass
Claus Gittinger <cg@exept.de>
parents: 590
diff changeset
     3
"{ NameSpace: Smalltalk }"
51b8edf986fc class: RBAbstractClass
Claus Gittinger <cg@exept.de>
parents: 590
diff changeset
     4
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
     5
TestAsserter subclass:#TestResource
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	instanceVariableNames:'name description'
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	classVariableNames:''
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
	poolDictionaries:''
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
	category:'SUnit-Base'
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
!
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
TestResource class instanceVariableNames:'current'
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
"
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
 No other class instance variables are inherited by this class.
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
"
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
!
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
668
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    19
!TestResource class methodsFor:'documentation'!
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    20
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    21
documentation
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    22
"
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    23
Normally a test will set up all the objects it needs and tear them down again after it has run.  
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    24
This self-containedness makes a test more robust.  
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    25
Use TestResources only for objects that are needed by several tests and that are too 'expensive' 
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    26
(in time or otherwise) to recreate and destroy for each test.  
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    27
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    28
A viable approach is to develop the code in MyTestCase's #setUp and #tearDown methods, 
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    29
then at some point refactor the code into the #setUp and #tearDown of a TestResource 
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    30
whose class is added to MyTestCase class>>resource method.
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    31
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    32
TestResource uses the singleton pattern.  
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    33
A TestResource class will set up a single instance of itself when first requested and tear it down again 
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    34
at the end of TestSuite>>run (or TestCase>>run, >>debug and >>debugAsFailure).  
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    35
Normally, a TestResource, once setUp, remains active during the running of all remaining tests 
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    36
and is #reset after all tests have run.  
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    37
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    38
For an exception, see subclass CompetingResource in SUnitResourcePatterns.  
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    39
Users can choose to #reset a resource in the #tearDown of a test that alters it, 
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    40
sacrificing the performance gain of having a single #setUp of the resource for the certainty 
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    41
that other tests using it will not see the alterations.  
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    42
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    43
Generally however, this should be the exception:  
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    44
if you need to reset the resource for every test that uses it, 
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    45
its code should just be part of your test's #setUp and #tearDown code.
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    46
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    47
To use, create a subclass of TestResource and override the following:
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    48
        - TestCase class>>resources, to return a collection including the TestResource class, 
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    49
          for all test case classes that need it
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    50
                * a TestCase' resources are set up in the order returned and torn down in the reverse order
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    51
        - TestResource class>>resources, if the resource itself always needs some other resource 
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    52
          to be present before it can set up
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    53
                * a TestResource's resource are set up before it and torn down after it, and are set up in the order returned and torn down in the reverse order
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    54
        - TestResource>>setUp and tearDown, to define initial and final behaviour (just like a test)
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    55
        - TestResource>>isAvailable, to return true if it is and false if it isn't 
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    56
          (the framework calls this after setUp);  ideally, this call should not change the resource' state 
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    57
           - that should be done in setUp
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    58
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    59
TestResource implements the singleton pattern in its class-side #isAvailable and #reset methods.  
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    60
Do not override these when creating specific resources;  unless you are developing a whole new pattern of use, 
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    61
it will always be correct to override instance-side #setUp, #tearDown and #isAvailable, 
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    62
and dangerous to override class>>isAvailable, class>>isAlreadyAvailable and class>>reset.
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    63
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    64
Generally, users do not code interactions with a test's resources during the running of a test.  
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    65
Code that reads a resource' values while leaving its state strictly alone is safe enough.  
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    66
A test must leave a resource in a clean state:  always use #reset if a test must protect 
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    67
later-running tests from unsafe changes (and review whether in such a case a resource 
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    68
is the right thing to use in the first place).
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    69
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    70
See my superclass' comment for assertion and logging information.
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    71
"
324764951a46 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 667
diff changeset
    72
! !
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
    73
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
    74
!TestResource class methodsFor:'instance creation'!
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
    75
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
    76
new
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
    77
	"Use #current to get the valid current instance.  Use of #new to get an instance (that should never be the current one) could be done in bizarre circumstances, so is not blocked, but will usually be inappropriate."
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
    78
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
    79
	^super new initialize
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
    80
!
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
    81
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
    82
reset
684
dde8533d69c9 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
    83
        [
dde8533d69c9 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
    84
            self isAlreadyAvailable ifTrue: [current tearDown]
dde8533d69c9 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
    85
        ] ensure: [
dde8533d69c9 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
    86
            current := nil
dde8533d69c9 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
    87
        ].
dde8533d69c9 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
    88
dde8533d69c9 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
    89
    "Modified: / 13-07-2017 / 14:03:24 / cg"
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
    90
! !
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
68
9fd111438d60 category renames (lower case)
Claus Gittinger <cg@exept.de>
parents: 44
diff changeset
    92
!TestResource class methodsFor:'accessing'!
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
current
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
    95
	"This is a lazy accessor:  the assert of self isAvailable does no work unless current isNil.  However this method should normally be sent only to a resource that should already have been made available, e.g. in a test whose test case class has the resource class in its #resources, so should never be able to fail the assert.
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
    96
	If the intent is indeed to access a possibly-unprepared or reset-in-earlier-test resource lazily, then preface the call of 'MyResource current' with 'MyResource availableFor: self'."
103
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
    97
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
    98
	self assert: self isAvailable
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
    99
		description: 'Sent #current to unavailable resource ', self name, '.  Add it to test case'' class-side #resources (recommended) or send #availableFor: beforehand'.
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
	^current
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
!
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
103
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   103
resources
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   104
	^#()
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
! !
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
68
9fd111438d60 category renames (lower case)
Claus Gittinger <cg@exept.de>
parents: 44
diff changeset
   107
!TestResource class methodsFor:'creation'!
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   109
signalInitializationError
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   110
	^TestResult signalErrorWith: 'Resource ' , self name , ' could not be initialized'
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   111
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   112
! !
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   113
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   114
!TestResource class methodsFor:'private'!
103
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   115
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   116
makeAvailable
569
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   117
    "This method must be the _only_ way to set a notNil value for the unique instance (current).  First, obtain a candidate instance and set current to a notNil placeholder (any notNil object not an instance of me would do;  this version uses false).  Next, check any subordinate resources needed by this resource.  Lastly, setUp the candidate and put it in current if it is available, ensuring that it is torn down otherwise."
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   118
    
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   119
    |candidate didSetup|
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   120
569
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   121
    current := false.
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   122
    candidate := self new.
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   123
    self resources do:[:each | 
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   124
        each availableFor:candidate
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   125
    ].
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   126
    [
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   127
        didSetup := false.
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   128
        candidate setUp.
590
c13008404767 Fixed copy-paste bug in TestResource>>makeAvailable
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 577
diff changeset
   129
        didSetup := true.
569
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   130
        candidate isAvailable ifTrue:[
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   131
            current := candidate
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   132
        ]
684
dde8533d69c9 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
   133
    ] ensure:[
569
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   134
        didSetup ifTrue:[
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   135
            current == candidate ifFalse:[
577
3dea1e941af7 class: TestResource
Stefan Vogel <sv@exept.de>
parents: 569
diff changeset
   136
                candidate safeTearDown
569
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   137
            ]
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   138
        ]
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   139
    ].
590
c13008404767 Fixed copy-paste bug in TestResource>>makeAvailable
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 577
diff changeset
   140
c13008404767 Fixed copy-paste bug in TestResource>>makeAvailable
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 577
diff changeset
   141
    "Modified: / 04-06-2014 / 12:39:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
684
dde8533d69c9 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 668
diff changeset
   142
    "Modified: / 13-07-2017 / 14:03:07 / cg"
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
!
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   145
resetOrAddResourcesTo: aCollection
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   146
	"Add correctly set-up resources to the collection unless already there. Reset any imperfectly-set-up resources, so current isNil will return true if they are re-encountered via an indirectly self-prerequing resource;  circular references cannot be set up so will never reply true to isAlreadyAvailable, but may have correctly-set-up prereqs to add and/or imperfectly-set-up ones to reset, so do not abort the loop first time round."
70
2ff4508f476d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 68
diff changeset
   147
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   148
	current isNil ifTrue: [^self].
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   149
	self isAlreadyAvailable
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   150
		ifFalse:
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   151
			[self reset.
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   152
			self resources do: [:each | each resetOrAddResourcesTo: aCollection]]
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   153
		ifTrue:
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   154
			[(aCollection includes: self) ifFalse:
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   155
				[self resources do: [:each | each resetOrAddResourcesTo: aCollection].
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   156
				aCollection add: self]].
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   157
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   158
"The cloned 'self resources do: ...' line in both blocks is, I think, the best way to write this method so that its logic is clear.  The first loop resets this resource immediately, before traversing its resources;  the second traverses before adding"
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   159
! !
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   160
638
51b8edf986fc class: RBAbstractClass
Claus Gittinger <cg@exept.de>
parents: 590
diff changeset
   161
!TestResource class methodsFor:'queries'!
51b8edf986fc class: RBAbstractClass
Claus Gittinger <cg@exept.de>
parents: 590
diff changeset
   162
51b8edf986fc class: RBAbstractClass
Claus Gittinger <cg@exept.de>
parents: 590
diff changeset
   163
isAbstract
51b8edf986fc class: RBAbstractClass
Claus Gittinger <cg@exept.de>
parents: 590
diff changeset
   164
	"Override to true if a TestResource subclass is Abstract and should not have
51b8edf986fc class: RBAbstractClass
Claus Gittinger <cg@exept.de>
parents: 590
diff changeset
   165
	TestCase instances built from it"
51b8edf986fc class: RBAbstractClass
Claus Gittinger <cg@exept.de>
parents: 590
diff changeset
   166
51b8edf986fc class: RBAbstractClass
Claus Gittinger <cg@exept.de>
parents: 590
diff changeset
   167
	^ self == TestResource
51b8edf986fc class: RBAbstractClass
Claus Gittinger <cg@exept.de>
parents: 590
diff changeset
   168
! !
51b8edf986fc class: RBAbstractClass
Claus Gittinger <cg@exept.de>
parents: 590
diff changeset
   169
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   170
!TestResource class methodsFor:'running'!
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   171
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   172
availableFor: aTestAsserter
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   173
	aTestAsserter
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   174
		assert: self isAvailable
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   175
		description: 'Unavailable resource ' , self name , ' requested by ', aTestAsserter printString.
103
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   176
!
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   177
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   178
resetResources: topLevelResources
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   179
	"Reset all imperfectly-set-up resources while gathering the rest for ordered resetting."
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   180
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   181
	| availableResources |
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   182
	availableResources := OrderedCollection new: topLevelResources size.
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   183
	topLevelResources do: [:each | each resetOrAddResourcesTo: availableResources].
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   184
	availableResources reverseDo: [:each | each reset].
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
! !
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
68
9fd111438d60 category renames (lower case)
Claus Gittinger <cg@exept.de>
parents: 44
diff changeset
   187
!TestResource class methodsFor:'testing'!
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   189
isAlreadyAvailable
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   190
	^current class == self
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
!
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
isAvailable
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   194
	"This is (and must be) a lazy method.  If my current has a value, an attempt to make me available has already been made:  trust its result.  If not, try to make me available."
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   195
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   196
	current isNil ifTrue: [self makeAvailable].
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   197
	^self isAlreadyAvailable
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
!
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
isUnavailable
103
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   201
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
	^self isAvailable not
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   203
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
! !
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
68
9fd111438d60 category renames (lower case)
Claus Gittinger <cg@exept.de>
parents: 44
diff changeset
   206
!TestResource methodsFor:'accessing'!
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
description
103
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   209
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   210
	description isNil
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   211
		ifTrue: [^''].
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   212
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
	^description
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
!
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
description: aString
103
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   217
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
	description := aString
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
!
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
name
103
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   222
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   223
	name isNil
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   224
		ifTrue: [^self printString].
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   225
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
	^name
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
!
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
name: aString
103
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   230
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
	name := aString
103
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   232
!
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   233
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   234
resources
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   235
	^self class resources
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
! !
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   238
!TestResource methodsFor:'initialize-release'!
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
initialize
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   241
	"This method used to call setUp but now does nothing;  setUp is called by the framework at the appropriate point.  Subclasses may override to set the object to its default state."
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
! !
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
68
9fd111438d60 category renames (lower case)
Claus Gittinger <cg@exept.de>
parents: 44
diff changeset
   244
!TestResource methodsFor:'printing'!
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
printOn: aStream
103
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   247
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
	aStream nextPutAll: self class printString
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
! !
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
577
3dea1e941af7 class: TestResource
Stefan Vogel <sv@exept.de>
parents: 569
diff changeset
   251
!TestResource methodsFor:'private'!
3dea1e941af7 class: TestResource
Stefan Vogel <sv@exept.de>
parents: 569
diff changeset
   252
3dea1e941af7 class: TestResource
Stefan Vogel <sv@exept.de>
parents: 569
diff changeset
   253
safeTearDown
3dea1e941af7 class: TestResource
Stefan Vogel <sv@exept.de>
parents: 569
diff changeset
   254
    "Have to handle Abort. When tearDown is called as inside an ensure block after
3dea1e941af7 class: TestResource
Stefan Vogel <sv@exept.de>
parents: 569
diff changeset
   255
     an abort in the debugger of an errornous test case and raises an error with a debugger
3dea1e941af7 class: TestResource
Stefan Vogel <sv@exept.de>
parents: 569
diff changeset
   256
     itself."
3dea1e941af7 class: TestResource
Stefan Vogel <sv@exept.de>
parents: 569
diff changeset
   257
3dea1e941af7 class: TestResource
Stefan Vogel <sv@exept.de>
parents: 569
diff changeset
   258
    AbortOperationRequest handle:[:ex| ] do:[self tearDown].
3dea1e941af7 class: TestResource
Stefan Vogel <sv@exept.de>
parents: 569
diff changeset
   259
! !
3dea1e941af7 class: TestResource
Stefan Vogel <sv@exept.de>
parents: 569
diff changeset
   260
68
9fd111438d60 category renames (lower case)
Claus Gittinger <cg@exept.de>
parents: 44
diff changeset
   261
!TestResource methodsFor:'running'!
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
setUp
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   264
	"Does nothing. Subclasses should override this to initialize their resource"
103
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   265
!
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   266
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   267
signalInitializationError
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   268
	^self class signalInitializationError
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   269
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
!
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
tearDown
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   273
	"Does nothing. Subclasses should override this to tear down their resource"
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
! !
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
68
9fd111438d60 category renames (lower case)
Claus Gittinger <cg@exept.de>
parents: 44
diff changeset
   276
!TestResource methodsFor:'testing'!
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
isAvailable
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   279
	"Override to provide information on the readiness of the resource.  Put state-changing behaviour in setUp and keep this a state-preserving check as far as possible.  Where setUp is guaranteed to provide a valid resource if it completes, there is no need to override this."
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   280
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
	^true
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
!
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
isUnavailable
103
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   285
	"override to provide information on the
ad6897ce99e0 Merge SUnit 3.1 changes
Stefan Vogel <sv@exept.de>
parents: 70
diff changeset
   286
	readiness of the resource"
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   287
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
	^self isAvailable not
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   289
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
! !
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
!TestResource class methodsFor:'documentation'!
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
version
638
51b8edf986fc class: RBAbstractClass
Claus Gittinger <cg@exept.de>
parents: 590
diff changeset
   295
    ^ '$Header$'
217
2033d47baf43 changed: #new
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
   296
!
2033d47baf43 changed: #new
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
   297
652
771369120c8b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 638
diff changeset
   298
version_CVS
771369120c8b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 638
diff changeset
   299
    ^ '$Header$'
771369120c8b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 638
diff changeset
   300
!
771369120c8b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 638
diff changeset
   301
222
8e6f482297fa Jan's 4.1 version
Claus Gittinger <cg@exept.de>
parents: 217
diff changeset
   302
version_SVN
638
51b8edf986fc class: RBAbstractClass
Claus Gittinger <cg@exept.de>
parents: 590
diff changeset
   303
    ^ '$Id$'
44
63d3c94197da initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
! !
569
edb941b33667 class: TestResource
Claus Gittinger <cg@exept.de>
parents: 448
diff changeset
   305