[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