code: package com.beijunyi.parallelgit.utils;
  
  import java.io.IOException;
  
  import com.beijunyi.parallelgit.AbstractParallelGitTest;
  import com.beijunyi.parallelgit.utils.exceptions.BranchAlreadyExistsException;
  import com.beijunyi.parallelgit.utils.exceptions.NoSuchCommitException;
  import org.eclipse.jgit.lib.AnyObjectId;
  import org.eclipse.jgit.revwalk.RevCommit;
  import org.junit.Before;
  import org.junit.Test;
  
  import static org.junit.Assert.*;
  
  public class BranchUtilsCreateBranchTest extends AbstractParallelGitTest {
  
    @Before
    public void setUp() throws IOException {
      initRepository();
    }
  
    @Test
    public void createBranch_theNewBranchShouldExistAfterTheOperation() throws IOException {
      writeSomethingToCache();
      AnyObjectId commit = commitToMaster();
      BranchUtils.createBranch("test_branch", commit.getName(), repo);
      assertTrue(BranchUtils.branchExists("test_branch", repo));
    }
  
    @Test
    public void createBranchFromCommitId_theHeadOfTheNewBranchShouldEqualToTheSpecifiedCommit() throws IOException {
      writeSomethingToCache();
      AnyObjectId commit = commitToMaster();
      BranchUtils.createBranch("test_branch", commit, repo);
      assertEquals(commit, BranchUtils.getHeadCommit("test_branch", repo));
    }
  
    @Test
    public void createBranchFromCommitName_theHeadOfTheNewBranchShouldEqualToTheSpecifiedCommit() throws IOException {
      writeSomethingToCache();
      AnyObjectId commit = commitToMaster();
      BranchUtils.createBranch("test_branch", commit.getName(), repo);
      assertEquals(commit, BranchUtils.getHeadCommit("test_branch", repo));
    }
  
    @Test
    public void createBranchFromCommit_theHeadOfTheNewBranchShouldEqualToTheSpecifiedCommit() throws IOException {
      writeSomethingToCache();
      RevCommit commit = commitToMaster();
      BranchUtils.createBranch("test_branch", commit, repo);
      assertEquals(commit, BranchUtils.getHeadCommit("test_branch", repo));
    }
  
    @Test
    public void createBranchFromBranchRef_theHeadsOfTheTwoBranchesShouldEqual() throws IOException {
      writeSomethingToCache();
      commitToBranch("source_branch");
      BranchUtils.createBranch("test_branch", repo.findRef("source_branch"), repo);
      assertEquals(BranchUtils.getHeadCommit("source_branch", repo), BranchUtils.getHeadCommit("test_branch", repo));
    }
  
    @Test
    public void createBranchFromBranchName_theHeadsOfTheTwoBranchesShouldEqual() throws IOException {
      writeSomethingToCache();
      commitToBranch("source_branch");
      BranchUtils.createBranch("test_branch", "source_branch", repo);
      assertEquals(BranchUtils.getHeadCommit("source_branch", repo), BranchUtils.getHeadCommit("test_branch", repo));
    }
  
    @Test
    public void createBranchFromTagRef_theHeadOfTheNewBranchShouldEqualToTheTaggedCommit() throws IOException {
      writeSomethingToCache();
      TagUtils.tagCommit("source_tag", commitToMaster(), repo);
      BranchUtils.createBranch("test_branch", repo.findRef("source_tag"), repo);
      assertEquals(TagUtils.getTaggedCommit("source_tag", repo), BranchUtils.getHeadCommit("test_branch", repo));
    }
  
    @Test
    public void createBranchFromTagName_theHeadOfTheNewBranchShouldEqualToTheTaggedCommit() throws IOException {
      writeSomethingToCache();
      TagUtils.tagCommit("source_tag", commitToMaster(), repo);
      BranchUtils.createBranch("test_branch", "source_tag", repo);
      assertEquals(TagUtils.getTaggedCommit("source_tag", repo), BranchUtils.getHeadCommit("test_branch", repo));
    }
  
    @Test
    public void createBranchFromTag_theHeadOfTheNewBranchShouldEqualToTheTaggedCommit() throws IOException {
      writeSomethingToCache();
      TagUtils.tagCommit("source_tag", commitToMaster(), repo);
      BranchUtils.createBranch("test_branch", repo.resolve("source_tag"), repo);
      assertEquals(TagUtils.getTaggedCommit("source_tag", repo), BranchUtils.getHeadCommit("test_branch", repo));
    }
  
    @Test(expected = BranchAlreadyExistsException.class)
    public void createBranchWhenBranchAlreadyExists_shouldThrowBranchAlreadyExistsException() throws IOException {
      writeSomethingToCache();
      AnyObjectId commit = commitToMaster();
      BranchUtils.createBranch("test_branch", commit.getName(), repo);
      BranchUtils.createBranch("test_branch", commit.getName(), repo);
    }
  
    @Test(expected = NoSuchCommitException.class)
    public void createBranchFromNonExistentStartPoint_shouldThrowNoSuchRevisionException() throws IOException {
      BranchUtils.createBranch("test_branch", "non_existent_start_point", repo);
    }
  
  }
  