Skip to content

Commit 8f3a2e6

Browse files
author
Kormos Tamás
committed
Added FileVersionInfo support
1 parent 7ade63c commit 8f3a2e6

File tree

15 files changed

+708
-10
lines changed

15 files changed

+708
-10
lines changed

src/TestableIO.System.IO.Abstractions.TestingHelpers/MockFileData.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,11 @@ public MockFileData(MockFileData template)
119119
/// </summary>
120120
public byte[] Contents { get; set; }
121121

122+
/// <summary>
123+
/// Gets or sets the file version info of the <see cref="MockFileData"/>
124+
/// </summary>
125+
public IFileVersionInfo FileVersionInfo { get; set; }
126+
122127
/// <summary>
123128
/// Gets or sets the string contents of the <see cref="MockFileData"/>.
124129
/// </summary>

src/TestableIO.System.IO.Abstractions.TestingHelpers/MockFileInfo.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ public override void Encrypt()
259259
var mockFileData = GetMockFileDataForWrite();
260260
mockFileData.Attributes |= FileAttributes.Encrypted;
261261
}
262-
262+
263263
/// <inheritdoc />
264264
public override void MoveTo(string destFileName)
265265
{
@@ -323,7 +323,7 @@ public override IFileInfo Replace(string destinationFileName, string destination
323323
mockFile.Replace(path, destinationFileName, destinationBackupFileName, ignoreMetadataErrors);
324324
return mockFileSystem.FileInfo.New(destinationFileName);
325325
}
326-
326+
327327
/// <inheritdoc />
328328
public override IDirectoryInfo Directory
329329
{
@@ -333,6 +333,15 @@ public override IDirectoryInfo Directory
333333
}
334334
}
335335

336+
/// <inheritdoc />
337+
public override IFileVersionInfo FileVersionInfo
338+
{
339+
get
340+
{
341+
return mockFileSystem.GetFile(path).FileVersionInfo;
342+
}
343+
}
344+
336345
/// <inheritdoc />
337346
public override string DirectoryName
338347
{

src/TestableIO.System.IO.Abstractions.TestingHelpers/MockFileSystem.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,8 @@ public void AddFile(string path, MockFileData mockFile)
252252
AddDirectory(directoryPath);
253253
}
254254

255+
mockFile.FileVersionInfo ??= new MockFileVersionInfo(fileName: fixedPath);
256+
255257
SetEntry(fixedPath, mockFile);
256258
}
257259

@@ -568,7 +570,7 @@ private bool FileIsReadOnly(string path)
568570
}
569571

