Skip to content

Commit def8603

Browse files
herebebeastiesfgreinacher
authored andcommitted
#351: Add IFileSystem property to base classes (#352)
* Add IFileSystem property to base classes This allows people to get at the underlying IFileSystem implementation when developing extension methods. For example, it may make sense to put your extension method on DirectoryBase, but you may require FileBase to actually implement it. This makes that possible. In addition it fixes a bug in MockFileInfo.Replace where the returned FileInfo was for the concrete FileSystem not the mock one (bug caused by implicit casting). I think this commit actually removes the need for supporting implicit casting at all. * Remove laziness from FileSystem I really can't see the point of any of this - none of these constructors do any real work. * Rest of PR comments * Fix for serialization test
1 parent 90f411d commit def8603

29 files changed

Lines changed: 211 additions & 137 deletions

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,9 @@ $RECYCLE.BIN/
149149
# Mac crap
150150
.DS_Store
151151

152+
# JetBrains Rider IDE files
153+
.idea/
154+
152155
#System.IO.Abstractions specific ignores
153156
Releases
154157
System.IO.Abstractions.*.nupkg

System.IO.Abstractions.TestingHelpers.Tests/ConvertersTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,23 +32,23 @@ public void WrapFileSystemInfos_with_IEnumerable_is_lazy()
3232
{
3333
var crashingFileSystemInfos = new CrashingEnumerable<FileSystemInfo>();
3434

35-
Assert.DoesNotThrow(() => Converters.WrapFileSystemInfos(crashingFileSystemInfos));
35+
Assert.DoesNotThrow(() => crashingFileSystemInfos.WrapFileSystemInfos(new MockFileSystem()));
3636
}
3737

3838
[Test]
3939
public void WrapFiles_with_IEnumerable_is_lazy()
4040
{
4141
var crashingFileInfos = new CrashingEnumerable<FileInfo>();
4242

43-
Assert.DoesNotThrow(() => Converters.WrapFiles(crashingFileInfos));
43+
Assert.DoesNotThrow(() => crashingFileInfos.WrapFiles(new MockFileSystem()));
4444
}
4545
[Test]
4646
public void WrapDirectories_with_IEnumerable_is_lazy()
4747
{
4848
var crashingDirectoryInfos = new CrashingEnumerable<DirectoryInfo>();
4949

50-
Assert.DoesNotThrow(() => Converters.WrapDirectories(crashingDirectoryInfos));
50+
Assert.DoesNotThrow(() => crashingDirectoryInfos.WrapDirectories(new MockFileSystem()));
5151
}
5252

5353
}
54-
}
54+
}

System.IO.Abstractions.TestingHelpers/IMockFileDataAccessor.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,5 +62,7 @@ public interface IMockFileDataAccessor
6262
IDriveInfoFactory DriveInfo { get; }
6363

6464
PathVerifier PathVerifier { get; }
65+
66+
IFileSystem FileSystem { get; }
6567
}
66-
}
68+
}

System.IO.Abstractions.TestingHelpers/MockDirectory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class MockDirectory : DirectoryBase
1818

1919
private string currentDirectory;
2020

21-
public MockDirectory(IMockFileDataAccessor mockFileDataAccessor, FileBase fileBase, string currentDirectory)
21+
public MockDirectory(IMockFileDataAccessor mockFileDataAccessor, FileBase fileBase, string currentDirectory) : base(mockFileDataAccessor?.FileSystem)
2222
{
2323
this.currentDirectory = currentDirectory;
2424
this.mockFileDataAccessor = mockFileDataAccessor ?? throw new ArgumentNullException(nameof(mockFileDataAccessor));
@@ -529,4 +529,4 @@ static void CheckSearchPattern(string searchPattern)
529529
}
530530
}
531531
}
532-
}
532+
}

