MCWorkingCopyTest.st
changeset 324 b0deb87709fe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MCWorkingCopyTest.st	Sat Aug 20 14:26:52 2011 +0200
@@ -0,0 +1,372 @@
+"{ Package: 'stx:goodies/monticello' }"
+
+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, '-', Author initials, '.', 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.
+        repositoryGroup disableCache.
+        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 := Author initials.
+        Author initials: 'abc'.
+
+    "Modified: / 13-09-2010 / 12:00:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+tearDown
+	workingCopy unregister.
+	self restoreMocks.
+	self clearPackageCache.
+	Author initials: 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.
+
+    "Modified: / 13-09-2010 / 12:18:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+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/MCWorkingCopyTest.st,v 1.1 2011-08-20 12:26:52 cg Exp $'
+!
+
+version_CVS
+    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCWorkingCopyTest.st,v 1.1 2011-08-20 12:26:52 cg Exp $'
+!
+
+version_SVN
+    ^ '§Id: MCWorkingCopyTest.st 10 2010-09-13 11:28:19Z vranyj1 §'
+! !