code: package com.beijunyi.parallelgit.filesystem.commands;
  
  import java.io.IOException;
  
  import com.beijunyi.parallelgit.AbstractParallelGitTest;
  import com.beijunyi.parallelgit.filesystem.Gfs;
  import com.beijunyi.parallelgit.filesystem.GitFileSystem;
  import com.beijunyi.parallelgit.filesystem.ParallelGitMergeTest;
  import com.beijunyi.parallelgit.filesystem.commands.GfsMerge.Result;
  import org.eclipse.jgit.lib.AnyObjectId;
  import org.eclipse.jgit.lib.ObjectId;
  import org.junit.After;
  import org.junit.Before;
  import org.junit.Test;
  
  import static com.beijunyi.parallelgit.filesystem.Gfs.merge;
  import static com.beijunyi.parallelgit.filesystem.commands.GfsMerge.Status.ALREADY_UP_TO_DATE;
  import static com.beijunyi.parallelgit.utils.BranchUtils.getHeadCommit;
  import static java.nio.file.Files.*;
  import static org.junit.Assert.*;
  
  public class GfsMergeUpToDateTest extends AbstractParallelGitTest implements ParallelGitMergeTest {
  
    private GitFileSystem gfs;
  
    @Before
    public void setUp() throws Exception {
      initRepository();
      AnyObjectId base = commit();
      AnyObjectId theirs = commitToBranch(THEIRS, base);
      commitToBranch(OURS, theirs);
      gfs = Gfs.newFileSystem(OURS, repo);
    }
  
    @After
    public void tearDown() throws IOException {
      if(gfs != null) {
        gfs.close();
        gfs = null;
      }
    }
  
    @Test
    public void mergeWhenHeadIsAheadOfSourceBranch_theResultShouldBeAlreadyUpToDate() throws Exception {
      Result result = merge(gfs).source(THEIRS).execute();
  
      assertTrue(result.isSuccessful());
      assertEquals(ALREADY_UP_TO_DATE, result.getStatus());
    }
  
    @Test
    public void mergeWhenHeadIsAheadWithLocalChanges_theResultShouldBeAlreadyUpToDate() throws Exception {
      write(gfs.getPath("/some_file.txt"), someBytes());
      Result result = merge(gfs).source(THEIRS).execute();
  
      assertTrue(result.isSuccessful());
      assertEquals(ALREADY_UP_TO_DATE, result.getStatus());
    }
  
    @Test
    public void mergeWhenHeadIsAheadWithLocalChanges_theLocalChangesShouldBeKept() throws Exception {
      write(gfs.getPath("/test_file.txt"), someBytes());
      Result result = merge(gfs).source(THEIRS).execute();
  
      assertTrue(result.isSuccessful());
      assertTrue(exists(gfs.getPath("/test_file.txt")));
    }
  
    @Test
    public void mergeWhenHeadIsAheadWithLocalChanges_theResultCommitShouldBeTheHeadOfLocalBranch() throws IOException {
      ObjectId expected = getHeadCommit(OURS, repo);
      Result result = merge(gfs).source(THEIRS).execute();
  
      assertTrue(result.isSuccessful());
      assertEquals(ALREADY_UP_TO_DATE, result.getStatus());
      assertEquals(expected, result.getCommit());
    }
  
  }
  