From f7d6a2efb2bb2b44b59bf0af008afc83845009d5 Mon Sep 17 00:00:00 2001 From: David Gardiner Date: Sat, 12 Nov 2022 12:45:12 +1030 Subject: [PATCH] Addition changes to enable Verify.Cli app - Add simple constructor to InnerVerifier for just comparing files - Ensure replacements field is valid even if we haven't called UseAssembly --- docs/mdsource/verify-file.source.md | 9 ++++- docs/verify-file.md | 32 +++++++++++++++ src/Verify.Tests/InnerVerifyTests.cs | 40 +++++++++++++++++++ src/Verify.Tests/sample.verified.txt | 1 + .../Serialization/Scrubbers/ApplyScrubbers.cs | 4 +- src/Verify/Verifier/InnerVerifier.cs | 37 +++++++++++++++++ 6 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 src/Verify.Tests/InnerVerifyTests.cs create mode 100644 src/Verify.Tests/sample.verified.txt diff --git a/docs/mdsource/verify-file.source.md b/docs/mdsource/verify-file.source.md index 7688d3f50e..86e80e713f 100644 --- a/docs/mdsource/verify-file.source.md +++ b/docs/mdsource/verify-file.source.md @@ -9,4 +9,11 @@ snippet: VerifyFile An optional `info` parameter can be supplied to add more context to the test. The instance passed will be json serialized. -snippet: VerifyFileWithInfo \ No newline at end of file +snippet: VerifyFileWithInfo + + +## Verify a file without using a unit test + +Use the functionality of VerifyTests outside of a unit test. + +snippet: VerifyFileWithoutUnitTest diff --git a/docs/verify-file.md b/docs/verify-file.md index 8ecb5eb64d..eca9048f9a 100644 --- a/docs/verify-file.md +++ b/docs/verify-file.md @@ -35,3 +35,35 @@ public Task VerifyFileWithInfo() => ``` snippet source | anchor + + +## Verify a file without using a unit test + +Use the functionality of VerifyTests outside of a unit test. + + + +```cs +public async Task VerifyExternalFile() +{ + var solutionDirectory = AttributeReader.GetSolutionDirectory(); + var settings = new VerifySettings(); + settings.DisableRequireUniquePrefix(); + + var sourceFile = Path.Combine(solutionDirectory, "Verify.Tests", "sample.txt"); + + Func> verify = _ => _.VerifyFile(sourceFile, null); + await new SettingsTask( + settings, + async verifySettings => + { + using var verifier = new InnerVerifier( + sourceFile, + verifySettings + ); + return await verify(verifier); + }); +} +``` +snippet source | anchor + diff --git a/src/Verify.Tests/InnerVerifyTests.cs b/src/Verify.Tests/InnerVerifyTests.cs new file mode 100644 index 0000000000..8b36a00eeb --- /dev/null +++ b/src/Verify.Tests/InnerVerifyTests.cs @@ -0,0 +1,40 @@ +public class InnerVerifyTests +{ + [Fact] + public void InnerVerifier_FileConstructor() + { + const string sourceFile = "path/to/source/file.cs"; + var settings = new VerifySettings(); + + var verifier = new InnerVerifier(sourceFile, settings); + + Assert.NotNull(verifier); + } + + [Fact] + + #region VerifyFileWithoutUnitTest + + public async Task VerifyExternalFile() + { + var solutionDirectory = AttributeReader.GetSolutionDirectory(); + var settings = new VerifySettings(); + settings.DisableRequireUniquePrefix(); + + var sourceFile = Path.Combine(solutionDirectory, "Verify.Tests", "sample.txt"); + + Func> verify = _ => _.VerifyFile(sourceFile, null); + await new SettingsTask( + settings, + async verifySettings => + { + using var verifier = new InnerVerifier( + sourceFile, + verifySettings + ); + return await verify(verifier); + }); + } + + #endregion +} \ No newline at end of file diff --git a/src/Verify.Tests/sample.verified.txt b/src/Verify.Tests/sample.verified.txt new file mode 100644 index 0000000000..fdf74cdc4b --- /dev/null +++ b/src/Verify.Tests/sample.verified.txt @@ -0,0 +1 @@ +Foo \ No newline at end of file diff --git a/src/Verify/Serialization/Scrubbers/ApplyScrubbers.cs b/src/Verify/Serialization/Scrubbers/ApplyScrubbers.cs index 88b8ec9cfc..39d7682644 100644 --- a/src/Verify/Serialization/Scrubbers/ApplyScrubbers.cs +++ b/src/Verify/Serialization/Scrubbers/ApplyScrubbers.cs @@ -1,10 +1,10 @@ -// ReSharper disable RedundantSuppressNullableWarningExpression +// ReSharper disable RedundantSuppressNullableWarningExpression static class ApplyScrubbers { static char dirSeparator = Path.DirectorySeparatorChar; static char altDirSeparator = Path.AltDirectorySeparatorChar; - static List> replacements = null!; + static List> replacements = new(); static string ReplaceAltDirChar(this string directory) => directory.Replace(dirSeparator, altDirSeparator); diff --git a/src/Verify/Verifier/InnerVerifier.cs b/src/Verify/Verifier/InnerVerifier.cs index 36f41803db..9882d43419 100644 --- a/src/Verify/Verifier/InnerVerifier.cs +++ b/src/Verify/Verifier/InnerVerifier.cs @@ -70,6 +70,43 @@ public InnerVerifier( } } + /// + /// Initialize a new instance of the class for verifying the entire file (not just a specific type) + /// + /// This constructor is used by 3rd party clients + // ReSharper disable once UnusedMember.Global + public InnerVerifier(string sourceFile, VerifySettings settings) + { + Guard.AgainstEmpty(sourceFile); + + this.settings = settings; + directory = ResolveDirectory(sourceFile, settings, new()); + + counter = Counter.Start( +#if NET6_0_OR_GREATER + settings.namedDates, + settings.namedTimes, +#endif + settings.namedDateTimes, + settings.namedGuids, + settings.namedDateTimeOffsets + ); + + IoHelpers.CreateDirectory(directory); + + ValidatePrefix(settings, directory); + + verifiedFiles = new List { Path.Combine(directory, $"{Path.GetFileNameWithoutExtension(sourceFile)}.verified.{FileExtensions.GetExtension(sourceFile)}") }; + + getFileNames = target => new( + target.Extension, + sourceFile, + Path.Combine(directory, $"{Path.GetFileNameWithoutExtension(sourceFile)}.verified.{target.Extension}") + ); + + getIndexedFileNames = (_, _) => throw new NotImplementedException(); + } + void InitForDirectoryConvention(Namer namer, string typeAndMethod, string parameters) { var verifiedPrefix = PrefixForDirectoryConvention(namer, typeAndMethod, parameters);