Skip to content

Commit

Permalink
#190: New files and directories wil respect parent directory capitali…
Browse files Browse the repository at this point in the history
…zation.
  • Loading branch information
Alexander Pruss authored and tathamoddie committed May 3, 2017
1 parent 5c044f2 commit 801282a
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 12 deletions.
63 changes: 63 additions & 0 deletions TestHelpers.Tests/MockFileSystemTests.cs
Expand Up @@ -140,5 +140,68 @@ public void MockFileSystem_DriveInfo_ShouldNotThrowAnyException()
// Assert
Assert.IsNotNull(actualResults);
}

[Test]
public void MockFileSystem_AddFile_ShouldMatchCapitalization_PerfectMatch()
{
// Arrange
var fileSystem = new MockFileSystem();
fileSystem.AddDirectory(MockUnixSupport.Path(@"C:\test"));
fileSystem.AddDirectory(MockUnixSupport.Path(@"C:\LOUD"));

// Act
fileSystem.AddFile(@"C:\test\file.txt", "foo");
fileSystem.AddFile(@"C:\LOUD\file.txt", "foo");
fileSystem.AddDirectory(@"C:\test\SUBDirectory");
fileSystem.AddDirectory(@"C:\LOUD\SUBDirectory");

// Assert
Assert.Contains(@"C:\test\file.txt", fileSystem.AllFiles.ToList());
Assert.Contains(@"C:\LOUD\file.txt", fileSystem.AllFiles.ToList());
Assert.Contains(@"C:\test\SUBDirectory\", fileSystem.AllDirectories.ToList());
Assert.Contains(@"C:\LOUD\SUBDirectory\", fileSystem.AllDirectories.ToList());
}

[Test]
public void MockFileSystem_AddFile_ShouldMatchCapitalization_PartialMatch()
{
// Arrange
var fileSystem = new MockFileSystem();
fileSystem.AddDirectory(MockUnixSupport.Path(@"C:\test\subtest"));
fileSystem.AddDirectory(MockUnixSupport.Path(@"C:\LOUD\SUBLOUD"));

// Act
fileSystem.AddFile(@"C:\test\SUBTEST\file.txt", "foo");
fileSystem.AddFile(@"C:\LOUD\subloud\file.txt", "foo");
fileSystem.AddDirectory(@"C:\test\SUBTEST\SUBDirectory");
fileSystem.AddDirectory(@"C:\LOUD\subloud\SUBDirectory");

// Assert
Assert.Contains(@"C:\test\subtest\file.txt", fileSystem.AllFiles.ToList());
Assert.Contains(@"C:\LOUD\SUBLOUD\file.txt", fileSystem.AllFiles.ToList());
Assert.Contains(@"C:\test\subtest\SUBDirectory\", fileSystem.AllDirectories.ToList());
Assert.Contains(@"C:\LOUD\SUBLOUD\SUBDirectory\", fileSystem.AllDirectories.ToList());
}

[Test]
public void MockFileSystem_AddFile_ShouldMatchCapitalization_PartialMatch_FurtherLeft()
{
// Arrange
var fileSystem = new MockFileSystem();
fileSystem.AddDirectory(MockUnixSupport.Path(@"C:\test\subtest"));
fileSystem.AddDirectory(MockUnixSupport.Path(@"C:\LOUD\SUBLOUD"));

// Act
fileSystem.AddFile(@"C:\test\SUBTEST\new\file.txt", "foo");
fileSystem.AddFile(@"C:\LOUD\subloud\new\file.txt", "foo");
fileSystem.AddDirectory(@"C:\test\SUBTEST\new\SUBDirectory");
fileSystem.AddDirectory(@"C:\LOUD\subloud\new\SUBDirectory");

// Assert
Assert.Contains(@"C:\test\subtest\new\file.txt", fileSystem.AllFiles.ToList());
Assert.Contains(@"C:\LOUD\SUBLOUD\new\file.txt", fileSystem.AllFiles.ToList());
Assert.Contains(@"C:\test\subtest\new\SUBDirectory\", fileSystem.AllDirectories.ToList());
Assert.Contains(@"C:\LOUD\SUBLOUD\new\SUBDirectory\", fileSystem.AllDirectories.ToList());
}
}
}
49 changes: 37 additions & 12 deletions TestingHelpers/MockFileSystem.cs
Expand Up @@ -81,12 +81,37 @@ public PathVerifier PathVerifier
get { return pathVerifier; }
}

private string FixPath(string path)
private string FixPath(string path, bool checkCaps = false)
{
var pathSeparatorFixed = path.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
return pathField.GetFullPath(pathSeparatorFixed);
var fullPath = pathField.GetFullPath(pathSeparatorFixed);

return checkCaps ? GetPathWithCorrectDirectoryCapitalization(fullPath) : fullPath;
}

//If C:\foo exists, ensures that trying to save a file to "C:\FOO\file.txt" instead saves it to "C:\foo\file.txt".
private string GetPathWithCorrectDirectoryCapitalization(string fullPath)
{
string[] splitPath = fullPath.Split(Path.DirectorySeparatorChar);
string leftHalf = fullPath;
string rightHalf = "";
for (int i = splitPath.Length - 1; i > 1; i--)
{
rightHalf = i == splitPath.Length - 1 ? splitPath[i] : splitPath[i] + Path.DirectorySeparatorChar + rightHalf;
int lastSeparator = leftHalf.LastIndexOf(Path.DirectorySeparatorChar);
leftHalf = lastSeparator > 0 ? leftHalf.Substring(0, lastSeparator) : leftHalf;
if (directory.Exists(leftHalf))
{
leftHalf += Path.DirectorySeparatorChar;
leftHalf = pathField.GetFullPath(leftHalf);
string baseDirectory = AllDirectories.First(dir => dir.Equals(leftHalf, StringComparison.OrdinalIgnoreCase));
return baseDirectory + rightHalf;
}
}
return fullPath;
}


public MockFileData GetFile(string path)
{
path = FixPath(path);
Expand All @@ -96,7 +121,7 @@ public MockFileData GetFile(string path)

public void AddFile(string path, MockFileData mockFile)
{
var fixedPath = FixPath(path);
var fixedPath = FixPath(path, true);
lock (files)
{
if (FileExists(fixedPath))
Expand All @@ -123,25 +148,25 @@ public void AddFile(string path, MockFileData mockFile)

public void AddDirectory(string path)
{
var fixedPath = FixPath(path);
var fixedPath = FixPath(path, true);
var separator = XFS.Separator();

lock (files)
{
if (FileExists(path) &&
if (FileExists(fixedPath) &&
(files[fixedPath].Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
throw new UnauthorizedAccessException(string.Format(CultureInfo.InvariantCulture, Properties.Resources.ACCESS_TO_THE_PATH_IS_DENIED, path));
throw new UnauthorizedAccessException(string.Format(CultureInfo.InvariantCulture, Properties.Resources.ACCESS_TO_THE_PATH_IS_DENIED, fixedPath));

var lastIndex = 0;

bool isUnc =
path.StartsWith(@"\\", StringComparison.OrdinalIgnoreCase) ||
path.StartsWith(@"//", StringComparison.OrdinalIgnoreCase);
fixedPath.StartsWith(@"\\", StringComparison.OrdinalIgnoreCase) ||
fixedPath.StartsWith(@"//", StringComparison.OrdinalIgnoreCase);

if (isUnc)
{
//First, confirm they aren't trying to create '\\server\'
lastIndex = path.IndexOf(separator, 2, StringComparison.OrdinalIgnoreCase);
lastIndex = fixedPath.IndexOf(separator, 2, StringComparison.OrdinalIgnoreCase);
if (lastIndex < 0)
throw new ArgumentException(@"The UNC path should be of the form \\server\share.", "path");

Expand All @@ -151,16 +176,16 @@ public void AddDirectory(string path)
*/
}

while ((lastIndex = path.IndexOf(separator, lastIndex + 1, StringComparison.OrdinalIgnoreCase)) > -1)
while ((lastIndex = fixedPath.IndexOf(separator, lastIndex + 1, StringComparison.OrdinalIgnoreCase)) > -1)
{
var segment = path.Substring(0, lastIndex + 1);
var segment = fixedPath.Substring(0, lastIndex + 1);
if (!directory.Exists(segment))
{
files[segment] = new MockDirectoryData();
}
}

var s = path.EndsWith(separator, StringComparison.OrdinalIgnoreCase) ? path : path + separator;
var s = fixedPath.EndsWith(separator, StringComparison.OrdinalIgnoreCase) ? fixedPath : fixedPath + separator;
files[s] = new MockDirectoryData();
}
}
Expand Down

0 comments on commit 801282a

Please sign in to comment.