570572
#if FEATURE_SERIALIZABLE
571-
[Serializable]
573+
[Serializable]
572574
#endif
573575
private class FileSystemEntry
574576
{
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
using System.Diagnostics;
2+
using System.Runtime.InteropServices;
3+
using System.Text;
4+
5+
namespace System.IO.Abstractions.TestingHelpers
6+
{
7+
/// <inheritdoc />
8+
#if FEATURE_SERIALIZABLE
9+
[Serializable]
10+
#endif
11+
public class MockFileVersionInfo : FileVersionInfoBase
12+
{
13+
/// <inheritdoc />
14+
public MockFileVersionInfo(
15+
[Optional] string comments,
16+
[Optional] string companyName,
17+
[Optional] int fileBuildPart,
18+
[Optional] string fileDescription,
19+
[Optional] int fileMajorPart,
20+
[Optional] int fileMinorPart,
21+
[Optional] string fileName,
22+
[Optional] int filePrivatePart,
23+
[Optional] string fileVersion,
24+
[Optional] string internalName,
25+
[Optional] bool isDebug,
26+
[Optional] bool isPatched,
27+
[Optional] bool isPrivateBuild,
28+
[Optional] bool isPreRelease,
29+
[Optional] bool isSpecialBuild,
30+
[Optional] string language,
31+
[Optional] string legalCopyright,
32+
[Optional] string legalTrademarks,
33+
[Optional] string originalFilename,
34+
[Optional] string privateBuild,
35+
[Optional] int productBuildPart,
36+
[Optional] int productMajorPart,
37+
[Optional] int productMinorPart,
38+
[Optional] string productName,
39+
[Optional] int productPrivatePart,
40+
[Optional] string productVersion,
41+
[Optional] string specialBuild)
42+
{
43+
Comments = comments;
44+
CompanyName = companyName;
45+
FileBuildPart = fileBuildPart;
46+
FileDescription = fileDescription;
47+
FileMajorPart = fileMajorPart;
48+
FileMinorPart = fileMinorPart;
49+
FileName = fileName;
50+
FilePrivatePart = filePrivatePart;
51+
FileVersion = fileVersion;
52+
InternalName = internalName;
53+
IsDebug = isDebug;
54+
IsPatched = isPatched;
55+
IsPrivateBuild = isPrivateBuild;
56+
IsPreRelease = isPreRelease;
57+
IsSpecialBuild = isSpecialBuild;
58+
Language = language;
59+
LegalCopyright = legalCopyright;
60+
LegalTrademarks = legalTrademarks;
61+
OriginalFilename = originalFilename;
62+
PrivateBuild = privateBuild;
63+
ProductBuildPart = productBuildPart;
64+
ProductMajorPart = productMajorPart;
65+
ProductMinorPart = productMinorPart;
66+
ProductName = productName;
67+
ProductPrivatePart = productPrivatePart;
68+
ProductVersion = productVersion;
69+
SpecialBuild = specialBuild;
70+
}
71+
72+
/// <inheritdoc/>
73+
public override string Comments { get; }
74+
75+
/// <inheritdoc/>
76+
public override string CompanyName { get; }
77+
78+
/// <inheritdoc/>
79+
public override int FileBuildPart { get; }
80+
81+
/// <inheritdoc/>
82+
public override string FileDescription { get; }
83+
84+
/// <inheritdoc/>
85+
public override int FileMajorPart { get; }
86+
87+
/// <inheritdoc/>
88+
public override int FileMinorPart { get; }
89+
90+
/// <inheritdoc/>
91+
public override string FileName { get; }
92+
93+
/// <inheritdoc/>
94+
public override int FilePrivatePart { get; }
95+
96+
/// <inheritdoc/>
97+
public override string FileVersion { get; }
98+
99+
/// <inheritdoc/>
100+
public override string InternalName { get; }
101+
102+
/// <inheritdoc/>
103+
public override bool IsDebug { get; }
104+
105+
/// <inheritdoc/>
106+
public override bool IsPatched { get; }
107+
108+
/// <inheritdoc/>
109+
public override bool IsPrivateBuild { get; }
110+
111+
/// <inheritdoc/>
112+
public override bool IsPreRelease { get; }
113+
114+
/// <inheritdoc/>
115+
public override bool IsSpecialBuild { get; }
116+
117+
/// <inheritdoc/>
118+
public override string Language { get; }
119+
120+
/// <inheritdoc/>
121+
public override string LegalCopyright { get; }
122+
123+
/// <inheritdoc/>
124+
public override string LegalTrademarks { get; }
125+
126+
/// <inheritdoc/>
127+
public override string OriginalFilename { get; }
128+
129+
/// <inheritdoc/>
130+
public override string PrivateBuild { get; }
131+
132+
/// <inheritdoc/>
133+
public override int ProductBuildPart { get; }
134+
135+
/// <inheritdoc/>
136+
public override int ProductMajorPart { get; }
137+
138+
/// <inheritdoc/>
139+
public override int ProductMinorPart { get; }
140+
141+
/// <inheritdoc/>
142+
public override string ProductName { get; }
143+
144+
/// <inheritdoc/>
145+
public override int ProductPrivatePart { get; }
146+
147+
/// <inheritdoc/>
148+
public override string ProductVersion { get; }
149+
150+
/// <inheritdoc/>
151+
public override string SpecialBuild { get; }
152+
153+
/// <inheritdoc cref="FileVersionInfo.ToString" />
154+
public override string ToString()
155+
{
156+
// An initial capacity of 512 was chosen because it is large enough to cover
157+
// the size of the static strings with enough capacity left over to cover
158+
// average length property values.
159+
var sb = new StringBuilder(512);
160+
sb.Append("File: ").AppendLine(FileName);
161+
sb.Append("InternalName: ").AppendLine(InternalName);
162+
sb.Append("OriginalFilename: ").AppendLine(OriginalFilename);
163+
sb.Append("FileVersion: ").AppendLine(FileVersion);
164+
sb.Append("FileDescription: ").AppendLine(FileDescription);
165+
sb.Append("Product: ").AppendLine(ProductName);
166+
sb.Append("ProductVersion: ").AppendLine(ProductVersion);
167+
sb.Append("Debug: ").AppendLine(IsDebug.ToString());
168+
sb.Append("Patched: ").AppendLine(IsPatched.ToString());
169+
sb.Append("PreRelease: ").AppendLine(IsPreRelease.ToString());
170+
sb.Append("PrivateBuild: ").AppendLine(IsPrivateBuild.ToString());
171+
sb.Append("SpecialBuild: ").AppendLine(IsSpecialBuild.ToString());
172+
sb.Append("Language: ").AppendLine(Language);
173+
return sb.ToString();
174+
}
175+
}
176+
}

src/TestableIO.System.IO.Abstractions.Wrappers/FileInfoBase.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ internal FileInfoBase() { }
3636

3737
/// <inheritdoc cref="IFileInfo.Encrypt"/>
3838
public abstract void Encrypt();
39-
39+
4040
/// <inheritdoc cref="IFileInfo.MoveTo(string)"/>
4141
public abstract void MoveTo(string destFileName);
4242

@@ -73,10 +73,13 @@ internal FileInfoBase() { }
7373

7474
/// <inheritdoc cref="IFileInfo.Replace(string,string,bool)"/>
7575
public abstract IFileInfo Replace(string destinationFileName, string destinationBackupFileName, bool ignoreMetadataErrors);
76-
76+
7777
/// <inheritdoc cref="IFileInfo.Directory"/>
7878
public abstract IDirectoryInfo Directory { get; }
7979

80+
/// <inheritdoc cref="IFileVersionInfo"/>
81+
public abstract IFileVersionInfo FileVersionInfo { get; }
82+
8083
/// <inheritdoc cref="IFileInfo.DirectoryName"/>
8184
public abstract string DirectoryName { get; }
8285

src/TestableIO.System.IO.Abstractions.Wrappers/FileInfoWrapper.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,12 @@ public override IDirectoryInfo Directory
247247
get { return new DirectoryInfoWrapper(FileSystem, instance.Directory); }
248248
}
249249

