// Path: src/test/java/com/github/sbridges/ephemeralfs/TestUtil.java
// public static void assertFound(DirectoryStream<Path> stream, Path...paths) throws IOException {
//     try {
//          
//         Set<Path> actual = new HashSet<>();
//         Set<Path> expected = new HashSet<>();
//         for(Path p : stream) {
//             if(!actual.add(p)) {
//                 throw new AssertionError("dupe");
//             }
//         }
//         for(Path p : paths) {
//             if(!expected.add(p)) {
//                 throw new AssertionError("dupe");
//             }
//         }
//             
//         assertEquals(expected, actual);
//     } finally {
//         if(stream != null) {
//             stream.close();
//         }
//     }
// }
// 
// Path: src/test/java/com/github/sbridges/ephemeralfs/junit/FsType.java
// public enum FsType {
//     
//     UNIX {
//         @Override
//         public Path createTestRoot(Class testKlass) {
//         	FileSystem fs = EphemeralFsFileSystemBuilder.unixFs().build();
//             return fs.getRootDirectories().iterator().next();
//         }
// 
//         @Override
//         public void cleanUpRoot(Path root) throws IOException {
//             root.getFileSystem().close();
//         }
//     },
//     WINDOWS {
//         @Override
//         public Path createTestRoot(Class testKlass) {
//         	FileSystem fs = EphemeralFsFileSystemBuilder.windowsFs().build();
//             return fs.getRootDirectories().iterator().next();
//         }
// 
//         @Override
//         public void cleanUpRoot(Path root) throws IOException {
//             root.getFileSystem().close();
//         }
//     },
//     MAC {
//         @Override
//         public Path createTestRoot(Class testKlass) {
//             FileSystem fs = EphemeralFsFileSystemBuilder.macFs().build();
//             return fs.getRootDirectories().iterator().next();
//         }
//         @Override
//         public void cleanUpRoot(Path root) throws IOException {
//             root.getFileSystem().close();
//         }
//     },
//     SYSTEM {
//         @Override
//         public Path createTestRoot(Class testKlass) {
//             try {
//                 File tempDir = Files.createTempDirectory(testKlass.getSimpleName()).toFile();
//                 tempDir = tempDir.getCanonicalFile();
//                 return tempDir.toPath();
//             } catch (IOException e) {
//                 throw new IllegalStateException(e);
//             }
//         }
// 
//         @Override
//         public void cleanUpRoot(Path root) {
//             TestUtil.deleteTempDirRecursive(root);
//             
//         }
//         
//         @Override
//         public String toString() {
//             if(OSTest.isMac()) {
//                 return "SYSTEM-MAC";
//             }
//             if(OSTest.isWindows()) {
//                 return "SYSTEM-WINDOWS";
//             }
//             if(OSTest.isUnix()) {
//                 return "SYSTEM-UNIX";
//             }
//             throw new IllegalStateException();
//         }
//     };
//     
//     public abstract void cleanUpRoot(Path root) throws IOException;
//     public abstract Path createTestRoot(Class testKlass);
//     
//     
// }
// 
// Path: src/test/java/com/github/sbridges/ephemeralfs/junit/MultiFsRunner.java
// public class MultiFsRunner extends ParentRunner<Runner> {
// 
//     private final List<Runner> children;
//     
//     public MultiFsRunner(Class<?> testClass) throws InitializationError {
//         super(testClass);
//         children = new ArrayList<>();
//         
//         EnumSet<FsType> validTypes = EnumSet.allOf(FsType.class);
//     	if(testClass.getAnnotation(RunWithTypes.class) != null ) {
//     		validTypes.clear();
//     		List<FsType> allowedTypes = Arrays.asList(testClass.getAnnotation(RunWithTypes.class).value());
//     		validTypes.addAll(allowedTypes);
//     		if(validTypes.contains(WithFsTestRunner.getNativeType())) {
//     			validTypes.add(FsType.SYSTEM);
//     		}
//         }
//     	if(testClass.getAnnotation(RunUnlessType.class) != null ) {
//     		
//     		List<FsType> dissallowedTypes = Arrays.asList(testClass.getAnnotation(RunUnlessType.class).value());
//     		validTypes.removeAll(dissallowedTypes);
//     		
//     		if(dissallowedTypes.contains(WithFsTestRunner.getNativeType())) {
//     			validTypes.remove(FsType.SYSTEM);
//     		}
//         }
//         
//         for(FsType type : validTypes) {
//       		children.add(new WithFsTestRunner(testClass, type));	
//         }
//     }
// 
//     @Override
//     protected List<Runner> getChildren() {
//         return children;
//     }
// 
//     @Override
//     protected Description describeChild(Runner child) {
//         return child.getDescription();
//     }
// 
//     @Override
//     protected void runChild(Runner child, RunNotifier notifier) {
//         child.run(notifier);
//     }
//     
//     
// 
// 
// }


