code: package com.beijunyi.parallelgit.filesystem.commands;
  
  import java.io.IOException;
  
  import com.beijunyi.parallelgit.filesystem.AbstractGitFileSystemTest;
  import com.beijunyi.parallelgit.filesystem.Gfs;
  import com.beijunyi.parallelgit.filesystem.commands.GfsApplyStash.Result;
  import com.beijunyi.parallelgit.utils.RepositoryUtils;
  import org.junit.Before;
  import org.junit.Test;
  
  import static com.beijunyi.parallelgit.filesystem.Gfs.*;
  import static java.nio.file.Files.readAllBytes;
  import static org.eclipse.jgit.util.RawParseUtils.decode;
  import static org.junit.Assert.*;
  
  public class GfsApplyStashTest extends AbstractGitFileSystemTest {
  
    @Before
    public void setUp() throws IOException {
      initFileRepository(true);
      RepositoryUtils.setRefLogEnabled(true, repo);
      initGitFileSystem();
    }
  
    @Test
    public void applyStash_theLatestStashedChangesShouldAppearInTheFileSystem() throws IOException {
      byte[] expected = someBytes();
      writeToGfs("/test_file.txt", expected);
      createStash(gfs).execute();
      reset(gfs).execute();
      Result result = applyStash(gfs).execute();
  
      assertTrue(result.isSuccessful());
      assertArrayEquals(expected, readAllBytes(gfs.getPath("/test_file.txt")));
    }
  
    @Test
    public void applySpecificStash_theCorrespondingStashedChangesShouldAppearInTheFileSystem() throws IOException {
      byte[] expected = someBytes();
      writeToGfs("/test_file.txt", expected);
      createStash(gfs).execute();
      reset(gfs).execute();
  
      writeSomethingToGfs();
      createStash(gfs).execute();
      reset(gfs).execute();
  
      Result result = applyStash(gfs).stash(1).execute();
  
      assertTrue(result.isSuccessful());
      assertArrayEquals(expected, readAllBytes(gfs.getPath("/test_file.txt")));
    }
  
    @Test
    public void applyStashWithConflicts_theResultShouldContainTheConflicts() throws IOException {
      writeToGfs("/test_file.txt", someBytes());
      createStash(gfs).execute();
      reset(gfs).execute();
  
      writeToGfs("/test_file.txt", someBytes());
      Gfs.commit(gfs).execute();
  
      Result result = applyStash(gfs).execute();
  
      assertTrue(result.hasConflicts());
      assertTrue(result.getConflicts().containsKey("/test_file.txt"));
    }
  
    @Test
    public void applyStashWithConflicts_theConflictingFileShouldBeFormatted() throws IOException {
      writeToGfs("/test_file.txt", "version A");
      createStash(gfs).execute();
      reset(gfs).execute();
  
      writeToGfs("/test_file.txt", "version B");
      Gfs.commit(gfs).execute();
  
      Result result = applyStash(gfs).execute();
  
      assertTrue(result.hasConflicts());
      assertEquals("<<<<<<< Updated upstream\n" +
                   "version B\n" +
                   "=======\n" +
                   "version A\n" +
                   ">>>>>>> Stashed changes\n", decode(readAllBytes(gfs.getPath("/test_file.txt"))));
    }
  
  }
  