Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<Project>
<PropertyGroup>
<NoWarn>CA1822;CS1591;CS0649;xUnit1026;xUnit1013;CS1573;VerifyTestsProjectDir;VerifySetParameters;PolyFillTargetsForNuget;xUnit1051;NU1608;NU1109</NoWarn>
<Version>31.20.0</Version>
<Version>31.21.0</Version>
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>preview</LangVersion>
<AssemblyVersion>1.0.0</AssemblyVersion>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"Array": null
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"Array": null
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public Task AllCategories()
};
var notEquals = new List<NotEqualResult>
{
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<string>
{
Expand All @@ -33,7 +33,7 @@ public Task NotEqualWithMessage()
{
var notEquals = new List<NotEqualResult>
{
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, [], []);
Expand Down
10 changes: 5 additions & 5 deletions src/Verify.ExceptionParsing.Tests/ExceptionParsingTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public Task WithMessage()
{
var notEquals = new List<NotEqualResult>
{
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)
};

Expand Down Expand Up @@ -132,7 +132,7 @@ public Task SingleNotEqual()
{
var notEquals = new List<NotEqualResult>
{
new(new("txt", receivedTxt, verifiedTxt), null, new("receivedText"), new("verifiedText"))
new(new("txt", receivedTxt, verifiedTxt), null, new("receivedText"), "verifiedText")
};

return ParseVerify([], notEquals, [], []);
Expand All @@ -153,7 +153,7 @@ public Task MultipleItem()
};
var notEquals = new List<NotEqualResult>
{
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<string>
Expand All @@ -178,7 +178,7 @@ public Task SingleItem()
};
var notEquals = new List<NotEqualResult>
{
new(new("txt", receivedTxt, verifiedTxt), null, new("receivedText"), new("verifiedText"))
new(new("txt", receivedTxt, verifiedTxt), null, new("receivedText"), "verifiedText")
};
var delete = new List<string>
{
Expand Down Expand Up @@ -242,4 +242,4 @@ static Task ParseVerify(
result
});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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: []);
Expand All @@ -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: []);
Expand Down Expand Up @@ -108,7 +108,7 @@ public Task AllCategories()
};
var notEquals = new List<NotEqualResult>
{
new(new("txt", receivedTxt, verifiedTxt), null, new("received"), new("verified"))
new(new("txt", receivedTxt, verifiedTxt), null, new("received"), "verified")
};
var delete = new List<string>
{
Expand Down Expand Up @@ -139,8 +139,8 @@ public Task MultipleNotEqual_MixedMessageAndNoMessage()
{
var notEquals = new List<NotEqualResult>
{
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, [], []);
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{}
{}
53 changes: 20 additions & 33 deletions src/Verify.Tests/NewLineTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Exception>(() => Verify("a\nb", settings));
Assert.Contains("carriage return", crlf.ToString());

File.Delete(fullPath);
await File.WriteAllTextAsync(fullPath, "a\rb");
var cr = await Assert.ThrowsAnyAsync<Exception>(() => 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()
{
Expand All @@ -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<Exception>(() => 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<VerifyException>(() => Verify("a", settings));

await File.WriteAllTextAsync(file, "a\n\n");
await Verify("a\n\n", settings);
await Verify("a\n", settings);
await Assert.ThrowsAsync<VerifyException>(() => Verify("a\n", settings));
File.Delete(file);
}
#endif

//TODO: add test for trailing newlines
// [Fact]
Expand Down
35 changes: 10 additions & 25 deletions src/Verify/Compare/Comparer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@ public static async Task<EqualityResult> 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)
{
Expand All @@ -20,36 +25,16 @@ public static async Task<EqualityResult> Text(FilePair filePair, StringBuilder r
return new(Equality.NotEqual, result.Message, received, verified);
}

static Task<CompareResult> CompareStrings(string extension, StringBuilder received, StringBuilder verified, VerifySettings settings, bool bypassComparer)
static Task<CompareResult> 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));
}
}
}
6 changes: 0 additions & 6 deletions src/Verify/IoHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -208,12 +208,6 @@ internal static string ResolveDirectoryFromSourceFile(string sourceFile)
throw new($"Unable to resolve directory. sourceFile: {sourceFile}");
}

public static async Task<StringBuilder> 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)!);
Expand Down
6 changes: 3 additions & 3 deletions src/Verify/Verifier/EqualityResult.cs
Original file line number Diff line number Diff line change
@@ -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;
}
public string? VerifiedText { get; } = verifiedText;
}
6 changes: 3 additions & 3 deletions src/Verify/Verifier/NotEqualResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
public string? VerifiedText { get; } = verifiedText;
}
Loading