MCWorkingCopyTest.st
author Claus Gittinger <cg@exept.de>
Mon, 14 May 2018 02:21:18 +0200
changeset 1048 582b3a028cbc
parent 324 b0deb87709fe
permissions -rw-r--r--
#FEATURE by cg class: MCMethodDefinition changed: #postloadOver:

"{ 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 §'
! !