Verify.AngleSharp
Extends Verify with Html verification utilities via AngleSharp.
NuGet package
https://nuget.org/packages/Verify.AngleSharp/
Comparer Usage
Extends Verify to allow comparison of htm and html files via AngleSharp.
Initialize
Call VerifyAngleSharpDiffing.Initialize()
once at assembly load time.
Initialize takes an optional Action<IDiffingStrategyCollection>
to control settings at a global level:
VerifyAngleSharpDiffing.Initialize(
action =>
{
static FilterDecision SpanFilter(
in ComparisonSource source,
FilterDecision decision)
{
if (source.Node.NodeName == "SPAN")
{
return FilterDecision.Exclude;
}
return decision;
}
var options = action.AddDefaultOptions();
options.AddFilter(SpanFilter);
});
Verify html
Given an existing verified file:
<!DOCTYPE html>
<html>
<body>
<h1>My First Heading</h1>
<p>My first paragraph.</p>
</body>
</html>
And a test:
[Test]
public Task Sample()
{
var html = @"<!DOCTYPE html>
<html>
<body>
<h1>My First Heading</h1>
<p>My first paragraph.</p>
</body>
</html>";
return Verify(html)
.UseExtension("html");
}
Note that the input html differs from the verified html, but not in a semantically significant way. Hence this test will pass.
Diff results
If the comparison fails, the resulting differences will be included in the test result displayed to the user.
For example if, in the above html, <h1>My First Heading</h1>
changes to <h1>First Heading</h1>
then the following will be printed in the test results:
Comparer result:
* Node Diff
Path: h1(0) > #text(0)
Received: First Heading
Verified: My First Heading
Test level settings
Settings can also be controlled for a specific test.
var settings = new VerifySettings();
settings.UseExtension("html");
settings.AngleSharpDiffingSettings(
action =>
{
static FilterDecision SpanFilter(
in ComparisonSource source,
FilterDecision decision)
{
if (source.Node.NodeName == "SPAN")
{
return FilterDecision.Exclude;
}
return decision;
}
var options = action.AddDefaultOptions();
options.AddFilter(SpanFilter);
});
Pretty Print
Html can be pretty printed.
[Test]
public Task PrettyPrintHtml()
{
var html = @"<!DOCTYPE html>
<html><body><h1>My First Heading</h1>
<p>My first paragraph.</p></body></html>";
return Verify(html)
.UseExtension("html")
.PrettyPrintHtml();
}
Results in
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>My First Heading</h1>
<p>My first paragraph.</p>
</body>
</html>
To apply this to all html
files use HtmlPrettyPrint.All();
Manipulate Html
Nodes can be manipulated as part of the pretty print:
[Test]
public Task PrettyPrintHtmlWithNodeManipulation()
{
var html = @"<!DOCTYPE html>
<html>
<body>
<h1>My First Heading</h1>
<p>My first paragraph.</p>
</body>
</html>";
return Verify(html)
.UseExtension("html")
.PrettyPrintHtml(
nodes =>
{
foreach (var node in nodes.QuerySelectorAll("h1"))
{
node.Remove();
}
});
}
Results in
<!DOCTYPE html>
<html>
<head></head>
<body>
<p>My first paragraph.</p>
</body>
</html>