mercurial/HGStXTests.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 11 Jun 2015 22:47:57 +0100
changeset 550 c5e8328a47f0
parent 548 cfbdb28f0fc7
child 562 e694ffae649b
child 566 012225aa6d26
permissions -rw-r--r--
Fix for mixed Smalltalk-Java packages When package containing Java classes (those annotated by a stx/libjava.annotation.Package) is about to be commited, * Add javaBundle into project' definition (but never overwrite it) * Generate and commit java/build.xml and java/build.auto.xml build support files.

"{ Encoding: utf8 }"

"
stx:libscm - a new source code management library for Smalltalk/X
Copyright (C) 2012-2015 Jan Vrany

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
"
"{ Package: 'stx:libscm/mercurial' }"

"{ NameSpace: Smalltalk }"

HGTestCase subclass:#HGStXTests
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	category:'SCM-Mercurial-Tests'
!

!HGStXTests class methodsFor:'documentation'!

copyright
"
stx:libscm - a new source code management library for Smalltalk/X
Copyright (C) 2012-2015 Jan Vrany

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
"
!

documentation
"
    Tests for Mercurial-Smalltalk/X integration. Mapping packages
    to Mercurial repositories, commitning packages from image
    and so on...

    [author:]
        Jan Vrany <jan.vrany@fit.cvut.cz>

    [instance variables:]

    [class variables:]

    [see also:]

"
! !

!HGStXTests methodsFor:'running'!

loadPackage: packageId
    "A utility method to prepare a repository for package
     and load package from it"

    self repositoryNamed: (packageId copyReplaceAll:$: with:$/).
    Smalltalk loadPackage: packageId.

    "Created: / 16-11-2012 / 20:01:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

tearDown
    | classes methods |
    super tearDown.

    "Also, wipe out all mocks"
    classes := OrderedCollection new.
    methods := OrderedCollection new.
    Smalltalk allClassesDo:[:cls|
        (cls package notNil and:[cls package startsWith:'mocks']) ifTrue:[
            classes add: cls
        ] ifFalse:[
            cls methodsDo:[:m|(m package notNil and:[m package startsWith:'mocks']) ifTrue:[methods add: m]].
            cls class methodsDo:[:m|(m package notNil and:[m package startsWith:'mocks']) ifTrue:[methods add: m]].
        ]
    ].
    Class withoutUpdatingChangesDo:[
        classes do:[:cls|cls removeFromSystem].
        methods do:[:m|m mclass removeSelector: m selector]
    ].
