package com.beijunyi.parallelgit.filesystem.commands;
import java.io.IOException;
import com.beijunyi.parallelgit.filesystem.Gfs;
import com.beijunyi.parallelgit.filesystem.PreSetupGitFileSystemTest;
import com.beijunyi.parallelgit.filesystem.io.GfsCheckoutConflict;
import org.eclipse.jgit.lib.ObjectId;
import org.junit.Test;
import static org.eclipse.jgit.lib.Constants.encode;
import static org.junit.Assert.*;
public class GfsCheckoutWithConflictsTest extends PreSetupGitFileSystemTest {
@Test
public void checkoutWhenLocalChangesConflictWithTarget_resultShouldBeUnsuccessful() throws IOException {
writeToCache("conflicting_file.txt", "version A");
commitToBranch("test_branch");
writeToGfs("conflicting_file.txt", "version B");
GfsCheckout.Result result = Gfs.checkout(gfs).target("test_branch").execute();
assertTrue(result.hasConflicts());
assertFalse(result.isSuccessful());
}
@Test
public void checkoutWhenConflictsEncountered_fileSystemHeadShouldNotChange() throws IOException {
ObjectId head = status.commit();
writeToCache("conflicting_file.txt", "version A");
commitToBranch("test_branch");
writeToGfs("conflicting_file.txt", "version B");
GfsCheckout.Result result = Gfs.checkout(gfs).target("test_branch").execute();
assertTrue(result.hasConflicts());
assertFalse(result.isSuccessful());
assertEquals(head, status.commit());
}
@Test
public void checkoutWhenConflictsEncountered_localFilesShouldNotChange() throws IOException {
writeToCache("conflicting_file.txt", "version A");
commitToBranch("test_branch");
writeToGfs("conflicting_file.txt", "version B");
GfsCheckout.Result result = Gfs.checkout(gfs).target("test_branch").execute();
assertTrue(result.hasConflicts());
assertFalse(result.isSuccessful());
assertEquals("version B", readAsString(gfs.getPath("/conflicting_file.txt")));
}
@Test
public void checkoutWhenConflictsEncountered_resultShouldHaveTheConflictingFilePath() throws IOException {
writeToCache("conflicting_file.txt", "version A");
commitToBranch("test_branch");
writeToGfs("conflicting_file.txt", "version B");
GfsCheckout.Result result = Gfs.checkout(gfs).target("test_branch").execute();
assertTrue(result.hasConflicts());
assertFalse(result.isSuccessful());
assertTrue(result.getConflicts().containsKey("/conflicting_file.txt"));
}
@Test
public void checkoutWhenConflictsEncountered_resultShouldHaveAllConflictingVersions() throws IOException {
ObjectId baseVersion = writeToCache("conflicting_file.txt", "version BASE");
ObjectId baseCommit = commitToBranch("test_branch");
ObjectId theirsVersion = writeToCache("conflicting_file.txt", "version THEIRS");
commitToBranch("test_branch");
Gfs.checkout(gfs).target(baseCommit.name()).execute();
byte[] ours = encode("version OURS");
writeToGfs("conflicting_file.txt", ours);
GfsCheckout.Result result = Gfs.checkout(gfs).target("test_branch").execute();
assertTrue(result.hasConflicts());
assertFalse(result.isSuccessful());
GfsCheckoutConflict conflict = result.getConflicts().get("/conflicting_file.txt");
assertEquals(baseVersion, conflict.getHead().getId());
assertEquals(theirsVersion, conflict.getTarget().getId());
assertEquals(calculateBlobId(ours), conflict.getWorktree().getId());
}
@Test
public void checkoutWithForceOption_conflictingFilesShouldBeOverwritten() throws IOException {
writeToCache("conflicting_file.txt", "version A");
commitToBranch("test_branch");
writeToGfs("conflicting_file.txt", "version B");
GfsCheckout.Result result = Gfs.checkout(gfs).target("test_branch").force(true).execute();
assertTrue(result.isSuccessful());
assertEquals("version A", readAsString(gfs.getPath("/conflicting_file.txt")));
}
}