public Delay50MsNoFiltering() {
                _fileSystem = Substitute.For<IFileSystem>();
                var watchers = GetWatchersFromMsBuildFileSystemWatcher(_fileSystem);

                _fileSystemFilter = Substitute.For<IMsBuildFileSystemFilter>();
                _fileSystemFilter.IsFileAllowed(Arg.Any<string>(), Arg.Any<FileAttributes>()).ReturnsForAnyArgs(true);
                _fileSystemFilter.IsDirectoryAllowed(Arg.Any<string>(), Arg.Any<FileAttributes>()).ReturnsForAnyArgs(true);

                _taskScheduler = new ControlledTaskScheduler(SynchronizationContext.Current);

                _fileSystemWatcher = new MsBuildFileSystemWatcher(ProjectDirectory, "*", 50, 50, _fileSystem, _fileSystemFilter, Substitute.For<IActionLog>(), _taskScheduler);
                _taskScheduler.Link(_fileSystemWatcher.SourceBlock, c => { _changeset = c; });

                _fileSystemWatcher.Start();
                _fileWatcher = watchers.FileWatcher;
                _directoryWatcher = watchers.DirectoryWatcher;
                _attributesWatcher = watchers.AttributesWatcher;
            }
        public MsBuildFileSystemWatcher.Changeset ProduceChangeset()
        {
            var changeset = new MsBuildFileSystemWatcher.Changeset();

            foreach (var entry in _entries.Values.ToList())
            {
                switch (entry.State)
                {
                case Added:
                case RenamedThenAdded:
                    if (entry.PreviousRelativePath != null)
                    {
                        switch (entry.Type)
                        {
                        case File:
                            changeset.RenamedFiles.Add(entry.PreviousRelativePath, entry.RelativePath);
                            break;

                        case Directory:
                            changeset.RenamedDirectories.Add(entry.PreviousRelativePath, entry.RelativePath);
                            break;

                        default:
                            throw new ArgumentOutOfRangeException();
                        }
                    }
                    else
                    {
                        switch (entry.Type)
                        {
                        case File:
                            changeset.AddedFiles.Add(entry.RelativePath);
                            break;

                        case Directory:
                            changeset.AddedDirectories.Add(entry.RelativePath);
                            break;

                        default:
                            throw new ArgumentOutOfRangeException();
                        }
                    }
                    entry.State = Unchanged;
                    break;

                case Deleted:
                    switch (entry.Type)
                    {
                    case File:
                        changeset.RemovedFiles.Add(entry.RelativePath);
                        break;

                    case Directory:
                        changeset.RemovedDirectories.Add(entry.RelativePath);
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                    _entries.Remove(entry.RelativePath);
                    break;

                case Renamed:
                    _entries.Remove(entry.RelativePath);
                    break;

                default:
                    entry.State = Unchanged;
                    break;
                }
            }

            return(changeset);
        }
 public async Task InitializeAsync()
 {
     await _taskScheduler;
     _taskScheduler.Link(_fileSystemWatcher.SourceBlock, c => { _changeset = c; });
 }
        public MsBuildFileSystemWatcher.Changeset ProduceChangeset() {
            var changeset = new MsBuildFileSystemWatcher.Changeset();
            foreach (var entry in _entries.Values.ToList()) {
                switch (entry.State) {
                    case Added:
                    case RenamedThenAdded:
                        if (entry.PreviousRelativePath != null) {
                            switch (entry.Type) {
                                case File:
                                    changeset.RenamedFiles.Add(entry.PreviousRelativePath, entry.RelativePath);
                                    break;
                                case Directory:
                                    changeset.RenamedDirectories.Add(entry.PreviousRelativePath, entry.RelativePath);
                                    break;
                                default:
                                    throw new ArgumentOutOfRangeException();
                            }
                        } else {
                            switch (entry.Type) {
                                case File:
                                    changeset.AddedFiles.Add(entry.RelativePath);
                                    break;
                                case Directory:
                                    changeset.AddedDirectories.Add(entry.RelativePath);
                                    break;
                                default:
                                    throw new ArgumentOutOfRangeException();
                            }
                        }
                        entry.State = Unchanged;
                        break;
                    case Deleted:
                        switch (entry.Type) {
                            case File:
                                changeset.RemovedFiles.Add(entry.RelativePath);
                                break;
                            case Directory:
                                changeset.RemovedDirectories.Add(entry.RelativePath);
                                break;
                            default:
                                throw new ArgumentOutOfRangeException();
                        }
                        _entries.Remove(entry.RelativePath);
                        break;
                    case Renamed:
                        _entries.Remove(entry.RelativePath);
                        break;
                    default:
                        entry.State = Unchanged;
                        break;
                }
            }

            return changeset;
        }
 public async Task InitializeAsync()
 {
     await _taskScheduler;
     _changeset = null;
 }