code: package com.beijunyi.parallelgit.utils;
  
  import java.io.IOException;
  import java.util.Arrays;
  import java.util.List;
  
  import com.beijunyi.parallelgit.AbstractParallelGitTest;
  import org.eclipse.jgit.revwalk.RevCommit;
  import org.junit.Before;
  import org.junit.Test;
  
  import static org.junit.Assert.*;
  
  public class CommitUtilsGetFileRevisionsTest extends AbstractParallelGitTest {
  
    @Before
    public void setUp() throws IOException {
      initRepository();
    }
  
    @Test
    public void getFileRevisions_shouldReturnTheCommitsWhereTheSpecifiedFileIsChanged() throws IOException {
      writeSomethingToCache();
      commitToBranch("test_branch");
      writeToCache("/test_file.txt");
      RevCommit commit2 = commitToBranch("test_branch");
      updateFile("/test_file.txt", "some new text data");
      RevCommit commit3 = commitToBranch("test_branch");
      writeSomethingToCache();
      commitToBranch("test_branch");
  
      List<RevCommit> expected = Arrays.asList(commit3, commit2);
      List<RevCommit> actual = CommitUtils.getFileRevisions("/test_file.txt", "test_branch", repo);
      assertEquals(expected, actual);
    }
  
    @Test
    public void getFileRevisionsWhenFileIsNeverChanged_shouldReturnTheCommitWhereTheSpecifiedFileIsCreated() throws IOException {
      writeSomethingToCache();
      commitToBranch("test_branch");
      writeToCache("/test_file.txt");
      RevCommit commit = commitToBranch("test_branch");
      writeSomethingToCache();
      commitToBranch("test_branch");
  
      List<RevCommit> revisions = CommitUtils.getFileRevisions("/test_file.txt", "test_branch", repo);
      assertEquals(1, revisions.size());
      assertEquals(commit, revisions.get(0));
    }
  
    @Test
    public void getFileRevisionsWhenFileNeverExisted_shouldReturnEmptyList() throws IOException {
      writeSomethingToCache();
      commitToBranch("test_branch");
  
      List<RevCommit> revisions = CommitUtils.getFileRevisions("/non_existent_file.txt", "test_branch", repo);
      assertTrue(revisions.isEmpty());
    }
  
    @Test
    public void getFileRevisionsWhenBranchDoesNotExist_shouldReturnEmptyList() throws IOException {
      List<RevCommit> revisions = CommitUtils.getFileRevisions("/non_existent_file.txt", "non_existent_branch", repo);
      assertTrue(revisions.isEmpty());
    }
  
    @Test
    public void getLatestFileRevision_shouldReturnTheLatestCommitThatChangedTheSpecificFile() throws IOException {
      writeSomethingToCache();
      commitToBranch("test_branch");
      writeToCache("/test_file.txt");
      commitToBranch("test_branch");
      updateFile("/test_file.txt", "some new text data");
      RevCommit expected = commitToBranch("test_branch");
      writeSomethingToCache();
      commitToBranch("test_branch");
  
      RevCommit actual = CommitUtils.getLatestFileRevision("/test_file.txt", "test_branch", repo);
      assertEquals(expected, actual);
    }
  
    @Test
    public void getLatestFileRevisionWhenFileNeverExisted_shouldReturnNull() throws IOException {
      writeSomethingToCache();
      commitToBranch("test_branch");
  
      assertNull(CommitUtils.getLatestFileRevision("/non_existent_file.txt", "test_branch", repo));
    }
  
    @Test
    public void getLatestFileRevisionWhenBranchDoesNotExist_shouldReturnNull() throws IOException {
      assertNull(CommitUtils.getLatestFileRevision("/non_existent_file.txt", "non_existent_branch", repo));
    }
  
  }
  