package com.beijunyi.parallelgit.filesystem.commands;
import java.io.IOException;
import java.nio.file.Files;
import com.beijunyi.parallelgit.filesystem.Gfs;
import com.beijunyi.parallelgit.filesystem.PreSetupGitFileSystemTest;
import com.beijunyi.parallelgit.filesystem.commands.GfsCheckout.Result;
import com.beijunyi.parallelgit.filesystem.exceptions.NoBranchException;
import com.beijunyi.parallelgit.utils.BranchUtils;
import com.beijunyi.parallelgit.utils.exceptions.NoSuchBranchException;
import org.eclipse.jgit.lib.ObjectId;
import org.junit.Test;
import static org.junit.Assert.*;
public class GfsCheckoutWithNoConflictTest extends PreSetupGitFileSystemTest {
@Test
public void checkoutWhenThereIsNoLocalChanges_fileSystemShouldRemainClean() throws IOException {
writeSomethingToCache();
commitToBranch("test_branch");
Result result = Gfs.checkout(gfs).target("test_branch").execute();
assertFalse(result.hasConflicts());
assertTrue(result.isSuccessful());
assertFalse(status.isDirty());
}
@Test
public void checkoutWhenLocalChangesDoNotCauseConflict_localChangesShouldBeKept() throws IOException {
writeSomethingToCache();
commitToBranch("test_branch");
writeToGfs("non_conflicting_file.txt");
Result result = Gfs.checkout(gfs).target("test_branch").execute();
assertFalse(result.hasConflicts());
assertTrue(result.isSuccessful());
assertTrue(Files.exists(gfs.getPath("non_conflicting_file.txt")));
}
@Test
public void checkoutBranchWhenThereIsNoConflict_fileSystemShouldAttachToTargetBranch() throws IOException {
writeSomethingToCache();
commitToBranch("test_branch");
Result result = Gfs.checkout(gfs).target("test_branch").execute();
assertFalse(result.hasConflicts());
assertTrue(result.isSuccessful());
assertTrue(status.isAttached());
assertEquals("test_branch", status.branch());
}
@Test
public void checkoutBranchWithDetachOption_fileSystemShouldBecomeDetached() throws IOException {
writeSomethingToCache();
commitToBranch("test_branch");
Result result = Gfs.checkout(gfs).target("test_branch").detach(true).execute();
assertFalse(result.hasConflicts());
assertTrue(result.isSuccessful());
assertFalse(status.isAttached());
}
@Test
public void checkoutBranchWithDetachOption_fileSystemHeadShouldBecomeTheTargetBranchHeadCommit() throws IOException {
writeSomethingToCache();
commitToBranch("test_branch");
Result result = Gfs.checkout(gfs).target("test_branch").detach(true).execute();
assertFalse(result.hasConflicts());
assertTrue(result.isSuccessful());
assertEquals(BranchUtils.getHeadCommit("test_branch", repo), status.commit());
}
@Test
public void checkoutCommitWhenThereIsNoConflict_fileSystemShouldBecomeDetached() throws IOException {
writeSomethingToCache();
ObjectId commitId = commit();
Result result = Gfs.checkout(gfs).target(commitId.name()).execute();
assertFalse(result.hasConflicts());
assertTrue(result.isSuccessful());
assertFalse(status.isAttached());
}
@Test
public void checkoutCommitWhenThereIsNoConflict_fileSystemHeadShouldBecomeTheTargetCommit() throws IOException {
writeSomethingToCache();
ObjectId commitId = commit();
Result result = Gfs.checkout(gfs).target(commitId.name()).execute();
assertFalse(result.hasConflicts());
assertTrue(result.isSuccessful());
assertEquals(commitId, status.commit());
}
@Test(expected = NoBranchException.class)
public void checkoutWithNoTargetSpecified_shouldThrowNoBranchException() throws IOException {
Gfs.checkout(gfs).execute();
}
@Test(expected = NoSuchBranchException.class)
public void checkoutNonExistentBranch_shouldThrowNoSuchBranchException() throws IOException {
Gfs.checkout(gfs).target("non_existent_branch").execute();
}
}