code: package com.beijunyi.parallelgit.filesystem;
  
  import java.io.IOException;
  
  import org.junit.Before;
  import org.junit.Test;
  
  import static org.junit.Assert.assertEquals;
  
  public class GitPathRelativizeTest extends AbstractGitFileSystemTest {
  
    @Before
    public void setupFileSystem() throws IOException {
      initGitFileSystem();
    }
  
    @Test
    public void absolutePathRelativizesParentTest() {
      GitPath path = gfs.getPath("/a/b/c");
      GitPath parent = gfs.getPath("/a/b");
      GitPath result = path.relativize(parent);
      assertEquals("..", result.toString());
    }
  
    @Test
    public void absolutePathRelativizesGrandParentTest() {
      GitPath path = gfs.getPath("/a/b/c");
      GitPath parent = gfs.getPath("/a");
      GitPath result = path.relativize(parent);
      assertEquals("../..", result.toString());
    }
  
    @Test
    public void absolutePathRelativizesChildTest() {
      GitPath path = gfs.getPath("/a/b");
      GitPath child = gfs.getPath("/a/b/c");
      GitPath result = path.relativize(child);
      assertEquals("c", result.toString());
    }
  
    @Test
    public void absolutePathRelativizesGrandChildTest() {
      GitPath path = gfs.getPath("/a");
      GitPath child = gfs.getPath("/a/b/c");
      GitPath result = path.relativize(child);
      assertEquals("b/c", result.toString());
    }
  
    @Test
    public void absolutePathRelativizesSiblingTest() {
      GitPath path = gfs.getPath("/a/b/c");
      GitPath sibling = gfs.getPath("/a/b/d");
      GitPath result = path.relativize(sibling);
      assertEquals("../d", result.toString());
    }
  
    @Test
    public void absolutePathRelativizesSamePathTest() {
      GitPath path = gfs.getPath("/a/b/c");
      GitPath samePath = gfs.getPath("/a/b/c");
      GitPath result = path.relativize(samePath);
      assertEquals("", result.toString());
    }
  
    @Test(expected = IllegalArgumentException.class)
    public void absolutePathRelativizesEmptyPathTest() {
      GitPath path = gfs.getPath("/a/b/c");
      GitPath emptyPath = gfs.getPath("");
      path.relativize(emptyPath);
    }
  
    @Test(expected = IllegalArgumentException.class)
    public void absolutePathRelativizesRelativePathTest() {
      GitPath path = gfs.getPath("/a/b");
      GitPath relativePath = gfs.getPath("a/b/c");
      path.relativize(relativePath);
    }
  
    @Test
    public void rootPathRelativizesAbsolutePathTest() {
      GitPath path = gfs.getPath("/");
      GitPath absolutePath = gfs.getPath("/a/b/c");
      GitPath result = path.relativize(absolutePath);
      assertEquals("a/b/c", result.toString());
    }
  
    @Test
    public void rootPathRelativizesRootPathTest() {
      GitPath path = gfs.getPath("/");
      GitPath rootPath = gfs.getPath("/");
      GitPath result = path.relativize(rootPath);
      assertEquals("", result.toString());
    }
  
    @Test(expected = IllegalArgumentException.class)
    public void rootPathRelativizesRelativePathTest() {
      GitPath path = gfs.getPath("/");
      GitPath relativePath = gfs.getPath("a/b/c");
      GitPath result = path.relativize(relativePath);
      assertEquals(relativePath.toString(), result.toString());
    }
  
    @Test
    public void relativePathRelativizesParentTest() {
      GitPath path = gfs.getPath("a/b/c");
      GitPath parent = gfs.getPath("a/b");
      GitPath result = path.relativize(parent);
      assertEquals("..", result.toString());
    }
  
    @Test
    public void relativePathRelativizesGrandParentTest() {
      GitPath path = gfs.getPath("a/b/c");
      GitPath parent = gfs.getPath("a");
      GitPath result = path.relativize(parent);
      assertEquals("../..", result.toString());
    }
  
    @Test
    public void relativePathRelativizesChildTest() {
      GitPath path = gfs.getPath("a/b");
      GitPath child = gfs.getPath("a/b/c");
      GitPath result = path.relativize(child);
      assertEquals("c", result.toString());
    }
  
    @Test
    public void relativePathRelativizesGrandChildTest() {
      GitPath path = gfs.getPath("a");
      GitPath child = gfs.getPath("a/b/c");
      GitPath result = path.relativize(child);
      assertEquals("b/c", result.toString());
    }
  
    @Test
    public void relativePathRelativizesSiblingTest() {
      GitPath path = gfs.getPath("/a/b/c");
      GitPath sibling = gfs.getPath("/a/b/d");
      GitPath result = path.relativize(sibling);
      assertEquals("../d", result.toString());
    }
  
    @Test
    public void relativePathRelativizesSamePathTest() {
      GitPath path = gfs.getPath("a/b/c");
      GitPath samePath = gfs.getPath("a/b/c");
      GitPath result = path.relativize(samePath);
      assertEquals("", result.toString());
    }
  
    @Test
    public void relativePathRelativizesEmptyPathTest() {
      GitPath path = gfs.getPath("a/b/c");
      GitPath emptyPath = gfs.getPath("");
      GitPath result = path.relativize(emptyPath);
      assertEquals("../../..", result.toString());
    }
  
    @Test(expected = IllegalArgumentException.class)
    public void relativePathRelativizesAbsolutePathTest() {
      GitPath path = gfs.getPath("a/b");
      GitPath absolutePath = gfs.getPath("/a/b/c");
      path.relativize(absolutePath);
    }
  
    @Test(expected = IllegalArgumentException.class)
    public void emptyPathRelativizesAbsolutePathTest() {
      GitPath path = gfs.getPath("");
      GitPath absolutePath = gfs.getPath("/a/b/c");
      GitPath result = path.relativize(absolutePath);
      assertEquals(absolutePath.toString(), result.toString());
    }
  
    @Test
    public void emptyPathRelativizesRelativePathTest() {
      GitPath path = gfs.getPath("");
      GitPath relativePath = gfs.getPath("a/b/c");
      GitPath result = path.relativize(relativePath);
      assertEquals(relativePath.toString(), result.toString());
    }
  
    @Test
    public void emptyPathRelativizesEmptyPathTest() {
      GitPath path = gfs.getPath("");
      GitPath emptyPath = gfs.getPath("");
      GitPath result = path.relativize(emptyPath);
      assertEquals(emptyPath.toString(), result.toString());
    }
  
  }
  