code: 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.commands.GfsCommit.Result;
  import org.eclipse.jgit.lib.PersonIdent;
  import org.eclipse.jgit.revwalk.RevCommit;
  import org.junit.Test;
  
  import static org.junit.Assert.*;
  
  public class GfsCommitTest extends PreSetupGitFileSystemTest {
  
    @Test
    public void commitInBranch_theResultCommitShouldEqualTheHeadOfTheAttachedBranch() throws IOException {
      writeSomethingToGfs();
      Result result = Gfs.commit(gfs).execute();
      assertEquals(repo.resolve(gfs.getStatusProvider().branch()), result.getCommit());
    }
  
    @Test
    public void commitNoChange_theResultShouldBeUnsuccessful() throws IOException {
      Result result = Gfs.commit(gfs).execute();
      assertFalse(result.isSuccessful());
    }
  
    @Test
    public void commitNoChangeWithAllowEmptyOption_theResultsShouldBeSuccessful() throws IOException {
      Result result = Gfs.commit(gfs).allowEmpty(true).execute();
      assertTrue(result.isSuccessful());
    }
  
    @Test
    public void commitNoChangeWithAllowEmptyOption_newCommitShouldBeCreated() throws IOException {
      RevCommit currentHead = gfs.getStatusProvider().commit();
      Result result = Gfs.commit(gfs).allowEmpty(true).execute();
      assertNotEquals(currentHead, result.getCommit());
    }
  
    @Test
    public void commitNoChangeWithAllowEmptyOption_theResultCommitShouldHaveTheSameTree() throws IOException {
      RevCommit currentHead = gfs.getStatusProvider().commit();
      Result result = Gfs.commit(gfs).allowEmpty(true).execute();
      assertEquals(currentHead.getTree(), result.getCommit().getTree());
    }
  
    @Test
    public void commitWithMessage_theResultCommitShouldHaveTheSpecifiedMessage() throws IOException {
      writeSomethingToGfs();
      Result result = Gfs.commit(gfs).message("test_message").execute();
      assertEquals("test_message", result.getCommit().getFullMessage());
    }
  
    @Test
    public void commitWithAuthor_theResultCommitShouldHaveTheSpecifiedAuthor() throws IOException {
      writeSomethingToGfs();
      PersonIdent author = new PersonIdent("test_author_name", "test_author@email.com");
      Result result = Gfs.commit(gfs).author(author).execute();
      assertEquals(author, result.getCommit().getAuthorIdent());
    }
  
    @Test
    public void commitWithCommitter_theResultCommitShouldHaveTheSpecifiedCommitter() throws IOException {
      writeSomethingToGfs();
      PersonIdent committer = new PersonIdent("test_committer_name", "test_committer@email.com");
      Result result = Gfs.commit(gfs).committer(committer).execute();
      assertEquals(committer, result.getCommit().getCommitterIdent());
    }
  
    @Test
    public void commitWithCommitterOnly_theResultCommitAuthorShouldDefaultToBeTheSameAsTheSpecifiedCommitter() throws IOException {
      writeSomethingToGfs();
      PersonIdent committer = new PersonIdent("test_committer_name", "test_committer@email.com");
      Result result = Gfs.commit(gfs).committer(committer).execute();
      assertEquals(committer, result.getCommit().getAuthorIdent());
    }
  
    @Test
    public void commitWithAuthorAndCommitter_theResultCommitShouldHaveTheSpecifiedAuthorAndCommitter() throws IOException {
      writeSomethingToGfs();
      PersonIdent author = new PersonIdent("test_author_name", "test_author@email.com");
      PersonIdent committer = new PersonIdent("test_committer_name", "test_committer@email.com");
      Result result = Gfs.commit(gfs).committer(committer).author(author).execute();
      RevCommit resultCommit = result.getCommit();
      assertEquals(author, resultCommit.getAuthorIdent());
      assertEquals(committer, resultCommit.getCommitterIdent());
    }
  
    @Test
    public void amendCommit_theResultCommitShouldHaveTheSameParentsAsTheAmendedCommit() throws IOException {
      RevCommit[] parents = gfs.getStatusProvider().commit().getParents();
      writeSomethingToGfs();
      Result result = Gfs.commit(gfs).amend(true).execute();
      assertArrayEquals(parents, result.getCommit().getParents());
    }
  
    @Test
    public void amendInBranch_theResultCommitShouldEqualTheHeadOfTheAttachedBranch() throws IOException {
      writeSomethingToGfs();
      Result result = Gfs.commit(gfs).amend(true).execute();
      assertEquals(repo.resolve(gfs.getStatusProvider().branch()), result.getCommit());
    }
  
    @Test
    public void amendCommitMessage_theResultCommitShouldHaveTheNewMessage() throws IOException {
      Result result = Gfs.commit(gfs).message("test_message").amend(true).execute();
      assertEquals("test_message", result.getCommit().getFullMessage());
    }
  
    @Test
    public void amendCommitAuthor_theResultCommitShouldHaveTheInputAuthor() throws IOException {
      PersonIdent author = new PersonIdent("test_author_name", "test_author@email.com");
      Result result = Gfs.commit(gfs).author(author).amend(true).execute();
      assertEquals(author, result.getCommit().getAuthorIdent());
    }
  
    @Test
    public void amendCommitCommitter_theResultCommitShouldHaveTheInputCommitter() throws IOException {
      PersonIdent committer = new PersonIdent("test_committer_name", "test_committer@email.com");
      Result result = Gfs.commit(gfs).committer(committer).amend(true).execute();
      assertEquals(committer, result.getCommit().getCommitterIdent());
    }
  
  
  
  }
  