System.IO.Abstractions.TestingHelpers/MockDirectoryInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class MockDirectoryInfo : DirectoryInfoBase
1717
/// <param name="mockFileDataAccessor">The mock file data accessor.</param>
1818
/// <param name="directoryPath">The directory path.</param>
1919
/// <exception cref="ArgumentNullException">Thrown if <paramref name="mockFileDataAccessor"/> or <paramref name="directoryPath"/> is <see langref="null"/>.</exception>
20-
public MockDirectoryInfo(IMockFileDataAccessor mockFileDataAccessor, string directoryPath)
20+
public MockDirectoryInfo(IMockFileDataAccessor mockFileDataAccessor, string directoryPath) : base(mockFileDataAccessor?.FileSystem)
2121
{
2222
this.mockFileDataAccessor = mockFileDataAccessor ?? throw new ArgumentNullException(nameof(mockFileDataAccessor));
2323

System.IO.Abstractions.TestingHelpers/MockDriveInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ public class MockDriveInfo : DriveInfoBase
55
{
66
private readonly IMockFileDataAccessor mockFileDataAccessor;
77

8-
public MockDriveInfo(IMockFileDataAccessor mockFileDataAccessor, string name)
8+
public MockDriveInfo(IMockFileDataAccessor mockFileDataAccessor, string name) : base(mockFileDataAccessor?.FileSystem)
99
{
1010
if (mockFileDataAccessor == null)
1111
{

System.IO.Abstractions.TestingHelpers/MockFile.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class MockFile : FileBase
1212
private readonly IMockFileDataAccessor mockFileDataAccessor;
1313
private readonly MockPath mockPath;
1414

15-
public MockFile(IMockFileDataAccessor mockFileDataAccessor)
15+
public MockFile(IMockFileDataAccessor mockFileDataAccessor) : base(mockFileDataAccessor?.FileSystem)
1616
{
1717
this.mockFileDataAccessor = mockFileDataAccessor ?? throw new ArgumentNullException(nameof(mockFileDataAccessor));
1818
mockPath = new MockPath(mockFileDataAccessor);
@@ -350,7 +350,7 @@ public override void Move(string sourceFileName, string destFileName)
350350
throw new IOException("A file can not be created if it already exists.");
351351
}
352352
}
353-
353+
354354

355355
var sourceFile = mockFileDataAccessor.GetFile(sourceFileName);
356356

@@ -399,7 +399,7 @@ public override Stream Open(string path, FileMode mode, FileAccess access, FileS
399399
}
400400

401401
var length = mockFileDataAccessor.GetFile(path).Contents.Length;
402-
402+
403403
MockFileStream.StreamType streamType = MockFileStream.StreamType.WRITE;
404404
if (access == FileAccess.Read)
405405
streamType = MockFileStream.StreamType.READ;
@@ -938,7 +938,7 @@ public override void WriteAllText(string path, string contents, Encoding encodin
938938
}
939939

940940
VerifyDirectoryExists(path);
941-
941+
942942
MockFileData data = contents == null ? new MockFileData(new byte[0]) : new MockFileData(contents, encoding);
943943
mockFileDataAccessor.AddFile(path, data);
944944
}
@@ -975,4 +975,4 @@ private void VerifyDirectoryExists(string path)
975975
}
976976
}
977977
}
978-
}
978+
}

System.IO.Abstractions.TestingHelpers/MockFileInfo.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public class MockFileInfo : FileInfoBase
88
private readonly IMockFileDataAccessor mockFileSystem;
99
private string path;
1010

11-
public MockFileInfo(IMockFileDataAccessor mockFileSystem, string path)
11+
public MockFileInfo(IMockFileDataAccessor mockFileSystem, string path) : base(mockFileSystem?.FileSystem)
1212
{
1313
this.mockFileSystem = mockFileSystem ?? throw new ArgumentNullException(nameof(mockFileSystem));
1414
this.path = path ?? throw new ArgumentNullException(nameof(path));
@@ -259,7 +259,7 @@ public override FileInfoBase Replace(string destinationFileName, string destinat
259259
public override FileInfoBase Replace(string destinationFileName, string destinationBackupFileName, bool ignoreMetadataErrors)
260260
{
261261
mockFileSystem.File.Replace(path, destinationFileName, destinationBackupFileName, ignoreMetadataErrors);
262-
return new FileInfo(destinationFileName);
262+
return mockFileSystem.FileInfo.FromFileName(destinationFileName);
263263
}
264264
#endif
265265

@@ -312,4 +312,4 @@ public override long Length
312312
}
313313
}
314314
}
315-
}
315+
}

System.IO.Abstractions.TestingHelpers/MockFileSystem.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ public MockFileSystem(IDictionary<string, MockFileData> files, string currentDir
6060

6161
public IFileSystemWatcherFactory FileSystemWatcher { get; }
6262

63+
public IFileSystem FileSystem => this;
64+
6365
public PathVerifier PathVerifier => pathVerifier;
6466

6567
private string FixPath(string path, bool checkCaps = false)

System.IO.Abstractions.TestingHelpers/MockPath.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,9 @@ public class MockPath : PathWrapper
1414

1515
private static readonly char[] InvalidAdditionalPathChars = { '*', '?' };
1616

17-
public MockPath(IMockFileDataAccessor mockFileDataAccessor)
17+
public MockPath(IMockFileDataAccessor mockFileDataAccessor) : base(mockFileDataAccessor?.FileSystem)
1818
{
19-
if (mockFileDataAccessor == null)
20-
{
21-
throw new ArgumentNullException(nameof(mockFileDataAccessor));
22-
}
23-
24-
this.mockFileDataAccessor = mockFileDataAccessor;
19+
this.mockFileDataAccessor = mockFileDataAccessor ?? throw new ArgumentNullException(nameof(mockFileDataAccessor));
2520
}
2621

2722
public override string GetFullPath(string path)

0 commit comments

Comments
 (0)