From 5724ae168c529cee4820721270ce135d8b926e70 Mon Sep 17 00:00:00 2001 From: Valentin Date: Thu, 9 Jan 2025 17:50:05 +0100 Subject: [PATCH] Add initial support for the `FileVersionInfo` interfaces --- Directory.Packages.props | 2 +- .../FileSystem/FileVersionInfoFactoryMock.cs | 31 ++ .../FileSystem/FileVersionInfoMock.cs | 382 ++++++++++++++++++ .../MockFileSystem.cs | 4 + .../Statistics/FileSystemStatistics.cs | 9 + .../Statistics/IFileSystemStatistics.cs | 5 + .../FileSystem/FileVersionInfoFactory.cs | 26 ++ .../FileSystem/FileVersionInfoWrapper.cs | 143 +++++++ .../Testably.Abstractions/RealFileSystem.cs | 4 + .../Testably.Abstractions.Testing_net6.0.txt | 2 + .../Testably.Abstractions.Testing_net7.0.txt | 2 + .../Testably.Abstractions.Testing_net8.0.txt | 2 + ...ly.Abstractions.Testing_netstandard2.0.txt | 2 + ...ly.Abstractions.Testing_netstandard2.1.txt | 2 + .../Expected/Testably.Abstractions_net6.0.txt | 1 + .../Expected/Testably.Abstractions_net7.0.txt | 1 + .../Expected/Testably.Abstractions_net8.0.txt | 1 + .../Testably.Abstractions_netstandard2.0.txt | 1 + .../Testably.Abstractions_netstandard2.1.txt | 1 + .../ParityTests.cs | 13 + .../TestHelpers/Parity.cs | 7 + .../FileVersionInfoFactoryStatisticsTests.cs | 19 + .../FileVersionInfoStatisticsTests.cs | 304 ++++++++++++++ .../Statistics/StatisticsTests.cs | 4 + 24 files changed, 967 insertions(+), 1 deletion(-) create mode 100644 Source/Testably.Abstractions.Testing/FileSystem/FileVersionInfoFactoryMock.cs create mode 100644 Source/Testably.Abstractions.Testing/FileSystem/FileVersionInfoMock.cs create mode 100644 Source/Testably.Abstractions/FileSystem/FileVersionInfoFactory.cs create mode 100644 Source/Testably.Abstractions/FileSystem/FileVersionInfoWrapper.cs create mode 100644 Tests/Testably.Abstractions.Testing.Tests/Statistics/FileSystem/FileVersionInfoFactoryStatisticsTests.cs create mode 100644 Tests/Testably.Abstractions.Testing.Tests/Statistics/FileSystem/FileVersionInfoStatisticsTests.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index 566d8f4b6..63a6ccf92 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -6,7 +6,7 @@ - + diff --git a/Source/Testably.Abstractions.Testing/FileSystem/FileVersionInfoFactoryMock.cs b/Source/Testably.Abstractions.Testing/FileSystem/FileVersionInfoFactoryMock.cs new file mode 100644 index 000000000..f39326985 --- /dev/null +++ b/Source/Testably.Abstractions.Testing/FileSystem/FileVersionInfoFactoryMock.cs @@ -0,0 +1,31 @@ +using System; + +namespace Testably.Abstractions.Testing.FileSystem; + +internal sealed class FileVersionInfoFactoryMock + : IFileVersionInfoFactory +{ + private readonly MockFileSystem _fileSystem; + + internal FileVersionInfoFactoryMock(MockFileSystem fileSystem) + { + _fileSystem = fileSystem; + } + + #region IFileVersionInfoFactory Members + + /// + public IFileSystem FileSystem + => _fileSystem; + + /// + public IFileVersionInfo GetVersionInfo(string fileName) + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterMethod(nameof(GetVersionInfo), fileName); + + return FileVersionInfoMock.New(_fileSystem.Storage.GetLocation(fileName), _fileSystem); + } + + #endregion +} diff --git a/Source/Testably.Abstractions.Testing/FileSystem/FileVersionInfoMock.cs b/Source/Testably.Abstractions.Testing/FileSystem/FileVersionInfoMock.cs new file mode 100644 index 000000000..2ae496bb3 --- /dev/null +++ b/Source/Testably.Abstractions.Testing/FileSystem/FileVersionInfoMock.cs @@ -0,0 +1,382 @@ +using System; +using Testably.Abstractions.Testing.Statistics; +using Testably.Abstractions.Testing.Storage; + +namespace Testably.Abstractions.Testing.FileSystem; + +/// +/// Mocked instance of a +/// +internal sealed class FileVersionInfoMock : IFileVersionInfo +{ + /// + public IFileSystem FileSystem + => _fileSystem; + + private readonly MockFileSystem _fileSystem; + private readonly string _path; + + private FileVersionInfoMock(IStorageLocation location, MockFileSystem fileSystem) + { + _fileSystem = fileSystem; + _path = location.FullPath; + } + + #region IFileVersionInfo Members + + /// + public string? Comments + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(Comments), PropertyAccess.Get); + + return ""; + } + } + + /// + public string? CompanyName + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(CompanyName), PropertyAccess.Get); + + return ""; + } + } + + /// + public int FileBuildPart + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(FileBuildPart), PropertyAccess.Get); + + return 0; + } + } + + /// + public string? FileDescription + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(FileDescription), PropertyAccess.Get); + + return ""; + } + } + + /// + public int FileMajorPart + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(FileMajorPart), PropertyAccess.Get); + + return 0; + } + } + + /// + public int FileMinorPart + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(FileMinorPart), PropertyAccess.Get); + + return 0; + } + } + + /// + public string FileName + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(FileName), PropertyAccess.Get); + + return ""; + } + } + + /// + public int FilePrivatePart + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(FilePrivatePart), PropertyAccess.Get); + + return 0; + } + } + + /// + public string? FileVersion + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(FileVersion), PropertyAccess.Get); + + return ""; + } + } + + /// + public string? InternalName + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(InternalName), PropertyAccess.Get); + + return ""; + } + } + + /// + public bool IsDebug + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(IsDebug), PropertyAccess.Get); + + return false; + } + } + + /// + public bool IsPatched + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(IsPatched), PropertyAccess.Get); + + return false; + } + } + + /// + public bool IsPreRelease + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(IsPreRelease), PropertyAccess.Get); + + return false; + } + } + + /// + public bool IsPrivateBuild + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(IsPrivateBuild), PropertyAccess.Get); + + return false; + } + } + + /// + public bool IsSpecialBuild + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(IsSpecialBuild), PropertyAccess.Get); + + return false; + } + } + + /// + public string? Language + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(Language), PropertyAccess.Get); + + return ""; + } + } + + /// + public string? LegalCopyright + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(LegalCopyright), PropertyAccess.Get); + + return ""; + } + } + + /// + public string? LegalTrademarks + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(LegalTrademarks), PropertyAccess.Get); + + return ""; + } + } + + /// + public string? OriginalFilename + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(OriginalFilename), PropertyAccess.Get); + + return ""; + } + } + + /// + public string? PrivateBuild + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(PrivateBuild), PropertyAccess.Get); + + return ""; + } + } + + /// + public int ProductBuildPart + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(ProductBuildPart), PropertyAccess.Get); + + return 0; + } + } + + /// + public int ProductMajorPart + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(ProductMajorPart), PropertyAccess.Get); + + return 0; + } + } + + /// + public int ProductMinorPart + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(ProductMinorPart), PropertyAccess.Get); + + return 0; + } + } + + /// + public string? ProductName + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(ProductName), PropertyAccess.Get); + + return ""; + } + } + + /// + public int ProductPrivatePart + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(ProductPrivatePart), PropertyAccess.Get); + + return 0; + } + } + + /// + public string? ProductVersion + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(ProductVersion), PropertyAccess.Get); + + return ""; + } + } + + /// + public string? SpecialBuild + { + get + { + using IDisposable registration = _fileSystem.StatisticsRegistration + .FileVersionInfo.RegisterPathProperty(_path, + nameof(SpecialBuild), PropertyAccess.Get); + + return ""; + } + } + + #endregion + + internal static FileVersionInfoMock New(IStorageLocation location, MockFileSystem fileSystem) + => new(location, fileSystem); +} diff --git a/Source/Testably.Abstractions.Testing/MockFileSystem.cs b/Source/Testably.Abstractions.Testing/MockFileSystem.cs index 17429e92d..c6faf9557 100644 --- a/Source/Testably.Abstractions.Testing/MockFileSystem.cs +++ b/Source/Testably.Abstractions.Testing/MockFileSystem.cs @@ -138,6 +138,7 @@ public MockFileSystem(Func options FileInfo = new FileInfoFactoryMock(this); FileStream = new FileStreamFactoryMock(this); FileSystemWatcher = new FileSystemWatcherFactoryMock(this); + FileVersionInfo = new FileVersionInfoFactoryMock(this); SafeFileHandleStrategy = new NullSafeFileHandleStrategy(); AccessControlStrategy = new NullAccessControlStrategy(); InitializeFileSystem(initialization); @@ -168,6 +169,9 @@ public IFile File /// public IFileSystemWatcherFactory FileSystemWatcher { get; } + /// + public IFileVersionInfoFactory FileVersionInfo { get; } + /// public IPath Path => _pathMock; diff --git a/Source/Testably.Abstractions.Testing/Statistics/FileSystemStatistics.cs b/Source/Testably.Abstractions.Testing/Statistics/FileSystemStatistics.cs index bebfe221e..d8b4ac26b 100644 --- a/Source/Testably.Abstractions.Testing/Statistics/FileSystemStatistics.cs +++ b/Source/Testably.Abstractions.Testing/Statistics/FileSystemStatistics.cs @@ -11,6 +11,8 @@ internal sealed class FileSystemStatistics : IFileSystemStatistics internal readonly PathStatistics FileSystemWatcher; + internal readonly PathStatistics + FileVersionInfo; internal readonly CallStatistics Path; private readonly MockFileSystem _fileSystem; @@ -34,6 +36,8 @@ public FileSystemStatistics(MockFileSystem fileSystem) statisticsGate, fileSystem, nameof(IFileSystem.FileStream)); FileSystemWatcher = new PathStatistics( statisticsGate, fileSystem, nameof(IFileSystem.FileSystemWatcher)); + FileVersionInfo = new PathStatistics( + statisticsGate, fileSystem, nameof(IFileSystem.FileVersionInfo)); Path = new CallStatistics( statisticsGate, nameof(IFileSystem.Path)); } @@ -73,6 +77,11 @@ IPathStatistics IFileSystemStatistics.File IFileSystemStatistics.FileSystemWatcher => FileSystemWatcher; + /// + IPathStatistics + IFileSystemStatistics.FileVersionInfo + => FileVersionInfo; + /// IStatistics IFileSystemStatistics.Path => Path; diff --git a/Source/Testably.Abstractions.Testing/Statistics/IFileSystemStatistics.cs b/Source/Testably.Abstractions.Testing/Statistics/IFileSystemStatistics.cs index 519db82fb..ce5211140 100644 --- a/Source/Testably.Abstractions.Testing/Statistics/IFileSystemStatistics.cs +++ b/Source/Testably.Abstractions.Testing/Statistics/IFileSystemStatistics.cs @@ -40,6 +40,11 @@ public interface IFileSystemStatistics /// IPathStatistics FileSystemWatcher { get; } + /// + /// Statistical information about calls to . + /// + IPathStatistics FileVersionInfo { get; } + /// /// Statistical information about calls to . /// diff --git a/Source/Testably.Abstractions/FileSystem/FileVersionInfoFactory.cs b/Source/Testably.Abstractions/FileSystem/FileVersionInfoFactory.cs new file mode 100644 index 000000000..4179ad1af --- /dev/null +++ b/Source/Testably.Abstractions/FileSystem/FileVersionInfoFactory.cs @@ -0,0 +1,26 @@ +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.IO; + +namespace Testably.Abstractions.FileSystem; + +internal sealed class FileVersionInfoFactory : IFileVersionInfoFactory +{ + internal FileVersionInfoFactory(RealFileSystem fileSystem) + { + FileSystem = fileSystem; + } + + #region IFileSystemWatcherFactory Members + + /// + public IFileSystem FileSystem { get; } + + /// + public IFileVersionInfo GetVersionInfo(string fileName) + => FileVersionInfoWrapper.FromFileVersionInfo( + FileVersionInfo.GetVersionInfo(fileName), + FileSystem); + + #endregion +} diff --git a/Source/Testably.Abstractions/FileSystem/FileVersionInfoWrapper.cs b/Source/Testably.Abstractions/FileSystem/FileVersionInfoWrapper.cs new file mode 100644 index 000000000..53a11bfe2 --- /dev/null +++ b/Source/Testably.Abstractions/FileSystem/FileVersionInfoWrapper.cs @@ -0,0 +1,143 @@ +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; + +namespace Testably.Abstractions.FileSystem; + +internal sealed class FileVersionInfoWrapper : IFileVersionInfo +{ + private readonly FileVersionInfo _instance; + + private FileVersionInfoWrapper(FileVersionInfo fileSystemWatcher, + IFileSystem fileSystem) + { + _instance = fileSystemWatcher; + FileSystem = fileSystem; + } + + #region IFileVersionInfo Members + + /// + public string? Comments + => _instance.Comments; + + /// + public string? CompanyName + => _instance.CompanyName; + + /// + public int FileBuildPart + => _instance.FileBuildPart; + + /// + public string? FileDescription + => _instance.FileDescription; + + /// + public int FileMajorPart + => _instance.FileMajorPart; + + /// + public int FileMinorPart + => _instance.FileMinorPart; + + /// + public string FileName + => _instance.FileName; + + /// + public int FilePrivatePart + => _instance.FilePrivatePart; + + /// + public IFileSystem FileSystem { get; } + + /// + public string? FileVersion + => _instance.FileVersion; + + /// + public string? InternalName + => _instance.InternalName; + + /// + public bool IsDebug + => _instance.IsDebug; + + /// + public bool IsPatched + => _instance.IsPatched; + + /// + public bool IsPreRelease + => _instance.IsPreRelease; + + /// + public bool IsPrivateBuild + => _instance.IsPrivateBuild; + + /// + public bool IsSpecialBuild + => _instance.IsSpecialBuild; + + /// + public string? Language + => _instance.Language; + + /// + public string? LegalCopyright + => _instance.LegalCopyright; + + /// + public string? LegalTrademarks + => _instance.LegalTrademarks; + + /// + public string? OriginalFilename + => _instance.OriginalFilename; + + /// + public string? PrivateBuild + => _instance.PrivateBuild; + + /// + public int ProductBuildPart + => _instance.ProductBuildPart; + + /// + public int ProductMajorPart + => _instance.ProductMajorPart; + + /// + public int ProductMinorPart + => _instance.ProductMinorPart; + + /// + public string? ProductName + => _instance.ProductName; + + /// + public int ProductPrivatePart + => _instance.ProductPrivatePart; + + /// + public string? ProductVersion + => _instance.ProductVersion; + + /// + public string? SpecialBuild + => _instance.SpecialBuild; + + #endregion + + [return: NotNullIfNotNull("instance")] + internal static FileVersionInfoWrapper? FromFileVersionInfo( + FileVersionInfo? instance, IFileSystem fileSystem) + { + if (instance == null) + { + return null; + } + + return new FileVersionInfoWrapper(instance, fileSystem); + } +} diff --git a/Source/Testably.Abstractions/RealFileSystem.cs b/Source/Testably.Abstractions/RealFileSystem.cs index 2903f7a04..2a554275b 100644 --- a/Source/Testably.Abstractions/RealFileSystem.cs +++ b/Source/Testably.Abstractions/RealFileSystem.cs @@ -22,6 +22,7 @@ public RealFileSystem() FileInfo = new FileInfoFactory(this); FileStream = new FileStreamFactory(this); FileSystemWatcher = new FileSystemWatcherFactory(this); + FileVersionInfo = new FileVersionInfoFactory(this); Path = new PathWrapper(this); } @@ -48,6 +49,9 @@ public RealFileSystem() /// public IFileSystemWatcherFactory FileSystemWatcher { get; } + /// + public IFileVersionInfoFactory FileVersionInfo { get; } + /// public IPath Path { get; } diff --git a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_net6.0.txt b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_net6.0.txt index a7ea4e2e5..a30b42d2c 100644 --- a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_net6.0.txt +++ b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_net6.0.txt @@ -101,6 +101,7 @@ namespace Testably.Abstractions.Testing public System.IO.Abstractions.IFileInfoFactory FileInfo { get; } public System.IO.Abstractions.IFileStreamFactory FileStream { get; } public System.IO.Abstractions.IFileSystemWatcherFactory FileSystemWatcher { get; } + public System.IO.Abstractions.IFileVersionInfoFactory FileVersionInfo { get; } public Testably.Abstractions.Testing.FileSystem.IInterceptionHandler Intercept { get; } public Testably.Abstractions.Testing.FileSystem.INotificationHandler Notify { get; } public System.IO.Abstractions.IPath Path { get; } @@ -293,6 +294,7 @@ namespace Testably.Abstractions.Testing.Statistics Testably.Abstractions.Testing.Statistics.IPathStatistics FileInfo { get; } Testably.Abstractions.Testing.Statistics.IPathStatistics FileStream { get; } Testably.Abstractions.Testing.Statistics.IPathStatistics FileSystemWatcher { get; } + Testably.Abstractions.Testing.Statistics.IPathStatistics FileVersionInfo { get; } Testably.Abstractions.Testing.Statistics.IStatistics Path { get; } int TotalCount { get; } } diff --git a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_net7.0.txt b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_net7.0.txt index 9a44cbdee..31a2fa9a3 100644 --- a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_net7.0.txt +++ b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_net7.0.txt @@ -101,6 +101,7 @@ namespace Testably.Abstractions.Testing public System.IO.Abstractions.IFileInfoFactory FileInfo { get; } public System.IO.Abstractions.IFileStreamFactory FileStream { get; } public System.IO.Abstractions.IFileSystemWatcherFactory FileSystemWatcher { get; } + public System.IO.Abstractions.IFileVersionInfoFactory FileVersionInfo { get; } public Testably.Abstractions.Testing.FileSystem.IInterceptionHandler Intercept { get; } public Testably.Abstractions.Testing.FileSystem.INotificationHandler Notify { get; } public System.IO.Abstractions.IPath Path { get; } @@ -293,6 +294,7 @@ namespace Testably.Abstractions.Testing.Statistics Testably.Abstractions.Testing.Statistics.IPathStatistics FileInfo { get; } Testably.Abstractions.Testing.Statistics.IPathStatistics FileStream { get; } Testably.Abstractions.Testing.Statistics.IPathStatistics FileSystemWatcher { get; } + Testably.Abstractions.Testing.Statistics.IPathStatistics FileVersionInfo { get; } Testably.Abstractions.Testing.Statistics.IStatistics Path { get; } int TotalCount { get; } } diff --git a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_net8.0.txt b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_net8.0.txt index 71fa47194..81697dc82 100644 --- a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_net8.0.txt +++ b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_net8.0.txt @@ -101,6 +101,7 @@ namespace Testably.Abstractions.Testing public System.IO.Abstractions.IFileInfoFactory FileInfo { get; } public System.IO.Abstractions.IFileStreamFactory FileStream { get; } public System.IO.Abstractions.IFileSystemWatcherFactory FileSystemWatcher { get; } + public System.IO.Abstractions.IFileVersionInfoFactory FileVersionInfo { get; } public Testably.Abstractions.Testing.FileSystem.IInterceptionHandler Intercept { get; } public Testably.Abstractions.Testing.FileSystem.INotificationHandler Notify { get; } public System.IO.Abstractions.IPath Path { get; } @@ -291,6 +292,7 @@ namespace Testably.Abstractions.Testing.Statistics Testably.Abstractions.Testing.Statistics.IPathStatistics FileInfo { get; } Testably.Abstractions.Testing.Statistics.IPathStatistics FileStream { get; } Testably.Abstractions.Testing.Statistics.IPathStatistics FileSystemWatcher { get; } + Testably.Abstractions.Testing.Statistics.IPathStatistics FileVersionInfo { get; } Testably.Abstractions.Testing.Statistics.IStatistics Path { get; } int TotalCount { get; } } diff --git a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_netstandard2.0.txt b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_netstandard2.0.txt index 558153265..4d0e8139d 100644 --- a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_netstandard2.0.txt +++ b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_netstandard2.0.txt @@ -99,6 +99,7 @@ namespace Testably.Abstractions.Testing public System.IO.Abstractions.IFileInfoFactory FileInfo { get; } public System.IO.Abstractions.IFileStreamFactory FileStream { get; } public System.IO.Abstractions.IFileSystemWatcherFactory FileSystemWatcher { get; } + public System.IO.Abstractions.IFileVersionInfoFactory FileVersionInfo { get; } public Testably.Abstractions.Testing.FileSystem.IInterceptionHandler Intercept { get; } public Testably.Abstractions.Testing.FileSystem.INotificationHandler Notify { get; } public System.IO.Abstractions.IPath Path { get; } @@ -290,6 +291,7 @@ namespace Testably.Abstractions.Testing.Statistics Testably.Abstractions.Testing.Statistics.IPathStatistics FileInfo { get; } Testably.Abstractions.Testing.Statistics.IPathStatistics FileStream { get; } Testably.Abstractions.Testing.Statistics.IPathStatistics FileSystemWatcher { get; } + Testably.Abstractions.Testing.Statistics.IPathStatistics FileVersionInfo { get; } Testably.Abstractions.Testing.Statistics.IStatistics Path { get; } int TotalCount { get; } } diff --git a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_netstandard2.1.txt b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_netstandard2.1.txt index 9fd37ba1f..f90b10c57 100644 --- a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_netstandard2.1.txt +++ b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_netstandard2.1.txt @@ -99,6 +99,7 @@ namespace Testably.Abstractions.Testing public System.IO.Abstractions.IFileInfoFactory FileInfo { get; } public System.IO.Abstractions.IFileStreamFactory FileStream { get; } public System.IO.Abstractions.IFileSystemWatcherFactory FileSystemWatcher { get; } + public System.IO.Abstractions.IFileVersionInfoFactory FileVersionInfo { get; } public Testably.Abstractions.Testing.FileSystem.IInterceptionHandler Intercept { get; } public Testably.Abstractions.Testing.FileSystem.INotificationHandler Notify { get; } public System.IO.Abstractions.IPath Path { get; } @@ -290,6 +291,7 @@ namespace Testably.Abstractions.Testing.Statistics Testably.Abstractions.Testing.Statistics.IPathStatistics FileInfo { get; } Testably.Abstractions.Testing.Statistics.IPathStatistics FileStream { get; } Testably.Abstractions.Testing.Statistics.IPathStatistics FileSystemWatcher { get; } + Testably.Abstractions.Testing.Statistics.IPathStatistics FileVersionInfo { get; } Testably.Abstractions.Testing.Statistics.IStatistics Path { get; } int TotalCount { get; } } diff --git a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_net6.0.txt b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_net6.0.txt index aa0b31e17..bde87672c 100644 --- a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_net6.0.txt +++ b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_net6.0.txt @@ -14,6 +14,7 @@ namespace Testably.Abstractions public System.IO.Abstractions.IFileInfoFactory FileInfo { get; } public System.IO.Abstractions.IFileStreamFactory FileStream { get; } public System.IO.Abstractions.IFileSystemWatcherFactory FileSystemWatcher { get; } + public System.IO.Abstractions.IFileVersionInfoFactory FileVersionInfo { get; } public System.IO.Abstractions.IPath Path { get; } } public sealed class RealRandomSystem : Testably.Abstractions.IRandomSystem diff --git a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_net7.0.txt b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_net7.0.txt index 703e74a7c..bada05068 100644 --- a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_net7.0.txt +++ b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_net7.0.txt @@ -14,6 +14,7 @@ namespace Testably.Abstractions public System.IO.Abstractions.IFileInfoFactory FileInfo { get; } public System.IO.Abstractions.IFileStreamFactory FileStream { get; } public System.IO.Abstractions.IFileSystemWatcherFactory FileSystemWatcher { get; } + public System.IO.Abstractions.IFileVersionInfoFactory FileVersionInfo { get; } public System.IO.Abstractions.IPath Path { get; } } public sealed class RealRandomSystem : Testably.Abstractions.IRandomSystem diff --git a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_net8.0.txt b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_net8.0.txt index 83375a2e5..23989e69e 100644 --- a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_net8.0.txt +++ b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_net8.0.txt @@ -14,6 +14,7 @@ namespace Testably.Abstractions public System.IO.Abstractions.IFileInfoFactory FileInfo { get; } public System.IO.Abstractions.IFileStreamFactory FileStream { get; } public System.IO.Abstractions.IFileSystemWatcherFactory FileSystemWatcher { get; } + public System.IO.Abstractions.IFileVersionInfoFactory FileVersionInfo { get; } public System.IO.Abstractions.IPath Path { get; } } public sealed class RealRandomSystem : Testably.Abstractions.IRandomSystem diff --git a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_netstandard2.0.txt b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_netstandard2.0.txt index 6c5af245f..07414ca54 100644 --- a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_netstandard2.0.txt +++ b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_netstandard2.0.txt @@ -14,6 +14,7 @@ namespace Testably.Abstractions public System.IO.Abstractions.IFileInfoFactory FileInfo { get; } public System.IO.Abstractions.IFileStreamFactory FileStream { get; } public System.IO.Abstractions.IFileSystemWatcherFactory FileSystemWatcher { get; } + public System.IO.Abstractions.IFileVersionInfoFactory FileVersionInfo { get; } public System.IO.Abstractions.IPath Path { get; } } public sealed class RealRandomSystem : Testably.Abstractions.IRandomSystem diff --git a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_netstandard2.1.txt b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_netstandard2.1.txt index 15db8c729..395613383 100644 --- a/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_netstandard2.1.txt +++ b/Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions_netstandard2.1.txt @@ -14,6 +14,7 @@ namespace Testably.Abstractions public System.IO.Abstractions.IFileInfoFactory FileInfo { get; } public System.IO.Abstractions.IFileStreamFactory FileStream { get; } public System.IO.Abstractions.IFileSystemWatcherFactory FileSystemWatcher { get; } + public System.IO.Abstractions.IFileVersionInfoFactory FileVersionInfo { get; } public System.IO.Abstractions.IPath Path { get; } } public sealed class RealRandomSystem : Testably.Abstractions.IRandomSystem diff --git a/Tests/Testably.Abstractions.Parity.Tests/ParityTests.cs b/Tests/Testably.Abstractions.Parity.Tests/ParityTests.cs index 31929ec8b..a4f1487fa 100644 --- a/Tests/Testably.Abstractions.Parity.Tests/ParityTests.cs +++ b/Tests/Testably.Abstractions.Parity.Tests/ParityTests.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Threading; @@ -98,6 +99,18 @@ public async Task await That(parityErrors).Should().BeEmpty(); } + [Fact] + public async Task + IFileVersionInfoAndIFileVersionInfoFactory_EnsureParityWith_FileVersionInfo() + { + List parityErrors = Parity.FileVersionInfo + .GetErrorsToInstanceType( + typeof(FileVersionInfo), + testOutputHelper); + + await That(parityErrors).Should().BeEmpty(); + } + [Fact] public async Task IGuid_EnsureParityWith_Guid() { diff --git a/Tests/Testably.Abstractions.Parity.Tests/TestHelpers/Parity.cs b/Tests/Testably.Abstractions.Parity.Tests/TestHelpers/Parity.cs index 4a54e96be..e1ed9236b 100644 --- a/Tests/Testably.Abstractions.Parity.Tests/TestHelpers/Parity.cs +++ b/Tests/Testably.Abstractions.Parity.Tests/TestHelpers/Parity.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Threading; @@ -57,6 +58,12 @@ public class Parity nameof(System.IO.FileSystemWatcher.ToString)) ]); + public ParityCheck FileVersionInfo { get; } = new(excludeMethods: + [ + typeof(FileVersionInfo).GetMethod( + nameof(System.Diagnostics.FileVersionInfo.ToString)) + ]); + public ParityCheck Guid { get; } = new(); public ParityCheck Path { get; } = new(excludeFields: new[] diff --git a/Tests/Testably.Abstractions.Testing.Tests/Statistics/FileSystem/FileVersionInfoFactoryStatisticsTests.cs b/Tests/Testably.Abstractions.Testing.Tests/Statistics/FileSystem/FileVersionInfoFactoryStatisticsTests.cs new file mode 100644 index 000000000..02aff7bb0 --- /dev/null +++ b/Tests/Testably.Abstractions.Testing.Tests/Statistics/FileSystem/FileVersionInfoFactoryStatisticsTests.cs @@ -0,0 +1,19 @@ +using Testably.Abstractions.Testing.Tests.TestHelpers; + +namespace Testably.Abstractions.Testing.Tests.Statistics.FileSystem; + +public class FileVersionInfoFactoryStatisticsTests +{ + [SkippableFact] + public void Method_GetVersionInfo_String_ShouldRegisterCall() + { + MockFileSystem sut = new(); + string fileName = "foo"; + + sut.FileVersionInfo.GetVersionInfo(fileName); + + sut.Statistics.FileVersionInfo.ShouldOnlyContainMethodCall( + nameof(IFileVersionInfoFactory.GetVersionInfo), + fileName); + } +} diff --git a/Tests/Testably.Abstractions.Testing.Tests/Statistics/FileSystem/FileVersionInfoStatisticsTests.cs b/Tests/Testably.Abstractions.Testing.Tests/Statistics/FileSystem/FileVersionInfoStatisticsTests.cs new file mode 100644 index 000000000..6491647ed --- /dev/null +++ b/Tests/Testably.Abstractions.Testing.Tests/Statistics/FileSystem/FileVersionInfoStatisticsTests.cs @@ -0,0 +1,304 @@ +using Testably.Abstractions.Testing.Tests.TestHelpers; +// ReSharper disable MethodSupportsCancellation + +namespace Testably.Abstractions.Testing.Tests.Statistics.FileSystem; + +public class FileVersionInfoStatisticsTests +{ + [SkippableFact] + public void Property_Comments_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").Comments; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.Comments)); + } + + [SkippableFact] + public void Property_CompanyName_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").CompanyName; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.CompanyName)); + } + + [SkippableFact] + public void Property_FileBuildPart_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").FileBuildPart; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.FileBuildPart)); + } + + [SkippableFact] + public void Property_FileDescription_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").FileDescription; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.FileDescription)); + } + + [SkippableFact] + public void Property_FileMajorPart_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").FileMajorPart; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.FileMajorPart)); + } + + [SkippableFact] + public void Property_FileMinorPart_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").FileMinorPart; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.FileMinorPart)); + } + + [SkippableFact] + public void Property_FileName_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").FileName; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.FileName)); + } + + [SkippableFact] + public void Property_FilePrivatePart_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").FilePrivatePart; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.FilePrivatePart)); + } + + [SkippableFact] + public void Property_FileVersion_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").FileVersion; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.FileVersion)); + } + + [SkippableFact] + public void Property_InternalName_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").InternalName; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.InternalName)); + } + + [SkippableFact] + public void Property_IsDebug_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").IsDebug; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.IsDebug)); + } + + [SkippableFact] + public void Property_IsPatched_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").IsPatched; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.IsPatched)); + } + + [SkippableFact] + public void Property_IsPreRelease_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").IsPreRelease; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.IsPreRelease)); + } + + [SkippableFact] + public void Property_IsPrivateBuild_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").IsPrivateBuild; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.IsPrivateBuild)); + } + + [SkippableFact] + public void Property_IsSpecialBuild_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").IsSpecialBuild; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.IsSpecialBuild)); + } + + [SkippableFact] + public void Property_Language_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").Language; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.Language)); + } + + [SkippableFact] + public void Property_LegalCopyright_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").LegalCopyright; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.LegalCopyright)); + } + + [SkippableFact] + public void Property_LegalTrademarks_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").LegalTrademarks; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.LegalTrademarks)); + } + + [SkippableFact] + public void Property_OriginalFilename_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").OriginalFilename; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.OriginalFilename)); + } + + [SkippableFact] + public void Property_PrivateBuild_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").PrivateBuild; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.PrivateBuild)); + } + + [SkippableFact] + public void Property_ProductBuildPart_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").ProductBuildPart; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.ProductBuildPart)); + } + + [SkippableFact] + public void Property_ProductMajorPart_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").ProductMajorPart; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.ProductMajorPart)); + } + + [SkippableFact] + public void Property_ProductMinorPart_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").ProductMinorPart; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.ProductMinorPart)); + } + + [SkippableFact] + public void Property_ProductName_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").ProductName; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.ProductName)); + } + + [SkippableFact] + public void Property_ProductPrivatePart_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").ProductPrivatePart; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.ProductPrivatePart)); + } + + [SkippableFact] + public void Property_ProductVersion_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").ProductVersion; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.ProductVersion)); + } + + [SkippableFact] + public void Property_SpecialBuild_Get_ShouldRegisterPropertyAccess() + { + MockFileSystem sut = new(); + + _ = sut.FileVersionInfo.GetVersionInfo("foo").SpecialBuild; + + sut.Statistics.FileVersionInfo["foo"] + .ShouldOnlyContainPropertyGetAccess(nameof(IFileVersionInfo.SpecialBuild)); + } +} diff --git a/Tests/Testably.Abstractions.Testing.Tests/Statistics/StatisticsTests.cs b/Tests/Testably.Abstractions.Testing.Tests/Statistics/StatisticsTests.cs index 239be4ff0..fc8c36003 100644 --- a/Tests/Testably.Abstractions.Testing.Tests/Statistics/StatisticsTests.cs +++ b/Tests/Testably.Abstractions.Testing.Tests/Statistics/StatisticsTests.cs @@ -50,6 +50,10 @@ public void FileSystem_Initialize_ShouldNotRegisterStatistics() typeof(IFileSystemWatcherFactory), typeof(FileSystemWatcherFactoryStatisticsTests))] [InlineData(nameof(MockFileSystem.FileSystemWatcher), true, typeof(IFileSystemWatcher), typeof(FileSystemWatcherStatisticsTests))] + [InlineData(nameof(MockFileSystem.FileVersionInfo), false, + typeof(IFileVersionInfoFactory), typeof(FileVersionInfoFactoryStatisticsTests))] + [InlineData(nameof(MockFileSystem.FileVersionInfo), true, + typeof(IFileVersionInfo), typeof(FileVersionInfoStatisticsTests))] [InlineData(nameof(MockFileSystem.Path), false, typeof(IPath), typeof(FileSystem.PathStatisticsTests))] public void ShouldHaveTestedAllFileSystemMethods(string className, bool requireInstance,