diff --git a/LibGit2Sharp.Tests/MergeFixture.cs b/LibGit2Sharp.Tests/MergeFixture.cs index 32bef84e9deb01237122a0bbafd2bdc15b092f0a..2323b3115914aef2d678ec08dc5c5ffb23b985a1 100644 --- a/LibGit2Sharp.Tests/MergeFixture.cs +++ b/LibGit2Sharp.Tests/MergeFixture.cs @@ -1,7 +1,7 @@ -using System; -using System.Linq; +using System.Linq; using LibGit2Sharp.Tests.TestHelpers; using Xunit; +using Xunit.Extensions; namespace LibGit2Sharp.Tests { @@ -81,9 +81,11 @@ public void CanRetrieveTheBranchBeingMerged() Assert.Null(mergedHeads[1].Tip); } } - - [Fact] - public void CanMergeRepoNonFastForward() + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void CanMergeRepoNonFastForward(bool shouldMergeOccurInDetachedHeadState) { const string firstBranchFileName = "first branch file.txt"; const string secondBranchFileName = "second branch file.txt"; @@ -104,7 +106,15 @@ public void CanMergeRepoNonFastForward() // Commit with ONE new file to first branch (FirstBranch moves forward as it is checked out, SecondBranch stays back one). AddFileCommitToRepo(repo, firstBranchFileName); - secondBranch.Checkout(); + if (shouldMergeOccurInDetachedHeadState) + { + // Detaches HEAD + repo.Checkout(secondBranch.Tip); + } + else + { + secondBranch.Checkout(); + } // Commit with ONE new file to second branch (FirstBranch and SecondBranch now point to separate commits that both have the same parent commit). AddFileCommitToRepo(repo, secondBranchFileName); @@ -116,6 +126,13 @@ public void CanMergeRepoNonFastForward() Assert.Equal(repo.Head.Tip, mergeResult.Commit); Assert.Equal(originalTreeCount + 3, mergeResult.Commit.Tree.Count); // Expecting original tree count plussed by the 3 added files. Assert.Equal(2, mergeResult.Commit.Parents.Count()); // Merge commit should have 2 parents + Assert.Equal(shouldMergeOccurInDetachedHeadState, repo.Info.IsHeadDetached); + + if (!shouldMergeOccurInDetachedHeadState) + { + // Ensure HEAD is still attached and points to SecondBranch + Assert.Equal(repo.Refs.Head.TargetIdentifier, secondBranch.CanonicalName); + } } } @@ -143,8 +160,10 @@ public void IsUpToDateMerge() } } - [Fact] - public void CanFastForwardRepos() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void CanFastForwardRepos(bool shouldMergeOccurInDetachedHeadState) { const string firstBranchFileName = "first branch file.txt"; const string sharedBranchFileName = "first+second branch file.txt"; @@ -169,14 +188,33 @@ public void CanFastForwardRepos() // Commit with ONE new file to first branch (FirstBranch moves forward as it is checked out, SecondBranch stays back one). AddFileCommitToRepo(repo, firstBranchFileName); - secondBranch.Checkout(); + if (shouldMergeOccurInDetachedHeadState) + { + // Detaches HEAD + repo.Checkout(secondBranch.Tip); + } + else + { + secondBranch.Checkout(); + } + + Assert.Equal(shouldMergeOccurInDetachedHeadState, repo.Info.IsHeadDetached); MergeResult mergeResult = repo.Merge(repo.Branches["FirstBranch"].Tip, Constants.Signature); Assert.Equal(MergeStatus.FastForward, mergeResult.Status); Assert.Equal(repo.Branches["FirstBranch"].Tip, mergeResult.Commit); Assert.Equal(repo.Branches["FirstBranch"].Tip, repo.Head.Tip); + Assert.Equal(repo.Head.Tip, mergeResult.Commit); + Assert.Equal(0, repo.Index.RetrieveStatus().Count()); + Assert.Equal(shouldMergeOccurInDetachedHeadState, repo.Info.IsHeadDetached); + + if (!shouldMergeOccurInDetachedHeadState) + { + // Ensure HEAD is still attached and points to SecondBranch + Assert.Equal(repo.Refs.Head.TargetIdentifier, secondBranch.CanonicalName); + } } }