static void EnsureMetaDataMatch(CommitCountingRepoFixture fixture, string branchName, Func <IRepository, Commit> commitFinder = null)
    {
        var referenceCommitFinder = commitFinder ?? (r => r.FindBranch(branchName).Tip);

        var commit      = referenceCommitFinder(fixture.Repository);
        var releaseDate = LastVersionOnMasterFinder.Execute(fixture.Repository, commit);

        releaseDate.ShouldBe(commit.When());
    }
    public void CanCorrectlyDetectCommitCountsAndReleaseDataWhenThatApplies()
    {
        using (var f = new CommitCountingRepoFixture())
        {
            ResetToP(f.Repository);
            EnsureMetaDataMatch(f, "1.4.0-unstable.7+7");

            ResetToO(f.Repository);
            EnsureMetaDataMatch(f, "1.4.0-unstable.6+6");

            ResetToN(f.Repository);
            EnsureMetaDataMatch(f, "1.3.1");

            ResetToM(f.Repository);
            EnsureMetaDataMatch(f, "1.4.0-unstable.5+5");

            ResetToL(f.Repository);
            EnsureMetaDataMatch(f, "1.3.1-beta.1+1");

            ResetToK(f.Repository);
            EnsureMetaDataMatch(f, "1.4.0-feature+2");

            ResetToJ(f.Repository);
            EnsureMetaDataMatch(f, "1.4.0-feature+1");

            ResetToI(f.Repository);
            EnsureMetaDataMatch(f, "1.4.0-unstable.2+2");

            ResetToH(f.Repository);
            EnsureMetaDataMatch(f, "1.3.0");

            ResetToG(f.Repository);
            EnsureMetaDataMatch(f, "1.3.0-beta.1+2");

            ResetToF(f.Repository);
            EnsureMetaDataMatch(f, "1.2.1");

            ResetToE(f.Repository);
            EnsureMetaDataMatch(f, "1.3.0-unstable.2+2");

            ResetToD(f.Repository);
            EnsureMetaDataMatch(f, "1.3.0-beta.1+1");

            ResetToC(f.Repository);
            EnsureMetaDataMatch(f, "1.2.1-beta.1+1");

            ResetToB(f.Repository);
            EnsureMetaDataMatch(f, "1.3.0-unstable.1+1");
        }
    }
    public void CanCorrectlyDetectCommitCountsAndReleaseDataWhenThatApplies()
    {
        using (var f = new CommitCountingRepoFixture())
        {
            ResetToP(f.Repository);
            EnsureMetaDataMatch(f, "develop");

            ResetToO(f.Repository);
            EnsureMetaDataMatch(f, "develop");

            ResetToN(f.Repository);
            EnsureMetaDataMatch(f, "master", r => (Commit)r.Tags["1.3.0"].Target);

            ResetToM(f.Repository);
            EnsureMetaDataMatch(f, "develop");

            ResetToL(f.Repository);
            EnsureMetaDataMatch(f, "hotfix-1.3.1", r => (Commit)r.Tags["1.3.0"].Target);

            ResetToK(f.Repository);
            EnsureMetaDataMatch(f, "feature");

            ResetToJ(f.Repository);
            EnsureMetaDataMatch(f, "feature");

            ResetToI(f.Repository);
            EnsureMetaDataMatch(f, "develop");

            ResetToH(f.Repository);
            EnsureMetaDataMatch(f, "master", r => (Commit)r.Tags["1.3.0"].Target);

            ResetToG(f.Repository);
            EnsureMetaDataMatch(f, "release-1.3.0");

            ResetToF(f.Repository);
            EnsureMetaDataMatch(f, "master", r => (Commit)r.Tags["1.2.0"].Target);

            ResetToE(f.Repository);
            EnsureMetaDataMatch(f, "develop");

            ResetToD(f.Repository);
            EnsureMetaDataMatch(f, "release-1.3.0");

            ResetToC(f.Repository);
            EnsureMetaDataMatch(f, "hotfix-1.2.1", r => (Commit)r.Tags["1.2.0"].Target);

            ResetToB(f.Repository);
            EnsureMetaDataMatch(f, "develop");
        }
    }
        public void CanCorrectlyDetectCommitCountsAndReleaseDataWhenThatApplies()
        {
            using (var f = new CommitCountingRepoFixture())
            {
                ResetToP(f.Repository);
                EnsureMetaDataMatch(f, "develop", "1.4.0.7-unstable");

                ResetToO(f.Repository);
                EnsureMetaDataMatch(f, "develop", "1.4.0.6-unstable");

                ResetToN(f.Repository);
                EnsureMetaDataMatch(f, "master", "1.3.1", r => (Commit)r.Tags["1.3.0"].Target);

                ResetToM(f.Repository);
                EnsureMetaDataMatch(f, "develop", "1.4.0.5-unstable");

                ResetToL(f.Repository);
                EnsureMetaDataMatch(f, "hotfix-1.3.1", "1.3.1-beta.1+1", r => (Commit)r.Tags["1.3.0"].Target);

                ResetToK(f.Repository);
                EnsureMetaDataMatch(f, "feature", "1.4.0-feature+2");

                ResetToJ(f.Repository);
                EnsureMetaDataMatch(f, "feature", "1.4.0-feature+1");

                ResetToI(f.Repository);
                EnsureMetaDataMatch(f, "develop", "1.4.0.2-unstable");

                ResetToH(f.Repository);
                EnsureMetaDataMatch(f, "master", "1.3.0", r => (Commit)r.Tags["1.3.0"].Target);

                ResetToG(f.Repository);
                EnsureMetaDataMatch(f, "release-1.3.0", "1.3.0-beta.1+2");

                ResetToF(f.Repository);
                EnsureMetaDataMatch(f, "master", "1.2.1", r => (Commit)r.Tags["1.2.0"].Target);

                ResetToE(f.Repository);
                EnsureMetaDataMatch(f, "develop", "1.3.0.2-unstable");

                ResetToD(f.Repository);
                EnsureMetaDataMatch(f, "release-1.3.0", "1.3.0-beta.1+1");

                ResetToC(f.Repository);
                EnsureMetaDataMatch(f, "hotfix-1.2.1", "1.2.1-beta.1+1", r => (Commit)r.Tags["1.2.0"].Target);

                ResetToB(f.Repository);
                EnsureMetaDataMatch(f, "develop", "1.3.0.1-unstable");
            }
        }
        static void EnsureMetaDataMatch(
            CommitCountingRepoFixture fixture, string branchName,
            string expectedSemVer, Func <IRepository, Commit> commitFinder = null)
        {
            var referenceCommitFinder = commitFinder ?? (r => r.FindBranch(branchName).Tip);

            var commit = referenceCommitFinder(fixture.Repository);

            var result = fixture.ExecuteGitVersion();
            var vars   = result.OutputVariables;

            vars[VariableProvider.FullSemVer].ShouldBe(expectedSemVer);
            vars[VariableProvider.OriginalRelease].ShouldBe(BuildReleaseMetaDateFrom(commit));
        }
    public void CanCorrectlyDetectCommitCountsAndReleaseDataWhenThatApplies()
    {
        using (var f = new CommitCountingRepoFixture())
        {
            ResetToP(f.Repository);
            EnsureBranchMatch(f, "develop");

            ResetToO(f.Repository);
            EnsureBranchMatch(f, "develop");

            ResetToN(f.Repository);
            EnsureBranchMatch(f, "master", r => (Commit)r.Tags["1.3.0"].Target);

            ResetToM(f.Repository);
            EnsureBranchMatch(f, "develop");

            ResetToL(f.Repository);
            EnsureBranchMatch(f, "hotfix-1.3.1", r => (Commit)r.Tags["1.3.0"].Target);

            ResetToK(f.Repository);
            EnsureBranchMatch(f, "feature");

            ResetToJ(f.Repository);
            EnsureBranchMatch(f, "feature");

            ResetToI(f.Repository);
            EnsureBranchMatch(f, "develop");

            ResetToH(f.Repository);
            EnsureBranchMatch(f, "master", r => (Commit)r.Tags["1.3.0"].Target);

            ResetToG(f.Repository);
            EnsureBranchMatch(f, "release-1.3.0");

            ResetToF(f.Repository);
            EnsureBranchMatch(f, "master", r => (Commit)r.Tags["1.2.0"].Target);

            ResetToE(f.Repository);
            EnsureBranchMatch(f, "develop");

            ResetToD(f.Repository);
            EnsureBranchMatch(f, "release-1.3.0");

            ResetToC(f.Repository);
            EnsureBranchMatch(f, "hotfix-1.2.1", r => (Commit)r.Tags["1.2.0"].Target);

            ResetToB(f.Repository);
            EnsureBranchMatch(f, "develop");
        }
    }
        static void EnsureMetaDataMatch(
            CommitCountingRepoFixture fixture, string branchName,
            string expectedSemVer, Func<IRepository, Commit> commitFinder = null)
        {
            var referenceCommitFinder = commitFinder ?? (r => r.FindBranch(branchName).Tip);

            var commit = referenceCommitFinder(fixture.Repository);

            var result = fixture.ExecuteGitVersion();
            var vars = result.OutputVariables;
            vars[VariableProvider.FullSemVer].ShouldBe(expectedSemVer);
            vars[VariableProvider.OriginalRelease].ShouldBe(BuildReleaseMetaDateFrom(commit));
        }
    static void EnsureMetaDataMatch(
        CommitCountingRepoFixture fixture, string branchName,
        string expectedSemVer, Func<IRepository, Commit> commitFinder = null)
    {
        var referenceCommitFinder = commitFinder ?? (r => r.FindBranch(branchName).Tip);

        var commit = referenceCommitFinder(fixture.Repository);

        var result = fixture.ExecuteGitVersion();
        result.ToString("f").ShouldBe(expectedSemVer);
        result.BuildMetaData.ReleaseDate.OriginalCommitSha.ShouldBe(commit.Sha);
        result.BuildMetaData.ReleaseDate.OriginalDate.ShouldBe(commit.Committer.When);
    }
    static void EnsureMetaDataMatch(CommitCountingRepoFixture fixture, string expectedSemVer)
    {
        var result = fixture.ExecuteGitVersion();

        result.ToString("f").ShouldBe(expectedSemVer);
    }
 static void EnsureMetaDataMatch(CommitCountingRepoFixture fixture,string expectedSemVer)
 {
     var result = fixture.ExecuteGitVersion();
     result.ToString("f").ShouldBe(expectedSemVer);
 }
    static void EnsureBranchMatch(CommitCountingRepoFixture fixture, string branchName, Func<IRepository, Commit> commitFinder = null)
    {
        var referenceCommitFinder = commitFinder ?? (r => r.FindBranch(branchName).Tip);

        var commit = referenceCommitFinder(fixture.Repository);
        var releaseDate = LastMinorVersionFinder.Execute(fixture.Repository, new Config(), commit);
        releaseDate.ShouldBe(commit.When());
    }
    public void CanCorrectlyDetectCommitCountsSemVer()
    {
        using (var f = new CommitCountingRepoFixture())
        {
            ResetToP(f.Repository);
            EnsureMetaDataMatch(f, "1.4.0-unstable.7+7");

            ResetToO(f.Repository);
            EnsureMetaDataMatch(f, "1.4.0-unstable.6+6");

            ResetToN(f.Repository);
            EnsureMetaDataMatch(f, "1.3.1");

            ResetToM(f.Repository);
            EnsureMetaDataMatch(f, "1.4.0-unstable.5+5");

            ResetToL(f.Repository);
            EnsureMetaDataMatch(f, "1.3.1-beta.1+1");

            ResetToK(f.Repository);
            EnsureMetaDataMatch(f, "1.4.0-feature+2");

            ResetToJ(f.Repository);
            EnsureMetaDataMatch(f, "1.4.0-feature+1");

            ResetToI(f.Repository);
            EnsureMetaDataMatch(f, "1.4.0-unstable.2+2");

            ResetToH(f.Repository);
            EnsureMetaDataMatch(f, "1.3.0");

            ResetToG(f.Repository);
            EnsureMetaDataMatch(f, "1.3.0-beta.1+2");

            ResetToF(f.Repository);
            EnsureMetaDataMatch(f, "1.2.1");

            ResetToE(f.Repository);
            EnsureMetaDataMatch(f, "1.3.0-unstable.2+2");

            ResetToD(f.Repository);
            EnsureMetaDataMatch(f, "1.3.0-beta.1+1");

            ResetToC(f.Repository);
            EnsureMetaDataMatch(f, "1.2.1-beta.1+1");

            ResetToB(f.Repository);
            EnsureMetaDataMatch(f, "1.3.0-unstable.1+1");
        }
    }