diff --git a/src/Directory.Build.props b/src/Directory.Build.props index c5e211951..48d70101e 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -2,7 +2,7 @@ CA1822;CS1591;CS0649;xUnit1026;xUnit1013;CS1573;VerifyTestsProjectDir;VerifySetParameters;PolyFillTargetsForNuget;xUnit1051;NU1608;NU1109 - 31.20.0 + 31.21.0 enable preview 1.0.0 diff --git a/src/StrictJsonTests/SerializationTests.ImmutableArray_Empty.verified.json b/src/StrictJsonTests/SerializationTests.ImmutableArray_Empty.verified.json index 5c755d679..de4b275ff 100644 --- a/src/StrictJsonTests/SerializationTests.ImmutableArray_Empty.verified.json +++ b/src/StrictJsonTests/SerializationTests.ImmutableArray_Empty.verified.json @@ -1,3 +1,3 @@ { "Array": null -} +} \ No newline at end of file diff --git a/src/StrictJsonTests/SerializationTests.ImmutableArray_Uninitialized.verified.json b/src/StrictJsonTests/SerializationTests.ImmutableArray_Uninitialized.verified.json index 5c755d679..de4b275ff 100644 --- a/src/StrictJsonTests/SerializationTests.ImmutableArray_Uninitialized.verified.json +++ b/src/StrictJsonTests/SerializationTests.ImmutableArray_Uninitialized.verified.json @@ -1,3 +1,3 @@ { "Array": null -} +} \ No newline at end of file diff --git a/src/Verify.ExceptionParsing.Tests/ExceptionMessageFormatSamples.cs b/src/Verify.ExceptionParsing.Tests/ExceptionMessageFormatSamples.cs index cb91008ae..6b740c2b8 100644 --- a/src/Verify.ExceptionParsing.Tests/ExceptionMessageFormatSamples.cs +++ b/src/Verify.ExceptionParsing.Tests/ExceptionMessageFormatSamples.cs @@ -14,7 +14,7 @@ public Task AllCategories() }; var notEquals = new List { - new(new("txt", Dir("MyTests.Test2.received.txt"), Dir("MyTests.Test2.verified.txt")), null, new("received text"), new("verified text")) + new(new("txt", Dir("MyTests.Test2.received.txt"), Dir("MyTests.Test2.verified.txt")), null, new("received text"), "verified text") }; var delete = new List { @@ -33,7 +33,7 @@ public Task NotEqualWithMessage() { var notEquals = new List { - new(new("txt", Dir("MyTests.Test1.received.txt"), Dir("MyTests.Test1.verified.txt")), "The comparer reported a difference", new("received text"), new("verified text")) + new(new("txt", Dir("MyTests.Test1.received.txt"), Dir("MyTests.Test1.verified.txt")), "The comparer reported a difference", new("received text"), "verified text") }; return BuildVerify([], notEquals, [], []); diff --git a/src/Verify.ExceptionParsing.Tests/ExceptionParsingTests.cs b/src/Verify.ExceptionParsing.Tests/ExceptionParsingTests.cs index 25cc71d2e..271b88f8f 100644 --- a/src/Verify.ExceptionParsing.Tests/ExceptionParsingTests.cs +++ b/src/Verify.ExceptionParsing.Tests/ExceptionParsingTests.cs @@ -31,7 +31,7 @@ public Task WithMessage() { var notEquals = new List { - new(new("txt", receivedTxt, verifiedTxt), "TheMessage", new("receivedText"), new("verifiedText")), + new(new("txt", receivedTxt, verifiedTxt), "TheMessage", new("receivedText"), "verifiedText"), new(new("bin", receivedBin, verifiedBin), "TheMessage", null, null) }; @@ -132,7 +132,7 @@ public Task SingleNotEqual() { var notEquals = new List { - new(new("txt", receivedTxt, verifiedTxt), null, new("receivedText"), new("verifiedText")) + new(new("txt", receivedTxt, verifiedTxt), null, new("receivedText"), "verifiedText") }; return ParseVerify([], notEquals, [], []); @@ -153,7 +153,7 @@ public Task MultipleItem() }; var notEquals = new List { - new(new("txt", receivedTxt, verifiedTxt), null, new("receivedText"), new("verifiedText")), + new(new("txt", receivedTxt, verifiedTxt), null, new("receivedText"), "verifiedText"), new(new("bin", receivedBin, verifiedBin), null, null, null) }; var delete = new List @@ -178,7 +178,7 @@ public Task SingleItem() }; var notEquals = new List { - new(new("txt", receivedTxt, verifiedTxt), null, new("receivedText"), new("verifiedText")) + new(new("txt", receivedTxt, verifiedTxt), null, new("receivedText"), "verifiedText") }; var delete = new List { @@ -242,4 +242,4 @@ static Task ParseVerify( result }); } -} \ No newline at end of file +} diff --git a/src/Verify.ExceptionParsing.Tests/VerifyExceptionMessageBuilderTests.cs b/src/Verify.ExceptionParsing.Tests/VerifyExceptionMessageBuilderTests.cs index 3402baca1..768613c69 100644 --- a/src/Verify.ExceptionParsing.Tests/VerifyExceptionMessageBuilderTests.cs +++ b/src/Verify.ExceptionParsing.Tests/VerifyExceptionMessageBuilderTests.cs @@ -42,7 +42,7 @@ public Task SingleNotEqual_Text() => @new: [], notEquals: [ - new(new("txt", receivedTxt, verifiedTxt), null, new("received content"), new("verified content")) + new(new("txt", receivedTxt, verifiedTxt), null, new("received content"), "verified content") ], delete: [], equal: []); @@ -53,7 +53,7 @@ public Task SingleNotEqual_WithMessage() => @new: [], notEquals: [ - new(new("txt", receivedTxt, verifiedTxt), "Comparer reported difference", new("received content"), new("verified content")) + new(new("txt", receivedTxt, verifiedTxt), "Comparer reported difference", new("received content"), "verified content") ], delete: [], equal: []); @@ -108,7 +108,7 @@ public Task AllCategories() }; var notEquals = new List { - new(new("txt", receivedTxt, verifiedTxt), null, new("received"), new("verified")) + new(new("txt", receivedTxt, verifiedTxt), null, new("received"), "verified") }; var delete = new List { @@ -139,8 +139,8 @@ public Task MultipleNotEqual_MixedMessageAndNoMessage() { var notEquals = new List { - new(new("txt", receivedTxt, verifiedTxt), null, new("received text"), new("verified text")), - new(new("txt", receivedTxt, verifiedTxt), "Custom comparison message", new("received2"), new("verified2")) + new(new("txt", receivedTxt, verifiedTxt), null, new("received text"), "verified text"), + new(new("txt", receivedTxt, verifiedTxt), "Custom comparison message", new("received2"), "verified2") }; return BuildVerify([], notEquals, [], []); diff --git a/src/Verify.MSTest.SourceGenerator.Tests/NoMatchTests.NoAttributes.verified.txt b/src/Verify.MSTest.SourceGenerator.Tests/NoMatchTests.NoAttributes.verified.txt index f11778892..22fdca1b2 100644 --- a/src/Verify.MSTest.SourceGenerator.Tests/NoMatchTests.NoAttributes.verified.txt +++ b/src/Verify.MSTest.SourceGenerator.Tests/NoMatchTests.NoAttributes.verified.txt @@ -1 +1 @@ -{} +{} \ No newline at end of file diff --git a/src/Verify.Tests/NewLineTests.cs b/src/Verify.Tests/NewLineTests.cs index f36f35d85..6bcda4128 100644 --- a/src/Verify.Tests/NewLineTests.cs +++ b/src/Verify.Tests/NewLineTests.cs @@ -44,35 +44,27 @@ public async Task StringWithDifferingNewline() { var fullPath = CurrentFile.Relative("NewLineTests.StringWithDifferingNewline.verified.txt"); File.Delete(fullPath); + var settings = new VerifySettings(); + settings.DisableRequireUniquePrefix(); + + // A verified file containing \r is rejected rather than silently normalized await File.WriteAllTextAsync(fullPath, "a\r\nb"); - await Verify("a\r\nb"); - PrefixUnique.Clear(); - await Verify("a\rb"); - PrefixUnique.Clear(); - await Verify("a\nb"); - PrefixUnique.Clear(); + var crlf = await Assert.ThrowsAnyAsync(() => Verify("a\nb", settings)); + Assert.Contains("carriage return", crlf.ToString()); - File.Delete(fullPath); + await File.WriteAllTextAsync(fullPath, "a\rb"); + var cr = await Assert.ThrowsAnyAsync(() => Verify("a\nb", settings)); + Assert.Contains("carriage return", cr.ToString()); + + // A verified file using \n still matches received content normalized to \n await File.WriteAllTextAsync(fullPath, "a\nb"); - await Verify("a\r\nb"); - PrefixUnique.Clear(); - await Verify("a\rb"); - PrefixUnique.Clear(); - await Verify("a\nb"); - PrefixUnique.Clear(); + await Verify("a\r\nb", settings); + await Verify("a\rb", settings); + await Verify("a\nb", settings); File.Delete(fullPath); - await File.WriteAllTextAsync(fullPath, "a\rb"); - await Verify("a\r\nb"); - PrefixUnique.Clear(); - await Verify("a\rb"); - PrefixUnique.Clear(); - await Verify("a\nb"); - File.Delete(fullPath); } -#if NET9_0 - [Fact] public async Task TrailingNewlinesRaw() { @@ -81,26 +73,21 @@ public async Task TrailingNewlinesRaw() var settings = new VerifySettings(); settings.DisableRequireUniquePrefix(); + // A verified file containing \r is rejected await File.WriteAllTextAsync(file, "a\r\n"); - await Verify("a\r\n", settings); - await Verify("a\n", settings); - await Verify("a", settings); - - await File.WriteAllTextAsync(file, "a\r\n\r\n"); - await Verify("a\r\n\r\n", settings); - await Verify("a\n\n", settings); - await Verify("a\n", settings); + var exception = await Assert.ThrowsAnyAsync(() => Verify("a\n", settings)); + Assert.Contains("carriage return", exception.ToString()); + // Trailing newlines are now compared exactly, with no tolerance await File.WriteAllTextAsync(file, "a\n"); await Verify("a\n", settings); - await Verify("a", settings); + await Assert.ThrowsAsync(() => Verify("a", settings)); await File.WriteAllTextAsync(file, "a\n\n"); await Verify("a\n\n", settings); - await Verify("a\n", settings); + await Assert.ThrowsAsync(() => Verify("a\n", settings)); File.Delete(file); } -#endif //TODO: add test for trailing newlines // [Fact] diff --git a/src/Verify/Compare/Comparer.cs b/src/Verify/Compare/Comparer.cs index 9dde538f5..3e4a27b85 100644 --- a/src/Verify/Compare/Comparer.cs +++ b/src/Verify/Compare/Comparer.cs @@ -9,7 +9,12 @@ public static async Task Text(FilePair filePair, StringBuilder r return new(Equality.New, null, received, null); } - var verified = await IoHelpers.ReadStringBuilderWithFixedLines(filePair.VerifiedPath); + var verified = await File.ReadAllTextAsync(filePair.VerifiedPath); + if (verified.Contains('\r')) + { + throw new($@"Verified file must use \n line endings, but it contains a \r (carriage return). Path: {filePair.VerifiedPath}. See https://github.com/verifytests/verify#text-file-settings"); + } + var result = await CompareStrings(filePair.Extension, received, verified, settings, bypassComparer); if (result.IsEqual) { @@ -20,36 +25,16 @@ public static async Task Text(FilePair filePair, StringBuilder r return new(Equality.NotEqual, result.Message, received, verified); } - static Task CompareStrings(string extension, StringBuilder received, StringBuilder verified, VerifySettings settings, bool bypassComparer) + static Task CompareStrings(string extension, StringBuilder received, string verified, VerifySettings settings, bool bypassComparer) { - if (verified.Length > 0 && - verified.Length - 1 == received.Length && - verified.LastChar() == '\n') - { - verified.Length -= 1; - } - - // StringBuilder is broken on older .net https://github.com/dotnet/runtime/issues/27684 -#if NET6_0_OR_GREATER - var isEqual = verified.Equals(received); - if (!isEqual && - !bypassComparer && - settings.TryFindStringComparer(extension, out var compare)) - { - return compare(received.ToString(), verified.ToString(), settings.Context); - } -#else - var receivedString = received.ToString(); - var verifiedString = verified.ToString(); - var isEqual = receivedString.Equals(verifiedString); + var isEqual = received.Equals(verified.AsSpan()); if (!isEqual && !bypassComparer && settings.TryFindStringComparer(extension, out var compare)) { - return compare(receivedString, verifiedString, settings.Context); + return compare(received.ToString(), verified, settings.Context); } -#endif return Task.FromResult(new CompareResult(isEqual)); } -} \ No newline at end of file +} diff --git a/src/Verify/IoHelpers.cs b/src/Verify/IoHelpers.cs index 540bdee62..5fe104ee3 100644 --- a/src/Verify/IoHelpers.cs +++ b/src/Verify/IoHelpers.cs @@ -208,12 +208,6 @@ internal static string ResolveDirectoryFromSourceFile(string sourceFile) throw new($"Unable to resolve directory. sourceFile: {sourceFile}"); } - public static async Task ReadStringBuilderWithFixedLines(string path) - { - using var stream = OpenRead(path); - return await stream.ReadStringBuilderWithFixedLines(); - } - public static async Task WriteStream(string path, Stream stream) { Directory.CreateDirectory(Path.GetDirectoryName(path)!); diff --git a/src/Verify/Verifier/EqualityResult.cs b/src/Verify/Verifier/EqualityResult.cs index 0faa23c7b..66ade7b31 100644 --- a/src/Verify/Verifier/EqualityResult.cs +++ b/src/Verify/Verifier/EqualityResult.cs @@ -1,7 +1,7 @@ -readonly struct EqualityResult(Equality equality, string? message, StringBuilder? receivedText, StringBuilder? verifiedText) +readonly struct EqualityResult(Equality equality, string? message, StringBuilder? receivedText, string? verifiedText) { public Equality Equality { get; } = equality; public string? Message { get; } = message; public StringBuilder? ReceivedText { get; } = receivedText; - public StringBuilder? VerifiedText { get; } = verifiedText; -} \ No newline at end of file + public string? VerifiedText { get; } = verifiedText; +} diff --git a/src/Verify/Verifier/NotEqualResult.cs b/src/Verify/Verifier/NotEqualResult.cs index c6c30114f..bba5fb761 100644 --- a/src/Verify/Verifier/NotEqualResult.cs +++ b/src/Verify/Verifier/NotEqualResult.cs @@ -2,10 +2,10 @@ FilePair file, string? message, StringBuilder? receivedText, - StringBuilder? verifiedText) + string? verifiedText) { public FilePair File { get; } = file; public string? Message { get; } = message; public StringBuilder? ReceivedText { get; } = receivedText; - public StringBuilder? VerifiedText { get; } = verifiedText; -} \ No newline at end of file + public string? VerifiedText { get; } = verifiedText; +}