test/MCWorkingCopyTest.st
changeset 13 34ad2e22a389
child 813 eabdb5055eac
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/MCWorkingCopyTest.st	Wed Nov 22 14:01:47 2006 +0100
@@ -0,0 +1,359 @@
+"{ Package: 'stx:goodies/monticello/test' }"
+
+MCTestCase subclass:#MCWorkingCopyTest
+	instanceVariableNames:'savedInitials workingCopy repositoryGroup versions versions2'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Monticello-Tests'
+!
+
+
+!MCWorkingCopyTest methodsFor:'accessing'!
+
+description
+	^ self class name
+! !
+
+!MCWorkingCopyTest methodsFor:'actions'!
+
+basicMerge: aVersion
+	aVersion merge
+!
+
+load: aVersion
+	aVersion load
+!
+
+merge: aVersion
+	[[self basicMerge: aVersion]
+		on: MCMergeResolutionRequest do: [:n | n resume: true]]
+			on: MCNoChangesException do: [:n | ]
+!
+
+snapshot
+	| version |
+	[version _ workingCopy newVersion]
+		on: MCVersionNameAndMessageRequest
+		do: [:n | n resume: (Array with: n suggestedName with: '')].
+	versions at: version info put: version.
+	^ version
+! !
+
+!MCWorkingCopyTest methodsFor:'asserting'!
+
+assertNameWhenSavingTo: aRepository is: aString
+	| name |
+	name _ nil.
+	[aRepository storeVersion: workingCopy newVersion]
+		on: MCVersionNameAndMessageRequest
+		do: [:n | name _ n suggestedName. n resume: (Array with: name with: '')].
+	self assert: name = aString
+!
+
+assertNumberWhenSavingTo: aRepository is: aNumber
+	| name |
+	name _ nil.
+	[aRepository storeVersion: workingCopy newVersion]
+		on: MCVersionNameAndMessageRequest
+		do: [:n | name _ n suggestedName. n resume: (Array with: name with: '')].
+	self assert: name = (self packageName, '-', Utilities authorInitials, '.', aNumber asString)
+! !
+
+!MCWorkingCopyTest methodsFor:'private'!
+
+packageName
+	^ self mockPackage name
+! !
+
+!MCWorkingCopyTest methodsFor:'running'!
+
+clearPackageCache
+	| dir |
+	dir _ MCCacheRepository default directory.
+	(dir fileNamesMatching: 'MonticelloMocks*') do: [:ea | dir deleteFileNamed: ea].
+	(dir fileNamesMatching: 'MonticelloTest*') do: [:ea | dir deleteFileNamed: ea].
+	(dir fileNamesMatching: 'rev*') do: [:ea | dir deleteFileNamed: ea].
+	(dir fileNamesMatching: 'foo-*') do: [:ea | dir deleteFileNamed: ea].
+	(dir fileNamesMatching: 'foo2-*') do: [:ea | dir deleteFileNamed: ea].
+!
+
+setUp
+	| repos1 repos2 |
+	self clearPackageCache.
+	repositoryGroup _ MCRepositoryGroup new.
+	workingCopy _ MCWorkingCopy forPackage: self mockPackage.
+	versions _ Dictionary new.
+	versions2 _ Dictionary new.
+	repos1 _ MCDictionaryRepository new dictionary: versions.
+	repos2 _ MCDictionaryRepository new dictionary: versions2.
+	repositoryGroup addRepository: repos1.
+	repositoryGroup addRepository: repos2.
+	MCRepositoryGroup default removeRepository: repos1; removeRepository: repos2.
+	workingCopy repositoryGroup: repositoryGroup.
+	savedInitials _ Utilities authorInitials.
+	Utilities setAuthorInitials: 'abc'.
+!
+
+tearDown
+	workingCopy unregister.
+	self restoreMocks.
+	self clearPackageCache.
+	Utilities setAuthorInitials: savedInitials.
+! !
+
+!MCWorkingCopyTest methodsFor:'tests'!
+
+testAncestorMerge
+	| base revA revB revC |
+
+	base _ self snapshot.
+	self change: #a toReturn: 'a1'.
+	revA _  self snapshot.
+	self change: #b toReturn: 'b1'.
+	revB _  self snapshot.	
+	self change: #c toReturn: 'c1'.
+	revC _  self snapshot.	
+
+	self should: [self basicMerge: revA] raise: MCNoChangesException.
+	
+!
+
+testBackport
+	| inst base final backported |
+	inst _ self mockInstanceA.
+	base _  self snapshot.
+	self assert: inst one = 1.
+	self change: #one toReturn: 2.
+	self change: #two toReturn: 3.
+	final _ self snapshot.
+	[workingCopy backportChangesTo: base info]
+		on: MCChangeSelectionRequest
+		do: [:e | e resume: e patch].
+	self assert: inst one = 2.
+	self assert: inst two = 3.
+	self assert: workingCopy ancestry ancestors size = 1.
+	self assert: workingCopy ancestry ancestors first = base info.
+	self assert: workingCopy ancestry stepChildren size = 1.
+	self assert: workingCopy ancestry stepChildren first = final info.
+	backported _ self snapshot.
+	[workingCopy backportChangesTo: base info]
+		on: MCChangeSelectionRequest
+		do: [:e | e resume: e patch].
+	self assert: workingCopy ancestry ancestors size = 1.
+	self assert: workingCopy ancestry ancestors first = base info.
+	self assert: workingCopy ancestry stepChildren size = 1.
+	self assert: workingCopy ancestry stepChildren first = backported info.
+	
+!
+
+testDoubleRepeatedMerge
+	| base motherA1 motherA2 motherB1 motherB2 inst |
+
+	base _ self snapshot.
+	self change: #a toReturn: 'a1'.
+	motherA1 _  self snapshot.
+	self change: #c toReturn: 'c1'.
+	motherA2 _  self snapshot.	
+	
+	self load: base.
+	self change: #b toReturn: 'b1'.
+	motherB1 _  self snapshot.
+	self change: #d toReturn: 'd1'.
+	motherB2 _  self snapshot.
+	
+	self load: base.
+	self merge: motherA1.
+	self merge: motherB1.
+	self change: #a toReturn: 'a2'.
+	self change: #b toReturn: 'b2'.
+	self snapshot.
+
+	self shouldnt: [self merge: motherA2] raise: Error.
+	self shouldnt: [self merge: motherB2] raise: Error.
+	
+	inst _ self mockInstanceA.
+	self assert: inst a = 'a2'.
+	self assert: inst b = 'b2'.
+	self assert: inst c = 'c1'.
+	self assert: inst d = 'd1'.
+	
+!
+
+testMergeIntoImageWithNoChanges
+	| base revB revA1 |
+
+	self change: #a toReturn: 'a'.
+	base _ self snapshot.
+	self change: #b toReturn: 'b'.
+	revB _ self snapshot.
+	
+	self load: base.
+	self change: #a toReturn: 'a1'.
+	revA1 _ self snapshot.
+
+	self change: #a toReturn: 'a'.
+	self snapshot.
+	self merge: revB.
+
+	self assert: (workingCopy ancestors size = 2)
+	
+!
+
+testMergeIntoUnmodifiedImage
+	| base revA |
+
+	base _ self snapshot.
+	self change: #a toReturn: 'a1'.
+	revA _ self snapshot.
+	
+	self load: base.
+
+	self merge: revA.
+
+	self assert: (workingCopy ancestors size = 1)
+	
+!
+
+testNaming
+	| repos version |
+
+	repos := MCDictionaryRepository new.
+	self assertNameWhenSavingTo: repos is: self packageName, '-abc.1'.
+	self assertNameWhenSavingTo: repos is: self packageName, '-abc.2'.
+	repos := MCDictionaryRepository new.
+	self assertNameWhenSavingTo: repos is: self packageName, '-abc.3'.
+	version := self snapshot.
+	version info instVarNamed: 'name' put: 'foo-jf.32'.
+	version load.
+	self assertNameWhenSavingTo: repos is: 'foo-abc.33'.
+	self assertNameWhenSavingTo: repos is: 'foo-abc.34'.
+	version info instVarNamed: 'name' put: 'foo-abc.35'.
+	repos storeVersion: version.
+	self assertNameWhenSavingTo: repos is: 'foo-abc.36'.
+	self assertNameWhenSavingTo: repos is: 'foo-abc.37'.
+	version info instVarNamed: 'name' put: 'foo-abc.10'.
+	repos storeVersion: version.
+	self assertNameWhenSavingTo: repos is: 'foo-abc.38'.
+	version info instVarNamed: 'name' put: 'foo2-ab.40'.
+	version load.
+	self assertNameWhenSavingTo: repos is: 'foo2-abc.41'.
+!
+
+testOptimizedLoad
+	| inst base diffy |
+	inst _ self mockInstanceA.
+	base _ self snapshot.
+	self change: #one toReturn: 2.
+	self assert: inst one = 2.
+	diffy _ self snapshot asDiffAgainst: base.
+	self deny: diffy canOptimizeLoading.
+	self load: base.
+	self assert: inst one = 1.
+	self assert: diffy canOptimizeLoading.
+	self load: diffy.
+	self assert: inst one = 2.
+!
+
+testRedundantMerge
+	| base |
+	base _  self snapshot.
+	self merge: base.
+	self shouldnt: [self merge: base] raise: Error.
+!
+
+testRepeatedMerge
+	| base mother1 mother2 inst |
+
+	base _  self snapshot.
+	self change: #one toReturn: 2.
+	mother1 _  self snapshot.
+	self change: #two toReturn: 3.
+	mother2 _  self snapshot.	
+	
+	self load: base.
+	self change: #truth toReturn: false.
+	self snapshot.
+
+	inst _ self mockInstanceA.
+	self assert: inst one = 1.
+	self assert: inst two = 2.	
+
+	self merge: mother1.
+	self assert: inst one = 2.
+	self assert: inst two = 2.	
+	
+	self change: #one toReturn: 7.
+	self assert: inst one = 7.
+	self assert: inst two = 2.
+	
+	self shouldnt: [self merge: mother2] raise: Error.
+	self assert: inst one = 7.
+	self assert: inst two = 3.
+!
+
+testRepositoryFallback
+	| version |
+	version _ self snapshot.
+	self assert: (repositoryGroup versionWithInfo: version info) == version.
+	versions removeKey: version info.
+	versions2 at: version info put: version.
+	self assert: ( repositoryGroup versionWithInfo: version info) == version.
+	versions2 removeKey: version info.
+	self should: [repositoryGroup versionWithInfo: version info] raise: Error.
+!
+
+testSelectiveBackport
+	| inst base intermediate final patch selected |
+	inst _ self mockInstanceA.
+	base _  self snapshot.
+	self assert: inst one = 1.
+	self change: #one toReturn: 2.
+	intermediate _ self snapshot.
+	self change: #two toReturn: 3.
+	final _ self snapshot.
+	[workingCopy backportChangesTo: base info]
+		on: MCChangeSelectionRequest
+		do: [:e |
+			patch _ e patch.
+			selected _ patch operations select: [:ea | ea definition selector = #two].
+			e resume: (MCPatch operations: selected)]. 
+	self assert: inst one = 1.
+	self assert: inst two = 3.
+	self assert: workingCopy ancestry ancestors size = 1.
+	self assert: workingCopy ancestry ancestors first = base info.
+	self assert: workingCopy ancestry stepChildren size = 1.
+	self assert: workingCopy ancestry stepChildren first = final info
+!
+
+testSimpleMerge
+	| mother base inst |
+	inst _ self mockInstanceA.
+	base _  self snapshot.
+	self change: #one toReturn: 2.
+	mother _  self snapshot.
+	self load: base.
+	self change: #two toReturn: 3.
+	self snapshot.
+	self assert: inst one = 1.
+	self assert: inst two = 3.
+	
+	self merge: mother.
+	self assert: inst one = 2.
+	self assert: inst two = 3.
+!
+
+testSnapshotAndLoad
+	| base inst |
+	inst _ self mockInstanceA.
+	base _  self snapshot.
+	self change: #one toReturn: 2.
+	self assert: inst one = 2.
+	self load: base.
+	self assert: inst one = 1.
+! !
+
+!MCWorkingCopyTest class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/goodies/monticello/test/MCWorkingCopyTest.st,v 1.1 2006-11-22 13:01:47 cg Exp $'
+! !