Skip to content

Commit 45a060f

Browse files
authored
Addition changes to enable Verify.Cli app (#888)
- Add simple constructor to InnerVerifier for just comparing files - Ensure replacements field is valid even if we haven't called UseAssembly
1 parent 2f1e8bf commit 45a060f

File tree

6 files changed

+120
-3
lines changed

6 files changed

+120
-3
lines changed

docs/mdsource/verify-file.source.md

+8-1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,11 @@ snippet: VerifyFile
99

1010
An optional `info` parameter can be supplied to add more context to the test. The instance passed will be json serialized.
1111

12-
snippet: VerifyFileWithInfo
12+
snippet: VerifyFileWithInfo
13+
14+
15+
## Verify a file without using a unit test
16+
17+
Use the functionality of VerifyTests outside of a unit test.
18+
19+
snippet: VerifyFileWithoutUnitTest

docs/verify-file.md

+32
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,35 @@ public Task VerifyFileWithInfo() =>
3535
```
3636
<sup><a href='/src/Verify.Tests/StreamTests.cs#L184-L192' title='Snippet source file'>snippet source</a> | <a href='#snippet-verifyfilewithinfo' title='Start of snippet'>anchor</a></sup>
3737
<!-- endSnippet -->
38+
39+
40+
## Verify a file without using a unit test
41+
42+
Use the functionality of VerifyTests outside of a unit test.
43+
44+
<!-- snippet: VerifyFileWithoutUnitTest -->
45+
<a id='snippet-verifyfilewithoutunittest'></a>
46+
```cs
47+
public async Task VerifyExternalFile()
48+
{
49+
var solutionDirectory = AttributeReader.GetSolutionDirectory();
50+
var settings = new VerifySettings();
51+
settings.DisableRequireUniquePrefix();
52+
53+
var sourceFile = Path.Combine(solutionDirectory, "Verify.Tests", "sample.txt");
54+
55+
Func<InnerVerifier, Task<VerifyResult>> verify = _ => _.VerifyFile(sourceFile, null);
56+
await new SettingsTask(
57+
settings,
58+
async verifySettings =>
59+
{
60+
using var verifier = new InnerVerifier(
61+
sourceFile,
62+
verifySettings
63+
);
64+
return await verify(verifier);
65+
});
66+
}
67+
```
68+
<sup><a href='/src/Verify.Tests/InnerVerifyTests.cs#L16-L39' title='Snippet source file'>snippet source</a> | <a href='#snippet-verifyfilewithoutunittest' title='Start of snippet'>anchor</a></sup>
69+
<!-- endSnippet -->

src/Verify.Tests/InnerVerifyTests.cs

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
public class InnerVerifyTests
2+
{
3+
[Fact]
4+
public void InnerVerifier_FileConstructor()
5+
{
6+
const string sourceFile = "path/to/source/file.cs";
7+
var settings = new VerifySettings();
8+
9+
var verifier = new InnerVerifier(sourceFile, settings);
10+
11+
Assert.NotNull(verifier);
12+
}
13+
14+
[Fact]
15+
16+
#region VerifyFileWithoutUnitTest
17+
18+
public async Task VerifyExternalFile()
19+
{
20+
var solutionDirectory = AttributeReader.GetSolutionDirectory();
21+
var settings = new VerifySettings();
22+
settings.DisableRequireUniquePrefix();
23+
24+
var sourceFile = Path.Combine(solutionDirectory, "Verify.Tests", "sample.txt");
25+
26+
Func<InnerVerifier, Task<VerifyResult>> verify = _ => _.VerifyFile(sourceFile, null);
27+
await new SettingsTask(
28+
settings,
29+
async verifySettings =>
30+
{
31+
using var verifier = new InnerVerifier(
32+
sourceFile,
33+
verifySettings
34+
);
35+
return await verify(verifier);
36+
});
37+
}
38+
39+
#endregion
40+
}

src/Verify.Tests/sample.verified.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Foo

src/Verify/Serialization/Scrubbers/ApplyScrubbers.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
// ReSharper disable RedundantSuppressNullableWarningExpression
1+
// ReSharper disable RedundantSuppressNullableWarningExpression
22

33
static class ApplyScrubbers
44
{
55
static char dirSeparator = Path.DirectorySeparatorChar;
66
static char altDirSeparator = Path.AltDirectorySeparatorChar;
7-
static List<KeyValuePair<string, string>> replacements = null!;
7+
static List<KeyValuePair<string, string>> replacements = new();
88

99
static string ReplaceAltDirChar(this string directory) =>
1010
directory.Replace(dirSeparator, altDirSeparator);

src/Verify/Verifier/InnerVerifier.cs

+37
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,43 @@ public InnerVerifier(
7070
}
7171
}
7272

73+
/// <summary>
74+
/// Initialize a new instance of the <see cref="InnerVerifier"/> class for verifying the entire file (not just a specific type)
75+
/// </summary>
76+
/// <remarks>This constructor is used by 3rd party clients</remarks>
77+
// ReSharper disable once UnusedMember.Global
78+
public InnerVerifier(string sourceFile, VerifySettings settings)
79+
{
80+
Guard.AgainstEmpty(sourceFile);
81+
82+
this.settings = settings;
83+
directory = ResolveDirectory(sourceFile, settings, new());
84+
85+
counter = Counter.Start(
86+
#if NET6_0_OR_GREATER
87+
settings.namedDates,
88+
settings.namedTimes,
89+
#endif
90+
settings.namedDateTimes,
91+
settings.namedGuids,
92+
settings.namedDateTimeOffsets
93+
);
94+
95+
IoHelpers.CreateDirectory(directory);
96+
97+
ValidatePrefix(settings, directory);
98+
99+
verifiedFiles = new List<string> { Path.Combine(directory, $"{Path.GetFileNameWithoutExtension(sourceFile)}.verified.{FileExtensions.GetExtension(sourceFile)}") };
100+
101+
getFileNames = target => new(
102+
target.Extension,
103+
sourceFile,
104+
Path.Combine(directory, $"{Path.GetFileNameWithoutExtension(sourceFile)}.verified.{target.Extension}")
105+
);
106+
107+
getIndexedFileNames = (_, _) => throw new NotImplementedException();
108+
}
109+
73110
void InitForDirectoryConvention(Namer namer, string typeAndMethod, string parameters)
74111
{
75112
var verifiedPrefix = PrefixForDirectoryConvention(namer, typeAndMethod, parameters);

0 commit comments

Comments
 (0)