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 GitPathNormalizeTest extends AbstractGitFileSystemTest {
  
    @Before
    public void setupFileSystem() throws IOException {
      initGitFileSystem();
    }
  
    @Test
    public void normalizesAbsolutePathTest() {
      GitPath path = gfs.getPath("/a/b");
      GitPath result = path.normalize();
      assertEquals("/a/b", result.toString());
    }
  
    @Test
    public void normalizesAbsolutePathWithDotsTest() {
      GitPath path = gfs.getPath("/a/./b/.");
      GitPath result = path.normalize();
      assertEquals("/a/b", result.toString());
    }
  
    @Test
    public void normalizesAbsolutePathWithJustDotsTest() {
      GitPath path = gfs.getPath("/./.");
      GitPath result = path.normalize();
      assertEquals("/", result.toString());
    }
  
    @Test
    public void normalizesAbsolutePathWithDoubleDotsTest() {
      GitPath path = gfs.getPath("/a/c/../b/../b");
      GitPath result = path.normalize();
      assertEquals("/a/b", result.toString());
    }
  
    @Test
    public void normalizesAbsolutePathWithMoreDoubleDotsThanNamesTest() {
      GitPath path = gfs.getPath("/a/../..");
      GitPath result = path.normalize();
      assertEquals("/", result.toString());
    }
  
    @Test
    public void normalizesAbsolutePathWithJustDoubleDotsTest() {
      GitPath path = gfs.getPath("/../..");
      GitPath result = path.normalize();
      assertEquals("/", result.toString());
    }
  
    @Test
    public void normalizesAbsolutePathWithDotsAndDoubleDotsTest() {
      GitPath path = gfs.getPath("/./a/./c/../b/../b");
      GitPath result = path.normalize();
      assertEquals("/a/b", result.toString());
    }
  
    @Test
    public void normalizesRootPathTest() {
      GitPath path = gfs.getPath("/");
      GitPath result = path.normalize();
      assertEquals("/", result.toString());
    }
  
    @Test
    public void normalizesRelativePathTest() {
      GitPath path = gfs.getPath("a/b");
      GitPath result = path.normalize();
      assertEquals("a/b", result.toString());
    }
  
    @Test
    public void normalizesRelativePathWithDotsTest() {
      GitPath path = gfs.getPath("a/./b/.");
      GitPath result = path.normalize();
      assertEquals("a/b", result.toString());
    }
  
    @Test
    public void normalizesRelativePathWithJustDotsTest() {
      GitPath path = gfs.getPath("./.");
      GitPath result = path.normalize();
      assertEquals("", result.toString());
    }
  
    @Test
    public void normalizesRelativePathWithDoubleDotsTest() {
      GitPath path = gfs.getPath("a/c/../b/../b");
      GitPath result = path.normalize();
      assertEquals("a/b", result.toString());
    }
  
    @Test
    public void normalizesRelativePathWithMoreDoubleDotsThanNamesTest() {
      GitPath path = gfs.getPath("a/../..");
      GitPath result = path.normalize();
      assertEquals("..", result.toString());
    }
  
    @Test
    public void normalizesRelativePathWithJustDoubleDotsTest() {
      GitPath path = gfs.getPath("../..");
      GitPath result = path.normalize();
      assertEquals("../..", result.toString());
    }
  
    @Test
    public void normalizesRelativePathWithDotsAndDoubleDotsTest() {
      GitPath path = gfs.getPath("./a/./c/../b/../b");
      GitPath result = path.normalize();
      assertEquals("a/b", result.toString());
    }
  
    @Test
    public void normalizesEmptyPathTest() {
      GitPath path = gfs.getPath("");
      GitPath result = path.normalize();
      assertEquals("", result.toString());
    }
  }
  