コード例 #1
0
            public async Task DirectoryAdded_ThenRemoved(string[] addedDirectories, string[] deletedDirectories, string[] expectedAdded, string[] expectedRemoved)
            {
                using (_taskScheduler.Pause()) {
                    foreach (var path in addedDirectories)
                    {
                        DirectoryInfoStubFactory.Create(_fileSystem, path);
                    }

                    RaiseCreated(_directoryWatcher, addedDirectories);
                    _taskScheduler.ScheduledTasksCount.Should().Be(1);
                }

                await Task.Delay(20);

                foreach (var path in deletedDirectories)
                {
                    DirectoryInfoStubFactory.Delete(_fileSystem, path);
                }

                RaiseDeleted(_directoryWatcher, deletedDirectories);

                await _taskScheduler;

                _changeset.Should().NotBeNull();
                _changeset.AddedDirectories.Should().Equal(expectedAdded);
                _changeset.RemovedDirectories.Should().Equal(expectedRemoved);
            }
            public async Task DirectoryRemoved_ThenAdded(string[] deletedDirectories, string[] createdDirectories, string[] expectedRemoved, string[] expectedAdded)
            {
                await InjectDirectoriesIntoWatcher(_directoryWatcher, _fileSystem, deletedDirectories, _taskScheduler);

                const string projectDirectorySubtree = @"
[a]
  [def]
    x.r
    y.r
    [z.r]
[b]
  [abc]
  z.r";

                using (_taskScheduler.Pause()) {
                    RaiseDeleted(_directoryWatcher, deletedDirectories);

                    DirectoryInfoStubFactory.FromIndentedString(_fileSystem, ProjectDirectory, projectDirectorySubtree);

                    RaiseCreated(_directoryWatcher, createdDirectories);

                    _taskScheduler.ScheduledTasksCount.Should().Be(1);
                }

                await _taskScheduler;

                _changeset.Should().NotBeNull()
                .And.HaveAddedDirectories(expectedAdded)
                .And.HaveRemovedDirectories(expectedRemoved);
            }
            public async Task FileRemoved_DirectoryAdded(string[] deletedFiles, string[] createdDirectories, string[] expectedRemovedFiles, string[] expectedAddedDirectories, string[] expectedAddedFiles)
            {
                const string projectDirectorySubtree = @"
[a]
  [def]
    x.r
    y.r
    [z.r]
[b]
  [abc]
  z.r";

                foreach (var path in deletedFiles)
                {
                    FileInfoStubFactory.Create(_fileSystem, path);
                }
                RaiseCreated(_fileWatcher, deletedFiles);
                await _taskScheduler;

                using (_taskScheduler.Pause()) {
                    RaiseDeleted(_fileWatcher, deletedFiles);
                    DirectoryInfoStubFactory.FromIndentedString(_fileSystem, ProjectDirectory, projectDirectorySubtree);
                    RaiseCreated(_directoryWatcher, createdDirectories);

                    _taskScheduler.ScheduledTasksCount.Should().Be(1);
                }

                await _taskScheduler;

                _changeset.Should().NotBeNull()
                .And.HaveAddedFiles(expectedAddedFiles)
                .And.HaveAddedDirectories(expectedAddedDirectories)
                .And.HaveRemovedFiles(expectedRemovedFiles)
                .And.NoOtherChanges();
            }
            public async Task DirectoryAdded_SymlinkIgnored()
            {
                const string projectDirectorySubtree = @"
[a]
  [def]
    x.r
    y.r
    [z.r]
";
                // a\
                var a = (IDirectoryInfo)DirectoryInfoStubFactory.FromIndentedString(_fileSystem, ProjectDirectory, projectDirectorySubtree);
                // a\def\
                var def = (IDirectoryInfo)a.EnumerateFileSystemInfos().Last();
                // a\def\z.r\
                var z_r = (IDirectoryInfo)def.EnumerateFileSystemInfos().Last();

                z_r.Attributes.Returns(FileAttributes.Directory | FileAttributes.ReparsePoint);
                z_r.EnumerateFileSystemInfos().ThrowsForAnyArgs(new Exception());

                using (_taskScheduler.Pause()) {
                    RaiseCreated(_directoryWatcher, @"Z:\abc\a");
                }

                await _taskScheduler;

                var expectedFiles       = new[] { @"a\def\x.r", @"a\def\y.r" };
                var expectedDirectories = new[] { @"a\", @"a\def\" };

                _changeset.Should().NotBeNull()
                .And.HaveAddedFiles(expectedFiles)
                .And.HaveAddedDirectories(expectedDirectories)
                .And.NoOtherChanges();
            }
            public async Task DirectoryAdded_ThenRemoved(string[] addedDirectories, string[] deletedDirectories, string[] expectedAdded, string[] expectedRemoved)
            {
                await InjectDirectoriesIntoWatcher(_directoryWatcher, _fileSystem, deletedDirectories, _taskScheduler);

                using (_taskScheduler.Pause()) {
                    foreach (var path in addedDirectories)
                    {
                        DirectoryInfoStubFactory.Create(_fileSystem, path);
                    }

                    RaiseCreated(_directoryWatcher, addedDirectories);

                    foreach (var path in deletedDirectories)
                    {
                        DirectoryInfoStubFactory.Delete(_fileSystem, path);
                    }

                    RaiseDeleted(_directoryWatcher, deletedDirectories);

                    _taskScheduler.ScheduledTasksCount.Should().Be(1);
                }

                await _taskScheduler;

                _changeset.Should().NotBeNull()
                .And.HaveAddedDirectories(expectedAdded)
                .And.HaveRemovedDirectories(expectedRemoved)
                .And.NoOtherChanges();
            }
            public async Task DirectoryAdded_DirectoryWithContent(string[] addedDirectories, string[] expectedDirectories, string[] expectedFiles)
            {
                const string projectDirectorySubtree = @"
[a]
  [def]
    x.r
    y.r
    [z.r]
[b]
  [abc]
  z.r
[c]
  [ghi]
  w.r
";

                DirectoryInfoStubFactory.FromIndentedString(_fileSystem, ProjectDirectory, projectDirectorySubtree);

                using (_taskScheduler.Pause()) {
                    RaiseCreated(_directoryWatcher, addedDirectories);

                    _taskScheduler.ScheduledTasksCount.Should().Be(1);
                }

                await _taskScheduler;

                _changeset.Should().NotBeNull()
                .And.HaveAddedFiles(expectedFiles)
                .And.HaveAddedDirectories(expectedDirectories)
                .And.NoOtherChanges();
            }
コード例 #7
0
        private static async Task InjectDirectoriesIntoWatcher(IFileSystemWatcher fileWatcher, IFileSystem fileSystem, IEnumerable <string> fullPaths, ControlledTaskScheduler taskScheduler)
        {
            var directories = fullPaths.AsList();

            foreach (var path in directories)
            {
                DirectoryInfoStubFactory.Create(fileSystem, path);
            }
            RaiseCreated(fileWatcher, directories);
            await taskScheduler;

            foreach (var path in directories)
            {
                DirectoryInfoStubFactory.Delete(fileSystem, path);
            }
        }
            public async Task DirectoryAdded(string[] addedDirectories, string[] expected)
            {
                using (_taskScheduler.Pause()) {
                    foreach (var path in addedDirectories)
                    {
                        DirectoryInfoStubFactory.Create(_fileSystem, path);
                        RaiseCreated(_directoryWatcher, path);
                    }

                    _taskScheduler.ScheduledTasksCount.Should().Be(1);
                }

                await _taskScheduler;

                _changeset.Should().NotBeNull()
                .And.HaveAddedDirectories(expected)
                .And.NoOtherChanges();
            }
            public async Task DirectoryRemoved_SomeStillExists(string[] deletedDirectories, string[] existingDirectories, string[] expected)
            {
                await InjectDirectoriesIntoWatcher(_directoryWatcher, _fileSystem, deletedDirectories, _taskScheduler);

                foreach (var path in existingDirectories)
                {
                    DirectoryInfoStubFactory.Create(_fileSystem, path);
                }

                using (_taskScheduler.Pause()) {
                    RaiseDeleted(_directoryWatcher, deletedDirectories);
                    _taskScheduler.ScheduledTasksCount.Should().Be(1);
                }

                await _taskScheduler;

                _changeset.Should().NotBeNull()
                .And.HaveRemovedDirectories(expected)
                .And.NoOtherChanges();
            }
            public NoDelayNoFiltering()
            {
                _fileSystem = Substitute.For <IFileSystem>();
                _fileSystem.GetFileAttributes(Arg.Any <string>()).Throws <FileNotFoundException>();
                var watchers = GetWatchersFromMsBuildFileSystemWatcher(_fileSystem);

                var 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);

                DirectoryInfoStubFactory.Create(_fileSystem, ProjectDirectory);
                _fileSystemWatcher = new MsBuildFileSystemWatcher(ProjectDirectory, "*", 0, 0, _fileSystem, fileSystemFilter, _taskScheduler, NullLog.Instance);
                _fileSystemWatcher.Start();

                _fileWatcher       = watchers.FileWatcher;
                _directoryWatcher  = watchers.DirectoryWatcher;
                _attributesWatcher = watchers.AttributesWatcher;
            }