import static org.junit.Assert.*;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.NotDirectoryException;
import java.nio.file.Path;
import java.util.Iterator;
import java.util.NoSuchElementException;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.github.sbridges.ephemeralfs.junit.FsType;
import com.github.sbridges.ephemeralfs.junit.IgnoreIf;
import com.github.sbridges.ephemeralfs.junit.MultiFsRunner;
import static com.github.sbridges.ephemeralfs.TestUtil.assertFound;
        
        DirectoryStream<Path> ds = Files.newDirectoryStream(dir);
        Iterator<Path> iterator = ds.iterator();
        iterator.hasNext();
        ds.close();
        iterator.next();
        try
        {
            iterator.next();
            fail();
        } catch(NoSuchElementException e) {
            //pass
        }
        
        
    }
    
    @Test
    public void testMultiple() throws Exception {
        Path dir = root.resolve("dir");
        Files.createDirectories(dir);
        
        Path child = dir.resolve("child");
        Path child2 = dir.resolve("child2");
        Path child3 = dir.resolve("child3");
        
        Files.createDirectories(child);
        Files.createDirectories(child2);
        Files.createDirectories(child3);
        
// Path: src/test/java/com/github/sbridges/ephemeralfs/TestUtil.java
// public static void assertFound(DirectoryStream<Path> stream, Path...paths) throws IOException {
//     try {
//          
//         Set<Path> actual = new HashSet<>();
//         Set<Path> expected = new HashSet<>();
//         for(Path p : stream) {
//             if(!actual.add(p)) {
//                 throw new AssertionError("dupe");
//             }
//         }
//         for(Path p : paths) {
//             if(!expected.add(p)) {
//                 throw new AssertionError("dupe");
//             }
//         }
//             
//         assertEquals(expected, actual);
//     } finally {
//         if(stream != null) {
//             stream.close();
//         }
//     }
// }
// 
// Path: src/test/java/com/github/sbridges/ephemeralfs/junit/FsType.java
// public enum FsType {
//     
//     UNIX {
//         @Override
//         public Path createTestRoot(Class testKlass) {
//         	FileSystem fs = EphemeralFsFileSystemBuilder.unixFs().build();
//             return fs.getRootDirectories().iterator().next();
//         }
// 
//         @Override
//         public void cleanUpRoot(Path root) throws IOException {
//             root.getFileSystem().close();
//         }
//     },
//     WINDOWS {
//         @Override
//         public Path createTestRoot(Class testKlass) {
//         	FileSystem fs = EphemeralFsFileSystemBuilder.windowsFs().build();
//             return fs.getRootDirectories().iterator().next();
//         }
// 
//         @Override
//         public void cleanUpRoot(Path root) throws IOException {
//             root.getFileSystem().close();
//         }
//     },
//     MAC {
//         @Override
//         public Path createTestRoot(Class testKlass) {
//             FileSystem fs = EphemeralFsFileSystemBuilder.macFs().build();
//             return fs.getRootDirectories().iterator().next();
//         }
//         @Override
//         public void cleanUpRoot(Path root) throws IOException {
//             root.getFileSystem().close();
//         }
//     },
//     SYSTEM {
//         @Override
//         public Path createTestRoot(Class testKlass) {
//             try {
//                 File tempDir = Files.createTempDirectory(testKlass.getSimpleName()).toFile();
//                 tempDir = tempDir.getCanonicalFile();
//                 return tempDir.toPath();
//             } catch (IOException e) {
//                 throw new IllegalStateException(e);
//             }
//         }
// 
//         @Override
//         public void cleanUpRoot(Path root) {
//             TestUtil.deleteTempDirRecursive(root);
//             
//         }
//         
//         @Override
//         public String toString() {
//             if(OSTest.isMac()) {
//                 return "SYSTEM-MAC";
//             }
//             if(OSTest.isWindows()) {
//                 return "SYSTEM-WINDOWS";
//             }
//             if(OSTest.isUnix()) {
//                 return "SYSTEM-UNIX";
//             }
//             throw new IllegalStateException();
//         }
//     };
//     
//     public abstract void cleanUpRoot(Path root) throws IOException;
//     public abstract Path createTestRoot(Class testKlass);
//     
//     
// }
// 
// Path: src/test/java/com/github/sbridges/ephemeralfs/junit/MultiFsRunner.java
// public class MultiFsRunner extends ParentRunner<Runner> {
// 
//     private final List<Runner> children;
//     
//     public MultiFsRunner(Class<?> testClass) throws InitializationError {
//         super(testClass);
//         children = new ArrayList<>();
//         
//         EnumSet<FsType> validTypes = EnumSet.allOf(FsType.class);
//     	if(testClass.getAnnotation(RunWithTypes.class) != null ) {
//     		validTypes.clear();
//     		List<FsType> allowedTypes = Arrays.asList(testClass.getAnnotation(RunWithTypes.class).value());
//     		validTypes.addAll(allowedTypes);
//     		if(validTypes.contains(WithFsTestRunner.getNativeType())) {
//     			validTypes.add(FsType.SYSTEM);
//     		}
//         }
//     	if(testClass.getAnnotation(RunUnlessType.class) != null ) {
//     		
//     		List<FsType> dissallowedTypes = Arrays.asList(testClass.getAnnotation(RunUnlessType.class).value());
//     		validTypes.removeAll(dissallowedTypes);
//     		
//     		if(dissallowedTypes.contains(WithFsTestRunner.getNativeType())) {
//     			validTypes.remove(FsType.SYSTEM);
//     		}
//         }
//         
//         for(FsType type : validTypes) {
//       		children.add(new WithFsTestRunner(testClass, type));	
//         }
//     }
// 
//     @Override
//     protected List<Runner> getChildren() {
//         return children;
//     }
// 
//     @Override
//     protected Description describeChild(Runner child) {
//         return child.getDescription();
//     }
// 
//     @Override
//     protected void runChild(Runner child, RunNotifier notifier) {
//         child.run(notifier);
//     }
//     
//     
// 
// 
// }


// Path: src/test/java/com/github/sbridges/ephemeralfs/DirectoryStreamTest.java
import static org.junit.Assert.*;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.NotDirectoryException;
import java.nio.file.Path;
import java.util.Iterator;
import java.util.NoSuchElementException;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.github.sbridges.ephemeralfs.junit.FsType;
import com.github.sbridges.ephemeralfs.junit.IgnoreIf;
import com.github.sbridges.ephemeralfs.junit.MultiFsRunner;
import static com.github.sbridges.ephemeralfs.TestUtil.assertFound;

        
        DirectoryStream<Path> ds = Files.newDirectoryStream(dir);
        Iterator<Path> iterator = ds.iterator();
        iterator.hasNext();
        ds.close();
        iterator.next();
        try
        {
            iterator.next();
            fail();
        } catch(NoSuchElementException e) {
            //pass
        }
        
        
    }
    
    @Test
    public void testMultiple() throws Exception {
        Path dir = root.resolve("dir");
        Files.createDirectories(dir);
        
        Path child = dir.resolve("child");
        Path child2 = dir.resolve("child2");
        Path child3 = dir.resolve("child3");
        
        Files.createDirectories(child);
        Files.createDirectories(child2);
        Files.createDirectories(child3);
        
        assertFound(Files.newDirectoryStream(dir), child, child2, child3);