code: package com.beijunyi.parallelgit.utils;
  
  import java.io.IOException;
  
  import com.beijunyi.parallelgit.AbstractParallelGitTest;
  import com.beijunyi.parallelgit.utils.exceptions.RefUpdateRejectedException;
  import org.eclipse.jgit.lib.AnyObjectId;
  import org.eclipse.jgit.revwalk.RevCommit;
  import org.junit.Before;
  import org.junit.Test;
  
  import static com.beijunyi.parallelgit.utils.BranchUtils.*;
  import static com.beijunyi.parallelgit.utils.RefUtils.getBranchRef;
  import static org.eclipse.jgit.api.MergeResult.MergeStatus.FAST_FORWARD;
  import static org.junit.Assert.assertEquals;
  
  public class BranchUtilsSetBranchHeadTest extends AbstractParallelGitTest {
  
    private static final String TEST_BRANCH = "test_branch";
    private RevCommit branchHead;
  
    @Before
    public void setUpBranch() throws IOException {
      AnyObjectId masterHead = initMemoryRepository(false);
      writeSomethingToCache();
      branchHead = commitToBranch(TEST_BRANCH, masterHead);
    }
  
    @Test
    public void createNewCommit_branchHeadShouldBecomeTheNewCommit() throws IOException {
      writeSomethingToCache();
      AnyObjectId childCommit = commit(branchHead);
      newCommit(TEST_BRANCH, childCommit, repo);
      assertEquals(childCommit, getHeadCommit(TEST_BRANCH, repo));
    }
  
    @Test(expected = RefUpdateRejectedException.class)
    public void createNewCommitWhenNewCommitHasDifferentAncestor_shouldThrowRefUpdateRejectedException() throws IOException {
      writeSomethingToCache();
      AnyObjectId nonChildCommit = commit();
      newCommit(TEST_BRANCH, nonChildCommit, repo);
    }
  
    @Test
    public void amendBranchHead_branchHeadShouldBecomeTheSpecifiedCommit() throws IOException {
      writeSomethingToCache();
      AnyObjectId amendedCommit = commit(branchHead.getParent(0));
      BranchUtils.amendCommit(TEST_BRANCH, amendedCommit, repo);
      assertEquals(amendedCommit, getHeadCommit(TEST_BRANCH, repo));
    }
  
    @Test
    public void commitAfterMerge_branchHeadShouldBecomeTheSpecifiedCommit() throws IOException {
      writeSomethingToCache();
      AnyObjectId mergedCommit = commit(branchHead);
      BranchUtils.mergeCommit(TEST_BRANCH, mergedCommit, repo);
      assertEquals(mergedCommit, getHeadCommit(TEST_BRANCH, repo));
    }
  
    @Test
    public void cherryPickCommit_branchHeadShouldBecomeTheSpecifiedCommit() throws IOException {
      writeSomethingToCache();
      AnyObjectId cherryPickedCommit = commit(branchHead);
      BranchUtils.cherryPick(TEST_BRANCH, cherryPickedCommit, repo);
      assertEquals(cherryPickedCommit, getHeadCommit(TEST_BRANCH, repo));
    }
  
    @Test
    public void mergeBranch_branchHeadShouldBecomeTheSpecifiedCommit() throws IOException {
      writeSomethingToCache();
      AnyObjectId branchHeadCommit = commitToBranch("test_branch", branchHead);
      BranchUtils.merge(TEST_BRANCH, branchHeadCommit, getBranchRef("test_branch", repo), FAST_FORWARD.toString(), repo);
      assertEquals(branchHeadCommit, getHeadCommit(TEST_BRANCH, repo));
    }
  
  }
  