code: package com.beijunyi.parallelgit.filesystem.io;
  
  import java.io.IOException;
  import java.nio.file.*;
  import java.util.Iterator;
  import java.util.NoSuchElementException;
  
  import com.beijunyi.parallelgit.filesystem.AbstractGitFileSystemTest;
  import org.junit.Test;
  
  import static org.junit.Assert.*;
  
  public class GfsDirectoryStreamTest extends AbstractGitFileSystemTest {
  
    @Test
    public void directoryStreamOfDirectoryTest() throws IOException {
      initRepository();
      String[] files = new String[] {"/a/b.txt", "/a/c/c1.txt", "/a/d/d1.txt", "/a/d/d2.txt", "/a/e.txt", "/f.txt", "/g/h.txt"};
      for(String file : files)
        writeToCache(file);
      commitToMaster();
      initGitFileSystem();
  
      try(DirectoryStream<Path> ds = provider.newDirectoryStream(gfs.getPath("/a"), null)) {
        String[] filesInA = new String[] {"/a/b.txt", "/a/c", "/a/d", "/a/e.txt"};
        Iterator<Path> dsIt = ds.iterator();
        for(String file : filesInA) {
          assertTrue(dsIt.hasNext());
          assertEquals(file, dsIt.next().toString());
        }
        assertFalse(dsIt.hasNext());
      }
    }
  
    @Test(expected = NoSuchElementException.class)
    public void directoryStreamOfDirectoryNoSuchElementTest() throws IOException {
      initRepository();
      writeToCache("/dir/file.txt");
      commitToMaster();
      initGitFileSystem();
      try(DirectoryStream<Path> ds = Files.newDirectoryStream(gfs.getPath("/dir"))) {
        Iterator<Path> dsIt = ds.iterator();
        dsIt.next();
        dsIt.next();
      }
    }
  
    @Test(expected = UnsupportedOperationException.class)
    public void directoryStreamOfDirectoryRemoveTest() throws IOException {
      initRepository();
      writeToCache("/dir/file.txt");
      commitToMaster();
      initGitFileSystem();
      try(DirectoryStream<Path> ds = Files.newDirectoryStream(gfs.getPath("/dir"))) {
        Iterator<Path> dsIt = ds.iterator();
        dsIt.next();
        dsIt.remove();
      }
    }
  
    @Test(expected = ClosedDirectoryStreamException.class)
    public void userClosedDirectoryStream_shouldThrowClosedDirectoryStreamException() throws IOException {
      initRepository();
      writeToCache("/dir/file.txt");
      commitToMaster();
      initGitFileSystem();
      DirectoryStream<Path> ds = Files.newDirectoryStream(gfs.getPath("/dir"));
      ds.close();
      ds.iterator().next();
    }
  }
  