public FileSystemFluentMock Dir(string name)
 {
     string path = Path.Combine(dirChain.Select(_ => _.Name).ToArray());
     var directoryItem = new DirectoryItem(path, name);
     UpdateActiveItem(directoryItem);
     return this;
 }
 private void MockDir(DirectoryItem item)
 {
     directoryMock.Exists(item.FullPath).Returns(true);
     var dirFiles = item.Children.OfType<FileItem>().ToList();
     List<DirectoryItem> subDirs = item.Children.OfType<DirectoryItem>().ToList();
     subDirs.ForEach(MockDir);
     dirFiles.ForEach(f=>MockFile(item, f));
     List<string> allFiles = dirFiles.Select(f => Path.Combine(item.FullPath, f.Name)).ToList();
     directoryMock.EnumerateFiles(item.FullPath).Returns(allFiles);
     directoryMock.EnumerateFiles(item.FullPath, Arg.Any<string>())
         .Returns
         ((callInfo)=>
              {
                  var searchPattern = (string)callInfo.Args()[1];
                  var regex = new Regex(WildcardToRegex(searchPattern));
                  return allFiles.Where(f => regex.IsMatch(f));
              }
         );
     directoryMock.EnumerateFiles(item.FullPath, Arg.Any<string>(), SearchOption.AllDirectories)
         .Returns(c =>
         {
             var files = new List<string>();
             var searchPattern = (string)c.Args()[1];
             var regex = new Regex(WildcardToRegex(searchPattern));
             GetSubDirs(item).ForEach(sd => files.AddRange(directoryMock.EnumerateFiles(sd.FullPath, searchPattern)
                 .Where(f => regex.IsMatch(f))));
             files.AddRange(allFiles.Where(f => regex.IsMatch(f)));
             return files;
         });
     directoryMock.EnumerateDirectories(item.FullPath).Returns(subDirs.Select(_=>_.FullPath).ToList());
 }
 private List<DirectoryItem> GetSubDirs(DirectoryItem item)
 {
     var subDirs = new List<DirectoryItem>();
     foreach (DirectoryItem dirItem in item.Children.OfType<DirectoryItem>())
     {
         subDirs.Add(dirItem);
         subDirs.AddRange(GetSubDirs(dirItem));
     }
     return subDirs;
 }
        public IFileSystem Build(DirectoryItem root)
        {
            var fileSystem = Substitute.For<IFileSystem>();
            directoryMock = Substitute.For<IDirectory>();
            fileMock = Substitute.For<IFile>();
            fileSystem.DirectoryWrapper.Returns(directoryMock);
            fileSystem.FileWrapper.Returns(fileMock);

            MockDir(root);

            return fileSystem;
        }
 private void MockFile(DirectoryItem parent, FileItem fileItem)
 {
     string filePath = Path.Combine(parent.FullPath, fileItem.Name);
     fileMock.Exists(filePath).Returns(true);
     fileMock.ReadAllText(filePath).Returns(fileItem.Contents);
 }