SystemOrganization addCategory: #'Refactoring-Tests-Changes'! TestCase subclass: #RBRefactoringChangeTests instanceVariableNames: 'changes' classVariableNames: '' poolDictionaries: '' category: 'Refactoring-Tests-Changes'! !RBRefactoringChangeTests class methodsFor: 'accessing' stamp: 'lr 9/5/2010 19:39'! packageNamesUnderTest ^ #('Refactoring-Changes')! ! !RBRefactoringChangeTests methodsFor: 'mocking' stamp: 'lr 10/15/2010 09:17'! changeMock ^ RBRefactoringChangeMock! ! !RBRefactoringChangeTests methodsFor: 'utilities' stamp: 'lr 10/15/2010 09:13'! equalityTestFor: aChange self assert: aChange = aChange. self assert: aChange hash = aChange hash. self assert: aChange copy = aChange. self assert: aChange copy hash = aChange hash! ! !RBRefactoringChangeTests methodsFor: 'utilities' stamp: 'lr 10/15/2010 09:14'! perform: aChange do: aBlock "Perform a change in the system silently, evaluate aBlock and then undo the change again." | undo | ^ SystemChangeNotifier uniqueInstance doSilently: [ undo := aChange execute. aBlock ensure: [ undo execute ] ]! ! !RBRefactoringChangeTests methodsFor: 'mocking' stamp: 'lr 9/6/2010 13:38'! selectionInterval ^ 1 to: 0! ! !RBRefactoringChangeTests methodsFor: 'running' stamp: 'lr 9/8/2011 20:10'! setUp super setUp. changes := RBCompositeRefactoryChange named: 'testing'! ! !RBRefactoringChangeTests methodsFor: 'utilities' stamp: 'lr 9/5/2010 20:07'! stringTestFor: aChange self assert: (aChange name isString and: [ aChange name notEmpty ]). self assert: (aChange printString isString and: [ aChange printString notEmpty ]). self assert: (aChange changeString isString and: [ aChange changeString notEmpty ]). self assert: (aChange displayString isString and: [ aChange displayString notEmpty ])! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 08:28'! testAddClassInstanceVariable | change | change := changes addInstanceVariable: 'instVar' to: self class class. self assert: change changeClassName = self class name. self assert: change changeClass = self class class. self assert: change isMeta. self assert: change variable = 'instVar'. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 9/8/2011 20:10'! testAddClassInteractively | change | change := RBAddClassChange definition: 'TestCase subclass: #' , self class name , ' instanceVariableNames: ''instVar'' classVariableNames: ''ClassVar'' poolDictionaries: ''PoolDict'' category: ''' , self class category , '''' for: self. self assert: change controller = self. self assert: change superclassName = self class superclass name. self assert: change changeClassName = self class name. self assert: change changeClass = self class. self assert: change isMeta not. self assert: change instanceVariableNames size = 1. self assert: change instanceVariableNames first = 'instVar'. self assert: change classVariableNames size = 1. self assert: change classVariableNames first = 'ClassVar'. self assert: change poolDictionaryNames size = 1. self assert: change poolDictionaryNames first = 'PoolDict'. self assert: change category = self class category. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests-pattern' stamp: 'lr 9/8/2011 20:10'! testAddClassPattern "Make sure that all class definitions can be parsed." self class environment allClassesDo: [ :class | (class isObsolete or: [ class superclass notNil and: [ class superclass isObsolete ] ]) ifFalse: [ | change | change := changes defineClass: class definition. self assert: (change isKindOf: RBAddClassChange). self assert: (change changeClassName = class name). self assert: (class superclass isNil ifTrue: [ change definitionClass = ProtoObject ] ifFalse: [ change definitionClass = class superclass ]). self assert: (change instanceVariableNames = class instVarNames asArray). self assert: (change classVariableNames = class classVarNames asArray). self assert: (change poolDictionaryNames = class poolDictionaryNames asArray). self assert: (change category = class category). self universalTestFor: change ] ]! ! !RBRefactoringChangeTests methodsFor: 'tests-pattern' stamp: 'lr 9/8/2011 20:10'! testAddClassTraitPattern "Make sure that all class trait definitions can be parsed." self class environment allTraitsDo: [ :trait | | change | change := changes defineClass: trait classTrait definition. self assert: (change isKindOf: RBAddClassTraitChange). self assert: (change changeClassName = trait name). self universalTestFor: change ]! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 08:29'! testAddClassVariable | change | change := changes addClassVariable: 'ClassVar' to: self class. self assert: change changeClassName = self class name. self assert: change changeClass = self class. self assert: change isMeta not. self assert: change variable = 'ClassVar'. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 08:28'! testAddInstanceVariable | change | change := changes addInstanceVariable: 'instVar' to: self class. self assert: change changeClassName = self class name. self assert: change changeClass = self class. self assert: change isMeta not. self assert: change variable = 'instVar'. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests-pattern' stamp: 'lr 9/8/2011 20:10'! testAddMetaclassPattern "Make sure that all metaclass definitions can be parsed." self class environment allClassesDo: [ :class | | change | change := changes defineClass: class class definition. self assert: (change isKindOf: RBAddMetaclassChange). self assert: (change changeClassName = class name). self assert: (change classInstanceVariableNames = class class instVarNames). self universalTestFor: change ]! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 08:30'! testAddPool | change | change := changes addPool: 'PoolDict' to: self class. self assert: change changeClassName = self class name. self assert: change changeClass = self class. self assert: change isMeta not. self assert: change variable = 'PoolDict'. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests-pattern' stamp: 'lr 9/8/2011 20:10'! testAddTraitPattern "Make sure that all trait definitions can be parsed." self class environment allTraitsDo: [ :trait | | change | change := changes defineClass: trait definition. self assert: (change isKindOf: RBAddTraitChange). self assert: (change changeClassName = trait name). self assert: (change category = trait category). self universalTestFor: change ]! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 08:32'! testComment | change | change := changes comment: 'Some Comment' in: self class. self assert: change changeClassName = self class name. self assert: change changeClass = self class. self assert: change isMeta not. self assert: change comment = 'Some Comment'. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 08:33'! testCompileInClass | change | change := changes compile: 'setUp' in: self class. self assert: change controller isNil. self assert: change changeClassName = self class name. self assert: change changeClass = self class. self assert: change isMeta not. self assert: change selector = #setUp. self assert: change source = 'setUp'. self assert: change protocol = #running. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 08:33'! testCompileInClassified | change | change := changes compile: 'setUp' in: self class classified: #accessing. self assert: change controller isNil. self assert: change changeClassName = self class name. self assert: change changeClass = self class. self assert: change isMeta not. self assert: change selector = #setUp. self assert: change source = 'setUp'. self assert: change protocol = #accessing. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 9/8/2011 20:10'! testCompileInInteractively | change | change := RBAddMethodChange compile: 'setUp' in: self class classified: #running for: self. self assert: change controller = self. self assert: change changeClassName = self class name. self assert: change changeClass = self class. self assert: change isMeta not. self assert: change selector = #setUp. self assert: change source = 'setUp'. self assert: change protocol = #running. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 08:33'! testCompileInMetaclass | change | change := changes compile: 'new' in: self class class. self assert: change controller isNil. self assert: change changeClassName = self class name. self assert: change changeClass = self class class. self assert: change isMeta. self assert: change selector = #new. self assert: change source = 'new'. self assert: change protocol = #accessing. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 9/6/2010 11:31'! testComposite changes compile: 'method ^ 1' in: self class classified: #utilities; compile: 'method ^ 2' in: self class class classified: #utilities. self assert: (changes changesSize = 2). self assert: (changes problemCount = 2). self assert: (changes changeForClass: self class name selector: #method) notNil. self assert: (changes changeForMetaclass: self class name selector: #method) notNil. self universalTestFor: changes! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 10/15/2010 09:24'! testPerformAddRemoveClass | change | change := changes defineClass: 'Object subclass: #' , self changeMock name , 'Temporary instanceVariableNames: '''' classVariableNames: '''' poolDictionaries: '''' category: ''' , self class category , ''''. self perform: change do: [ self assert: (Smalltalk hasClassNamed: change changeClassName). self assert: change definedClass name = change changeClassName. self assert: change definedClass isBehavior ]. self deny: (Smalltalk hasClassNamed: change changeClassName). self assert: change definedClass isObsolete! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 10/15/2010 09:18'! testPerformAddRemoveClassInstanceVariable | change | change := changes addInstanceVariable: 'foo' to: self changeMock class. self perform: change do: [ self assert: (change changeClass instVarNames includes: 'foo') ]. self deny: (change changeClass instVarNames includes: 'foo')! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 9/8/2011 20:10'! testPerformAddRemoveClassInteractively | change | change := RBAddClassChange definition: 'Object subclass: #' , self changeMock name , 'Temporary instanceVariableNames: '''' classVariableNames: '''' poolDictionaries: '''' category: ''' , self class category , '''' for: self. self perform: change do: [ self assert: (Smalltalk hasClassNamed: change changeClassName). self assert: change definedClass name = change changeClassName. self assert: change definedClass isBehavior ]. self deny: (Smalltalk hasClassNamed: change changeClassName). self assert: change definedClass isObsolete ! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 10/15/2010 09:28'! testPerformAddRemoveClassMethod | change source | change := changes compile: 'method ^ 1' in: self changeMock class classified: #utilities. self perform: change do: [ self assert: (self changeMock respondsTo: #method) ]. self deny: (self changeMock respondsTo: #method). self assert: change definedSelector = #method! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 10/15/2010 09:20'! testPerformAddRemoveClassVariable | change | change := changes addClassVariable: 'Foo' to: self changeMock. self perform: change do: [ self assert: (change changeClass classVarNames includes: 'Foo') ]. self deny: (change changeClass classVarNames includes: 'Foo')! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 10/15/2010 09:28'! testPerformAddRemoveInstanceVariable | change | change := changes addInstanceVariable: 'foo' to: self changeMock. self perform: change do: [ self assert: (change changeClass instVarNames includes: 'foo') ]. self deny: (change changeClass instVarNames includes: 'foo')! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 10/15/2010 09:28'! testPerformAddRemoveMethod | change source | change := changes compile: 'method ^ 1' in: self changeMock classified: #utilities. self perform: change do: [ self assert: (self changeMock canUnderstand: #method) ]. self deny: (self changeMock canUnderstand: #method). self assert: change definedSelector = #method! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 9/8/2011 20:10'! testPerformAddRemoveMethodInteractively | change source | change := RBAddMethodChange compile: 'method ^ 1' in: self changeMock classified: #utilities for: self. self perform: change do: [ self assert: (self changeMock canUnderstand: #method) ]. self deny: (self changeMock canUnderstand: #method). self assert: change definedSelector = #method! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 10/15/2010 09:30'! testPerformChangeClass | change | change := changes defineClass: self class name , ' subclass: #' , self changeMock name , ' instanceVariableNames: '''' classVariableNames: '''' poolDictionaries: '''' category: ''' , self class category , ''''. self perform: change do: [ self assert: change changeClass superclass = self class. self assert: change changeClass instVarNames isEmpty ]. self assert: change changeClass superclass = Object. self assert: change changeClass instVarNames notEmpty. self assert: change definedClass = self changeMock! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 10/15/2010 09:32'! testPerformChangeComment | change comment | change := changes comment: 'Some Comment' in: self changeMock. comment := change changeClass organization classComment. self perform: change do: [ self assert: (change changeClass comment = 'Some Comment') ]. self assert: change changeClass organization classComment = comment! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 10/15/2010 09:31'! testPerformChangeMetaclass | change | change := changes defineClass: self changeMock name , ' class instanceVariableNames: '''''. self perform: change do: [ self assert: change changeClass class instVarNames isEmpty ]. self assert: change changeClass class instVarNames notEmpty. self assert: change definedClass = self changeMock class! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 10/15/2010 09:33'! testPerformChangeMethod | change source | change := changes compile: 'one ^ 2' in: self changeMock. source := change changeClass sourceCodeAt: #one. self perform: change do: [ self assert: (change changeClass sourceCodeAt: #one) = 'one ^ 2' ]. self assert: (change changeClass sourceCodeAt: #one) = source! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 10/15/2010 09:34'! testPerformCompositeChange changes compile: 'method1 ^ 1' in: self changeMock; compile: 'method2 ^ 2' in: self changeMock. self perform: changes do: [ self assert: (self changeMock canUnderstand: #method1). self assert: (self changeMock canUnderstand: #method2) ]. self deny: (self changeMock canUnderstand: #method1). self deny: (self changeMock canUnderstand: #method2) ! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 10/15/2010 09:34'! testPerformRenameClass | change | change := changes renameClass: self changeMock to: self changeMock name , 'Plus'. self perform: change do: [ self deny: (Smalltalk hasClassNamed: change oldName). self assert: (Smalltalk hasClassNamed: change newName) ]. self assert: (Smalltalk hasClassNamed: change oldName). self deny: (Smalltalk hasClassNamed: change newName)! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 10/15/2010 09:36'! testPerformRenameClassInstanceVariable | change | change := changes renameInstanceVariable: 'classInstVar' to: 'classInstVarPlus' in: self changeMock class. self perform: change do: [ self deny: (change changeClass instVarNames includes: change oldName). self assert: (change changeClass instVarNames includes: change newName) ]. self assert: (change changeClass instVarNames includes: change oldName). self deny: (change changeClass instVarNames includes: change newName)! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 10/15/2010 09:35'! testPerformRenameClassVariable | change | change := changes renameClassVariable: 'ClassVar' to: 'ClassVarPlus' in: self changeMock. self perform: change do: [ self deny: (change changeClass classVarNames includes: change oldName). self assert: (change changeClass classVarNames includes: change newName) ]. self assert: (change changeClass classVarNames includes: change oldName). self deny: (change changeClass classVarNames includes: change newName)! ! !RBRefactoringChangeTests methodsFor: 'tests-perform' stamp: 'lr 10/15/2010 09:35'! testPerformRenameInstanceVariable | change | change := changes renameInstanceVariable: 'instVar' to: 'instVarPlus' in: self changeMock. self perform: change do: [ self deny: (change changeClass instVarNames includes: change oldName). self assert: (change changeClass instVarNames includes: change newName) ]. self assert: (change changeClass instVarNames includes: change oldName). self deny: (change changeClass instVarNames includes: change newName)! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 09:09'! testRemoveClass | change | change := changes removeClass: self class. self assert: change changeClassName = self class name. self assert: change changeClass = self class. self assert: change isMeta not. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 09:11'! testRemoveClassInstanceVariable | change | change := changes removeInstanceVariable: 'instVar' from: self class class. self assert: change changeClassName = self class name. self assert: change changeClass = self class class. self assert: change isMeta. self assert: change variable = 'instVar'. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 09:10'! testRemoveClassNamed | change | change := changes removeClassNamed: self class name. self assert: change changeClassName = self class name. self assert: change changeClass = self class. self assert: change isMeta not. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 09:10'! testRemoveClassVariable | change | change := changes removeClassVariable: 'ClassVar' from: self class. self assert: change changeClassName = self class name. self assert: change changeClass = self class. self assert: change isMeta not. self assert: change variable = 'ClassVar'. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 09:10'! testRemoveInstanceVariable | change | change := changes removeInstanceVariable: 'instVar' from: self class. self assert: change changeClassName = self class name. self assert: change changeClass = self class. self assert: change isMeta not. self assert: change variable = 'instVar'. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 09:11'! testRemoveMethod | change | change := changes removeMethod: #setUp from: self class. self assert: change changeClassName = self class name. self assert: change changeClass = self class. self assert: change isMeta not. self assert: change selector = #setUp. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 09:11'! testRemovePool | change | change := changes removePool: 'PoolDict' from: self class. self assert: change changeClassName = self class name. self assert: change changeClass = self class. self assert: change isMeta not. self assert: change variable = 'PoolDict'. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 09:12'! testRenameClass | change | change := changes renameClass: self class to: self class name , 'Plus'. self assert: change oldName = self class name. self assert: change newName = (self class name , 'Plus'). self assert: change changeClass = self class. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 10/15/2010 09:12'! testRenameClassInstanceVariable | change | change := changes renameInstanceVariable: 'instVar1' to: 'instVar2' in: self class class. self assert: change changeClassName = self class name. self assert: change oldName = 'instVar1'. self assert: change newName = 'instVar2'. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 9/5/2010 20:02'! testRenameClassVariable | change | change := changes renameClassVariable: 'ClassVar1' to: 'ClassVar2' in: self class. self assert: change changeClassName = self class name. self assert: change oldName = 'ClassVar1'. self assert: change newName = 'ClassVar2'. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'tests' stamp: 'lr 9/5/2010 20:02'! testRenameInstanceVariable | change | change := changes renameInstanceVariable: 'instVar1' to: 'instVar2' in: self class. self assert: change changeClassName = self class name. self assert: change oldName = 'instVar1'. self assert: change newName = 'instVar2'. self universalTestFor: change! ! !RBRefactoringChangeTests methodsFor: 'utilities' stamp: 'lr 9/8/2011 20:10'! undoTestFor: aChange | undo | undo := aChange asUndoOperation. self assert: (undo isKindOf: RBRefactoryChange)! ! !RBRefactoringChangeTests methodsFor: 'utilities' stamp: 'lr 9/8/2011 20:10'! universalTestFor: aChange self equalityTestFor: aChange. self stringTestFor: aChange. (aChange isKindOf: RBRefactoryClassChange) ifTrue: [ self undoTestFor: aChange ]! ! Object subclass: #RBRefactoringChangeMock instanceVariableNames: 'instVar' classVariableNames: 'ClassVar' poolDictionaries: '' category: 'Refactoring-Tests-Changes'! RBRefactoringChangeMock class instanceVariableNames: 'classInstVar'! RBRefactoringChangeMock class instanceVariableNames: 'classInstVar'! !RBRefactoringChangeMock methodsFor: 'accessing' stamp: 'lr 9/8/2011 22:53'! one ^ 1! !