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()); } }