--- /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 §'
+! !