Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ public MockDirectoryInfo(IMockFileDataAccessor mockFileDataAccessor, string dire
}

SetDirectoryPath(directoryPath);
Refresh();
// Like the real FileSystemInfo, the state is read on first access, not on construction.
refreshOnNextRead = true;
}

#if FEATURE_CREATE_SYMBOLIC_LINK
Expand All @@ -62,6 +63,7 @@ public override void Refresh()
{
var mockFileData = mockFileDataAccessor.GetFile(directoryPath) ?? MockFileData.NullObject;
cachedMockFileData = mockFileData.Clone();
refreshOnNextRead = false;
}

#if FEATURE_CREATE_SYMBOLIC_LINK
Expand Down Expand Up @@ -304,7 +306,13 @@ public override IDirectoryInfo[] GetDirectories(string searchPattern, Enumeratio
private DirectoryInfoBase[] ConvertStringsToDirectories(IEnumerable<string> paths)
{
return paths
.Select(path => new MockDirectoryInfo(mockFileDataAccessor, path))
.Select(path =>
{
// Enumeration results carry the state found while enumerating.
var directoryInfo = new MockDirectoryInfo(mockFileDataAccessor, path);
directoryInfo.Refresh();
return directoryInfo;
})
.Cast<DirectoryInfoBase>()
.ToArray();
}
Expand Down Expand Up @@ -338,7 +346,13 @@ public override IFileInfo[] GetFiles(string searchPattern, EnumerationOptions en
IFileInfo[] ConvertStringsToFiles(IEnumerable<string> paths)
{
return paths
.Select(mockFileDataAccessor.FileInfo.New)
.Select(path =>
{
// Enumeration results carry the state found while enumerating.
var fileInfo = mockFileDataAccessor.FileInfo.New(path);
fileInfo.Refresh();
return fileInfo;
})
.ToArray();
}

Expand Down Expand Up @@ -373,6 +387,7 @@ public override void MoveTo(string destDirName)
{
mockFileDataAccessor.Directory.Move(directoryPath, destDirName);
SetDirectoryPath(destDirName);
refreshOnNextRead = true;
}

/// <inheritdoc />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ public MockFileInfo(IMockFileDataAccessor mockFileSystem, string path) : base(mo
this.originalPath = path;
this.path = mockFileSystem.Path.GetFullPath(path);
this.mockFile = new MockFile(mockFileSystem);
Refresh();
// Like the real FileSystemInfo, the state is read on first access, not on construction.
refreshOnNextRead = true;
}

#if FEATURE_CREATE_SYMBOLIC_LINK
Expand All @@ -47,6 +48,7 @@ public override void Refresh()
{
var mockFileData = mockFileSystem.GetFile(path)?.Clone();
cachedMockFileData = mockFileData ?? MockFileData.NullObject.Clone();
refreshOnNextRead = false;
}

#if FEATURE_CREATE_SYMBOLIC_LINK
Expand Down Expand Up @@ -265,6 +267,7 @@ public override void MoveTo(string destFileName)
{
mockFile.Move(path, destFileName);
path = mockFileSystem.Path.GetFullPath(destFileName);
refreshOnNextRead = true;
}

#if FEATURE_FILE_MOVE_WITH_OVERWRITE
Expand All @@ -273,6 +276,7 @@ public override void MoveTo(string destFileName, bool overwrite)
{
mockFile.Move(path, destFileName, overwrite);
path = mockFileSystem.Path.GetFullPath(destFileName);
refreshOnNextRead = true;
}
#endif

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -465,13 +465,32 @@ public async Task MockDirectoryInfo_ToString_ShouldReturnDirectoryName(string di
await That(mockDirectoryInfo.ToString()).IsEqualTo(directoryPath);
}

[Test]
public async Task MockDirectoryInfo_MoveTo_ShouldDiscardTheCachedData()
{
// Arrange
var fileSystem = new MockFileSystem();
var path = XFS.Path(@"c:\temp\folder");
fileSystem.AddDirectory(path);
var directoryInfo = fileSystem.DirectoryInfo.New(path);
_ = directoryInfo.Attributes;
fileSystem.File.SetAttributes(path, FileAttributes.Directory | FileAttributes.Hidden);

// Act
directoryInfo.MoveTo(XFS.Path(@"c:\temp\moved"));

// Assert
await That(directoryInfo.Attributes.HasFlag(FileAttributes.Hidden)).IsTrue();
}

[Test]
public async Task MockDirectoryInfo_Exists_ShouldReturnCachedData()
{
// Arrange
var fileSystem = new MockFileSystem();
var path = XFS.Path(@"c:\abc");
var directoryInfo = fileSystem.DirectoryInfo.New(path);
_ = directoryInfo.Exists;

// Act
fileSystem.AddDirectory(path);
Expand Down Expand Up @@ -721,4 +740,85 @@ public async Task MockDirectoryInfo_LastWriteTimeUtc_SetterShouldThrowDirectoryN
await That(() => directoryInfo.LastWriteTime = newTime).Throws<DirectoryNotFoundException>();
}

}
[Test]
public async Task MockDirectoryInfo_Exists_ShouldNotReadStateBeforeFirstAccess()
{
var fileSystem = new MockFileSystem();
var path = XFS.Path(@"c:\abc");
var directoryInfo = fileSystem.DirectoryInfo.New(path);

fileSystem.Directory.CreateDirectory(path);

await That(directoryInfo.Exists).IsTrue();
}

