diff -r 4a1710e4d89d -r b0deb87709fe MCWorkingCopyTest.st --- /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 " +! + +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 " +! + +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 §' +! !