"/    Delay waitForSeconds: 1.

    "/ Also, wipe out cached sources...
    [
        (AbstractSourceCodeManager cacheDirectoryName asFilename / 'mocks') recursiveRemove
    ] on: Error do:[:ex|
        Delay waitForSeconds: 1.
        Error ignoreIn:[
            (AbstractSourceCodeManager cacheDirectoryName asFilename / 'mocks') recursiveRemove.
        ].
    ]

    "Created: / 16-11-2012 / 19:00:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 12-08-2014 / 20:57:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_infrastructure
    "
        This is kind of meta-test that tests if the
        setUp/tearDown actually works. Especially, if
        no mock classes/methods are left in the image
        after tearDown. Also, make sure that all
        HGPackageModels for mocks
    "
    | pm |

    self loadPackage:'mocks:hg/p1'.

    self assert: (Smalltalk at: #'mocks_hg_p1') notNil.
    pm := HGPackageWorkingCopyRegistry packageNamed:'mocks:hg/p1'.
    self assert: pm notNil.
    self assert: ((HGPackageWorkingCopyRegistry current instVarNamed:#packages) includesKey: #'mocks:hg/p1').

    pm := nil.
    self cleanup.

    self assert: (Smalltalk at: #'mocks_hg_p1') isNil.
    self assert: repositories isNil.
    self assert: ((HGPackageWorkingCopyRegistry current instVarNamed:#packages) includesKey: #'mocks:hg/p1') not.

    "Created: / 16-11-2012 / 19:25:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 22-11-2012 / 15:31:54 / jv"
    "Modified: / 05-03-2014 / 21:50:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGStXTests methodsFor:'tests - commit'!

test_commit_01
    "
        Simple commit
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').
    self dumpRepositoryLog: repo.


    self deny:   ((repo @ 1 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').

    (MockHGP1Bar compile:'zork ^ 1' classified:'test') package: MockHGP1Bar package.
    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    self assert: ct isCommitingNewHead not.
    ct message:'test_commit_01'.
    ct do.
    self dumpRepositoryLog: repo.

    "
        repo workingCopy browse
    "
    self assert: ((repo @ 2 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').
    self assert: (Smalltalk at:#mocks_hg_p1) hgLogicalRevision revno = 2.

    "Created: / 16-11-2012 / 18:51:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:45:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_02a
    "
    Repeated commit
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    Smalltalk loadPackage:'mocks:hg/p1'.
    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    self dumpRepositoryLog: repo.

    (MockHGP1Bar compile:'zork ^ 1' classified:'test') package: MockHGP1Bar package.

    self deny:   ((repo @ 1 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').

    ct := pm commitTask.
    ct message:'test_commit_02-1'.
    ct do.
    self dumpRepositoryLog: repo.

    self assert: ((repo @ 2 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').
    self assert: ((repo @ 2 ) parent1 == (repo @ 1 )).

    (MockHGP1Bar compile:'zork ^ 2' classified:'test') package: MockHGP1Bar package.

    ct := pm commitTask.
    ct message:'test_commit_02-2'.
    ct do.
    self dumpRepositoryLog: repo.

    self assert:  (repo @ 3) message = 'test_commit_02-2'.
    self assert: ((repo @ 3 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 2').
    self assert: ((repo @ 3 ) parent1 == (repo @ 2 )).

    "
    repo workingCopy browse
    "

    "Created: / 20-11-2012 / 19:33:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:49:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_02b
    "
    Repeated commit, remove the working copy between commits
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    Smalltalk loadPackage:'mocks:hg/p1'.
    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    (MockHGP1Bar compile:'zork ^ 1' classified:'test') package: MockHGP1Bar package.

    self deny:   ((repo @ 1 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').

    ct := pm commitTask.
    ct message:'test_commit_02-1'.
    ct do.

    self assert: ((repo @ 2 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').
    self assert: ((repo @ 2 ) parent1 == (repo @ 1 )).

    (MockHGP1Bar compile:'zork ^ 2' classified:'test') package: MockHGP1Bar package.
    pm temporaryWorkingCopy path recursiveRemove.

    ct := pm commitTask.
    ct message:'test_commit_02-2'.
    ct do.

    self assert: ((repo @ 3 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 2').
    self assert: ((repo @ 3 ) parent1 == (repo @ 2 )).

    "
    repo workingCopy browse
    "

    "Created: / 20-11-2012 / 19:35:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:49:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_03a
    "
    Two images A, B working in parallel, commiting to same repo

    1) A: checkout, modify commit package (cs1)
    2) B: checkout, commit change         (cs2)
    2) A: modify, checkout                (cs3)

    The changeset cs3 should have cs1 as its parent1

    <skip>

    "

    | repo pmA ctA wcB s |

    "=== A modifies & commits =============================== "
    repo := self repositoryNamed: 'mocks/hg/p1'.
    Smalltalk loadPackage:'mocks:hg/p1'.
    self dumpRepositoryLog: repo.

    pmA := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    (MockHGP1Bar compile:'zork ^ 1' classified:'test') package: MockHGP1Bar package.

    self deny:   ((repo @ 1 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').

    ctA := pmA commitTask.
    self assert: ctA isCommitingNewHead not.
    ctA message:'test_commit_03a A-1'.
    ctA do.
    self dumpRepositoryLog: repo.

    self assert: ((repo @ 2 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').
    self assert: ((repo @ 2 ) parent1 == (repo @ 1 )).

    "=== B modifies & commits =============================== "
    wcB := repo workingCopy.
    s := ( wcB / 'abbrev.stc' ) appendStream.
    [ s nextPutLine:'# Modification '] ensure:[s close].
    wcB commit: 'test_commit_03a B-2'.
    self dumpRepositoryLog: repo.
    self assert: ((repo @ 3 ) parent1 == (repo @ 1 )).


    "=== A modifies & commits =============================== "
    (MockHGP1Bar compile:'zork ^ 2' classified:'test') package: MockHGP1Bar package.

    ctA := pmA commitTask.
    self assert: ctA isCommitingNewHead not.
    ctA message:'test_commit_03a A-3'.
    ctA do.
    self dumpRepositoryLog: repo.

    self assert: ((repo @ 4 ) parent1 == (repo @ 2 )).

    "
    repo workingCopy browse
    "

    "Created: / 20-11-2012 / 19:45:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_03b
    "
    Two images A, B working in parallel, commiting to same repo

    1) A: checkout, modify commit package (cs1)
    2) B: checkout, commit change         (cs2)
    3) A: flushes its temp working copy
    4) A: modify, checkout                (cs3)

    The changeset cs3 should have cs1 as its parent1
    "

    | repo pmA ctA wcB s |

    "=== A modifies & commits =============================== "
    repo := self repositoryNamed: 'mocks/hg/p1'.
    Smalltalk loadPackage:'mocks:hg/p1'.
    pmA := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    (MockHGP1Bar compile:'zork ^ 1' classified:'test') package: MockHGP1Bar package.

    self deny:   ((repo @ 1 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').

    ctA := pmA commitTask.
    ctA message:'test_commit_03a A-1'.
    ctA do.

    self assert: ((repo @ 2 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').
    self assert: ((repo @ 2 ) parent1 == (repo @ 1 )).

    "=== B modifies & commits =============================== "
    wcB := repo workingCopy.
    s := ( wcB / 'abbrev.stc' ) appendStream.
    [ s nextPutLine:'# Modification '] ensure:[s close].
    wcB commit: 'test_commit_03a B-2'.
    self assert: ((repo @ 3 ) parent1 == (repo @ 1 )).

    "=== A flushed its working copy ========================= "
    pmA temporaryWorkingCopy path recursiveRemove.


    "=== A modifies & commits =============================== "
    (MockHGP1Bar compile:'zork ^ 2' classified:'test') package: MockHGP1Bar package.

    ctA := pmA commitTask.
    ctA message:'test_commit_03a A-3'.
    ctA do.

    self assert: ((repo @ 4 ) parent1 == (repo @ 2 )).

    "
    repo workingCopy browse
    "

    "Created: / 20-11-2012 / 19:51:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_03c
    "
    Two images A, B working in parallel, commiting to same repo

                                                  (cs1) - base changeset
    2) B: checkout, modifu, commit change         (cs2)
    4) A: checkout, modify, commit change         (cs3)

    The changeset cs3 should have cs1 as its parent1
    "

    | repo pmA ctA wcB s |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    Smalltalk loadPackage:'mocks:hg/p1'.
    pmA := HGPackageWorkingCopy named: 'mocks:hg/p1'.

    "=== B modifies & commits =============================== "
    wcB := repo workingCopy.
    s := ( wcB / 'abbrev.stc' ) appendStream.
    [ s nextPutLine:'# Modification '] ensure:[s close].
    wcB commit: 'test_commit_03c B-1'.
    self assert: ((repo @ 2 ) parent1 == (repo @ 1 )).

    "=== A modifies & commits =============================== "
    (MockHGP1Bar compile:'zork ^ 2' classified:'test') package: MockHGP1Bar package.

    ctA := pmA commitTask.
    ctA message:'test_commit_03c A-2'.
    ctA do.

    self assert: ((repo @ 3 ) parent1 == (repo @ 1 )).

    "
    repo workingCopy browse
    "

    "Created: / 20-11-2012 / 20:00:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_05a
    "
    Setup:
    Two repositories: package + upstream repo (package's default).

    1) checkout, modify.
    2) commit, setup autopush to default remote.

    Check whether remote gets updated/
    "
    | path upstreamP upstream repo pm ct |

    path := (self repositoryNamed: 'mocks/hg/p1') path.
    upstreamP := repositories add:(Filename newTemporaryDirectory).
    path moveTo: (upstreamP / 'upstream').
    upstream := HGRepository on: (upstreamP / 'upstream').
    repo := upstream cloneTo: path.

    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    "=== modifyes & commits =============================== "
    (MockHGP1Foo compile:'zork ^ 2' classified:'test') package: MockHGP1Foo package.

    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_05a 1'.
    ct remote: repo remoteDefault.
    ct do.

    self assert: (upstream @ 2) message = 'test_commit_05a 1'.


    "
    repo workingCopy browse
    "

    "Created: / 10-12-2012 / 01:58:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_05b
    "
    Setup:
    Two repositories: package + upstream repo (package's default).

    1) checkout, modify.
    2) modify & commit in upstream
    3) commit, setup autopush to default remote.

    Check that an exception is raised as commit would create new
    head.
    "
    | path upstreamP upstream repo wc pm ct s |

    path := (self repositoryNamed: 'mocks/hg/p1') path.
    upstreamP := repositories add:(Filename newTemporaryDirectory).
    path moveTo: (upstreamP / 'upstream').
    upstream := HGRepository on: (upstreamP / 'upstream').
    repo := upstream cloneTo: path.

    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    "=== modify & commit into upstream ================== "
    wc := upstream workingCopy.
    [
        s := ( wc / 'MockHGP1Foo.st' ) appendStream.
        s nextPutLine: 'Just a comment'
    ] ensure:[
        s close
    ].    wc commit: 'test_commit_05b 1 into upstream'.

    "=== modify & commits =============================== "
    (MockHGP1Foo compile:'zork ^ 2' classified:'test') package: MockHGP1Foo package.

    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_05b 2'.
    ct remote: repo remoteDefault.

    self should: [ ct do ] raise: HGPushWouldCreateNewHeadError





    "
    repo workingCopy browse
    "

    "Created: / 10-12-2012 / 02:09:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_06a
    "
    Test commit into new branch
    "
    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    "=== modify & commit =============================== "
    (MockHGP1Foo compile:'zork ^ 2' classified:'test') package: MockHGP1Foo package.

    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_06a 1'.
    ct branch:'test_commit_06a'.
    self assert: ct isCommitingNewHead not.
    ct do.

    "=== check for the branch ========================= "
    self assert: (repo branches size  == 2).
    self assert: (repo @ 2) branches size == 1.
    self assert: (repo @ 2) branches anElement name = 'test_commit_06a'.
    self assert: (repo workingCopy branch name) = 'test_commit_06a'.

    "=== update original wc ========================== "
    self assert: ((repo workingCopy / 'MockHGP1Foo.st') contents asString includesString:'zork ^ 2') not.
    repo workingCopy update.
    self assert: ((repo workingCopy / 'MockHGP1Foo.st') contents asString includesString:'zork ^ 2').


    "
    repo workingCopy browse
    "

    "Created: / 10-12-2012 / 03:24:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_06b
    "
    Test commit into same branch
    "
    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    "=== modifyes & commits =============================== "
    (MockHGP1Foo compile:'zork ^ 2' classified:'test') package: MockHGP1Foo package.

    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_06a 1'.
    ct branch:'default'.
    ct do.

    self assert: (repo branches size  == 1).
    self assert: (repo @ 2) branches size == 1.
    self assert: (repo @ 2) branches anElement name = 'default'.


    "
    repo workingCopy browse
    "

    "Created: / 10-12-2012 / 03:24:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_06c
    "
    Test commit into existing branch should raise an error
    (theoretically possible, but would be tricky to support :-)
    "
    | repo pm ct s |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    "=== create the branch beforehand ===================== "
    [
        s := (repo workingCopy / 'abbrev.stc' ) appendStream.
        s cr;cr;cr.
    ] ensure:[
        s close
    ].
    repo workingCopy branch: 'test_commit_06c'.
    repo workingCopy commit: 'test_commit_06c into branch test_commit_06c'.
    repo workingCopy update: 0.

    "=== modify & commit ================================== "
    (MockHGP1Foo compile:'zork ^ 2' classified:'test') package: MockHGP1Foo package.

    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_06a 1'.
    ct branch:'test_commit_06c'.

    self should: [ ct do] raise: HGCommitError


    "
    repo workingCopy browse
    "

    "Created: / 10-12-2012 / 03:28:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_07
    "
        Tests commit to an empty repository
    "

    | repo cls pm ct |

    repo := self repositoryNamed: 'mocks/hg/p4_empty' unpack: false.
    self dumpRepositoryLog: repo.

    cls := Object subclass:#MockHGP4_EmptyFoo instanceVariableNames:'' classVariableNames:'' poolDictionaries:''.
    cls package: #'mocks:hg/p4_empty'.
    (cls compile:'zork ^ 1' classified:'test') package: #'mocks:hg/p4_empty'.

    pm := HGPackageWorkingCopy named: #'mocks:hg/p4_empty'.
    ct := pm commitTask.
    self assert: ct isCommitingNewHead not.

    ct message:'test_commit_07'.
    ct do.
    self dumpRepositoryLog: repo.

    "
        repo workingCopy browse
    "
    self assert: ((repo @ 0 / 'MockHGP4_EmptyFoo.st') contents asString includesString:'zork ^ 1').
    self assert: (Smalltalk at:#mocks_hg_p4_empty) hgLogicalRevision revno = 0.

    "Created: / 14-01-2013 / 13:20:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_08
    "
    Test commit into fresh branch created in repo (but with no
    changeset yet)
    "
    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    repo workingCopy branch: 'branch_test_commit_08'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    "=== modifyes & commits =============================== "
    (MockHGP1Foo compile:'zork ^ 2' classified:'test') package: MockHGP1Foo package.

    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    self assert: ct isCommitingNewHead not.
    ct message:'test_commit_08 1'.
    ct do.

    self assert: (repo branches size == 2).
    self assert: (repo @ 2) branches size == 1.
    self assert: (repo @ 2) branches anElement name = 'branch_test_commit_08'.


    "
    repo workingCopy browse
    pm temporaryWorkingCopy browse.
    "

    "Created: / 14-01-2013 / 14:14:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_09a
    "
        Test commit of a new subpackage
    "

    | repo cls pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    cls := Object subclass:#MockHGP1_New instanceVariableNames:'' classVariableNames:'' poolDictionaries:''.
    cls package: #'mocks:hg/p1/new'.
    (cls compile:'zork ^ 1' classified:'test') package: #'mocks:hg/p1/new'.

    pm := HGPackageWorkingCopy named: #'mocks:hg/p1/new'.
    ct := pm commitTask.
    self assert: ct isCommitingNewHead not.

    ct message:'test_commit_09'.
    ct do.
    self dumpRepositoryLog: repo.

    "
        repo workingCopy browse
    "
    self assert: ((repo @ 2 / 'new' / 'MockHGP1_New.st') contents asString includesString:'zork ^ 1').
    self assert: (Smalltalk at:#mocks_hg_p1_new) hgLogicalRevision revno = 2.
"/    self assert: (Smalltalk at:#mocks_hg_p1) hgLogicalRevision revno = 2.

    "Created: / 18-03-2013 / 17:21:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_10a
    "
        Test if project definition class is automatically updated when committing.

        Case a: add a new class
    "

    | repo cls pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    cls := Object subclass:#MockHGP1Baz instanceVariableNames:'' classVariableNames:'' poolDictionaries:''.
    cls package: #'mocks:hg/p1'.
    (cls compile:'zork ^ 1' classified:'test') package: #'mocks:hg/p1'.

    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_10a'.
    ct doPrepareWorkingCopy.

    self assert: ((Smalltalk at: #'mocks_hg_p1') classNamesAndAttributes includes: #MockHGP1Baz).
    "
        repo workingCopy browse
    "
"/    self assert: (Smalltalk at:#mocks_hg_p1) hgLogicalRevision revno = 2.

    "Created: / 18-03-2013 / 18:40:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_10b
    "
        Test if project definition class is automatically updated when committing.

        Case b: remove a class
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    Smalltalk removeClass: (Smalltalk at: #MockHGP1Bar).

    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_10b'.
    ct doPrepareWorkingCopy.

    self assert: ((Smalltalk at: #'mocks_hg_p1') classNamesAndAttributes includes: #MockHGP1Bar) not.

    "Created: / 18-03-2013 / 18:41:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_10c
    "
        Test if project definition class is automatically updated when committing.

        Case c: add an extension
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    (UndefinedObject compile:'zork ^ 1' classified:'test') package: #'mocks:hg/p1'.

    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_10c'.
    ct doPrepareWorkingCopy.

    self assert: ((Smalltalk at: #'mocks_hg_p1') extensionMethodNames includes: #zork).

    "Created: / 18-03-2013 / 18:42:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_11a
    "
        Test if commit task detects method protocol changes
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    ((Smalltalk at: #MockHGP1Bar) compiledMethodAt: #qux) category: 'new category'.

    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_11a'.
    ct do.

    "
        repo workingCopy browse
    "
    self assert: ((repo @ 2 / 'MockHGP1Bar.st') contents asString includesString:'new category').

    "Created: / 18-03-2013 / 18:57:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_11b
    "
        Test if commit task detects class category changes
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    (Smalltalk at: #MockHGP1Bar) category:'new category'.

    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_11b'.
    ct do.

    "
        repo workingCopy browse
    "
    self assert: ((repo @ 2 / 'MockHGP1Bar.st') contents asString includesString:'new category').

    "Created: / 18-03-2013 / 18:59:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_11c
    "
        Test if commit task detects class removal
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    Smalltalk removeClass: (Smalltalk at: #MockHGP1Bar).

    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_11c'.
    ct do.

    "
        repo workingCopy browse
    "
    self should:[(repo @ 2 / 'MockHGP1Bar.st')] raise: HGError

    "Created: / 18-03-2013 / 19:00:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_11d
    "
        Test if commit task detects method removal
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    (Smalltalk at: #MockHGP1Bar) removeSelector: #'qux'.

    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_11b'.
    ct do.

    "
        repo workingCopy browse
    "
    self assert: ((repo @ 2 / 'MockHGP1Bar.st') contents asString includesString:'qux') not

    "Created: / 18-03-2013 / 19:01:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_12a
    "
        Test correct fileout or class with respect to UTF8.
        This checks for issue #8.

    "

    | repo pm ct contents |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    ((Smalltalk at: #MockHGP1Bar) compile:'zork

    ^''Příliš žluťoučký kůň úpěl ďábelské ódy''' classified: 'utf8 methods')
        package: (Smalltalk at: #MockHGP1Bar) package.


    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_12a'.
    ct do.

    "
        repo workingCopy browse
    "
    contents := (repo @ 2 / 'MockHGP1Bar.st') contents.
    self assert: (contents  asString includesString:'"{ Encoding: utf8 }"').
    self assert: (contents  asString includesString:'Příliš žluťoučký kůň úpěl ďábelské ódy') not.

    contents := (repo @ 1 / 'MockHGP1Bar.st') contents.
    self assert: (contents  asString includesString:'"{ Encoding: utf8 }"') not.

    "Created: / 22-03-2013 / 09:44:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_12b
    "
        Test correct fileout of extensions with respect to UTF8.
        This checks for issue #8.
    "

    | repo pm ct contents |

    "Hack for rel 6.2.2 - due to a bug in fileout,
     non-UTF8 characters are not supported.
     Should use 'self skipIf: ... ' but this is not
     supported by 6.2.2's SUnit..."
    (Smalltalk versionString = '6.2.2') ifTrue:[ ^ self ].

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    ((UndefinedObject) compile:'zork
    ^''Příliš žluťoučký kůň úpěl ďábelské ódy''' classified: 'utf8 methods')
    package: #'mocks:hg/p1'.

    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_12b'.
    ct do.

    "
        repo workingCopy browse
    "
    contents := (repo @ 2 / 'extensions.st') contents.
    self assert: (contents  asString includesString:'"{ Encoding: utf8 }"').
    self assert: (contents  asString includesString:'Příliš žluťoučký kůň úpěl ďábelské ódy') not.

    "Created: / 22-03-2013 / 09:46:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:48:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_12c
    "
        Test correct fileout of extensions with respect to UTF8.
        This checks for issue #8.
    "

    | repo pm ct contents |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    ((UndefinedObject) compile:'zork
    ^''XUZ''' classified: 'utf8 methods')
    package: #'mocks:hg/p1'.

    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_12b'.
    ct do.

    "
        repo workingCopy browse
    "
    contents := (repo @ 2 / 'extensions.st') contents.
    self assert: (contents  asString includesString:'"{ Encoding: utf8 }"') not.

    "Created: / 22-03-2013 / 10:13:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_13a
    "
        Test commit without package model.
        This checks for issue #7.
    "

    | repo  wc  ct currentcs |

    repo := self repositoryNamed:'test_repo_01'.
    "
     UserPreferences fileBrowserClass openOn: repo directory.
    "
    wc := repo workingCopy.
     "Modify some file"
    (wc / 'f1.txt') writingFileDo:[:s | s nextPutAll:'modified from test_01a'. ].
    ct := wc commitTask.
    ct do.

    currentcs := wc changeset.
    self assert:currentcs id revno == 5.

    "Created: / 01-04-2013 / 13:04:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_13b
    "
        Test commit without package model of a working copy after merge.
    "
    | repo wc ct |

    repo := self repositoryNamed:'mocks/hg/p3'.
    wc := repo workingCopy.
    wc update: 2.
    wc merge: (repo @ 1).
    (wc root / 'Make.spec') markResolved.
    (wc root / 'abbrev.stc') markResolved.
    (wc root / 'bc.mak') markResolved.
    (wc root / 'mocks_hg_p3.st') markResolved.
    (wc root / 'p3.rc') markResolved.
    (wc root / 'MockHGP3Foo.st') markResolved.

    "
     UserPreferences fileBrowserClass openOn: repo pathName.
    "
    ct := wc commitTask.
    ct do.

    "Created: / 01-04-2013 / 13:23:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 06-11-2014 / 11:27:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_14a
    "
    Test if container is removed if class is removed.
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').

    Smalltalk removeClass: (Smalltalk at: #MockHGP1Bar).

    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_14a'.
    ct do.

    self shouldnt: [ repo @ 1 / 'MockHGP1Bar.st' ] raise: HGError.
    self should:   [ repo @ 2 / 'MockHGP1Bar.st' ] raise: HGError.

    "Created: / 21-05-2013 / 16:24:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_14b
    "
    Test if container is removed if class is removed but not if package
    specifies #hgRemoveContainesForDeletedClasses

    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage: 'mocks:hg/p1').
    (Smalltalk at: #mocks_hg_p1) class compile: 'hgRemoveContainesForDeletedClasses ^false' classified: 'accessing - hg'.

    Smalltalk removeClass: (Smalltalk at: #MockHGP1Bar).
    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_14b'.
    ct do.

    self shouldnt: [ repo @ 1 / 'MockHGP1Bar.st' ] raise: HGError.
    self shouldnt: [ repo @ 2 / 'MockHGP1Bar.st' ] raise: HGError.

    "Created: / 21-05-2013 / 16:47:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_15a
    "
    Test creation of deeply nested packages
        1) load mocks:hg/p2/n2
        2) create class in mocks:hg/p2/n2_2
        3) commit


    "
    | repo pmN22 ctN22 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').

    Object subclass:#MocksHgP2N22Foo
        instanceVariableNames:''
        classVariableNames:''
        poolDictionaries:''
        category:'* Mocks *'.

    (Smalltalk at:#MocksHgP2N22Foo) package: #'mocks:hg/p2/n2/n2_2'.

    pmN22 := HGPackageWorkingCopy named: #'mocks:hg/p2/n2/n2_2'.
    ctN22 := pmN22 commitTask.
    ctN22 message:'test_commit_15a 1'.
    ctN22 do.
    "
    repo workingCopy browse
    "

    "Created: / 10-06-2013 / 23:28:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_15b
    "
    Test creation of deeply nested packages
        1) load mocks:hg/p2/n1/n1_1/n_1_1_1
        2) create class in mocks:hg/p2/n1/n1_1/n_1_1_1
        3) commit


    "
    | repo pmN111 ctN111 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').

    Object subclass:#MocksHgP2N111Foo
        instanceVariableNames:''
        classVariableNames:''
        poolDictionaries:''
        category:'* Mocks *'.

    (Smalltalk at:#MocksHgP2N111Foo) package: #'mocks:hg/p2/n1/n1_1/n_1_1_1'.

    pmN111 := HGPackageWorkingCopy named: #'mocks:hg/p2/n1/n1_1/n_1_1_1'.
    ctN111 := pmN111 commitTask.
    ctN111 message:'test_commit_15b 1'.
    ctN111 do.
    "
    repo workingCopy browse
    "

    "Created: / 11-06-2013 / 00:16:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_17a
    "
    Test class renames.

    Check, that rename is properly recorded in Mercurial history

    "
    | repo pm ct cs copies |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').


    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    "
    repo workingCopy browse
    "

    "/ Rename class...
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bar) to:#MockHGP1Quuz.

    ct := pm commitTask.
    ct message:'test_commit_17a'.
    ct do.

    cs := repo @ 2.
    copies  := cs changes select:[:change | change isCopied ].
    self assert: cs message = 'test_commit_17a'.
    self assert: copies size == 1.
    self assert: copies anElement path = 'MockHGP1Quuz.st'.
    self assert: copies anElement source = 'MockHGP1Bar.st'.

    "Created: / 04-03-2014 / 17:34:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_17b
    "
    Test class multiple renames of one class

    Check, that rename is properly recorded in Mercurial history

    "
    | repo pm ct cs copies |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').


    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    "
    repo workingCopy browse
    "

    "/ Rename class...
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bar) to:#MockHGP1Bazz.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bazz) to:#MockHGP1Buzz.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Buzz) to:#MockHGP1Bun.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bun) to:#MockHGP1Quuz.

    ct := pm commitTask.
    ct message:'test_commit_17b'.
    ct do.

    cs := repo @ 2.
    copies  := cs changes select:[:change | change isCopied ].
    self assert: cs message = 'test_commit_17b'.
    self assert: copies size == 1.
    self assert: copies anElement path = 'MockHGP1Quuz.st'.
    self assert: copies anElement source = 'MockHGP1Bar.st'.

    "Created: / 04-03-2014 / 17:43:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_17c
    "
    Test class circular renames of one class (issue #18)

    Check, that rename is properly recorded in Mercurial history

    "
    | repo pm ct cs copies |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').


    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    "
    repo workingCopy browse
    "

    "/ Rename class...
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bar) to:#MockHGP1Bazz.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bazz) to:#MockHGP1Bar.

    ct := pm commitTask.
    ct message:'test_commit_17c'.
    ct do.

    cs := repo @ 2.
    copies  := cs changes select:[:change | change isCopied ].
    self assert: cs message = 'test_commit_17c'.
    self assert: copies isEmpty.

    "Created: / 04-03-2014 / 17:45:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_17d
    "
    Test circular rename with one more rename at the end.

    Check, that rename is properly recorded in Mercurial history

    "
    | repo pm ct cs copies |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').


    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    "
    repo workingCopy browse
    "

    "/ Rename class...
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bar) to:#MockHGP1Bazz.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bazz) to:#MockHGP1Buzz.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Buzz) to:#MockHGP1Bun.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bun) to:#MockHGP1Bar.  

    ct := pm commitTask.
    ct message:'test_commit_17d'.
    ct do.

    cs := repo @ 2.
    copies  := cs changes select:[:change | change isCopied ].
    self assert: cs message = 'test_commit_17d'.
    self assert: copies isEmpty.

    "Created: / 04-03-2014 / 17:57:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_17e
    "
    Test circular rename with one more rename at the end.

    Check, that rename is properly recorded in Mercurial history

    "
    | repo pm ct cs copies |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').


    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    "
    repo workingCopy browse
    "

    "/ Rename class...
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bar) to:#MockHGP1Bazz.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bazz) to:#MockHGP1Buzz.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Buzz) to:#MockHGP1Bun.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bun) to:#MockHGP1Bar.  
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bar) to:#MockHGP1Quuz.

    ct := pm commitTask.
    ct message:'test_commit_17e'.
    ct do.

    cs := repo @ 2.
    copies  := cs changes select:[:change | change isCopied ].
    self assert: cs message = 'test_commit_17e'.
    self assert: copies size == 1.
    self assert: copies anElement path = 'MockHGP1Quuz.st'.
    self assert: copies anElement source = 'MockHGP1Bar.st'.

    "Created: / 04-03-2014 / 17:59:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_17f
    "
    Test class renames...

    Check, that rename is properly recorded in Mercurial history

    "
    | repo pm ct cs copies |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').


    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    "
    repo workingCopy browse
    "

    "/ Rename class...
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bar) to:#MockHGP1Baz.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Foo) to:#MockHGP1Foz.


    ct := pm commitTask.
    ct message:'test_commit_17f'.
    ct do.

    cs := repo @ 2.
    copies  := cs changes select:[:change | change isCopied ].
    self assert: cs message = 'test_commit_17f'.
    self assert: copies size == 2.

    "Created: / 04-03-2014 / 21:03:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_17g
    "
    Test class renames.

    Check, that rename is properly recorded in Mercurial history

    "
    | repo pm ct cs copies |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').


    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    "
    repo workingCopy browse
    "

    "/ Rename class...
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bar) to:#MockHGP1Quuz.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Foo) to:#MockHGP1Foz.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Foz) to:#MockHGP1Foo.



    ct := pm commitTask.
    ct message:'test_commit_17g'.
    ct do.

    cs := repo @ 2.
    copies  := cs changes select:[:change | change isCopied ].
    self assert: cs message = 'test_commit_17g'.
    self assert: copies size == 1.
    self assert: copies anElement path = 'MockHGP1Quuz.st'.
    self assert: copies anElement source = 'MockHGP1Bar.st'.

    "Created: / 04-03-2014 / 21:06:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_17h
    "
    Test class renames.

    Check, that rename is properly recorded in Mercurial history

    "
    | repo pm ct cs copies |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').


    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    "
    repo workingCopy browse
    pm temporaryWorkingCopy browse
    "

    "/ Rename class...
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bar) to:#MockHGP1Quuz.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Foo) to:#MockHGP1Bar.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bar) to:#MockHGP1Foo.

    ct := pm commitTask.
    ct message:'test_commit_17h'.
    ct do.

    cs := repo @ 2.
    copies  := cs changes select:[:change | change isCopied ].
    self assert: cs message = 'test_commit_17h'.
    self assert: copies size == 1.
    self assert: copies anElement path = 'MockHGP1Quuz.st'.
    self assert: copies anElement source = 'MockHGP1Bar.st'.

    "Created: / 04-03-2014 / 21:08:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_17i
    "
    Test class renames.

    Check, that rename is properly recorded in Mercurial history

    "
    | repo pm ct cs copies |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').


    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    "
    repo workingCopy browse
    "

    "/ Rename class...
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bar) to:#MockHGP1Quuz.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Foo) to:#MockHGP1Bar.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Quuz) to:#MockHGP1Quux.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bar) to:#MockHGP1Ban.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Quux) to:#MockHGP1Bar.
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Ban) to:#MockHGP1Foo.


    ct := pm commitTask.
    ct message:'test_commit_17i'.
    ct do.

    cs := repo @ 2.
    copies  := cs changes select:[:change | change isCopied ].
    self assert: cs message = 'test_commit_17i'.
    self assert: copies isEmpty.

    "Created: / 04-03-2014 / 21:18:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_18a
    "
    Test class rename.

    Check, that rename is properly reflected in build support files
    "
    | repo pm ct cs |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').


    pm := HGPackageWorkingCopy named: #'mocks:hg/p1'.
    "
    repo workingCopy browse
    "

    "/ Rename class...
    Smalltalk renameClass: (Smalltalk at: #MockHGP1Bar) to:#MockHGP1Quuz.

    ct := pm commitTask.
    ct message:'test_commit_18a'.
    ct do.

    cs := repo @ 2.
    self assert: cs message = 'test_commit_18a'.
    self assert: ((cs / 'Make.spec') contents asString includesString: 'MockHGP1Bar') not.
    self assert: ((cs / 'Make.proto') contents asString includesString: 'MockHGP1Bar') not.    
    self assert: ((cs / 'bc.mak') contents asString includesString: 'MockHGP1Bar') not.

    "Created: / 02-04-2014 / 14:30:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_19a
    "
        Simple selective commit
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').
    self dumpRepositoryLog: repo.

    self deny:   ((repo @ 1 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').

    ((Smalltalk at: #MockHGP1Bar) compile:'zork ^ 1' classified:'test') package: (Smalltalk at: #MockHGP1Bar) package.
    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    self assert: ct isCommitingNewHead not.
    ct message:'test_commit_01'.
    ct classes: (Array with: (Smalltalk at: #MockHGP1Bar)).
    ct do.
    self dumpRepositoryLog: repo.

    "
        repo workingCopy browse
    "
    self assert: ((repo @ 2 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').
    self assert: (Smalltalk at:#mocks_hg_p1) hgLogicalRevision revno = 2.

    "Created: / 01-05-2014 / 09:14:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_19b
    "
        Simple selective commit - modify two classes
        but commit only one.
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').
    self dumpRepositoryLog: repo.

    self deny:   ((repo @ 1 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').
    self deny:   ((repo @ 1 / 'MockHGP1Foo.st') contents asString includesString:'zork ^ 1').

    ((Smalltalk at: #MockHGP1Bar) compile:'zork ^ 1' classified:'test') package: (Smalltalk at: #MockHGP1Bar) package.
    ((Smalltalk at: #MockHGP1Foo) compile:'zork ^ 1' classified:'test') package: (Smalltalk at: #MockHGP1Foo) package.
    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    self assert: ct isCommitingNewHead not.
    ct message:'test_commit_01'.
    ct classes: (Array with: (Smalltalk at: #MockHGP1Bar)).
    ct do.
    self dumpRepositoryLog: repo.

    "
        repo workingCopy browse
    "
    self assert: ((repo @ 2 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').
    self assert: ((repo @ 2 / 'MockHGP1Foo.st') contents asString includesString:'zork ^ 1') not.
    self assert: ((repo @ 2) changes size = 1).
    self assert: (Smalltalk at:#mocks_hg_p1) hgLogicalRevision revno = 2.

    "Created: / 01-05-2014 / 09:16:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_20a
    "
    Test, that after a commit, changeset is properly condensed
    so browser would correctly show modified (uncommited) classes.

    This tests standard package commit.
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').
    self dumpRepositoryLog: repo.


    self deny:   ((repo @ 1 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').

    ((Smalltalk at:#MockHGP1Bar) compile:'zork ^ 1' classified:'test') package: (Smalltalk at:#MockHGP1Bar) package.
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MockHGP1Bar)).

    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_20a'.
    ct do.
    "
    repo workingCopy browse
    "
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MockHGP1Bar)) not.

    "Created: / 15-11-2014 / 00:25:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_20b
    "
    Test, that after a commit, changeset is properly condensed
    so browser would correctly show modified (uncommited) classes.

    This tests selective commit (modify two classes, commit only one)
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').
    self dumpRepositoryLog: repo.


    self deny:   ((repo @ 1 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').

    ((Smalltalk at:#MockHGP1Foo) compile:'bark ^ 1' classified:'test') package: (Smalltalk at:#MockHGP1Foo) package.
    ((Smalltalk at:#MockHGP1Bar) compile:'zork ^ 1' classified:'test') package: (Smalltalk at:#MockHGP1Bar) package.
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MockHGP1Foo)).
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MockHGP1Bar)).

    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_20a'.
    ct paths: { (ct temporaryWorkingCopy path / 'MockHGP1Bar.st') pathName } .
    ct do.
    "
    repo workingCopy browse
    "
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MockHGP1Foo)).
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MockHGP1Bar)) not.

    "Created: / 15-11-2014 / 00:26:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 15-11-2014 / 01:41:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_20c
    "
    Test, that after a commit, changeset is properly condensed
    so browser would correctly show modified (uncommited) classes.

    This tests selective commit (modify class & create an extension, commit only class)
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').
    self dumpRepositoryLog: repo.


    self deny:   ((repo @ 1 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').

    ((Smalltalk at:#MockHGP1Bar) compile:'zork ^ 1' classified:'test') package: (Smalltalk at:#MockHGP1Bar) package.
    (Object compile:'bark ^ 1' classified: 'test') package:  (Smalltalk at:#MockHGP1Bar) package.

    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MockHGP1Bar)).
    self assert: (ChangeSet current includesChangeForClass: Object selector: #bark).


    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_20a'.
    ct paths: { (ct temporaryWorkingCopy path / 'MockHGP1Bar.st') pathName }.
    ct do.
    "
    repo workingCopy browse
    "
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MockHGP1Bar)) not.
    self assert: (ChangeSet current includesChangeForClass: Object selector: #bark).

    "Created: / 15-11-2014 / 00:31:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 15-11-2014 / 01:48:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_20d
    "
    Test, that after a commit, changeset is properly condensed
    so browser would correctly show modified (uncommited) classes.

    This tests selective commit (modify class & create an extension, commit only class)
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').
    self dumpRepositoryLog: repo.


    self deny:   ((repo @ 1 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').

    ((Smalltalk at:#MockHGP1Bar) compile:'zork ^ 1' classified:'test') package: (Smalltalk at:#MockHGP1Bar) package.
    (Object compile:'bark ^ 1' classified: 'test') package:  (Smalltalk at:#MockHGP1Bar) package.

    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MockHGP1Bar)).
    self assert: (ChangeSet current includesChangeForClass: Object selector: #bark).


    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_20a'.
    ct paths: { (ct temporaryWorkingCopy path / 'extensions.st') pathName }.
    ct do.
    "
    repo workingCopy browse
    "
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MockHGP1Bar)).
    self assert: (ChangeSet current includesChangeForClass: Object selector: #bark) not.

    "Created: / 15-11-2014 / 00:33:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 15-11-2014 / 01:48:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_21a
    "
    Test, that after a commit, changeset is properly condensed for private classes
    so browser would correctly show modified (uncommited) classes.

    This tests selective commit (modify class & create an extension, commit only class)
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').
    self dumpRepositoryLog: repo.


    self deny:   ((repo @ 1 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').

    ((Smalltalk at:#MockHGP1Bar) compile:'zork ^ 1' classified:'test') package: (Smalltalk at:#MockHGP1Bar) package.
    "/ Create private class
    Object subclass: #Private1
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        privateIn: (Smalltalk at:#MockHGP1Foo).
    "/ Compile message in private class
    ((Smalltalk at:#'MockHGP1Foo::Private1') compile:'bark ^ 2' classified:'test') package: (Smalltalk at:#MockHGP1Bar) package.

    "/ Create nested private class
    Object subclass: #Private2
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        privateIn: (Smalltalk at:#'MockHGP1Foo::Private1').
    "/ Compile message in private class
    ((Smalltalk at:#'MockHGP1Foo::Private1::Private2') compile:'meouw ^ 3' classified:'test') package: (Smalltalk at:#MockHGP1Bar) package.

    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MockHGP1Bar)).
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#'MockHGP1Foo::Private1') selector: #bark).
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#'MockHGP1Foo::Private1::Private2') selector: #meouw).


    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_21a'.
    ct paths: { (ct temporaryWorkingCopy path / 'MockHGP1Foo.st') pathName }.
    ct do.
    "
    repo workingCopy browse
    "
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MockHGP1Bar)).
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#'MockHGP1Foo::Private1') selector: #bark) not.
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#'MockHGP1Foo::Private1::Private2') selector: #meouw) not.

    "Created: / 16-11-2014 / 13:22:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_21b
    "
    Test, that after a commit, changeset is properly condensed for private classes
    so browser would correctly show modified (uncommited) classes.

    This tests selective commit (modify class & create an extension, commit only class)
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').
    self dumpRepositoryLog: repo.


    self deny:   ((repo @ 1 / 'MockHGP1Bar.st') contents asString includesString:'zork ^ 1').

    ((Smalltalk at:#MockHGP1Bar) compile:'zork ^ 1' classified:'test') package: (Smalltalk at:#MockHGP1Bar) package.
    "/ Create private class
    Object subclass: #Private1
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        privateIn: (Smalltalk at:#MockHGP1Foo).
    "/ Compile message in private class
    ((Smalltalk at:#'MockHGP1Foo::Private1') compile:'bark ^ 2' classified:'test') package: (Smalltalk at:#MockHGP1Bar) package.

    "/ Create nested private class
    Object subclass: #Private2
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        privateIn: (Smalltalk at:#'MockHGP1Foo::Private1').
    "/ Compile message in private class
    ((Smalltalk at:#'MockHGP1Foo::Private1::Private2') compile:'meouw ^ 3' classified:'test') package: (Smalltalk at:#MockHGP1Bar) package.

    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MockHGP1Bar)).
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#'MockHGP1Foo::Private1') selector: #bark).
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#'MockHGP1Foo::Private1::Private2') selector: #meouw).


    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    ct message:'test_commit_21b'.
    ct do.
    "
    repo workingCopy browse
    "
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MockHGP1Bar)) not.
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#'MockHGP1Foo::Private1') selector: #bark) not.
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#'MockHGP1Foo::Private1::Private2') selector: #meouw) not.

    "Created: / 16-11-2014 / 13:27:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_22a
    "
    Tests custom build files generation.
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').
    self dumpRepositoryLog: repo.

    (Smalltalk at: #'mocks_hg_p1') class 
        compile:'generateCustomFileA <file: ''CustomA.txt'' overwrite: true> ^ ''Custom A'''
        classified: 'custom build files'.

    (Smalltalk at: #'mocks_hg_p1') class 
        compile:'generateCustomFileB <file: ''CustomB.txt'' overwrite: false> ^ ''Custom B'''
        classified: 'custom build files'.

    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    self assert: ct isCommitingNewHead not.
    ct message:'test_commit_22a 1'.
    ct do.
    self dumpRepositoryLog: repo.

    "
        repo workingCopy browse
    "

    self assert: ((repo @ 2 / 'CustomA.txt') contents asString includesString:'Custom A').
    self assert: ((repo @ 2 / 'CustomB.txt') contents asString includesString:'Custom B').

    "Now change the contents of generated files, commit agains
     and check that CustomA.txt changed while CustomB.not not"

    (Smalltalk at: #'mocks_hg_p1') class 
        compile:'generateCustomFileA <file: ''CustomA.txt'' overwrite: true> ^ ''Changed A'''
        classified: 'custom build files'.

    (Smalltalk at: #'mocks_hg_p1') class 
        compile:'generateCustomFileB <file: ''CustomB.txt'' overwrite: false> ^ ''Changed B'''
        classified: 'custom build files'.

    ct := pm commitTask.
    self assert: ct isCommitingNewHead not.
    ct message:'test_commit_22a 2'.
    ct do.
    self dumpRepositoryLog: repo.
    "
    (Smalltalk at: #'mocks_hg_p1') generateFile: 'CustomA.txt'
    (Smalltalk at: #'mocks_hg_p1') generateFile: 'CustomB.txt'  
    "
    self assert: ((repo @ 3 / 'CustomA.txt') contents asString includesString:'Custom A') not.
    self assert: ((repo @ 3 / 'CustomA.txt') contents asString includesString:'Changed A').
    self assert: ((repo @ 3 / 'CustomB.txt') contents asString includesString:'Custom B').

    "Created: / 16-11-2014 / 23:48:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified (format): / 19-01-2015 / 22:27:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_22b
    "
    Tests custom build files generation.
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').
    self dumpRepositoryLog: repo.

    (Smalltalk at: #'mocks_hg_p1') class 
        compile:'generateCustomFileA <file: ''CustomA.txt'' overwrite: true> ^ nil'
        classified: 'custom build files'.


    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    self assert: ct isCommitingNewHead not.
    ct message:'test_commit_22b 1'.
    ct do.
    self dumpRepositoryLog: repo.

    "
        repo workingCopy browse
    "
    self should:[ (repo @ 2 / 'CustomA.txt') ] raise: HGError. "/ no such child

    "Created: / 19-01-2015 / 22:32:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_23a
    "
    Tests creation of initial .hgignore
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').
    self dumpRepositoryLog: repo.

    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    ct := pm commitTask.
    self assert: ct isCommitingNewHead not.
    ct message:'test_commit_23a 1'.
    ct do.
    self dumpRepositoryLog: repo.

    "
        repo workingCopy browse
    "
    self assert: (repo @ 2 / '.hgignore') notNil.

    "Created: / 20-01-2015 / 08:01:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_26a
    "
    Test commit to a fresh repository
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/pfresh' init: true.

    Object subclass: #MockHGPFreshFoo
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        category: '* Mocks *'.

    (Smalltalk at: #MockHGPFreshFoo) package: #'mocks/hg/pfresh'.

    pm := HGPackageWorkingCopy named: 'mocks/hg/pfresh'.
    ct := pm commitTask.
    self assert: ct isCommitingNewHead not.
    ct message:'test_commit_26a'.
    ct do.
    self dumpRepositoryLog: repo.

    "
        repo workingCopy browse
    "
    self assert: (repo @ 0 / 'MockHGPFreshFoo.st') notNil.
    self assert: (repo @ 0 / 'mocks_hg_pfresh.st') notNil.
    self assert: (repo @ 0 / 'Make.proto') notNil.
    self assert: ((Smalltalk at: #'mocks_hg_pfresh') classNames includes: #MockHGPFreshFoo)

    "Created: / 11-06-2015 / 06:26:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_26b
    "
    Test selective commit to a fresh repository
    "

    | repo pm ct |

    repo := self repositoryNamed: 'mocks/hg/pfresh' init: true.

    Object subclass: #MockHGPFreshFoo
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        category: '* Mocks *'.

    (Smalltalk at: #MockHGPFreshFoo) package: #'mocks/hg/pfresh'.

    pm := HGPackageWorkingCopy named: 'mocks/hg/pfresh'.
    ct := pm commitTask.
    self assert: ct isCommitingNewHead not.
    ct message:'test_commit_26b'.
    ct classes: (Array with: (Smalltalk at: #MockHGPFreshFoo)).                      
    ct do.
    self dumpRepositoryLog: repo.

    "
        repo workingCopy browse
    "
    self assert: (repo @ 0 / 'MockHGPFreshFoo.st') notNil.
    self assert: (repo @ 0 / 'mocks_hg_pfresh.st') notNil.
    self assert: (repo @ 0 / 'Make.proto') notNil.
    self assert: ((Smalltalk at: #'mocks_hg_pfresh') classNames includes: #MockHGPFreshFoo)

    "Created: / 11-06-2015 / 06:29:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGStXTests methodsFor:'tests - commit - java'!

test_commit_16a
    "
    Test correct fileout if Java extensions
    "

    | repo pmN111 ctN111 java_lang_String changeset |

    "/ Hack for rel 6.2.2 - should use 'self skipIf: ... '
    "/ but this is not supported by 6.2.2's SUnit..."
    (Smalltalk versionString = '6.2.2') ifTrue:[ ^ self ].

    repo := self repositoryNamed: 'mocks/hg/p5'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p5').

    "/ Do skipIf after package is loaded!!!!!! otherwise the
    "/ Java extension is not loaded!!

    self skipIf: self stxlibjavaAvailable not description: 'STX:LIBJAVA not available'.

    java_lang_String := Java classForName: 'java.lang.String'.
    (Compiler compile:'test_commit_16a ^ #foo'  forClass: java_lang_String)
        package:#'mocks:hg/p5'.
    self assert: (java_lang_String methodDictionary includesKey:#test_commit_16a).

    pmN111 := HGPackageWorkingCopy named: #'mocks:hg/p5'.
    ctN111 := pmN111 commitTask.
    ctN111 message:'test_commit_16a '.
    ctN111 do.
    "
    repo workingCopy browse
    "
    changeset := repo @ 2.

    self assert: (changeset changes contains:[:change | change isAdded ]).
    self deny: (changeset changes contains:[:change | change isRemoved ]).

    self assert: (changeset / 'java' / 'extensions' / 'java' / 'lang' / 'String.st' ) notNil.

    "Created: / 29-11-2013 / 16:25:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_16b
    "
    Test covering issue #26: Java extension files are removed.

    Check, that if the particular class is not loaded in the system,
    extension file is kept intact.
    "

    | repo pmN111 ctN111 changeset |

    "/ Hack for rel 6.2.2 - should use 'self skipIf: ... '
    "/ but this is not supported by 6.2.2's SUnit..."
    (Smalltalk versionString = '6.2.2') ifTrue:[ ^ self ].


    repo := self repositoryNamed: 'mocks/hg/p5'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p5').

    "/ Do skipIf after package is loaded!!!!!! otherwise the
    "/ Java extension is not loaded!!
    self skipIf: self stxlibjavaAvailable not description: 'STX:LIBJAVA not available'.

    "/ Flush Java to make sure java.lang.Object is not loaded.
    (Smalltalk at:#Java) flushAllJavaResources.


    pmN111 := HGPackageWorkingCopy named: #'mocks:hg/p5'.
    ctN111 := pmN111 commitTask.
    ctN111 message:'test_commit_16a '.
    ctN111 do.
    "
    repo workingCopy browse
    "
    changeset := repo @ 2.

    self deny: (changeset changes select:[:change | change isAdded ]) size == 1. "/.hgignore.
    self deny: (changeset changes contains:[:change | change isRemoved ]).

    self assert: (changeset / 'java' / 'extensions' / 'java' / 'lang' / 'Object.st' ) notNil.

    "Created: / 29-11-2013 / 17:34:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 20-01-2015 / 11:38:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_java_01a
    "
    Test commit of Java classes
    "

    | repo classes pm ct changeset |

    "/ Hack for rel 6.2.2 - should use 'self skipIf: ... '
    "/ but this is not supported by 6.2.2's SUnit..."
    (Smalltalk versionString = '6.2.2') ifTrue:[ ^ self ].

    repo := self repositoryNamed: 'mocks/hg/p5'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p5').

    "/ Do skipIf after package is loaded!!!!!! otherwise the
    "/ Java extension is not loaded!!

    self skipIf: (self stxlibjavaAvailableRequireReboot: false) not description: 'STX:LIBJAVA not available'.

    classes := JavaCompiler compile:'
package mocks.hg.p5;

@stx.libjava.annotation.Package("mocks:hg/p5")
class Foo {
}
'.
    JavaVM registry registerClasses: classes andWait: true.
    

    pm := HGPackageWorkingCopy named: #'mocks:hg/p5'.
    ct := pm commitTask.
    ct message: testSelector.
    ct do.
    "
    repo workingCopy browse
    "
    changeset := repo @ 2.

    "/ Four files shall be added:
    "/ Foo.java
    "/ build.xml
    "/ build.auto.xml
    "/ .hgignore
    self assert: (changeset changes select:[:change | change isAdded ]) size == 4.


    self assert: (changeset / 'java' / 'src' / 'mocks' / 'hg' / 'p5' / 'Foo.java' ) notNil.

    "Created: / 04-08-2014 / 01:42:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified (format): / 20-01-2015 / 11:36:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_java_01b
    "
    Test commit of Java class with nested class
    "

    | repo classes pm ct changeset |

    "/ Hack for rel 6.2.2 - should use 'self skipIf: ... '
    "/ but this is not supported by 6.2.2's SUnit..."
    (Smalltalk versionString = '6.2.2') ifTrue:[ ^ self ].

    repo := self repositoryNamed: 'mocks/hg/p5'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p5').

    "/ Do skipIf after package is loaded!!!!!! otherwise the
    "/ Java extension is not loaded!!

    self skipIf: (self stxlibjavaAvailableRequireReboot: false) not description: 'STX:LIBJAVA not available'.

    classes := JavaCompiler compile:'
package mocks.hg.p5;

@stx.libjava.annotation.Package("mocks:hg/p5")
public class Foo {
    public static class Bar {
        public Object foo() {
            return new Object() { public int bar() { return 10; } };
        }

    }
}
'.
    JavaVM registry registerClasses: classes andWait: true.
    

    pm := HGPackageWorkingCopy named: #'mocks:hg/p5'.
    ct := pm commitTask.
    ct message: testSelector.
    ct do.
    "
    repo workingCopy browse
    "
    changeset := repo @ 2.

    "/ Four files shall be added:
    "/ Foo.java
    "/ build.xml
    "/ build.auto.xml
    "/ .hgignore      
    self assert: (changeset changes select:[:change | change isAdded ]) size == 4.

    self assert: (changeset / 'java' / 'src' / 'mocks' / 'hg' / 'p5' / 'Foo.java' ) notNil.

    "Created: / 04-08-2014 / 01:43:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 20-01-2015 / 11:36:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_java_01c
    "
    Test selective commit of Java class into fresh, non-java package   
    "

    | repo classes pm ct changeset |

    "/ Hack for rel 6.2.2 - should use 'self skipIf: ... '
    "/ but this is not supported by 6.2.2's SUnit..."
    (Smalltalk versionString = '6.2.2') ifTrue:[ ^ self ].

    repo := self repositoryNamed: 'mocks/hg/pfresh' init: true.

    "/ Do skipIf after package is loaded!!!!!! otherwise the
    "/ Java extension is not loaded!!

    self skipIf: (self stxlibjavaAvailableRequireReboot: false) not description: 'STX:LIBJAVA not available'.

    Object subclass: #MockHGPFreshFoo
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        category: '* Mocks *'.  
    (Smalltalk at: #MockHGPFreshFoo) package: #'mocks:hg/pfresh'.

    pm := HGPackageWorkingCopy named: #'mocks:hg/pfresh'.    
    ct := pm commitTask.
    ct message: testSelector.
    ct do.

    "/ Check that there's no #javaBundle (yet)
    self assert: ((Smalltalk at:#'mocks_hg_pfresh') class methodDictionary includesKey: #javaBundle) not.

    classes := JavaCompiler compile:'
package mocks.hg.pfresh;

@stx.libjava.annotation.Package("mocks:hg/pfresh")
class Foo {
}
'.
    JavaVM registry registerClasses: classes andWait: true.
    


    ct := pm commitTask.
    ct message: testSelector.
    ct classes: classes.
    ct do.
    "
    repo workingCopy browse
    ct temporaryWorkingCopy browse
    "
    changeset := repo @ 1.

    "/ Three files shall be added:
    "/ Foo.java
    "/ build.xml
    "/ build.auto.xml
    self assert: (changeset changes select:[:change | change isAdded ]) size == 3.
    self assert: (changeset / 'java' / 'src' / 'mocks' / 'hg' / 'pfresh' / 'Foo.java' ) notNil.

    "/ Check that #javaBundle has been generated
    self assert: ((Smalltalk at:#'mocks_hg_pfresh') class methodDictionary includesKey: #javaBundle)

    "Created: / 11-06-2015 / 08:01:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 11-06-2015 / 19:41:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified (comment): / 11-06-2015 / 22:05:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_java_01d
    "
    Test commit of Java class into fresh, non-java package
    "

    | repo classes pm ct changeset |

    "/ Hack for rel 6.2.2 - should use 'self skipIf: ... '
    "/ but this is not supported by 6.2.2's SUnit..."
    (Smalltalk versionString = '6.2.2') ifTrue:[ ^ self ].

    repo := self repositoryNamed: 'mocks/hg/pfresh' init: true.

    "/ Do skipIf after package is loaded!!!!!! otherwise the
    "/ Java extension is not loaded!!

    self skipIf: (self stxlibjavaAvailableRequireReboot: false) not description: 'STX:LIBJAVA not available'.

    Object subclass: #MockHGPFreshFoo
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        category: '* Mocks *'.  
    (Smalltalk at: #MockHGPFreshFoo) package: #'mocks:hg/pfresh'.

    pm := HGPackageWorkingCopy named: #'mocks:hg/pfresh'.    
    ct := pm commitTask.
    ct message: testSelector.
    ct do.

    "/ Check that there's no #javaBundle (yet)
    self assert: ((Smalltalk at:#'mocks_hg_pfresh') class methodDictionary includesKey: #javaBundle) not.

    classes := JavaCompiler compile:'
package mocks.hg.pfresh;

@stx.libjava.annotation.Package("mocks:hg/pfresh")
class Foo {
}
'.
    JavaVM registry registerClasses: classes andWait: true.
    


    ct := pm commitTask.
    ct message: testSelector.
    ct do.
    "
    repo workingCopy browse
    ct temporaryWorkingCopy browse
    "
    changeset := repo @ 1.

    "/ Three files shall be added:
    "/ Foo.java
    "/ build.xml
    "/ build.auto.xml
    self assert: (changeset changes select:[:change | change isAdded ]) size == 3.
    self assert: (changeset / 'java' / 'src' / 'mocks' / 'hg' / 'pfresh' / 'Foo.java' ) notNil.

    "/ Check that #javaBundle has been generated
    self assert: ((Smalltalk at:#'mocks_hg_pfresh') class methodDictionary includesKey: #javaBundle)

    "Created: / 11-06-2015 / 21:26:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGStXTests methodsFor:'tests - commit - nested'!

test_commit_nested_01a
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify & commit p1
    3) check that n1 & n2 has same logical revision as p1.
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2N1 revision = pmP2N2 revision.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2Foo) package.

    ctP2 := pmP2 commitTask.
    ctP2 message:'test_commit_nested_01a 1'.
    ctP2 do.

    self assert: pmP2 revision = pmP2N1  revision.
    self assert: pmP2 revision = pmP2N2   revision.

    "
    repo workingCopy browse
    "

    "Created: / 18-02-2014 / 20:32:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_01b
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify & commit n1
    3) check that p1 & n2 has same logical revision as n1.
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2N1 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2N1 revision = pmP2N2 revision.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2N1Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.

    ctP2N1 := pmP2N1 commitTask.
    ctP2N1 message:'test_commit_nested_01b 1'.
    ctP2N1 do.

    self assert: pmP2 revision = pmP2N1 revision.
    self assert: pmP2 revision = pmP2N2 revision.

    "
    repo workingCopy browse
    "

    "Created: / 18-02-2014 / 20:35:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_01c
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify & commit n2
    3) check that p1 & n1 has same logical revision as n2.
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2N2 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2N1 revision = pmP2N2 revision.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2N2Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N2Foo) package.

    ctP2N2 := pmP2N2 commitTask.
    ctP2N2 message:'test_commit_nested_01c 1'.
    ctP2N2 do.

    self assert: pmP2 revision = pmP2N1 revision.
    self assert: pmP2 revision = pmP2N2 revision.

    "
    repo workingCopy browse
    "

    "Created: / 18-02-2014 / 20:36:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_02a
    "
    Two packages in single repository but without 'parent' package.
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load both (they should be of same revision)
    2) modify & commit n1
    3) check that n2 has same logical revision as n1.
    "

    | repo pmN1 pmN2 ctN1 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmN1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmN2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmN1 revision = pmN2 revision.

    "=== A modifies & commits =============================== "
    (MocksHgP2N1Foo compile:'zork ^ 2' classified:'test') package: MocksHgP2N1Foo package.

    ctN1 := pmN1 commitTask.
    ctN1 message:'test_commit_nested_02a 1'.
    ctN1 do.

    self assert: pmN1 revision = pmN2 revision.

    "
    repo workingCopy browse
    "

    "Created: / 18-02-2014 / 20:37:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:47:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_03a
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify & commit p1 & n1
    3) check that n1 & n2 has same logical revision as p1.
       check that n1 has been commited too.
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2N1 revision = pmP2N2 revision.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2Foo) package.
    ((Smalltalk at: #MocksHgP2N1Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.

    ctP2 := pmP2 commitTask.
    ctP2 message:'test_commit_nested_01a 1'.
    ctP2 do.

    self assert: pmP2 revision = pmP2N1  revision.
    self assert: pmP2 revision = pmP2N2   revision.
    self assert: ((repo @ 4 / 'MocksHgP2Foo.st') contents asString includesString:'zork ^ 2').
    self assert: ((repo @ 4 / 'n1' / 'MocksHgP2N1Foo.st') contents asString includesString:'zork ^ 2').

    "
    repo workingCopy browse
    "

    "Created: / 18-02-2014 / 20:57:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:46:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_03b
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify p1 & n1, commit n1
    3) check that commit task warn about parent package
       being changed and in need to be commited too...
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2N1 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2N1 revision = pmP2N2 revision.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2Foo) package.
    ((Smalltalk at: #MocksHgP2N1Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.

    ctP2N1 := pmP2N1 commitTask.
    ctP2N1 message:'test_commit_nested_03b 1'.

    self assert: ctP2N1 isCommitingAllChangedPackages not.

    ctP2N1 do.

    self assert: pmP2 revision = pmP2N1  revision.
    self assert: pmP2 revision = pmP2N2   revision.
    self assert: ((repo @ 4 / 'MocksHgP2Foo.st') contents asString includesString:'zork ^ 2') not.
    self assert: ((repo @ 4 / 'n1' / 'MocksHgP2N1Foo.st') contents asString includesString:'zork ^ 2').

    "
    repo workingCopy browse
    "

    "Created: / 18-02-2014 / 21:38:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:46:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_04a
    "
    Nested packages
      mocks:hg/p2      @ 3
      mocks:hg/p2/n1   @ 3
      mocks:hg/p2/n2   @ 2

    1) load all of them
    2) modify & commit p1
    3) check that n1 has same logical revision as p1
       but NOT n2
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').

    "/ Force n2 to think it comes from rev 2...
    ((Smalltalk at: #'mocks_hg_p2_n2') class compiledMethodAt: #version_HG) 
        annotateWith: (HGRevisionAnnotation revision: (repo @ 2) id).



    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2 revision = pmP2N1 revision.
    self assert: pmP2N2 revision = '84a2ca31f8d9' asHGChangesetId.         

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2Foo) package.

    ctP2 := pmP2 commitTask.
    ctP2 message:'test_commit_nested_01a 1'.
    ctP2 do.

    self assert: pmP2 revision = pmP2N1 revision.
    self assert: pmP2N2 revision = '84a2ca31f8d9' asHGChangesetId.          

    "
    repo workingCopy browse
    "

    "Created: / 18-02-2014 / 21:10:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:46:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_04b
    "
    Nested packages
      mocks:hg/p2      @ 3
      mocks:hg/p2/n1   @ 3
      mocks:hg/p2/n2   @ 2

    1) load all of them
    2) modify & commit n1
    3) check that n1 has same logical revision as p1
       but NOT n2
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2N1 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').

    "/ Force n2 to think it comes from rev 2...
    ((Smalltalk at: #'mocks_hg_p2_n2') class compiledMethodAt: #version_HG) 
        annotateWith: (HGRevisionAnnotation revision: (repo @ 2) id).



    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2 revision = pmP2N1 revision.
    self assert: pmP2N2 revision ='84a2ca31f8d9' asHGChangesetId.     

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2Foo) package.

    ctP2N1 := pmP2N1 commitTask.
    ctP2N1 message:'test_commit_nested_04b 1'.
    ctP2N1 do.

    self assert: pmP2 revision = pmP2N1 revision.
    self assert: pmP2N2 revision = '84a2ca31f8d9' asHGChangesetId.          

    "
    repo workingCopy browse
    "

    "Created: / 18-02-2014 / 21:11:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:46:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_04c
    "
    Nested packages
      mocks:hg/p2      @ 3
      mocks:hg/p2/n1   @ 3
      mocks:hg/p2/n2   @ 2

    1) load all of them
    2) modify & commit n2
    3) check that n1 has same logical revision as p1
       but NOT n2
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2N2 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').

    "/ Force n2 to think it comes from rev 2...
    ((Smalltalk at: #'mocks_hg_p2_n2') class compiledMethodAt: #version_HG) 
        annotateWith: (HGRevisionAnnotation revision: (repo @ 2) id).



    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2 revision = pmP2N1 revision.
    self assert: pmP2N2 revision = '84a2ca31f8d9' asHGChangesetId.  

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2Foo) package.

    ctP2N2 := pmP2N2 commitTask.
    ctP2N2 message:'test_commit_nested_04c 1'.
    ctP2N2 do.

    self assert: pmP2 revision = pmP2N1 revision.
    self assert: pmP2 revision = '9e9134b80dfa' asHGChangesetId.  
    self assert: pmP2N2 revision revno == 4.  

    "
    repo workingCopy browse
    "

    "Created: / 18-02-2014 / 21:12:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:46:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_05a
    "
    Nested packages
      mocks:hg/p2/n1   @ 3
      mocks:hg/p2/n2   @ 3

    1) load both of them
    2) modify n1 & commit p2
    3) check that p2 has same logical revision as n1 and n2
       check that no mocks_hg_p2 project definition is created
       and commited (in this situation p2 is a virtual package)
    "

    | repo pmP2 pmP2N1 pmP2N2 ct |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').

    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2 isVirtual.
    self assert: pmP2N1 isVirtual not.
    self assert: pmP2N2 isVirtual not.
    self assert: pmP2 revision = pmP2N1 revision.
    self assert: pmP2 revision = pmP2N2 revision.
    "/ Package mocks:hg/p2 is NOT loaded
    self assert: (Smalltalk at:#'mocks_hg_p2') isNil.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2N1Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.

    ct := pmP2 commitTask.
    ct message:'test_commit_nested_05a 1'.
    ct do.

    self assert: pmP2 revision = pmP2N1 revision.
    self assert: pmP2 revision = pmP2N2 revision.

    self assert: pmP2 revision revno == 4.  
    "/ Package mocks:hg/p2 is NOT loaded
    self assert: (Smalltalk at:#'mocks_hg_p2') isNil

    "
    repo workingCopy browse
    "

    "Created: / 26-02-2014 / 22:56:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:46:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_05b
    "
    Nested packages
      mocks:hg/p2/n1   @ 3
      mocks:hg/p2/n2   @ 3

    1) load both of them
    2) modify n1 & commit n1 + n2
    3) check that n1 has same logical revision as n2
       check that no mocks_hg_p2 project definition is created
       and commited (in this situation p2 is a virtual package)
    "

    | repo pmP2N1 pmP2N2 ct |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').

    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.

    self assert: pmP2N1 isVirtual not.
    self assert: pmP2N2 isVirtual not.
    self assert: pmP2N1 revision = pmP2N2 revision.



    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2N1Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.

    ct := (pmP2N1 , pmP2N2) commitTask.
    ct message:'test_commit_nested_05b 1'.
    ct do.

    self assert: pmP2N1 revision = pmP2N2  revision.
    self assert: pmP2N1 revision revno == 4.  
    self assert: (Smalltalk at:#'mocks_hg_p2') isNil

    "
    repo workingCopy browse
    "

    "Created: / 26-02-2014 / 22:56:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:46:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_06a_1
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify MocksHgP2Foo & (selectively) commit MocksHgP2Foo
    3) check that n1 & n2 has same logical revision as p1.
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 cs |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2N1 revision = pmP2N2 revision.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2Foo) package.

    ctP2 := pmP2 commitTask.
    ctP2 classes: (Array with: (Smalltalk at: #MocksHgP2Foo)).
    ctP2 message:'test_commit_nested_06a 1'.
    ctP2 do.

    self assert: pmP2 revision = pmP2N1  revision.
    self assert: pmP2 revision = pmP2N2  revision.

    cs := repo @ 4.
    self assert: cs changes size == 1.
    self assert: cs changes anElement path = 'MocksHgP2Foo.st'.
    


    "
    repo workingCopy browse
    "

    "Created: / 01-05-2014 / 00:07:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_06a_2
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify MocksHgP2Foo & (selectively) commit MocksHgP2Foo
    3) check that n1 & n2 has same logical revision as p1.
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 cs |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2N1 revision = pmP2N2 revision.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2Foo) package.
    ((Smalltalk at: #mocks_hg_p2) compile:'qux ^ 2' classified:'test') package: (Smalltalk at: #mocks_hg_p2) package.

    ctP2 := pmP2 commitTask.
    ctP2 classes: (Array with: (Smalltalk at: #MocksHgP2Foo)).
    ctP2 message:'test_commit_nested_06a 1'.
    ctP2 do.

    self assert: pmP2 revision = pmP2N1  revision.
    self assert: pmP2 revision = pmP2N2  revision.

    cs := repo @ 4.
    self assert: cs changes size == 1.
    self assert: cs changes anElement path = 'MocksHgP2Foo.st'.
    


    "
    repo workingCopy browse
    "

    "Created: / 01-05-2014 / 00:10:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 01-05-2014 / 10:02:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_06b_1
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify MocksHgP2Foo & (selectively) commit MocksHgP2Foo
    3) check that n1 & n2 has same logical revision as p1.
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 cs |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2N1 revision = pmP2N2 revision.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2N1Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.

    ctP2 := pmP2 commitTask.
    ctP2 classes: (Array with: (Smalltalk at: #MocksHgP2N1Foo)).
    ctP2 message:'test_commit_nested_06a 1'.
    ctP2 do.

    self assert: pmP2 revision = pmP2N1  revision.
    self assert: pmP2 revision = pmP2N2  revision.

    cs := repo @ 4.
    self assert: cs changes size == 1.
    self assert: cs changes anElement path = 'n1/MocksHgP2N1Foo.st'.
    


    "
    repo workingCopy browse
    "

    "Created: / 01-05-2014 / 09:21:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_06b_2
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify MocksHgP2Foo & (selectively) commit MocksHgP2Foo
    3) check that n1 & n2 has same logical revision as p1.
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 cs |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2N1 revision = pmP2N2 revision.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2N1Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.
    ((Smalltalk at: #mocks_hg_p2) compile:'qux ^ 2' classified:'test') package: (Smalltalk at: #mocks_hg_p2) package.

    ctP2 := pmP2 commitTask.
    ctP2 classes: (Array with: (Smalltalk at: #MocksHgP2N1Foo)).
    ctP2 message:'test_commit_nested_06a 1'.
    ctP2 do.

    self assert: pmP2 revision = pmP2N1  revision.
    self assert: pmP2 revision = pmP2N2  revision.

    cs := repo @ 4.
    self assert: cs changes size == 1.
    self assert: cs changes anElement path = 'n1/MocksHgP2N1Foo.st'.
    


    "
    repo workingCopy browse
    "

    "Created: / 01-05-2014 / 09:21:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_06b_3
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify MocksHgP2Foo & (selectively) commit MocksHgP2Foo
    3) check that n1 & n2 has same logical revision as p1.
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 cs |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2N1 revision = pmP2N2 revision.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2N1Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.
    ((Smalltalk at: #mocks_hg_p2_n1) compile:'qux ^ 2' classified:'test') package: (Smalltalk at: #mocks_hg_p2_n1) package.

    ctP2 := pmP2 commitTask.
    ctP2 classes: (Array with: (Smalltalk at: #MocksHgP2N1Foo)).
    ctP2 message:'test_commit_nested_06a 1'.
    ctP2 do.

    self assert: pmP2 revision = pmP2N1  revision.
    self assert: pmP2 revision = pmP2N2  revision.

    cs := repo @ 4.
    self assert: cs changes size == 1.
    self assert: cs changes anElement path = 'n1/MocksHgP2N1Foo.st'.
    


    "
    repo workingCopy browse
    "

    "Created: / 01-05-2014 / 09:22:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_06b_4
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify MocksHgP2Foo & (selectively) commit MocksHgP2Foo
    3) check that n1 & n2 has same logical revision as p1.
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 cs |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2N1 revision = pmP2N2 revision.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2N1Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.
    ((Smalltalk at: #MocksHgP2N2Foo) compile:'qux ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N2Foo) package.

    ctP2 := pmP2 commitTask.
    ctP2 classes: (Array with: (Smalltalk at: #MocksHgP2N1Foo)).
    ctP2 message:'test_commit_nested_06a 1'.
    ctP2 do.

    self assert: pmP2 revision = pmP2N1  revision.
    self assert: pmP2 revision = pmP2N2  revision.

    cs := repo @ 4.
    self assert: cs changes size == 1.
    self assert: cs changes anElement path = 'n1/MocksHgP2N1Foo.st'.
    


    "
    repo workingCopy browse
    "

    "Created: / 01-05-2014 / 09:23:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_06c_1
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify MocksHgP2Foo & (selectively) commit MocksHgP2Foo
    3) check that n1 & n2 has same logical revision as p1.
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 cs |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2N1 revision = pmP2N2 revision.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2N1Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.
    ((Smalltalk at: #MocksHgP2N2Foo) compile:'qux ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N2Foo) package.

    ctP2 := pmP2 commitTask.
    ctP2 classes: (Array with: (Smalltalk at: #MocksHgP2N1Foo) with: (Smalltalk at: #MocksHgP2N2Foo)).
    ctP2 message:'test_commit_nested_06a 1'.
    ctP2 do.

    self assert: pmP2 revision = pmP2N1  revision.
    self assert: pmP2 revision = pmP2N2  revision.

    cs := repo @ 4.
    self assert: cs changes size == 2.
    self assert: (cs changes contains: [:e| e path = 'n1/MocksHgP2N1Foo.st' ]).
    self assert: (cs changes contains: [:e| e path = 'n2/MocksHgP2N2Foo.st' ]).
    


    "
    repo workingCopy browse
    "

    "Created: / 01-05-2014 / 09:25:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_06c_2
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify MocksHgP2N1Foo, MocksHgP2N1Foo & (selectively) commit MocksHgP2N1Foo and MocksHgP2N1Foo
    3) check that n1 & n2 has same logical revision as p1.
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 cs |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.
    self assert: pmP2N1 revision = pmP2N2 revision.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2N1Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.
    ((Smalltalk at: #MocksHgP2N2Foo) compile:'qux ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N2Foo) package.

    ctP2 := (pmP2N1 , pmP2N2) commitTask.
    ctP2 classes: (Array with: (Smalltalk at: #MocksHgP2N1Foo) with: (Smalltalk at: #MocksHgP2N2Foo)).
    ctP2 message:'test_commit_nested_06a 1'.
    ctP2 do.

    self assert: pmP2 revision = pmP2N1  revision.
    self assert: pmP2 revision = pmP2N2  revision.

    cs := repo @ 4.
    self assert: cs changes size == 2.
    self assert: (cs changes contains: [:e| e path = 'n1/MocksHgP2N1Foo.st' ]).
    self assert: (cs changes contains: [:e| e path = 'n2/MocksHgP2N2Foo.st' ]).
    


    "
    repo workingCopy browse
    "

    "Created: / 01-05-2014 / 09:25:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_07a
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify & commit p2 & p2/n1, commit both 
    3) check that current ChangeSet has no changes for commited classes
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2Foo) package.
    ((Smalltalk at: #Object) compile:'bark ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.

    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2Foo)).     
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#Object) selector: #bark).     

    ctP2 := pmP2 commitTask.
    ctP2 message:'test_commit_nested_07a 1'.
    ctP2 paths:{
        (ctP2 temporaryWorkingCopy path / 'MocksHgP2Foo.st') pathName.
        (ctP2 temporaryWorkingCopy path / 'n1' / 'extensions.st') pathName.
    }.
    ctP2 do.

    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2Foo)) not.     
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2N1Foo)) not.     
    "
    repo workingCopy browse
    "

    "Created: / 16-11-2014 / 07:24:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 16-11-2014 / 08:45:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_07b
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify & commit p2 & p2/n1, commit only p1
    3) check that current ChangeSet has no changes for commited classes
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2Foo) package.
    ((Smalltalk at: #MocksHgP2N1Foo) compile:'bark ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.

    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2Foo)).     
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2N1Foo)).     

    ctP2 := pmP2 commitTask.
    ctP2 message:'test_commit_nested_07a 1'.
    ctP2 paths:{
        (ctP2 temporaryWorkingCopy path / 'MocksHgP2Foo.st') pathName.
    }.
    ctP2 do.

    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2Foo)) not.     
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2N1Foo)).     
    "
    repo workingCopy browse
    "

    "Created: / 16-11-2014 / 08:42:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_07c
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify & commit p2 & p2/n1, commit only n1 
    3) check that current ChangeSet has no changes for commited classes
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2Foo) package.
    ((Smalltalk at: #MocksHgP2N1Foo) compile:'bark ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.

    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2Foo)).     
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2N1Foo)).     

    ctP2 := pmP2 commitTask.
    ctP2 message:'test_commit_nested_07a 1'.
    ctP2 paths:{
        (ctP2 temporaryWorkingCopy path / 'n1' / 'MocksHgP2N1Foo.st') pathName.
    }.
    ctP2 do.

    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2Foo)).     
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2N1Foo)) not.     
    "
    repo workingCopy browse
    "

    "Created: / 16-11-2014 / 08:43:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_07d
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify & commit p2 & p2/n1, none
    3) check that current ChangeSet has no changes for commited classes
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2Foo) package.
    ((Smalltalk at: #MocksHgP2N1Foo) compile:'bark ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.

    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2Foo)).     
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2N1Foo)).     

    ctP2 := pmP2 commitTask.
    ctP2 message:'test_commit_nested_07a 1'.
    ctP2 paths:{
    }.
    ctP2 do.

    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2Foo)).     
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2N1Foo)).     
    "
    repo workingCopy browse
    "

    "Created: / 16-11-2014 / 08:44:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_07e
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify & commit p2 & p2/n1, commit both 
    3) check that current ChangeSet has no changes for commited classes
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2Foo) package.
    ((Smalltalk at: #Object) compile:'bark ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.

    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2Foo)).     
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#Object) selector: #bark).     

    ctP2 := pmP2 commitTask.
    ctP2 message:'test_commit_nested_07a 1'.
    ctP2 paths:{
        (ctP2 temporaryWorkingCopy path / 'MocksHgP2Foo.st') pathName.
        (ctP2 temporaryWorkingCopy path / 'n1' / 'extensions.st') pathName.
    }.
    ctP2 do.

    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2Foo)) not.     
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#Object) selector: #bark) not.     
    "
    repo workingCopy browse
    "

    "Created: / 16-11-2014 / 08:45:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_07f
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load all of them
    2) modify & commit p2 & p2/n1, commit both 
    3) check that current ChangeSet has no changes for commited classes
    "

    | repo pmP2 pmP2N1 pmP2N2 ctP2 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n2').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.

    "=== A modifies & commits =============================== "
    ((Smalltalk at: #MocksHgP2Foo) compile:'zork ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2Foo) package.
    ((Smalltalk at: #Object) compile:'bark ^ 2' classified:'test') package: (Smalltalk at: #MocksHgP2N1Foo) package.

    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2Foo)).     
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#Object) selector: #bark).     

    ctP2 := pmP2 commitTask.
    ctP2 message:'test_commit_nested_07a 1'.
    ctP2 paths:{
        (ctP2 temporaryWorkingCopy path / 'MocksHgP2Foo.st') pathName.
    }.
    ctP2 do.

    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#MocksHgP2Foo)) not.     
    self assert: (ChangeSet current includesChangeForClass: (Smalltalk at:#Object) selector: #bark).     
    "
    repo workingCopy browse
    "

    "Created: / 16-11-2014 / 08:46:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_08a
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load hg/p2, hg/p2/n1
    2) commit hg/p2/n1
    3) check that no .hgignore has been created in n1
    "

    | repo pmP2 pmP2N1 ctP2N1 |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p2').
    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').
    pmP2   := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.

    ctP2N1 := pmP2N1 commitTask.
    ctP2N1 message:'test_commit_nested_08a 1'.
    ctP2N1 do.

    self should: [ (repo @ 4) / 'n1' / '.hgignore' ] raise: HGError.  

    "
    repo workingCopy browse
    "

    "Created: / 20-01-2015 / 19:48:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_commit_nested_08b
    "
    Nested packages
      mocks:hg/p2
      mocks:hg/p2/n1
      mocks:hg/p2/n2

    1) load hg/p2/n1
    2) commit hg/p2 (which is virtual now)
    3) check that .hgignore has been created in p2
    "

    | repo pmP2 ctP2 |

    repo := self repositoryNamed: 'mocks/hg/p2'.

    self assert: (Smalltalk loadPackage:'mocks:hg/p2/n1').

    pmP2 := HGPackageWorkingCopy named: 'mocks:hg/p2'.

    ctP2 := pmP2 commitTask.
    ctP2 message:'test_commit_nested_08a 1'.
    ctP2 do.

    self should:   [ (repo @ 4) / 'n1' / '.hgignore' ] raise: HGError.
    self shouldnt: [ (repo @ 4) / '.hgignore' ] raise: HGError.  

    "
    repo workingCopy browse
    "

    "Created: / 20-01-2015 / 19:54:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGStXTests methodsFor:'tests - manager API'!

test_log_01

    | log repo |


    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').

    log := HGSourceCodeManager
                revisionLogOf:MockHGP1Bar
                fromRevision:0 toRevision:0
                numberOfRevisions:nil
                fileName:'MockHGP1Bar.st'
                directory: 'hg/p1'
                module:'mocks'.

    self assert: (log at: #container) = 'MockHGP1Bar.st'.
    self assert: (log at: #cvsRoot) = repo pathName.
    self assert: (log at: #newestRevision) = '1:847b035d9aed'.
    self assert: (log at: #revisions) size == 1.

    "Created: / 04-12-2012 / 01:07:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_log_02

    | log repo |


    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').

    log := HGSourceCodeManager
                revisionLogOf:MockHGP1Bar
                fromRevision:nil toRevision:nil
                numberOfRevisions:nil
                fileName:'MockHGP1Bar.st'
                directory: 'hg/p1'
                module:'mocks'.

    self assert: (log at: #container) = 'MockHGP1Bar.st'.
    self assert: (log at: #cvsRoot) = repo pathName.
    self assert: (log at: #newestRevision) = '1:847b035d9aed'.
    self assert: (log at: #revisions) size == 2.
    self assert: ((log at: #revisions) first  at:#revision) = '1:847b035d9aed'.
    self assert: ((log at: #revisions) second at:#revision) = '0:99acfa83a3bf'.

    "Created: / 04-12-2012 / 01:26:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_log_03

    | log repo |


    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').

    log := HGSourceCodeManager
                revisionLogOf:MockHGP1Bar
                fromRevision:nil toRevision:nil
                numberOfRevisions:1
                fileName:'MockHGP1Bar.st'
                directory: 'hg/p1'
                module:'mocks'.

    self assert: (log at: #container) = 'MockHGP1Bar.st'.
    self assert: (log at: #cvsRoot) = repo pathName.
    self assert: (log at: #newestRevision) = '1:847b035d9aed'.
    self assert: (log at: #revisions) size == 1.
    self assert: ((log at: #revisions) first  at:#revision) = '1:847b035d9aed'.

    "Created: / 04-12-2012 / 01:31:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_log_04a

    | log repo |


    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').

    log := HGSourceCodeManager
                revisionLogOf:MockHGP1Bar
                fromRevision:'1:847b035d9aed' toRevision:nil
                numberOfRevisions:nil
                fileName:'MockHGP1Bar.st'
                directory: 'hg/p1'
                module:'mocks'.

    self assert: (log at: #container) = 'MockHGP1Bar.st'.
    self assert: (log at: #cvsRoot) = repo pathName.
    self assert: (log at: #newestRevision) = '1:847b035d9aed'.
    self assert: (log at: #revisions) size == 2.
    self assert: ((log at: #revisions) first  at:#revision) = '1:847b035d9aed'.
    self assert: ((log at: #revisions) second at:#revision) = '0:99acfa83a3bf'.

    "Created: / 04-12-2012 / 01:32:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_log_04b

    | log repo |


    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').

    log := HGSourceCodeManager
                revisionLogOf:MockHGP1Bar
                fromRevision:'1:847b035d9aed' toRevision:'0:99acfa83a3bf'
                numberOfRevisions:nil
                fileName:'MockHGP1Bar.st'
                directory: 'hg/p1'
                module:'mocks'.

    self assert: (log at: #container) = 'MockHGP1Bar.st'.
    self assert: (log at: #cvsRoot) = repo pathName.
    self assert: (log at: #newestRevision) = '1:847b035d9aed'.
    self assert: (log at: #revisions) size == 2.
    self assert: ((log at: #revisions) first  at:#revision) = '1:847b035d9aed'.
    self assert: ((log at: #revisions) second at:#revision) = '0:99acfa83a3bf'.

    "Created: / 04-12-2012 / 01:32:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_log_04c

    | log repo |


    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').

    log := HGSourceCodeManager
                revisionLogOf:MockHGP1Bar
                fromRevision:nil toRevision:'0:99acfa83a3bf'
                numberOfRevisions:nil
                fileName:'MockHGP1Bar.st'
                directory: 'hg/p1'
                module:'mocks'.

    self assert: (log at: #container) = 'MockHGP1Bar.st'.
    self assert: (log at: #cvsRoot) = repo pathName.
    self assert: (log at: #newestRevision) = '1:847b035d9aed'.
    self assert: (log at: #revisions) size == 2.
    self assert: ((log at: #revisions) first  at:#revision) = '1:847b035d9aed'.
    self assert: ((log at: #revisions) second at:#revision) = '0:99acfa83a3bf'.

    "Created: / 04-12-2012 / 01:32:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_log_04d

    | log repo |


    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').

    log := HGSourceCodeManager
                revisionLogOf:MockHGP1Bar
                fromRevision:'0:99acfa83a3bf' toRevision:'0:99acfa83a3bf'
                numberOfRevisions:nil
                fileName:'MockHGP1Bar.st'
                directory: 'hg/p1'
                module:'mocks'.

    self assert: (log at: #container) = 'MockHGP1Bar.st'.
    self assert: (log at: #cvsRoot) = repo pathName.
    self assert: (log at: #newestRevision) = '1:847b035d9aed'.
    self assert: (log at: #revisions) size == 1.
    self assert: ((log at: #revisions) first at:#revision) = '0:99acfa83a3bf'.

    "Created: / 04-12-2012 / 01:33:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_log_05a

    | log repo |


    repo := self repositoryNamed: 'mocks/hg/p6' revision: '0'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p6').
    self assert: (Smalltalk at: #MocksHGP6Bar) revisionInfo changesetId = '0:c76faa501252' asHGChangesetId.

    log := HGSourceCodeManager
                revisionLogOf:(Smalltalk at: #MocksHGP6Bar)
                fromRevision:'0:c76faa501252' toRevision:'0:c76faa501252'
                numberOfRevisions:nil
                fileName:'MocksHGP6Bar.st'
                directory: 'hg/p6'
                module:'mocks'.

    self assert: (log at: #container) = 'MocksHGP6Bar.st'.
    self assert: (log at: #cvsRoot) = repo pathName.
    self assert: (log at: #newestRevision) = '4:f71dfc6c6f9b'.
    self assert: (log at: #revisions) size == 1.
    self assert: ((log at: #revisions) first at:#revision) = '0:c76faa501252'.

    "Created: / 11-02-2014 / 11:31:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 11-02-2014 / 12:58:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_log_05b
    "
    Test revision log of removed item.
    "

    | log repo |

    repo := self repositoryNamed: 'mocks/hg/p6' revision: '0'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p6').
    self assert: (Smalltalk at: #MocksHGP6Foo) revisionInfo changesetId = '0:c76faa501252' asHGChangesetId.

    log := HGSourceCodeManager
                revisionLogOf:(Smalltalk at: #MocksHGP6Foo)
                fromRevision:'0:c76faa501252' toRevision:'0:c76faa501252'
                numberOfRevisions:nil
                fileName:'MocksHGP6Foo.st'
                directory: 'hg/p6'
                module:'mocks'.

    self assert: (log at: #container) = 'MocksHGP6Foo.st'.
    self assert: (log at: #cvsRoot) = repo pathName.
    self assert: (log at: #newestRevision) = '0:c76faa501252'.
    self assert: (log at: #revisions) size == 1.
    self assert: ((log at: #revisions) first at:#revision) = '0:c76faa501252'.

    "Created: / 11-02-2014 / 11:34:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 11-02-2014 / 13:55:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_stream_01a

    | stream repo contents |


    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').

    stream := HGSourceCodeManager
                streamForClass:MockHGP1Bar
                fileName:'MockHGP1Bar.st'
                revision: '0:99acfa83a3bf'
                directory: 'hg/p1'
                module:'mocks'
                cache: false.
    contents := stream contents.

    self assert: contents first = '"{ Package: ''mocks/hg/p1'' }"'

    "Created: / 04-12-2012 / 02:04:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_stream_01b

    | stream repo contents |


    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').

    stream := HGSourceCodeManager
                streamForClass:MockHGP1Bar
                fileName:'MockHGP1Bar.st'
                revision: '1:847b035d9aed'
                directory: 'hg/p1'
                module:'mocks'
                cache: false.
    contents := stream contents.

    self assert: contents first = '"{ Package: ''mocks:hg/p1'' }"'

    "Created: / 04-12-2012 / 02:05:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_stream_01c

    | stream repo contents |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').

    stream := HGSourceCodeManager
                streamForClass:MockHGP1Bar
                fileName:'MockHGP1Bar.st'
                revision: #newest
                directory: 'hg/p1'
                module:'mocks'
                cache: false.
    contents := stream contents.

    self assert: contents first = '"{ Package: ''mocks:hg/p1'' }"'

    "Created: / 09-07-2013 / 15:26:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_stream_02a

    | stream repo contents |


    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').

    stream := HGSourceCodeManager
                streamForClass:MockHGP1Bar
                fileName:'MockHGP1Bar.st'
                revision: '0:99acfa83a3bf'
                directory: 'hg/p1'
                module:'mocks'
                cache: true.

    contents := stream contents.

    self assert: contents first = '"{ Package: ''mocks/hg/p1'' }"'.
    self assert: stream isFileStream.

    stream := HGSourceCodeManager
                streamForClass:MockHGP1Bar
                fileName:'MockHGP1Bar.st'
                revision: '0:99acfa83a3bf'
                directory: 'hg/p1'
                module:'mocks'
                cache: true.

    contents := stream contents.

    self assert: contents first = '"{ Package: ''mocks/hg/p1'' }"'.
    self assert: stream isFileStream.

    "Created: / 04-12-2012 / 02:08:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 04-12-2012 / 10:12:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_stream_02b

    | stream repo contents |


    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').

    stream := HGSourceCodeManager
                streamForClass:MockHGP1Bar
                fileName:'MockHGP1Bar.st'
                revision: '1:847b035d9aed'
                directory: 'hg/p1'
                module:'mocks'
                cache: true.
    [
        contents := stream contents.
    ] ensure: [
        stream close
    ].

    self assert: contents first = '"{ Package: ''mocks:hg/p1'' }"'

    "Created: / 04-12-2012 / 10:11:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_stream_02c

    | stream repo |


    repo := self repositoryNamed: 'mocks/hg/p1'.
    (repo pathName asFilename / '.hg' ) recursiveRemove.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').

    stream := HGSourceCodeManager
                streamForClass:MockHGP1Bar
                fileName:'MockHGP1Bar.st'
                revision: '0:99acfa83a3bf'
                directory: 'hg/p1'
                module:'mocks'
                cache: true.

    self assert: stream isNil.

    "Created: / 27-03-2013 / 11:11:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_stream_03a

    | stream repo contents |


    repo := self repositoryNamed: 'mocks/hg/p1'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p1').
    (Smalltalk at:#MockHGP1Bar) setBinaryRevision: '$Changeset: 847b035d9aed2f8aa50f0214488febc771c8eac8 $ SCM=HG'.

    stream := HGSourceCodeManager getSourceStreamFor:(Smalltalk at:#MockHGP1Bar).
    [
        contents := stream contents.
    ] ensure: [
        stream close
    ].

    self assert: contents first = '"{ Package: ''mocks:hg/p1'' }"'

    "Created: / 18-03-2013 / 16:58:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_stream_04a
    "
        Tests of extension stream
    "

    | stream repo contents |


    repo := self repositoryNamed: 'mocks/hg/p4'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p4').
    stream := HGSourceCodeManager streamForExtensionFile:'extensions.st' package: 'mocks:hg/p4' directory: 'hg/p4' module: 'mocks' cache: false.

    [
        contents := stream contents.
    ] ensure: [
        stream close
    ].

    self assert: contents first = '"{ Package: ''mocks:hg/p4'' }"!!'

    "Created: / 27-03-2013 / 11:37:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_stream_04b
    "
        Tests of extension stream
    "

    | stream repo contents |

    Class tryLocalSourceFirst:false.
    repo := self repositoryNamed: 'mocks/hg/p4'.
    self assert: (Smalltalk loadPackage:'mocks:hg/p4').
    stream := HGSourceCodeManager streamForExtensionFile:'extensions.st' package: 'mocks:hg/p4' directory: 'hg/p4' module: 'mocks' cache: false.

    [
        contents := stream contents.
    ] ensure: [
        stream close
    ].

    self assert: contents first = '"{ Package: ''mocks:hg/p4'' }"!!'

    "Created: / 08-07-2013 / 02:20:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGStXTests methodsFor:'tests - misc'!

test_misc_Class_revisionOfManager_01a
    | repo cls |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    Smalltalk loadPackage:'mocks:hg/p1/'.

    cls := Smalltalk at: #MockHGP1Bar.
    self assert: (cls revisionOfManager: HGSourceCodeManager) asHGChangesetId = repo workingCopy changesetId.

    "Created: / 23-05-2014 / 12:15:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_misc_Class_revisionOfManager_01b
    | repo cls |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    Smalltalk loadPackage:'mocks:hg/p1/'.

    cls := Object subclass:#MockHGP1Qux
        instanceVariableNames:''
        classVariableNames:''
        poolDictionaries:''
        category:'* Mocks *'.
    cls setPackage: #'mocks:hg/p1'.
    self assert: (cls revisionOfManager: HGSourceCodeManager) isNil

    "Created: / 23-05-2014 / 13:13:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_misc_Class_revisionOfManager_01c
    | repo cls |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    Smalltalk loadPackage:'mocks:hg/p1/'.

    cls := Object subclass:#MockHGP1N1Qux
        instanceVariableNames:''
        classVariableNames:''
        poolDictionaries:''
        category:'* Mocks *'.
    cls setPackage: #'mocks:hg/p1/n1'.
    self assert: (cls revisionOfManager: HGSourceCodeManager) isNil

    "Created: / 23-05-2014 / 12:20:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_misc_fileReleaseAndRevisionNr
    "
    ProjectDefinition>>fileReleaseNr and ProjectDefinition>>fileRevisionNr
    are used to generate package.rc used on Windows.

    String returned must be an integer and must be a valid short value
    - otherwise, BCC won't compile/link the library.

    If this test fail it means that implementation fileReleaseNr/fileRevisionNr
    is rubbish. As of 2012-11-23, it uses 'self revision' and expects
    (but does not check!!) the resulting string is in X.Y form. In mercurial,
    #revision returns node id (SHA1 hash string).

    It has to be fixed there!!
    "

    | repo |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    Smalltalk loadPackage:'mocks:hg/p1'.

    self assert: ((Smalltalk at:#'mocks_hg_p1') fileReleaseNr allSatisfy:[:c|c isDigit]).
    self assert: ((Smalltalk at:#'mocks_hg_p1') fileReleaseNr asInteger <= 16r7FFF).

    self assert: ((Smalltalk at:#'mocks_hg_p1') fileRevisionNr allSatisfy:[:c|c isDigit]).
    self assert: ((Smalltalk at:#'mocks_hg_p1') fileRevisionNr asInteger <= 16r7FFF).

    "Created: / 23-11-2012 / 11:02:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_misc_hgRevision_01
    | repo |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    Smalltalk loadPackage:'mocks:hg/p1'.
    self dumpRepositoryLog: repo.

    self assert: (Smalltalk at:#'mocks_hg_p1') hgLogicalRevision  = (HGChangesetId fromString: '1:847b035d9aed').

    "Created: / 23-11-2012 / 11:00:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 16-05-2013 / 13:18:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_misc_packagegroup_01a
    | repo pmP2 pmP2N1 pmP2N2 pg|

    repo := self repositoryNamed: 'mocks/hg/p2'.
    Smalltalk loadPackage:'mocks:hg/p2'.
    Smalltalk loadPackage:'mocks:hg/p2/n1'.
    Smalltalk loadPackage:'mocks:hg/p2/n2'.
    pmP2 := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.

    pg := SCMCommonPackageModelGroup with: pmP2.

    self assert: (pg includes: pmP2).
    self assert: (pg includes: pmP2N1).
    self assert: (pg includes: pmP2N2).

    "Created: / 03-03-2014 / 09:00:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:46:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_misc_packagegroup_01b
    | repo pmP2 pmP2N1 pmP2N2 pg|

    repo := self repositoryNamed: 'mocks/hg/p2'.
    Smalltalk loadPackage:'mocks:hg/p2'.
    Smalltalk loadPackage:'mocks:hg/p2/n1'.
    Smalltalk loadPackage:'mocks:hg/p2/n2'.
    pmP2 := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.

    pg := SCMCommonPackageModelGroup with: pmP2N1.

    self assert: (pg includes: pmP2) not.
    self assert: (pg includes: pmP2N1).
    self assert: (pg includes: pmP2N2) not.

    "Created: / 03-03-2014 / 09:02:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:46:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_misc_packagegroup_02a
    | repo pmP2 pmP2N1 pmP2N2 pg|

    repo := self repositoryNamed: 'mocks/hg/p2'.
    Smalltalk loadPackage:'mocks:hg/p2'.
    Smalltalk loadPackage:'mocks:hg/p2/n1'.
    Smalltalk loadPackage:'mocks:hg/p2/n2'.
    pmP2 := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.

    pg := SCMCommonPackageModelGroup with: pmP2N1.
    pg add: pmP2N2.

    self assert: (pg includes: pmP2) not.
    self assert: (pg includes: pmP2N1).
    self assert: (pg includes: pmP2N2).

    "Created: / 03-03-2014 / 09:03:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:46:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_misc_packagegroup_02b
    | repo pmP2 pmP2N1 pmP2N2 pg|

    repo := self repositoryNamed: 'mocks/hg/p2'.
    Smalltalk loadPackage:'mocks:hg/p2'.
    Smalltalk loadPackage:'mocks:hg/p2/n1'.
    Smalltalk loadPackage:'mocks:hg/p2/n2'.
    pmP2 := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.

    pg := SCMCommonPackageModelGroup with: pmP2N1.
    pg add: pmP2.

    self assert: (pg includes: pmP2).
    self assert: (pg includes: pmP2N1).
    self assert: (pg includes: pmP2N2).

    "Created: / 03-03-2014 / 09:03:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:46:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_misc_packagemodel_01
    | repo pm |

    repo := self repositoryNamed: 'mocks/hg/p1'.
    Smalltalk loadPackage:'mocks:hg/p1'.
    pm := HGPackageWorkingCopy named: 'mocks:hg/p1'.
    self assert: pm parent == nil.

    "Created: / 03-12-2012 / 15:45:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:45:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_misc_packagemodel_02
    | repo pmP2 pmP2N1|

    repo := self repositoryNamed: 'mocks/hg/p2'.
    Smalltalk loadPackage:'mocks:hg/p2'.
    pmP2 := HGPackageWorkingCopy named: 'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.

    self assert: pmP2 parent isNil.
    self assert: pmP2N1 parent == pmP2.
    self assert: (pmP2 construct:'n1') == pmP2N1

    "Created: / 03-12-2012 / 15:46:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:45:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_misc_packagemodel_03
    | repo pmP2N1 pmP2N2|

    repo := self repositoryNamed: 'mocks/hg/p2'.
    Smalltalk loadPackage:'mocks:hg/p2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.

    self assert: pmP2N1 parent == pmP2N2 parent.

    "Created: / 03-12-2012 / 15:48:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:45:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_misc_packagemodel_03b
    | repo pmP2N1 pmP2N2|

    repo := self repositoryNamed: 'mocks/hg/p2'.
    Smalltalk loadPackage:'mocks:hg/p2/n1'.
    Smalltalk loadPackage:'mocks:hg/p2/n2'.
    pmP2N1 := HGPackageWorkingCopy named: 'mocks:hg/p2/n1'.
    pmP2N2 := HGPackageWorkingCopy named: 'mocks:hg/p2/n2'.

    self assert: pmP2N1 parent == pmP2N2 parent.
    self assert: pmP2N1 repository == pmP2N2 repository.

    "Created: / 03-12-2012 / 15:48:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 05-03-2014 / 21:45:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGStXTests methodsFor:'tests - package revisions'!

test_packagerev_01
    | repo rev |

    repo := self repositoryNamed: 'mocks/hg/p6'.
    rev := (repo @ 1) rootPackage.

    self assert: rev name = 'mocks:hg/p6'.
    self assert: rev parent isNil.
    self assert: rev children isEmpty.
    self assert: rev isVirtual not.

    "Created: / 06-03-2014 / 22:00:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 08-03-2014 / 10:06:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_packagerev_02
    | repo p2rev p2n1rev p2n2rev |

    repo := self repositoryNamed: 'mocks/hg/p2'.
    p2rev := (repo @ 3) rootPackage.

    self assert: p2rev name = 'mocks:hg/p2'.
    self assert: p2rev parent isNil.
    self assert: p2rev children size == 2.
    self assert: p2rev isVirtual not.

    p2n1rev := p2rev children detect:[:e | e name = 'mocks:hg/p2/n1' ] ifNone:[ nil ].
    p2n2rev := p2rev children detect:[:e | e name = 'mocks:hg/p2/n2' ] ifNone:[ nil ].

    self assert: p2n1rev notNil.
    self assert: p2n2rev notNil.

    self assert: p2n1rev parent == p2rev. 
    self assert: p2n1rev children isEmpty.
    self assert: p2n1rev isVirtual not.

    self assert: p2n1rev siblings size == 1.
    self assert: p2n1rev siblings anElement == p2n2rev.

    self assert: p2n2rev parent == p2rev. 
    self assert: p2n2rev children size == 1.
    self assert: p2n2rev children anElement name = 'mocks:hg/p2/n2/n2_1'.
    self assert: p2n2rev siblings size == 1.
    self assert: p2n2rev siblings anElement == p2n1rev.
    self assert: p2n2rev isVirtual not.

    "Created: / 07-03-2014 / 09:53:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 08-03-2014 / 10:07:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_packagerev_03a
    | repo p7rev p7n1rev p7n2rev |

    repo := self repositoryNamed: 'mocks/hg/p7'.
    p7rev := (repo @ 0) rootPackage.

    self assert: p7rev name = 'mocks:hg/p7'.
    self assert: p7rev parent isNil.
    self assert: p7rev children size == 2.
    self assert: p7rev isVirtual.

    p7n1rev := p7rev children detect:[:e | e name = 'mocks:hg/p7/n1' ] ifNone:[ nil ].
    p7n2rev := p7rev children detect:[:e | e name = 'mocks:hg/p7/n2' ] ifNone:[ nil ].

    self assert: p7n1rev notNil.
    self assert: p7n1rev isVirtual not.
    self assert: p7n2rev notNil.
    self assert: p7n2rev isVirtual not.

    "Created: / 08-03-2014 / 10:09:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_packagerev_03b
    | repo p7rev p7n1rev p7n2rev p7n3rev p7n3n1rev p7n3n2rev |

    repo := self repositoryNamed: 'mocks/hg/p7'.
    p7rev := (repo @ 1) rootPackage.

    self assert: p7rev name = 'mocks:hg/p7'.
    self assert: p7rev parent isNil.
    self assert: p7rev children size == 3.
    self assert: p7rev isVirtual.

    p7n1rev := p7rev children detect:[:e | e name = 'mocks:hg/p7/n1' ] ifNone:[ nil ].
    p7n2rev := p7rev children detect:[:e | e name = 'mocks:hg/p7/n2' ] ifNone:[ nil ].
    p7n3rev := p7rev children detect:[:e | e name = 'mocks:hg/p7/n3' ] ifNone:[ nil ].

    self assert: p7n1rev notNil.
    self assert: p7n1rev isVirtual not.
    self assert: p7n2rev notNil.
    self assert: p7n2rev isVirtual not.
    self assert: p7n3rev notNil.
    self assert: p7n3rev isVirtual.

    p7n3n1rev := p7n3rev children detect:[:e | e name = 'mocks:hg/p7/n3/n1' ] ifNone:[ nil ].
    p7n3n2rev := p7n3rev children detect:[:e | e name = 'mocks:hg/p7/n3/n2' ] ifNone:[ nil ].
    self assert: p7n3n1rev notNil.
    self assert: p7n3n1rev isVirtual not.
    self assert: p7n3n2rev notNil.
    self assert: p7n3n2rev isVirtual not.

    "Created: / 08-03-2014 / 10:11:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_packagerev_changeset_01
    | repo p6rev p6cs |

    repo := self repositoryNamed: 'mocks/hg/p6'.
    p6rev := (repo @ 1) rootPackage.
    p6cs  := p6rev changeSet.

    self assert: p6cs size == 21.

    "01"self assert: (p6cs contains:[:c | c isClassDefinitionChange and:[ c className = 'MocksHGP6Bar' ] ] ).
    "02"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Bar' and:[ c selector == #bar ] ] ]).
    "03"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Bar' and:[ c selector == #name ] ] ]).
    "04"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Bar class' and:[ c selector == #version_HG ] ] ]).

    "05"self assert: (p6cs contains:[:c | c isClassDefinitionChange and:[ c className = 'MocksHGP6Foo' ] ] ).
    "06"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Foo' and:[ c selector == #foo1 ] ] ]).
    "07"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Foo' and:[ c selector == #foo2 ] ] ]).
    "08"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Foo' and:[ c selector == #foo3 ] ] ]).
    "09"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Foo class' and:[ c selector == #version_HG ] ] ]).

    "10"self assert: (p6cs contains:[:c | c isClassDefinitionChange and:[ c className = 'mocks_hg_p6' ] ] ).
    "11"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #excludedFromPreRequisites ] ] ]).
    "12"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #mandatoryPreRequisites ] ] ]).
    "13"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #referencedPreRequisites ] ] ]).
    "14"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #subProjects ] ] ]).
    "15"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #classNamesAndAttributes ] ] ]).
    "16"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #extensionMethodNames ] ] ]).
    "17"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #description ] ] ]).
    "18"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #legalCopyright ] ] ]).
    "19"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #productName ] ] ]).
    "20"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #version_HG ] ] ]).
    "21"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #companyName ] ] ]).

    "Created: / 13-03-2014 / 22:35:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 14-03-2014 / 21:04:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_packagerev_changeset_02
    | repo p6rev p6cs |

    repo := self repositoryNamed: 'mocks/hg/p6'.
    p6rev := (repo @ 5) rootPackage.
    p6cs  := p6rev changeSet.

    self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'Object' and:[ c selector == #greet ] ] ]).

    "Created: / 14-03-2014 / 21:19:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_packagerev_changeset_03
    | repo p6hgcs p6rev p6cs |

    repo := self repositoryNamed: 'mocks/hg/p6'.
    p6hgcs := repo @ 1.
    "/ Simulate missing abbrev.stc...  
    p6hgcs root children removeKey: 'abbrev.stc'.

    p6rev := p6hgcs rootPackage.
    p6cs  := p6rev changeSet.

    self assert: p6cs size == 21.

    "01"self assert: (p6cs contains:[:c | c isClassDefinitionChange and:[ c className = 'MocksHGP6Bar' ] ] ).
    "02"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Bar' and:[ c selector == #bar ] ] ]).
    "03"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Bar' and:[ c selector == #name ] ] ]).
    "04"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Bar class' and:[ c selector == #version_HG ] ] ]).

    "05"self assert: (p6cs contains:[:c | c isClassDefinitionChange and:[ c className = 'MocksHGP6Foo' ] ] ).
    "06"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Foo' and:[ c selector == #foo1 ] ] ]).
    "07"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Foo' and:[ c selector == #foo2 ] ] ]).
    "08"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Foo' and:[ c selector == #foo3 ] ] ]).
    "09"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Foo class' and:[ c selector == #version_HG ] ] ]).

    "10"self assert: (p6cs contains:[:c | c isClassDefinitionChange and:[ c className = 'mocks_hg_p6' ] ] ).
    "11"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #excludedFromPreRequisites ] ] ]).
    "12"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #mandatoryPreRequisites ] ] ]).
    "13"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #referencedPreRequisites ] ] ]).
    "14"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #subProjects ] ] ]).
    "15"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #classNamesAndAttributes ] ] ]).
    "16"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #extensionMethodNames ] ] ]).
    "17"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #description ] ] ]).
    "18"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #legalCopyright ] ] ]).
    "19"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #productName ] ] ]).
    "20"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #version_HG ] ] ]).
    "21"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #companyName ] ] ]).

    "Created: / 14-03-2014 / 21:46:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_packagerev_changeset_04
    | repo p6hgcs p6rev p6cs warnings |

    repo := self repositoryNamed: 'mocks/hg/p6'.
    p6hgcs := repo @ 1.
    "/ Simulate missing class (listed in classNamesAndAttributes)
    p6hgcs root children removeKey: 'MocksHGP6Bar.st'.

    p6rev := p6hgcs rootPackage.
    warnings := OrderedCollection new.
    [
        p6cs := p6rev changeSet.
    ] on: SCMWarning do:[:ex |
        warnings add: ex.
        ex proceed.
    ].

    self assert: p6cs size == 17.
    self assert: warnings size == 1.

    "05"self assert: (p6cs contains:[:c | c isClassDefinitionChange and:[ c className = 'MocksHGP6Foo' ] ] ).
    "06"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Foo' and:[ c selector == #foo1 ] ] ]).
    "07"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Foo' and:[ c selector == #foo2 ] ] ]).
    "08"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Foo' and:[ c selector == #foo3 ] ] ]).
    "09"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'MocksHGP6Foo class' and:[ c selector == #version_HG ] ] ]).

    "10"self assert: (p6cs contains:[:c | c isClassDefinitionChange and:[ c className = 'mocks_hg_p6' ] ] ).
    "11"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #excludedFromPreRequisites ] ] ]).
    "12"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #mandatoryPreRequisites ] ] ]).
    "13"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #referencedPreRequisites ] ] ]).
    "14"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #subProjects ] ] ]).
    "15"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #classNamesAndAttributes ] ] ]).
    "16"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #extensionMethodNames ] ] ]).
    "17"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #description ] ] ]).
    "18"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #legalCopyright ] ] ]).
    "19"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #productName ] ] ]).
    "20"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #version_HG ] ] ]).
    "21"self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'mocks_hg_p6 class' and:[ c selector == #companyName ] ] ]).

    "Created: / 14-03-2014 / 22:39:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_packagerev_changeset_05
    | repo p6hgcs p6rev p6cs warnings |

    repo := self repositoryNamed: 'mocks/hg/p6'.
    p6hgcs := repo @ 5.
    "/ Simulate missing extensions.st
    p6hgcs root children removeKey: 'extensions.st'.

    p6rev := p6hgcs rootPackage.
    warnings := OrderedCollection new.
    [
        p6cs := p6rev changeSet.
    ] on: SCMWarning do:[:ex |
        warnings add: ex.
        ex proceed.
    ].

    self assert: warnings size == 1.

    self deny: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'Object' and:[ c selector == #greet ] ] ]).

    "Created: / 14-03-2014 / 22:51:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_packagerev_changeset_06
    | repo p6hgcs p6rev p6cs warnings |

    repo := self repositoryNamed: 'mocks/hg/p6'.
    p6hgcs := repo @ 5.
    "/ Simulate empty extensionMethodNames but non-empty extensions.st
    p6hgcs rootPackage definition extensionMethodNames: nil.  

    p6rev := p6hgcs rootPackage.
    warnings := OrderedCollection new.
    [
        p6cs := p6rev changeSet.
    ] on: SCMWarning do:[:ex |
        warnings add: ex.
        ex proceed.
    ].

    self assert: warnings size == 1.

    self assert: (p6cs contains:[:c | c isMethodCodeChange and:[ c className = 'Object' and:[ c selector == #greet ] ] ]).

    "Created: / 14-03-2014 / 22:53:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGStXTests methodsFor:'utilities'!

cleanup
    "Wipeout all mock package leftovers. Could be used
     to simulate work from another fresh image"

    self tearDown

    "Created: / 20-11-2012 / 19:32:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

stxlibjavaAvailable
    ^ self stxlibjavaAvailableRequireReboot: true.

    "Created: / 29-11-2013 / 16:21:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 04-08-2014 / 01:39:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

stxlibjavaAvailableRequireReboot: reboot

    (Smalltalk at:#JavaVM) isNil ifTrue:[
        [
            Smalltalk loadPackage:'stx:libjava'.
            Smalltalk loadPackage:'stx:libjava/tools'.
        ] on: PackageLoadError do:[
            ^ false.
        ]
    ].

    ((Smalltalk at:#JavaVM) isNil or:[(Smalltalk at:#Java) isNil]) ifTrue:[
        ^ false
    ].

    ((Smalltalk at:#JavaVM) booted not or:[ reboot ]) ifTrue:[
        ^ [
            "/ Opps, workaround - have to nil out Java:ExtensionsPathPackages
            Smalltalk at: #'Java:ExtensionsPathPackages' put: nil.
            (Smalltalk at:#JavaVM) reboot.
            true.
        ] on:Error do:[:ex | 
            false 
        ]
    ].

    ^ true.

    "Created: / 04-08-2014 / 01:36:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGStXTests class methodsFor:'documentation'!

version_HG

    ^ '$Changeset: <not expanded> $'
! !