[Test]
public async Task MockDirectoryInfo_Exists_ShouldBeFalseWhenDeletedBeforeFirstAccess()
{
var fileSystem = new MockFileSystem();
var path = XFS.Path(@"c:\abc");
fileSystem.Directory.CreateDirectory(path);
var directoryInfo = fileSystem.DirectoryInfo.New(path);

fileSystem.Directory.Delete(path);

await That(directoryInfo.Exists).IsFalse();
}

[Test]
public async Task MockDirectoryInfo_Exists_ShouldStayTrueWhenDeletedAfterFirstAccess()
{
var fileSystem = new MockFileSystem();
var path = XFS.Path(@"c:\abc");
fileSystem.Directory.CreateDirectory(path);
var directoryInfo = fileSystem.DirectoryInfo.New(path);
_ = directoryInfo.Exists;

fileSystem.Directory.Delete(path);

await That(directoryInfo.Exists).IsTrue();
directoryInfo.Refresh();
await That(directoryInfo.Exists).IsFalse();
}

[Test]
public async Task MockDirectoryInfo_LastWriteTime_ShouldReflectChangesBeforeFirstAccess()
{
var fileSystem = new MockFileSystem();
var path = XFS.Path(@"c:\abc");
fileSystem.Directory.CreateDirectory(path);
var directoryInfo = fileSystem.DirectoryInfo.New(path);
var date = new DateTime(2020, 1, 2, 3, 4, 5, DateTimeKind.Local);

fileSystem.Directory.SetLastWriteTime(path, date);

await That(directoryInfo.LastWriteTime).IsEqualTo(date);
}

[Test]
public async Task MockDirectoryInfo_LastWriteTime_ShouldReturnCachedDataAfterFirstAccess()
{
var fileSystem = new MockFileSystem();
var path = XFS.Path(@"c:\abc");
fileSystem.Directory.CreateDirectory(path);
var directoryInfo = fileSystem.DirectoryInfo.New(path);
var before = directoryInfo.LastWriteTime;

fileSystem.Directory.SetLastWriteTime(path, new DateTime(2020, 1, 2, 3, 4, 5, DateTimeKind.Local));

await That(directoryInfo.LastWriteTime).IsEqualTo(before);
}

[Test]
public async Task MockDirectoryInfo_FromEnumeration_ShouldHoldStateFromEnumeration()
{
var fileSystem = new MockFileSystem();
var path = XFS.Path(@"c:\abc\sub");
fileSystem.Directory.CreateDirectory(path);
var directoryInfo = fileSystem.DirectoryInfo.New(XFS.Path(@"c:\abc")).GetDirectories()[0];

fileSystem.Directory.Delete(path);

await That(directoryInfo.Exists).IsTrue();
}
}
Loading
Loading