250+
/// <inheritdoc />
251+
public override IFileVersionInfo FileVersionInfo
252+
{
253+
get { return new FileVersionInfoWrapper(Diagnostics.FileVersionInfo.GetVersionInfo(FullName)); }
254+
}
255+
250256
/// <inheritdoc />
251257
public override string DirectoryName
252258
{
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
using System.Diagnostics;
2+
3+
namespace System.IO.Abstractions
4+
{
5+
/// <inheritdoc cref="IFileVersionInfo"/>
6+
#if FEATURE_SERIALIZABLE
7+
[Serializable]
8+
#endif
9+
public abstract class FileVersionInfoBase : IFileVersionInfo
10+
{
11+
/// <inheritdoc cref="IFileVersionInfo.Comments" />
12+
public abstract string Comments { get; }
13+
14+
/// <inheritdoc cref="IFileVersionInfo.CompanyName" />
15+
public abstract string CompanyName { get; }
16+
17+
/// <inheritdoc cref="IFileVersionInfo.FileBuildPart" />
18+
public abstract int FileBuildPart { get; }
19+
20+
/// <inheritdoc cref="IFileVersionInfo.FileDescription" />
21+
public abstract string FileDescription { get; }
22+
23+
/// <inheritdoc cref="IFileVersionInfo.FileMajorPart" />
24+
public abstract int FileMajorPart { get; }
25+
26+
/// <inheritdoc cref="IFileVersionInfo.FileMinorPart" />
27+
public abstract int FileMinorPart { get; }
28+
29+
/// <inheritdoc cref="IFileVersionInfo.FileName" />
30+
public abstract string FileName { get; }
31+
32+
/// <inheritdoc cref="IFileVersionInfo.FilePrivatePart" />
33+
public abstract int FilePrivatePart { get; }
34+
35+
/// <inheritdoc cref="IFileVersionInfo.FileVersion" />
36+
public abstract string FileVersion { get; }
37+
38+
/// <inheritdoc cref="IFileVersionInfo.InternalName" />
39+
public abstract string InternalName { get; }
40+
41+
/// <inheritdoc cref="IFileVersionInfo.IsDebug" />
42+
public abstract bool IsDebug { get; }
43+
44+
/// <inheritdoc cref="IFileVersionInfo.IsPatched" />
45+
public abstract bool IsPatched { get; }
46+
47+
/// <inheritdoc cref="IFileVersionInfo.IsPrivateBuild" />
48+
public abstract bool IsPrivateBuild { get; }
49+
50+
/// <inheritdoc cref="IFileVersionInfo.IsPreRelease" />
51+
public abstract bool IsPreRelease { get; }
52+
53+
/// <inheritdoc cref="IFileVersionInfo.IsSpecialBuild" />
54+
public abstract bool IsSpecialBuild { get; }
55+
56+
/// <inheritdoc cref="IFileVersionInfo.Language" />
57+
public abstract string Language { get; }
58+
59+
/// <inheritdoc cref="IFileVersionInfo.LegalCopyright" />
60+
public abstract string LegalCopyright { get; }
61+
62+
/// <inheritdoc cref="IFileVersionInfo.LegalTrademarks" />
63+
public abstract string LegalTrademarks { get; }
64+
65+
/// <inheritdoc cref="IFileVersionInfo.OriginalFilename" />
66+
public abstract string OriginalFilename { get; }
67+
68+
/// <inheritdoc cref="IFileVersionInfo.PrivateBuild" />
69+
public abstract string PrivateBuild { get; }
70+
71+
/// <inheritdoc cref="IFileVersionInfo.ProductBuildPart" />
72+
public abstract int ProductBuildPart { get; }
73+
74+
/// <inheritdoc cref="IFileVersionInfo.ProductMajorPart" />
75+
public abstract int ProductMajorPart { get; }
76+
77+
/// <inheritdoc cref="IFileVersionInfo.ProductMinorPart" />
78+
public abstract int ProductMinorPart { get; }
79+
80+
/// <inheritdoc cref="IFileVersionInfo.ProductName" />
81+
public abstract string ProductName { get; }
82+
83+
/// <inheritdoc cref="IFileVersionInfo.ProductPrivatePart" />
84+
public abstract int ProductPrivatePart { get; }
85+
86+
/// <inheritdoc cref="IFileVersionInfo.ProductVersion" />
87+
public abstract string ProductVersion { get; }
88+
89+
/// <inheritdoc cref="IFileVersionInfo.SpecialBuild" />
90+
public abstract string SpecialBuild { get; }
91+
92+
/// <inheritdoc />
93+
public static implicit operator FileVersionInfoBase(FileVersionInfo fileVersionInfo)
94+
{
95+
if (fileVersionInfo == null)
96+
{
97+
return null;
98+
}
99+
100+
return new FileVersionInfoWrapper(fileVersionInfo);
101+
}
102+
103+
/// <inheritdoc />
104+
public new abstract string ToString();
105+
}
106+
}

0 commit comments

Comments
 (0)