diff --git a/src/System.IO.Abstractions.TestingHelpers/MockFileSystem.cs b/src/System.IO.Abstractions.TestingHelpers/MockFileSystem.cs index 5aaf48f65..a8082195a 100644 --- a/src/System.IO.Abstractions.TestingHelpers/MockFileSystem.cs +++ b/src/System.IO.Abstractions.TestingHelpers/MockFileSystem.cs @@ -239,10 +239,12 @@ public void MoveDirectory(string sourcePath, string destPath) sourcePath = FixPath(sourcePath); destPath = FixPath(destPath); + var sourcePathSequence = sourcePath.Split(new[] {Path.DirectorySeparatorChar}, StringSplitOptions.RemoveEmptyEntries); + lock (files) { var affectedPaths = files.Keys - .Where(p => StringOperations.StartsWith(p, sourcePath)) + .Where(p => PathStartsWith(p, sourcePathSequence)) .ToList(); foreach (var path in affectedPaths) @@ -252,6 +254,25 @@ public void MoveDirectory(string sourcePath, string destPath) files.Remove(path); } } + + bool PathStartsWith(string path, string[] minMatch) + { + var pathSequence = path.Split(new[] {Path.DirectorySeparatorChar}, StringSplitOptions.RemoveEmptyEntries); + if (pathSequence.Length < minMatch.Length) + { + return false; + } + + for (var i = 0; i < minMatch.Length; i++) + { + if (!StringOperations.Equals(minMatch[i], pathSequence[i])) + { + return false; + } + } + + return true; + } } public void RemoveFile(string path) diff --git a/tests/System.IO.Abstractions.TestingHelpers.Tests/MockDirectoryTests.cs b/tests/System.IO.Abstractions.TestingHelpers.Tests/MockDirectoryTests.cs index cabcdb441..cc5835976 100644 --- a/tests/System.IO.Abstractions.TestingHelpers.Tests/MockDirectoryTests.cs +++ b/tests/System.IO.Abstractions.TestingHelpers.Tests/MockDirectoryTests.cs @@ -1461,6 +1461,27 @@ public void MockDirectory_Move_ShouldMoveDirectoryWithReadOnlySubDirectory() Assert.IsTrue(fileSystem.FileExists(destSubDirName)); } + [Test] + public void MockDirectory_Move_ShouldOnlyMoveDirAndFilesWithinDir() + { + // Arrange + var fileSystem = new MockFileSystem(new Dictionary + { + {XFS.Path(@"c:\source\dummy"), new MockDirectoryData()}, + {XFS.Path(@"c:\source\dummy\content.txt"), new MockFileData(new byte[] {0})}, + {XFS.Path(@"c:\source\dummy.txt"), new MockFileData(new byte[] {0})}, + {XFS.Path(@"c:\source\dummy2"), new MockDirectoryData()}, + {XFS.Path(@"c:\destination"), new MockDirectoryData()}, + }); + + // Act + fileSystem.Directory.Move(XFS.Path(@"c:\source\dummy"), XFS.Path(@"c:\destination\dummy")); + + // Assert + Assert.That(fileSystem.FileExists(XFS.Path(@"c:\source\dummy.txt")), Is.True); + Assert.That(fileSystem.Directory.Exists(XFS.Path(@"c:\source\dummy2")), Is.True); + } + [Test] public void MockDirectory_GetCurrentDirectory_ShouldReturnValueFromFileSystemConstructor() {