package com.beijunyi.parallelgit.filesystem.commands;
import java.io.IOException;
import com.beijunyi.parallelgit.filesystem.AbstractGitFileSystemTest;
import com.beijunyi.parallelgit.filesystem.GitFileSystem;
import com.beijunyi.parallelgit.filesystem.ParallelGitMergeTest;
import com.beijunyi.parallelgit.filesystem.merge.MergeNote;
import org.eclipse.jgit.lib.AnyObjectId;
import org.junit.Before;
import org.junit.Test;
import static com.beijunyi.parallelgit.filesystem.Gfs.*;
import static com.beijunyi.parallelgit.filesystem.commands.GfsMerge.Result;
import static com.beijunyi.parallelgit.filesystem.commands.GfsMerge.Status.CONFLICTING;
import static com.beijunyi.parallelgit.utils.BranchUtils.getHeadCommit;
import static org.junit.Assert.*;
public class GfsMergeConflictingMergeTest extends AbstractGitFileSystemTest implements ParallelGitMergeTest {
private GitFileSystem gfs;
@Before
public void setUp() throws IOException {
initRepository();
writeToCache("/test_file.txt", "base stuff");
AnyObjectId base = commit();
writeToCache("/test_file.txt", "base stuff + some stuff");
commitToBranch(OURS, base);
writeToCache("/test_file.txt", "base stuff + other stuff");
commitToBranch(THEIRS, base);
gfs = newFileSystem(OURS, repo);
}
@Test
public void whenSourceBranchHasConflictingFile_theStatusShouldBeConflicting() throws IOException {
Result result = merge(gfs).source(THEIRS).execute();
assertEquals(CONFLICTING, result.getStatus());
}
@Test
public void whenSourceBranchHasConflictingFile_resultShouldContainTheConflictingFile() throws IOException {
Result result = merge(gfs).source(THEIRS).execute();
assertTrue(result.getConflicts().containsKey("/test_file.txt"));
}
@Test
public void whenSourceBranchHasConflictingFile_theConflictingFileShouldBeFormatted() throws IOException {
merge(gfs).source(THEIRS).execute();
assertEquals("<<<<<<< refs/heads/ours\n" +
"base stuff + some stuff\n" +
"=======\n" +
"base stuff + other stuff\n" +
">>>>>>> refs/heads/theirs\n", readAsString(gfs.getPath("/test_file.txt")));
}
@Test
public void whenConflictIsEncountered_mergeNoteShouldHaveTheSourceBranchHead() throws IOException {
merge(gfs).source(THEIRS).execute();
MergeNote note = gfs.getStatusProvider().mergeNote();
assertNotNull(note);
assertEquals(getHeadCommit(THEIRS, repo), note.getSource());
}
@Test
public void whenConflictIsEncountered_mergeNoteShouldHaveMergeConflictMessage() throws IOException {
merge(gfs).source(THEIRS).execute();
MergeNote note = gfs.getStatusProvider().mergeNote();
assertNotNull(note);
assertNotNull(note.getMessage());
}
@Test
public void squashConflictingBranch_mergeNoteShouldHaveNoSourceCommit() throws IOException {
writeToCache("/test_file.txt", "base stuff + other stuff + some more stuff");
commitToBranch(THEIRS);
merge(gfs).source(THEIRS).squash(true).execute();
MergeNote note = gfs.getStatusProvider().mergeNote();
assertNotNull(note);
assertNull(note.getSource());
}
@Test
public void squashConflictingBranch_mergeNoteShouldHaveMergeConflictMessage() throws IOException {
writeToCache("/test_file.txt", "base stuff + other stuff + some more stuff");
commitToBranch(THEIRS);
merge(gfs).source(THEIRS).squash(true).execute();
MergeNote note = gfs.getStatusProvider().mergeNote();
assertNotNull(note);
assertNotNull(note.getMessage());
}
}