[squeak-dev] Squeak 4.6: SystemChangeNotification-Tests-nice.23.mcz
commits at source.squeak.org
commits at source.squeak.org
Fri Jun 5 20:13:34 UTC 2015
Chris Muller uploaded a new version of SystemChangeNotification-Tests to project Squeak 4.6:
http://source.squeak.org/squeak46/SystemChangeNotification-Tests-nice.23.mcz
==================== Summary ====================
Name: SystemChangeNotification-Tests-nice.23
Author: nice
Time: 18 December 2013, 2:43:23.729 pm
UUID: 3eed6d26-4aef-4095-a604-d9f914240281
Ancestors: SystemChangeNotification-Tests-fbs.22
Use non logging Compiler protocol rather than providing a logged: false argument.
==================== Snapshot ====================
SystemOrganization addCategory: #'SystemChangeNotification-Tests'!
TestCase subclass: #SystemChangeFileTest
instanceVariableNames: 'tempChangesFile tempChangesName'
classVariableNames: ''
poolDictionaries: ''
category: 'SystemChangeNotification-Tests'!
----- Method: SystemChangeFileTest>>change:verify: (in category 'testing') -----
change: changeBlock verify: verifyBlock
self prepare: [] change: changeBlock verify: verifyBlock!
----- Method: SystemChangeFileTest>>createClass: (in category 'private') -----
createClass: name
^Object
subclass: name
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: self genericClassCategory!
----- Method: SystemChangeFileTest>>directory (in category 'accessing') -----
directory
"Where we want to place the temporary changes file"
^FileDirectory default!
----- Method: SystemChangeFileTest>>expectedFailures (in category 'testing') -----
expectedFailures
^#(
#testCategoryModified
#testClassReorganized
#testProtocolModified
)!
----- Method: SystemChangeFileTest>>genericChangesName (in category 'private') -----
genericChangesName
^self prefixChangesName, self randomString, '.changes'!
----- Method: SystemChangeFileTest>>genericClassCategory (in category 'private') -----
genericClassCategory
^(self prefixClassCategory, self randomString capitalized) asSymbol!
----- Method: SystemChangeFileTest>>genericClassName (in category 'private') -----
genericClassName
^(self prefixClassName, self randomString capitalized) asSymbol!
----- Method: SystemChangeFileTest>>genericInstVarName (in category 'private') -----
genericInstVarName
^(self prefixInstVarName, self randomString capitalized) asSymbol!
----- Method: SystemChangeFileTest>>genericProtocol (in category 'private') -----
genericProtocol
^(self prefixProtocol, self randomString) asSymbol!
----- Method: SystemChangeFileTest>>genericSelector (in category 'private') -----
genericSelector
^(self prefixSelector, self randomString capitalized) asSymbol!
----- Method: SystemChangeFileTest>>prefixChangesName (in category 'private') -----
prefixChangesName
^self prefixGeneral!
----- Method: SystemChangeFileTest>>prefixClassCategory (in category 'private') -----
prefixClassCategory
^self prefixGeneral, 'Category-'!
----- Method: SystemChangeFileTest>>prefixClassName (in category 'private') -----
prefixClassName
^self prefixGeneral, 'Class'!
----- Method: SystemChangeFileTest>>prefixGeneral (in category 'private') -----
prefixGeneral
^self class name select: [:each | each isUppercase]!
----- Method: SystemChangeFileTest>>prefixInstVarName (in category 'private') -----
prefixInstVarName
^self prefixGeneral asLowercase, 'InstVar'!
----- Method: SystemChangeFileTest>>prefixProtocol (in category 'private') -----
prefixProtocol
^self prefixGeneral asLowercase, ' protocol '!
----- Method: SystemChangeFileTest>>prefixSelector (in category 'private') -----
prefixSelector
^self prefixGeneral asLowercase, 'Selector'!
----- Method: SystemChangeFileTest>>prepare:change:verify: (in category 'testing') -----
prepare: prepareBlock change: changeBlock verify: verifyBlock
"All tests follow this pattern. Beware that prepareBlock (and verifyBlock) will be evalutated twice."
"Setup the testcourt"
prepareBlock value.
"Embrace the changeBlock so that any change to our testcourt
will be recorded in our temporary changes file"
self useTemporaryChangesFile.
changeBlock value.
"Check if the changes we made worked as expected. We need to do
this before we switch back to the standard changes file"
"We raise an Error if this fails, because then the testcase is broken"
[verifyBlock value]
on: TestFailure
do: [self error: 'The verifyBlock needs to validate the changes made in the changeBlock'].
self useStandardChangesFile.
"Remove the testcourt completely"
self removeTestcourt.
"Setup the testcourt once again"
prepareBlock value.
"Replay the changes from the temporary changes file"
self replayChanges.
"See if we got the same changes as we did before using the changeBlock"
verifyBlock value.
!
----- Method: SystemChangeFileTest>>randomString (in category 'private') -----
randomString
^Character alphabet shuffled!
----- Method: SystemChangeFileTest>>removeTestcourt (in category 'private') -----
removeTestcourt
SystemOrganization categories do: [:each |
(each beginsWith: self prefixClassCategory) ifTrue: [
SystemOrganization removeSystemCategory: each.
].
].
!
----- Method: SystemChangeFileTest>>replayChanges (in category 'private') -----
replayChanges
| file |
file := FileStream fileNamed: (self directory fullNameFor: self tempChangesName).
Transcript show: file contents; cr.
file fileIn.
!
----- Method: SystemChangeFileTest>>tearDown (in category 'running') -----
tearDown
self useStandardChangesFile.
tempChangesFile := tempChangesFile ifNotNil: [tempChangesFile close].
(self directory fileExists: self tempChangesName)
ifTrue: [self directory deleteFileNamed: self tempChangesName].
self removeTestcourt.
!
----- Method: SystemChangeFileTest>>tempChangesName (in category 'accessing') -----
tempChangesName
^tempChangesName ifNil: [tempChangesName := self genericChangesName]!
----- Method: SystemChangeFileTest>>testCategoryAdded (in category 'testing') -----
testCategoryAdded
| aClassCategory |
aClassCategory := self genericClassCategory.
self
change: [
SystemOrganization addCategory: aClassCategory.
]
verify: [
self assert: (SystemOrganization categories includes: aClassCategory).
]
!
----- Method: SystemChangeFileTest>>testCategoryAddedBefore (in category 'testing') -----
testCategoryAddedBefore
| aClassCategory |
aClassCategory := self genericClassCategory.
self
change: [
SystemOrganization addCategory: aClassCategory before: nil.
]
verify: [
self assert: (SystemOrganization categories includes: aClassCategory).
]
!
----- Method: SystemChangeFileTest>>testCategoryModified (in category 'as yet unclassified') -----
testCategoryModified
self assert: false description: 'When does that happen?'!
----- Method: SystemChangeFileTest>>testCategoryRemoved (in category 'testing') -----
testCategoryRemoved
| aClassCategory |
aClassCategory := self genericClassCategory.
self
prepare: [
SystemOrganization addCategory: aClassCategory.
]
change: [
SystemOrganization removeCategory: aClassCategory.
]
verify: [
self deny: (SystemOrganization categories includes: aClassCategory).
]
!
----- Method: SystemChangeFileTest>>testCategoryRenamed (in category 'testing') -----
testCategoryRenamed
| aNewClassCategory anOldClassCategory |
anOldClassCategory := self genericClassCategory.
aNewClassCategory := self genericClassCategory.
self
prepare: [
SystemOrganization addCategory: anOldClassCategory.
]
change: [
SystemOrganization renameCategory: anOldClassCategory toBe: aNewClassCategory
]
verify: [
self assert: (SystemOrganization categories includes: aNewClassCategory).
self deny: (SystemOrganization categories includes: anOldClassCategory).
]
!
----- Method: SystemChangeFileTest>>testClassAdded (in category 'testing') -----
testClassAdded
| aClassName |
aClassName := self genericClassName.
self
change: [
self createClass: aClassName.
]
verify: [
self assert: (Smalltalk globals includesKey: aClassName).
]
!
----- Method: SystemChangeFileTest>>testClassCommented (in category 'testing') -----
testClassCommented
| aClass aClassName aComment |
aClassName := self genericClassName.
self
prepare: [
aClass := self createClass: aClassName.
]
change: [
aComment := self randomString.
aClass classComment: aComment.
]
verify: [
self assert: aClass organization classComment string = aComment.
].!
----- Method: SystemChangeFileTest>>testClassModified (in category 'testing') -----
testClassModified
| aClass aClassName aInstVarName |
aClassName := self genericClassName.
self
prepare: [
aClass := self createClass: aClassName.
]
change: [
aInstVarName := self genericInstVarName.
aClass addInstVarName: aInstVarName.
]
verify: [
self assert: (aClass instVarNames includes: aInstVarName).
].!
----- Method: SystemChangeFileTest>>testClassRecategorized (in category 'testing') -----
testClassRecategorized
| aClassName aNewClassCategory |
aClassName := self genericClassName.
aNewClassCategory := self genericClassCategory.
self
prepare: [
self createClass: aClassName.
SystemOrganization addCategory: aNewClassCategory.
]
change: [
SystemOrganization classify: aClassName under: aNewClassCategory.
]
verify: [
self assert: (SystemOrganization categoryOfElement: aClassName) = aNewClassCategory.
]
!
----- Method: SystemChangeFileTest>>testClassRemoved (in category 'testing') -----
testClassRemoved
| aClass aClassName |
aClassName := self genericClassName.
self
prepare: [
aClass := self createClass: aClassName.
]
change: [
aClass removeFromSystem.
]
verify: [
self deny: (Smalltalk globals includesKey: aClassName).
].
!
----- Method: SystemChangeFileTest>>testClassRenamed (in category 'testing') -----
testClassRenamed
| aClass aNewClassName anOldClassName |
anOldClassName := self genericClassName.
aNewClassName := self genericClassName.
self
prepare: [
aClass := self createClass: anOldClassName.
]
change: [
aClass rename: aNewClassName.
]
verify: [
self assert: (Smalltalk globals includesKey: aNewClassName).
self deny: (Smalltalk globals includesKey: anOldClassName).
].!
----- Method: SystemChangeFileTest>>testClassReorganized (in category 'as yet unclassified') -----
testClassReorganized
self assert: false description: 'When does that happen?'!
----- Method: SystemChangeFileTest>>testExpressionDoIt (in category 'testing') -----
testExpressionDoIt
| aClassName |
aClassName := self genericClassName..
self
prepare: [
self createClass: aClassName.
]
change: [
Compiler evaluate: '(Smalltalk at: ', aClassName storeString, ') removeFromSystem'.
]
verify: [
self deny: (Smalltalk globals includesKey: aClassName).
].!
----- Method: SystemChangeFileTest>>testMethodAdded (in category 'testing') -----
testMethodAdded
| aClassName aClass aSelector |
aClassName := self genericClassName.
self
prepare: [
aClass := self createClass: aClassName.
]
change: [
aSelector := self genericSelector.
aClass compile: aSelector.
]
verify: [
self assert: (aClass methodDict includesKey: aSelector).
]
!
----- Method: SystemChangeFileTest>>testMethodModified (in category 'testing') -----
testMethodModified
| aClassName aClass aSelector aMethodSource |
aClassName := self genericClassName.
aSelector := self genericSelector.
self
prepare: [
aClass := self createClass: aClassName.
aClass compile: aSelector, ' ', self randomString storeString.
]
change: [
aMethodSource := aSelector, ' ', self randomString storeString.
aClass compile: aMethodSource.
]
verify: [
self assert: (aClass sourceCodeAt: aSelector) string = aMethodSource.
]
!
----- Method: SystemChangeFileTest>>testMethodRecategorized (in category 'testing') -----
testMethodRecategorized
| aClassName aClass aNewProtocol aSelector anOldProtocol |
aClassName := self genericClassName.
aSelector := self genericSelector.
anOldProtocol := self genericProtocol.
self
prepare: [
aClass := self createClass: aClassName.
aClass compile: aSelector classified: anOldProtocol.
]
change: [
aNewProtocol := self genericProtocol.
aClass organization classify: aSelector under: aNewProtocol.
]
verify: [
self assert: (aClass organization categoryOfElement: aSelector) = aNewProtocol
]
!
----- Method: SystemChangeFileTest>>testMethodRemoved (in category 'testing') -----
testMethodRemoved
| aClassName aClass aSelector |
aClassName := self genericClassName.
aSelector := self genericSelector.
self
prepare: [
aClass := self createClass: aClassName.
aClass compile: aSelector.
]
change: [
aClass removeSelector: aSelector.
]
verify: [
self deny: (aClass methodDict includesKey: aSelector).
]
!
----- Method: SystemChangeFileTest>>testProtocolAdded (in category 'testing') -----
testProtocolAdded
| aClassName aClass aProtocol |
aClassName := self genericClassName.
aProtocol := self genericProtocol.
self
prepare: [
aClass := self createClass: aClassName.
]
change: [
aClass organization addCategory: aProtocol.
]
verify: [
self assert: (aClass organization categories includes: aProtocol)
]
!
----- Method: SystemChangeFileTest>>testProtocolDefault (in category 'testing') -----
testProtocolDefault
| aClassName aClass aSelector |
aClassName := self genericClassName.
self
prepare: [
aClass := self createClass: aClassName.
]
change: [
aSelector := self genericSelector.
aClass compile: aSelector.
]
verify: [
self assert: (aClass organization categoryOfElement: aSelector) = aClass organization class default.
]
!
----- Method: SystemChangeFileTest>>testProtocolModified (in category 'as yet unclassified') -----
testProtocolModified
self assert: false description: 'When does that happen?'!
----- Method: SystemChangeFileTest>>testProtocolRemoved (in category 'testing') -----
testProtocolRemoved
| aClassName aClass aProtocol |
aClassName := self genericClassName.
aProtocol := self genericProtocol.
self
prepare: [
aClass := self createClass: aClassName.
aClass organization addCategory: aProtocol.
]
change: [
aClass organization removeCategory: aProtocol.
]
verify: [
self deny: (aClass organization categories includes: aProtocol)
]
!
----- Method: SystemChangeFileTest>>testProtocolRenamed (in category 'testing') -----
testProtocolRenamed
| aClassName aClass anOldProtocol aNewProtocol |
aClassName := self genericClassName.
anOldProtocol := self genericProtocol.
self
prepare: [
aClass := self createClass: aClassName.
aClass organization addCategory: anOldProtocol.
]
change: [
aNewProtocol := self genericProtocol.
aClass organization renameCategory: anOldProtocol toBe: aNewProtocol.
]
verify: [
self deny: (aClass organization categories includes: anOldProtocol).
self assert: (aClass organization categories includes: aNewProtocol).
]
!
----- Method: SystemChangeFileTest>>useStandardChangesFile (in category 'private') -----
useStandardChangesFile
Smalltalk
closeSourceFiles;
openSourceFiles!
----- Method: SystemChangeFileTest>>useTemporaryChangesFile (in category 'private') -----
useTemporaryChangesFile
Smalltalk closeSourceFiles.
tempChangesFile := self directory forceNewFileNamed: self tempChangesName.
SourceFiles at: 2 put: tempChangesFile!
TestCase subclass: #SystemChangeTestRoot
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'SystemChangeNotification-Tests'!
!SystemChangeTestRoot commentStamp: 'rw 4/5/2006 17:28' prior: 0!
The Root test class for the System Change Notification tests.!
SystemChangeTestRoot subclass: #ChangeHooksTest
instanceVariableNames: 'previousChangeSet testsChangeSet capturedEvents generatedTestClass generatedTestClassX createdMethodName createdMethod doItExpression'
classVariableNames: ''
poolDictionaries: ''
category: 'SystemChangeNotification-Tests'!
!ChangeHooksTest commentStamp: 'bp 12/4/2009 10:37' prior: 0!
This class implements unit tests to verify that when the system changes, notification messages are sent around correctly.
Therefore the test messages make a system change, after registering to receive an event after the change occured. In this event (sent immediately after the change), the actual assertions take place.
Note that the system changes are *really* made to the system, but in a change set that is created in the setUp method, while the previous one is restored in the tearDown method.!
----- Method: ChangeHooksTest>>addSingleEvent: (in category 'Private') -----
addSingleEvent: anEvent
capturedEvents isEmpty ifFalse: [self assert: false].
capturedEvents add: anEvent!
----- Method: ChangeHooksTest>>checkEvent:kind:item:itemKind: (in category 'Private') -----
checkEvent: anEvent kind: changeKind item: item itemKind: itemKind
self assert: (anEvent perform: ('is' , changeKind) asSymbol).
self assert: anEvent item = item.
self assert: anEvent itemKind = itemKind!
----- Method: ChangeHooksTest>>checkForOnlySingleEvent (in category 'Private') -----
checkForOnlySingleEvent
self assert: capturedEvents size = 1!
----- Method: ChangeHooksTest>>classCommentedEvent: (in category 'Events-Classes') -----
classCommentedEvent: event
self addSingleEvent: event.
self assert: generatedTestClass comment = self commentStringForTesting.
self
checkEvent: event
kind: #Commented
item: generatedTestClass
itemKind: AbstractEvent classKind!
----- Method: ChangeHooksTest>>classCreationEvent: (in category 'Events-Classes') -----
classCreationEvent: event
| classCreated |
self addSingleEvent: event.
classCreated := Smalltalk classNamed: self newlyCreatedClassName.
self assert: classCreated notNil.
self
assert: ((Smalltalk organization
listAtCategoryNamed: #'System-Change Notification')
includes: self newlyCreatedClassName).
self
checkEvent: event
kind: #Added
item: classCreated
itemKind: AbstractEvent classKind!
----- Method: ChangeHooksTest>>classRecategorizedEvent: (in category 'Events-Classes') -----
classRecategorizedEvent: event
self addSingleEvent: event.
self
checkEvent: event
kind: #Recategorized
item: generatedTestClass
itemKind: AbstractEvent classKind.
self assert: event oldCategory = #'System-Change Notification'!
----- Method: ChangeHooksTest>>classRedefinitionEvent: (in category 'Events-Classes') -----
classRedefinitionEvent: event
self addSingleEvent: event.
self
checkEvent: event
kind: #Modified
item: generatedTestClass
itemKind: AbstractEvent classKind.!
----- Method: ChangeHooksTest>>classRemovalEvent: (in category 'Events-Classes') -----
classRemovalEvent: event
"This event used to be sent efter the class was removed.
This was changed, and therefore this test is useless currently."
self addSingleEvent: event.
self assert: (Smalltalk classNamed: self generatedTestClassName) isNil.
self
checkEvent: event
kind: #Removed
item: self generatedTestClassName
itemKind: AbstractEvent classKind!
----- Method: ChangeHooksTest>>classRenameEvent: (in category 'Events-Classes') -----
classRenameEvent: event
| renamedClass |
self addSingleEvent: event.
renamedClass := Smalltalk classNamed: self renamedTestClassName.
self assert: renamedClass notNil.
self assert: (Smalltalk classNamed: self generatedTestClassName) isNil.
self
checkEvent: event
kind: #Renamed
item: renamedClass
itemKind: AbstractEvent classKind.
self assert: event oldName = self generatedTestClassName!
----- Method: ChangeHooksTest>>classSuperChangedEvent: (in category 'Events-Classes') -----
classSuperChangedEvent: event
self addSingleEvent: event.
self
checkEvent: event
kind: #Modified
item: generatedTestClass
itemKind: AbstractEvent classKind.
self assert: generatedTestClass superclass = Model!
----- Method: ChangeHooksTest>>commentStringForTesting (in category 'Private') -----
commentStringForTesting
^'Added this comment as part of the unit test in SystemChangeTest>>testClassCommentedBasicEvents. You should never see this, unless you are debugging the system somewhere in between the tests.'!
----- Method: ChangeHooksTest>>generateTestClass (in category 'Private-Generation') -----
generateTestClass
generatedTestClass := Object
subclass: self generatedTestClassName
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'System-Change Notification'.!
----- Method: ChangeHooksTest>>generateTestClassX (in category 'Private-Generation') -----
generateTestClassX
generatedTestClassX := Object
subclass: self generatedTestClassNameX
instanceVariableNames: 'x'
classVariableNames: ''
poolDictionaries: ''
category: 'System-Change Notification'.!
----- Method: ChangeHooksTest>>generatedTestClassName (in category 'Private-Generation') -----
generatedTestClassName
^#'AutoGeneratedClassForTestingSystemChanges'!
----- Method: ChangeHooksTest>>generatedTestClassNameX (in category 'Private-Generation') -----
generatedTestClassNameX
^#'AutoGeneratedClassXForTestingSystemChanges'!
----- Method: ChangeHooksTest>>instanceVariableCreationEvent: (in category 'Events-Instance Variables') -----
instanceVariableCreationEvent: event
self addSingleEvent: event.
self assert: event isModified.
self assert: event item = generatedTestClass.
self assert: event itemKind = AbstractEvent classKind.
self assert: event areInstVarsModified.
self deny: event isSuperclassModified.
self deny: event areClassVarsModified.
self deny: event areSharedPoolsModified.
!
----- Method: ChangeHooksTest>>instanceVariableRemovedEvent: (in category 'Events-Instance Variables') -----
instanceVariableRemovedEvent: event
self addSingleEvent: event.
self assert: event isModified.
self assert: event item = generatedTestClassX.
self assert: event itemKind = AbstractEvent classKind.
self assert: event areInstVarsModified.
self deny: event isSuperclassModified.
self deny: event areClassVarsModified.
self deny: event areSharedPoolsModified.
!
----- Method: ChangeHooksTest>>methodCreationEvent1: (in category 'Events-Methods') -----
methodCreationEvent1: event
| methodCreated |
self addSingleEvent: event.
methodCreated := generatedTestClass >> createdMethodName.
self
checkEvent: event
kind: #Added
item: methodCreated
itemKind: AbstractEvent methodKind!
----- Method: ChangeHooksTest>>methodCreationEvent2: (in category 'Events-Methods') -----
methodCreationEvent2: event
| methodCreated |
self addSingleEvent: event.
methodCreated := generatedTestClass >> createdMethodName.
self
checkEvent: event
kind: #Added
item: methodCreated
itemKind: AbstractEvent methodKind!
----- Method: ChangeHooksTest>>methodDoItEvent1: (in category 'Events-Expression') -----
methodDoItEvent1: event
self addSingleEvent: event.
self
checkEvent: event
kind: #DoIt
item: doItExpression
itemKind: AbstractEvent expressionKind.
self assert: event context isNil.!
----- Method: ChangeHooksTest>>methodRecategorizationEvent: (in category 'Events-Methods') -----
methodRecategorizationEvent: event
| methodCreated |
self addSingleEvent: event.
methodCreated := generatedTestClass >> createdMethodName.
self assert: ((generatedTestClass organization categoryOfElement: createdMethodName) = #newCategory).
self assert: event oldCategory = #testing.
self
checkEvent: event
kind: #Recategorized
item: methodCreated
itemKind: AbstractEvent methodKind.!
----- Method: ChangeHooksTest>>methodRemovedEvent1: (in category 'Events-Methods') -----
methodRemovedEvent1: event
self addSingleEvent: event.
self should: [generatedTestClass >> createdMethodName] raise: Error.
self
checkEvent: event
kind: #Removed
item: createdMethod
itemKind: AbstractEvent methodKind.
event itemClass = generatedTestClass.
event itemMethod = createdMethodName.
self assert: ((generatedTestClass organization categoryOfElement: createdMethodName) isNil).!
----- Method: ChangeHooksTest>>methodRemovedEvent2: (in category 'Events-Methods') -----
methodRemovedEvent2: event
self methodRemovedEvent1: event!
----- Method: ChangeHooksTest>>newlyCreatedClassName (in category 'Private-Generation') -----
newlyCreatedClassName
^#'AutoGeneratedClassWhileTestingSystemChanges'!
----- Method: ChangeHooksTest>>rememberEvent: (in category 'Events-General') -----
rememberEvent: event
capturedEvents add: event!
----- Method: ChangeHooksTest>>removeGeneratedTestClasses (in category 'Private') -----
removeGeneratedTestClasses
"Remove all classes that were possibly generated during testing."
| possiblyToRemove |
possiblyToRemove := OrderedCollection
with: self generatedTestClassName
with: self generatedTestClassNameX
with: self renamedTestClassName
with: self newlyCreatedClassName.
possiblyToRemove do: [:name | (Smalltalk hasClassNamed: name) ifTrue: [(Smalltalk at: name) removeFromSystemUnlogged]].
generatedTestClass := nil.
generatedTestClassX := nil!
----- Method: ChangeHooksTest>>renamedTestClassName (in category 'Private-Generation') -----
renamedTestClassName
^#'AutoRenamedClassForTestingSystemChanges'!
----- Method: ChangeHooksTest>>setUp (in category 'Running') -----
setUp
previousChangeSet := ChangeSet current.
testsChangeSet := ChangeSet new.
ChangeSet newChanges: testsChangeSet.
capturedEvents := OrderedCollection new.
self generateTestClass.
self generateTestClassX.
super setUp!
----- Method: ChangeHooksTest>>shouldNotBeCalledEvent: (in category 'Events-General') -----
shouldNotBeCalledEvent: anEvent
"This event should not be called, so fail the test."
self assert: false!
----- Method: ChangeHooksTest>>tearDown (in category 'Running') -----
tearDown
self removeGeneratedTestClasses.
ChangeSet newChanges: previousChangeSet.
ChangesOrganizer removeChangeSet: testsChangeSet.
previousChangeSet := nil.
testsChangeSet := nil.
capturedEvents := nil.
createdMethod := nil.
super tearDown!
----- Method: ChangeHooksTest>>testClassCommentedEvent (in category 'Testing-Classes') -----
testClassCommentedEvent
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #classCommentedEvent:.
generatedTestClass comment: self commentStringForTesting.
self checkForOnlySingleEvent!
----- Method: ChangeHooksTest>>testClassCreationEvent (in category 'Testing-Classes') -----
testClassCreationEvent
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #classCreationEvent:.
Object
subclass: self newlyCreatedClassName
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'System-Change Notification'.
self checkForOnlySingleEvent!
----- Method: ChangeHooksTest>>testClassRecategorizedEvent1 (in category 'Testing-Classes') -----
testClassRecategorizedEvent1
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #classRecategorizedEvent:.
Object
subclass: generatedTestClass name
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Collections-Abstract'.
self checkForOnlySingleEvent!
----- Method: ChangeHooksTest>>testClassRecategorizedEvent2 (in category 'Testing-Classes') -----
testClassRecategorizedEvent2
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #classRecategorizedEvent:.
generatedTestClass category: 'Collections-Abstract'.
self checkForOnlySingleEvent!
----- Method: ChangeHooksTest>>testClassRedefinition (in category 'Testing-Classes') -----
testClassRedefinition
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #classRedefinitionEvent:.
self generateTestClass!
----- Method: ChangeHooksTest>>testClassRemovalEvent (in category 'Testing-Classes') -----
testClassRemovalEvent
"This event used to be sent efter the class was removed.
This was changed, and therefore this test is useless currently."
"Keep it, since I really want to check with the responsible for the ChangeSet,
and it is very likely this will be reintroduced afterwards!!"
" | createdClass |
createdClass := self compileUniqueClass.
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #classRemovalEvent:.
createdClass removeFromSystem.
self checkForOnlySingleEvent
"!
----- Method: ChangeHooksTest>>testClassRenamedEvent (in category 'Testing-Classes') -----
testClassRenamedEvent
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #classRenameEvent:.
generatedTestClass rename: self renamedTestClassName.
self checkForOnlySingleEvent!
----- Method: ChangeHooksTest>>testClassSuperChangedEvent (in category 'Testing-Classes') -----
testClassSuperChangedEvent
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #classSuperChangedEvent:.
Model
subclass: generatedTestClass name
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'System-Change Notification'.
self checkForOnlySingleEvent!
----- Method: ChangeHooksTest>>testDoItEvent1 (in category 'Testing-Expression') -----
testDoItEvent1
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #methodDoItEvent1:.
doItExpression := '1 + 2'.
Compiler evaluate: doItExpression logged: true.
self checkForOnlySingleEvent!
----- Method: ChangeHooksTest>>testDoItEvent2 (in category 'Testing-Expression') -----
testDoItEvent2
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #shouldNotBeCalledEvent:.
doItExpression := '1 + 2'.
Compiler evaluate: doItExpression!
----- Method: ChangeHooksTest>>testInstanceVariableCreationEvent1 (in category 'Testing-Instance Variables') -----
testInstanceVariableCreationEvent1
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #instanceVariableCreationEvent:.
Object
subclass: self generatedTestClassName
instanceVariableNames: 'x'
classVariableNames: ''
poolDictionaries: ''
category: 'System-Change Notification'.
self checkForOnlySingleEvent!
----- Method: ChangeHooksTest>>testInstanceVariableCreationEvent2 (in category 'Testing-Instance Variables') -----
testInstanceVariableCreationEvent2
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #instanceVariableCreationEvent:.
generatedTestClass addInstVarName: 'x'.
self checkForOnlySingleEvent!
----- Method: ChangeHooksTest>>testInstanceVariableRemovedEvent1 (in category 'Testing-Instance Variables') -----
testInstanceVariableRemovedEvent1
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #instanceVariableRemovedEvent:.
Object
subclass: generatedTestClassX name
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'System-Change Notification'.
self checkForOnlySingleEvent!
----- Method: ChangeHooksTest>>testInstanceVariableRemovedEvent2 (in category 'Testing-Instance Variables') -----
testInstanceVariableRemovedEvent2
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #instanceVariableRemovedEvent:.
generatedTestClassX removeInstVarName: 'x'.
self checkForOnlySingleEvent!
----- Method: ChangeHooksTest>>testInstanceVariableRenamedSilently (in category 'Testing-Instance Variables') -----
testInstanceVariableRenamedSilently
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #shouldNotBeCalledEvent:.
generatedTestClassX renameSilentlyInstVar: 'x' to: 'y'!
----- Method: ChangeHooksTest>>testMethodCreationEvent1 (in category 'Testing-Methods') -----
testMethodCreationEvent1
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #methodCreationEvent1:.
createdMethodName := #testCreation.
generatedTestClass compile: createdMethodName , ' ^1'.
self checkForOnlySingleEvent!
----- Method: ChangeHooksTest>>testMethodCreationEvent2 (in category 'Testing-Methods') -----
testMethodCreationEvent2
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #methodCreationEvent2:.
createdMethodName := #testCreation.
generatedTestClass compile: createdMethodName , ' ^1' classified: #testing.
self checkForOnlySingleEvent!
----- Method: ChangeHooksTest>>testMethodRecategorizationEvent (in category 'Testing-Methods') -----
testMethodRecategorizationEvent
createdMethodName := #testCreation.
generatedTestClass compile: createdMethodName , ' ^1' classified: #testing.
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #methodRecategorizationEvent:.
generatedTestClass organization
classify: createdMethodName
under: #newCategory
suppressIfDefault: false.
self checkForOnlySingleEvent!
----- Method: ChangeHooksTest>>testMethodRemovedEvent1 (in category 'Testing-Methods') -----
testMethodRemovedEvent1
createdMethodName := #testCreation.
generatedTestClass compile: createdMethodName , ' ^1'.
createdMethod := generatedTestClass >> createdMethodName.
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #methodRemovedEvent1:.
generatedTestClass removeSelector: createdMethodName.
self checkForOnlySingleEvent!
----- Method: ChangeHooksTest>>testMethodRemovedEvent2 (in category 'Testing-Methods') -----
testMethodRemovedEvent2
createdMethodName := #testCreation.
generatedTestClass compile: createdMethodName , ' ^1'.
createdMethod := generatedTestClass >> createdMethodName.
self systemChangeNotifier notify: self
ofAllSystemChangesUsing: #methodRemovedEvent2:.
Smalltalk
removeSelector: (Array with: generatedTestClass name with: createdMethodName).
self checkForOnlySingleEvent!
SystemChangeTestRoot subclass: #SystemChangeErrorHandling
instanceVariableNames: 'capturedEvents'
classVariableNames: ''
poolDictionaries: ''
category: 'SystemChangeNotification-Tests'!
!SystemChangeErrorHandling commentStamp: 'bp 12/4/2009 10:37' prior: 0!
This class tests the error handing of the notification mechanism to ensure that one client that receives a system change cannot lock up the complete system.!
----- Method: SystemChangeErrorHandling>>handleEventWithError: (in category 'Event Notifications') -----
handleEventWithError: event
self error: 'Example of event handling code that throws an error.'!
----- Method: SystemChangeErrorHandling>>handleEventWithHalt: (in category 'Event Notifications') -----
handleEventWithHalt: event
self halt: 'Example of event handling code that contains a halt.'!
----- Method: SystemChangeErrorHandling>>setUp (in category 'Running') -----
setUp
super setUp.
capturedEvents := OrderedCollection new!
----- Method: SystemChangeErrorHandling>>storeEvent1: (in category 'Event Notifications') -----
storeEvent1: anEvent
capturedEvents add: anEvent!
----- Method: SystemChangeErrorHandling>>storeEvent2: (in category 'Event Notifications') -----
storeEvent2: anEvent
capturedEvents add: anEvent!
----- Method: SystemChangeErrorHandling>>storeEvent3: (in category 'Event Notifications') -----
storeEvent3: anEvent
capturedEvents add: anEvent!
----- Method: SystemChangeErrorHandling>>tearDown (in category 'Running') -----
tearDown
capturedEvents := nil.
super tearDown!
----- Method: SystemChangeErrorHandling>>testErrorOperation (in category 'Testing') -----
testErrorOperation
| notifier wasCaptured |
notifier := self systemChangeNotifier.
wasCaptured := false.
notifier notify: self ofSystemChangesOfItem: #class change: #Added using: #storeEvent1:.
notifier notify: self ofSystemChangesOfItem: #class change: #Added using: #storeEvent2:.
notifier notify: self ofSystemChangesOfItem: #class change: #Added using: #handleEventWithError:.
notifier notify: self ofSystemChangesOfItem: #class change: #Added using: #storeEvent3:.
[notifier classAdded: self class inCategory: #FooCat] on: Error do: [:exc |
wasCaptured := true.
self assert: (capturedEvents size = 3)].
self assert: wasCaptured.!
----- Method: SystemChangeErrorHandling>>testHaltOperation (in category 'Testing') -----
testHaltOperation
| notifier wasCaptured |
notifier := self systemChangeNotifier.
wasCaptured := false.
notifier notify: self ofAllSystemChangesUsing: #storeEvent1:.
notifier notify: self ofAllSystemChangesUsing: #storeEvent2:.
notifier notify: self ofAllSystemChangesUsing: #handleEventWithHalt:.
notifier notify: self ofAllSystemChangesUsing: #storeEvent3:.
[notifier classAdded: self class inCategory: #FooCat] on: Halt do: [:exc |
wasCaptured := true.
self assert: (capturedEvents size = 3)].
self assert: wasCaptured.!
----- Method: SystemChangeErrorHandling>>testUnhandledEventOperation (in category 'Testing') -----
testUnhandledEventOperation
| notifier wasCaptured |
notifier := self systemChangeNotifier.
wasCaptured := false.
notifier notify: self ofSystemChangesOfItem: #class change: #Added using: #storeEvent1:.
notifier notify: self ofSystemChangesOfItem: #class change: #Added using: #storeEvent2:.
notifier notify: self ofSystemChangesOfItem: #class change: #Added using: #zork:.
notifier notify: self ofSystemChangesOfItem: #class change: #Added using: #storeEvent3:.
[notifier classAdded: self class inCategory: #FooCat] on: MessageNotUnderstood do: [:exc |
wasCaptured := true.
self assert: (capturedEvents size = 3)].
self assert: wasCaptured.!
SystemChangeTestRoot subclass: #SystemChangeErrorHandlingTest
instanceVariableNames: 'capturedEvents'
classVariableNames: ''
poolDictionaries: ''
category: 'SystemChangeNotification-Tests'!
SystemChangeTestRoot subclass: #SystemChangeNotifierTest
instanceVariableNames: 'capturedEvent notifier'
classVariableNames: ''
poolDictionaries: ''
category: 'SystemChangeNotification-Tests'!
!SystemChangeNotifierTest commentStamp: 'rw 4/3/2006 17:19' prior: 0!
A SystemChangeNotifierTest is a test class that tests whether the triggering of changes indeed results in the intended changes to be sent to registered object. The basic mechanism for each test is fairly simple:
- register the receiver as the one to get the change notifier.
- manually trigger a change (so the system is not polluted just to see whether we get the needed event).
- the method #event: is invoked and remembers the change event.
- the change event is checked to see whether it was the intended one.
Instance Variables
capturedEvent: Remembers the captured event!
----- Method: SystemChangeNotifierTest>>capturedEvent: (in category 'Private') -----
capturedEvent: eventOrNil
"Remember the event being sent."
capturedEvent := eventOrNil!
----- Method: SystemChangeNotifierTest>>checkEventForClass:category:change: (in category 'Private') -----
checkEventForClass: aClass category: cat change: changeKind
self assert: (capturedEvent perform: ('is' , changeKind) asSymbol).
self assert: capturedEvent item = aClass.
self assert: capturedEvent itemKind = AbstractEvent classKind.
self assert: capturedEvent itemClass = aClass.
self assert: capturedEvent itemCategory = cat!
----- Method: SystemChangeNotifierTest>>checkEventForMethod:protocol:change: (in category 'Private') -----
checkEventForMethod: aMethod protocol: prot change: changeKind
self assert: (capturedEvent perform: ('is' , changeKind) asSymbol).
self assert: capturedEvent item = aMethod.
self assert: capturedEvent itemKind = AbstractEvent methodKind.
self assert: capturedEvent itemClass = self class.
self assert: capturedEvent itemMethod = aMethod.
self assert: capturedEvent itemProtocol = prot!
----- Method: SystemChangeNotifierTest>>checkEventForMethod:protocol:change:oldMethod: (in category 'Private') -----
checkEventForMethod: aMethod protocol: prot change: changeKind oldMethod: oldMethod
self checkEventForMethod: aMethod protocol: prot change: changeKind.
self assert: capturedEvent oldItem == oldMethod
!
----- Method: SystemChangeNotifierTest>>event: (in category 'Event Notifications') -----
event: event
"The notification message being sent to me when an event is captured. Remember it."
" capturedEvent isNil ifTrue: [ self capturedEvent: event] ifFalse: [self assert: false]"
self capturedEvent: event!
----- Method: SystemChangeNotifierTest>>setUp (in category 'Running') -----
setUp
super setUp.
notifier := SystemChangeNotifier createInstance.!
----- Method: SystemChangeNotifierTest>>systemChangeNotifier (in category 'Private') -----
systemChangeNotifier
"The notifier to use. Do not use the one in the system so that the fake events triggered in the tests perturb clients of the system's change notifier (e.g. the changes file then shows fake entries)."
^notifier!
----- Method: SystemChangeNotifierTest>>tearDown (in category 'Running') -----
tearDown
super tearDown.
self capturedEvent: nil.
notifier releaseAll.
notifier := nil!
----- Method: SystemChangeNotifierTest>>testClassAddedEvent (in category 'Testing-system triggers') -----
testClassAddedEvent
self systemChangeNotifier notify: self ofAllSystemChangesUsing: #event:.
self systemChangeNotifier classAdded: self class inCategory: #FooCat.
self
checkEventForClass: self class
category: #FooCat
change: #Added!
----- Method: SystemChangeNotifierTest>>testClassAddedEvent2 (in category 'Testing-system triggers') -----
testClassAddedEvent2
self systemChangeNotifier notify: self ofSystemChangesOfItem: #class change: #Added using: #event:.
self systemChangeNotifier classAdded: self class inCategory: #FooCat.
self
checkEventForClass: self class
category: #FooCat
change: #Added!
----- Method: SystemChangeNotifierTest>>testClassCommentedEvent (in category 'Testing-system triggers') -----
testClassCommentedEvent
self systemChangeNotifier notify: self ofAllSystemChangesUsing: #event:.
self systemChangeNotifier classCommented: self class inCategory: #FooCat.
self
checkEventForClass: self class
category: #FooCat
change: #Commented!
----- Method: SystemChangeNotifierTest>>testClassRecategorizedEvent (in category 'Testing-system triggers') -----
testClassRecategorizedEvent
self systemChangeNotifier notify: self ofAllSystemChangesUsing: #event:.
self systemChangeNotifier
class: self class
recategorizedFrom: #FooCat
to: #FooBar.
self
checkEventForClass: self class
category: #FooBar
change: #Recategorized.
self assert: capturedEvent oldCategory = #FooCat!
----- Method: SystemChangeNotifierTest>>testClassRemovedEvent (in category 'Testing-system triggers') -----
testClassRemovedEvent
self systemChangeNotifier notify: self ofAllSystemChangesUsing: #event:.
self systemChangeNotifier classRemoved: self class fromCategory: #FooCat.
self
checkEventForClass: self class
category: #FooCat
change: #Removed!
----- Method: SystemChangeNotifierTest>>testClassRenamedEvent (in category 'Testing-system triggers') -----
testClassRenamedEvent
"self run: #testClassRenamedEvent"
self systemChangeNotifier notify: self ofAllSystemChangesUsing: #event:.
self systemChangeNotifier
classRenamed: self class
from: #OldFooClass
to: #NewFooClass
inCategory: #FooCat.
self
checkEventForClass: self class
category: #FooCat
change: #Renamed.
" self assert: capturedEvent oldName = #OldFooClass.
self assert: capturedEvent newName = #NewFooClass"!
----- Method: SystemChangeNotifierTest>>testDoItEvent (in category 'Testing-system triggers') -----
testDoItEvent
self systemChangeNotifier notify: self ofAllSystemChangesUsing: #event:.
self systemChangeNotifier
evaluated: '1 + 2'
context: self.
self assert: capturedEvent isDoIt.
self assert: capturedEvent item = '1 + 2'.
self assert: capturedEvent itemKind = AbstractEvent expressionKind.
self assert: capturedEvent itemClass = nil.
self assert: capturedEvent itemMethod = nil.
self assert: capturedEvent itemProtocol = nil.
self assert: capturedEvent itemExpression = '1 + 2'.
self assert: capturedEvent context = self.!
----- Method: SystemChangeNotifierTest>>testMethodAddedEvent1 (in category 'Testing-system triggers') -----
testMethodAddedEvent1
self systemChangeNotifier notify: self ofAllSystemChangesUsing: #event:.
self systemChangeNotifier
methodAdded: self class >> #testMethodAddedEvent1
selector: #testMethodAddedEvent1
inProtocol: #FooCat
class: self class.
self
checkEventForMethod: self class >> #testMethodAddedEvent1
protocol: #FooCat
change: #Added!
----- Method: SystemChangeNotifierTest>>testMethodAddedEvent2 (in category 'Testing-system triggers') -----
testMethodAddedEvent2
self systemChangeNotifier notify: self ofAllSystemChangesUsing: #event:.
self systemChangeNotifier
methodAdded: self class >> #testMethodAddedEvent1
selector: #testMethodAddedEvent1
inClass: self class.
self
checkEventForMethod: self class >> #testMethodAddedEvent1
protocol: nil
change: #Added!
----- Method: SystemChangeNotifierTest>>testMethodAddedEvent3 (in category 'Testing-system triggers') -----
testMethodAddedEvent3
self systemChangeNotifier notify: self ofAllSystemChangesUsing: #event:.
self systemChangeNotifier
methodChangedFrom: self class >> #testMethodAddedEvent1
to: self class >> #testMethodAddedEvent2
selector: #testMethodAddedEvent2
inClass: self class.
self
checkEventForMethod: self class >> #testMethodAddedEvent2
protocol: nil
change: #Modified
oldMethod: self class >> #testMethodAddedEvent1.!
----- Method: SystemChangeNotifierTest>>testMethodRemovedEvent (in category 'Testing-system triggers') -----
testMethodRemovedEvent
self systemChangeNotifier notify: self ofAllSystemChangesUsing: #event:.
self systemChangeNotifier
methodRemoved: self class>> #testMethodRemovedEvent
selector: #testMethodRemovedEvent
inProtocol: #FooCat
class: self class.
self
checkEventForMethod: self class>> #testMethodRemovedEvent
protocol: #FooCat
change: #Removed.!
----- Method: SystemChangeTestRoot>>systemChangeNotifier (in category 'Private') -----
systemChangeNotifier
"The notifier to use. Use the one for the system."
^SystemChangeNotifier uniqueInstance!
----- Method: SystemChangeTestRoot>>tearDown (in category 'Running') -----
tearDown
self unhook.
super tearDown!
----- Method: SystemChangeTestRoot>>unhook (in category 'Running') -----
unhook
self systemChangeNotifier noMoreNotificationsFor: self!
More information about the Squeak-dev
mailing list
|