code: package com.beijunyi.parallelgit.filesystem;
  
  import java.io.IOException;
  import java.nio.file.Files;
  
  import org.junit.Before;
  import org.junit.Test;
  
  import static org.junit.Assert.assertTrue;
  
  public class FilesIsSameFileTest extends AbstractGitFileSystemTest {
  
    @Before
    public void setupFileSystem() throws IOException {
      initGitFileSystem();
    }
  
    @Test
    public void sameAbsolutePathsIsSameFileTest() throws IOException {
      GitPath p1 = gfs.getPath("/a/b");
      GitPath p2 = gfs.getPath("/a/b");
      assertTrue(Files.isSameFile(p1, p2));
    }
  
    @Test
    public void absolutePathsWithDotsIsSameFileTest() throws IOException {
      GitPath p1 = gfs.getPath("/a/b");
      GitPath p2 = gfs.getPath("/a/b/.");
      GitPath p3 = gfs.getPath("/a/./b");
      assertTrue(Files.isSameFile(p1, p2));
      assertTrue(Files.isSameFile(p1, p3));
      assertTrue(Files.isSameFile(p2, p3));
    }
  
    @Test
    public void absolutePathsWithDoubleDotsIsSameFileTest() throws IOException {
      GitPath p1 = gfs.getPath("/a/b.");
      GitPath p2 = gfs.getPath("/a/../a/b");
      GitPath p3 = gfs.getPath("/a/b/../b");
      GitPath p4 = gfs.getPath("/a/b/c/..");
      assertTrue(Files.isSameFile(p1, p2));
      assertTrue(Files.isSameFile(p1, p3));
      assertTrue(Files.isSameFile(p1, p4));
      assertTrue(Files.isSameFile(p2, p3));
      assertTrue(Files.isSameFile(p2, p4));
      assertTrue(Files.isSameFile(p3, p4));
    }
  
    @Test
    public void sameRelativePathsIsSameFileTest() throws IOException {
      GitPath p1 = gfs.getPath("a/b");
      GitPath p2 = gfs.getPath("a/b");
      assertTrue(Files.isSameFile(p1, p2));
    }
  
    @Test
    public void relativePathsWithDotsIsSameFileTest() throws IOException {
      GitPath p1 = gfs.getPath("a/b");
      GitPath p2 = gfs.getPath("a/b/.");
      GitPath p3 = gfs.getPath("a/./b");
      assertTrue(Files.isSameFile(p1, p2));
      assertTrue(Files.isSameFile(p1, p3));
      assertTrue(Files.isSameFile(p2, p3));
    }
  
    @Test
    public void relativePathsWithDoubleDotsIsSameFileTest() throws IOException {
      GitPath p1 = gfs.getPath("a/b.");
      GitPath p2 = gfs.getPath("a/../a/b");
      GitPath p3 = gfs.getPath("a/b/../b");
      GitPath p4 = gfs.getPath("a/b/c/..");
      assertTrue(Files.isSameFile(p1, p2));
      assertTrue(Files.isSameFile(p1, p3));
      assertTrue(Files.isSameFile(p1, p4));
      assertTrue(Files.isSameFile(p2, p3));
      assertTrue(Files.isSameFile(p2, p4));
      assertTrue(Files.isSameFile(p3, p4));
    }
  
    @Test
    public void mixAbsoluteAndRelativesPathIsSameFileTest() throws IOException {
      GitPath p1 = gfs.getPath("/a/b");
      GitPath p2 = gfs.getPath("a/b");
      assertTrue(Files.isSameFile(p1, p2));
    }
  }
  