code: package com.beijunyi.parallelgit.filesystem.io;
  
  import java.io.IOException;
  import java.nio.file.Files;
  import javax.annotation.Nonnull;
  
  import com.beijunyi.parallelgit.filesystem.AbstractGitFileSystemTest;
  import com.beijunyi.parallelgit.utils.CacheUtils;
  import org.eclipse.jgit.dircache.DirCache;
  import org.eclipse.jgit.dircache.DirCacheBuilder;
  import org.eclipse.jgit.dircache.DirCacheEntry;
  import org.junit.Test;
  
  import static com.beijunyi.parallelgit.utils.TreeUtils.normalizeNodePath;
  import static java.util.Collections.singleton;
  import static org.eclipse.jgit.dircache.DirCacheEntry.*;
  import static org.eclipse.jgit.lib.FileMode.REGULAR_FILE;
  import static org.junit.Assert.*;
  
  public class GfsDefaultCheckoutCacheTest extends AbstractGitFileSystemTest {
  
    @Test
    public void checkoutCacheWithNonConflictingFileAtRootLevel_theFileShouldExistAfterTheOperation() throws IOException {
      initGitFileSystem("/some_existing_file.txt");
      DirCache cache = createCacheWithFile("/test_file.txt");
      new GfsDefaultCheckout(gfs).checkout(cache);
      assertTrue(Files.exists(gfs.getPath("/test_file.txt")));
    }
  
    @Test
    public void checkoutCacheWithNonConflictingFileInDirectory_theFileShouldExistAfterTheOperation() throws IOException {
      initGitFileSystem("/some_existing_file.txt");
      DirCache cache = createCacheWithFile("/dir/test_file.txt");
      new GfsDefaultCheckout(gfs).checkout(cache);
      assertTrue(Files.exists(gfs.getPath("/dir/test_file.txt")));
    }
  
    @Test(expected = IllegalStateException.class)
    public void checkoutCacheWithMultiStagesFile_shouldThrowIllegalStateException() throws IOException {
      initGitFileSystem("/some_existing_file.txt");
  
      DirCache cache = DirCache.newInCore();
      DirCacheBuilder builder = cache.builder();
      builder.add(someEntry("/test_file.txt", STAGE_1));
      builder.add(someEntry("/test_file.txt", STAGE_2));
      builder.add(someEntry("/test_file.txt", STAGE_3));
      builder.finish();
  
      new GfsDefaultCheckout(gfs).checkout(cache);
    }
  
    @Test
    public void checkoutCacheWithIgnoringSomeFile_theIgnoredFileShouldNotBeCheckedOut() throws IOException {
      initGitFileSystem("/some_existing_file.txt");
  
      DirCache cache = DirCache.newInCore();
      DirCacheBuilder builder = cache.builder();
      builder.add(someEntry("/test_file1.txt"));
      builder.add(someEntry("/test_file2.txt"));
      builder.add(someEntry("/test_file3.txt"));
      builder.finish();
      new GfsDefaultCheckout(gfs).ignoredFiles(singleton("/test_file2.txt")).checkout(cache);
  
      assertTrue(Files.exists(gfs.getPath("/test_file1.txt")));
      assertFalse(Files.exists(gfs.getPath("/test_file2.txt")));
      assertTrue(Files.exists(gfs.getPath("/test_file3.txt")));
    }
  
    @Test
    public void checkoutCacheWithIgnoringMultiStagesFile_theIgnoredFileShouldNotBeCheckedOut() throws IOException {
      initGitFileSystem("/some_existing_file.txt");
  
      DirCache cache = DirCache.newInCore();
      DirCacheBuilder builder = cache.builder();
      builder.add(someEntry("/test_file.txt", STAGE_1));
      builder.add(someEntry("/test_file.txt", STAGE_2));
      builder.add(someEntry("/test_file.txt", STAGE_3));
      builder.finish();
      new GfsDefaultCheckout(gfs).ignoredFiles(singleton("/test_file.txt")).checkout(cache);
  
      assertFalse(Files.exists(gfs.getPath("/test_file.txt")));
    }
  
    @Nonnull
    private DirCache createCacheWithFile(String path) throws IOException {
      DirCache cache = DirCache.newInCore();
      CacheUtils.addFile(path, REGULAR_FILE, someObjectId(), cache);
      return cache;
    }
  
    @Nonnull
    private DirCacheEntry someEntry(String path, int stage) {
      DirCacheEntry ret = new DirCacheEntry(normalizeNodePath(path), stage);
      ret.setFileMode(REGULAR_FILE);
      ret.setObjectId(someObjectId());
      return ret;
    }
  
    @Nonnull
    private DirCacheEntry someEntry(String path) {
      return someEntry(path, STAGE_0);
    }
  
  
  }
  