Skip to content

Commit fe5b60a

Browse files
committed
Refactor tests and updated docs
1 parent ad05d12 commit fe5b60a

11 files changed

+131
-121
lines changed

README.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ By using the inline attribute `diff:regex` on the element containing the text no
130130

131131
The above control text would use case-insensitive regular expression to match against a test text string (e.g. "HELLO WORLD 2020").
132132

133-
### Ignore attribute
134-
If the `diff:ignore="true"` attribute is used on a control element (`="true"` implicit/optional), all their attributes and child nodes are skipped/ignored during comparison, including those of the test element, the control element is matched with.
133+
### Inline Ignore attribute
134+
If the inline `diff:ignore="true"` attribute is used on a control element (`="true"` implicit/optional), all their attributes and child nodes are skipped/ignored during comparison, including those of the test element, the control element is matched with.
135135

136136
In this example, the `<h1>` tag, it's attribute and children are considered the same as the element it is matched with:
137137

@@ -155,7 +155,7 @@ Activate this strategy by calling the `EnableIgnoreAttribute()` method on a `Dif
155155
var diffs = DiffBuilder
156156
.Compare(controlHtml)
157157
.WithTest(testHtml)
158-
.EnableIgnoreAttribute()
158+
.EnableInlineIgnore()
159159
.Build();
160160
```
161161

@@ -167,13 +167,15 @@ var diffs = DiffBuilder
167167

168168
#### CSS selector-cross tree matcher (node, attr)
169169

170-
### Compare options
171-
#### Name/Type comparer (node, attr)
172-
#### Content comparer (text, attr)
173-
#### Content regex comparer (text, attr)
174-
#### IgnoreCase content comparer (text, attr)
170+
### Attr Compare options
171+
#### Name comparer (attr)
172+
#### Content comparer (attr)
173+
#### Content regex comparer (attr)
174+
#### IgnoreCase attr comparer (attr)
175+
#### Regex attr comparer (attr)
175176
#### Class attribute comparer (attr)
176177
#### Boolean-attribute comparer (attr)
178+
177179
See rules at https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#boolean-attributes
178180
https://www.w3.org/TR/html52/infrastructure.html#sec-boolean-attributes
179181
https://gist.github.com/ArjanSchouten/0b8574a6ad7f5065a5e7

tests/Core/ComparisonSourceTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class ComparisonSourceTest : DiffingTestBase
1313
[Fact(DisplayName = "Two sources are equal if all their properties are equal")]
1414
public void Test1()
1515
{
16-
var node = ToNode("<br>");
16+
var node = ToNode("<br>");
1717
var source = new ComparisonSource(node, 1, "path", ComparisonSourceType.Control);
1818
var otherSource = new ComparisonSource(node, 1, "path", ComparisonSourceType.Control);
1919

tests/Core/DiffingEngineTestBase.cs

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace Egil.AngleSharp.Diffing.Core
5+
{
6+
public abstract class DiffingEngineTestBase : DiffingTestBase
7+
{
8+
protected static HtmlDifferenceEngine CreateHtmlDiffEngine(
9+
Func<DiffContext, SourceCollection, SourceCollection, IEnumerable<Comparison>>? nodeMatcher = null,
10+
Func<DiffContext, SourceMap, SourceMap, IEnumerable<AttributeComparison>>? attrMatcher = null,
11+
Func<ComparisonSource, FilterDecision>? nodeFilter = null,
12+
Func<AttributeComparisonSource, FilterDecision>? attrFilter = null,
13+
Func<Comparison, CompareResult>? nodeComparer = null,
14+
Func<AttributeComparison, CompareResult>? attrComparer = null
15+
)
16+
{
17+
return new HtmlDifferenceEngine(
18+
new MockFilterStrategy(nodeFilter, attrFilter),
19+
new MockMatcherStrategy(nodeMatcher, attrMatcher),
20+
new MockCompareStrategy(nodeComparer, attrComparer)
21+
);
22+
}
23+
24+
class MockMatcherStrategy : IMatcherStrategy
25+
{
26+
private readonly Func<DiffContext, SourceCollection, SourceCollection, IEnumerable<Comparison>>? _nodeMatcher;
27+
private readonly Func<DiffContext, SourceMap, SourceMap, IEnumerable<AttributeComparison>>? _attrMatcher;
28+
29+
public MockMatcherStrategy(
30+
Func<DiffContext, SourceCollection, SourceCollection, IEnumerable<Comparison>>? nodeMatcher = null,
31+
Func<DiffContext, SourceMap, SourceMap, IEnumerable<AttributeComparison>>? attrMatcher = null)
32+
{
33+
_nodeMatcher = nodeMatcher;
34+
_attrMatcher = attrMatcher;
35+
}
36+
37+
public IEnumerable<Comparison> Match(
38+
DiffContext context,
39+
SourceCollection controlNodes,
40+
SourceCollection testNodes) => _nodeMatcher!(context, controlNodes, testNodes);
41+
42+
public IEnumerable<AttributeComparison> Match(
43+
DiffContext context,
44+
SourceMap controlAttributes,
45+
SourceMap testAttributes) => _attrMatcher!(context, controlAttributes, testAttributes);
46+
}
47+
48+
class MockFilterStrategy : IFilterStrategy
49+
{
50+
private readonly Func<ComparisonSource, FilterDecision>? _nodeFilter;
51+
private readonly Func<AttributeComparisonSource, FilterDecision>? _attrFilter;
52+
53+
public MockFilterStrategy(Func<ComparisonSource, FilterDecision>? nodeFilter = null, Func<AttributeComparisonSource, FilterDecision>? attrFilter = null)
54+
{
55+
_nodeFilter = nodeFilter;
56+
_attrFilter = attrFilter;
57+
}
58+
59+
public FilterDecision Filter(in AttributeComparisonSource attributeComparisonSource)
60+
=> _attrFilter!(attributeComparisonSource);
61+
62+
public FilterDecision Filter(in ComparisonSource comparisonSource)
63+
=> _nodeFilter!(comparisonSource);
64+
}
65+
66+
class MockCompareStrategy : ICompareStrategy
67+
{
68+
private readonly Func<Comparison, CompareResult>? _nodeCompare;
69+
private readonly Func<AttributeComparison, CompareResult>? _attrCompare;
70+
71+
public MockCompareStrategy(Func<Comparison, CompareResult>? nodeCompare = null, Func<AttributeComparison, CompareResult>? attrCompare = null)
72+
{
73+
_nodeCompare = nodeCompare;
74+
_attrCompare = attrCompare;
75+
}
76+
77+
public CompareResult Compare(in Comparison comparison)
78+
=> _nodeCompare!(comparison);
79+
80+
public CompareResult Compare(in AttributeComparison comparison)
81+
=> _attrCompare!(comparison);
82+
}
83+
}
84+
}

tests/Core/DiffingTestBase.cs

Lines changed: 0 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System;
21
using System.Collections.Generic;
32
using AngleSharp;
43
using AngleSharp.Dom;
@@ -64,81 +63,5 @@ protected AttributeComparison ToAttributeComparison(string controlHtml, string c
6463
ToAttributeComparisonSource(testHtml, testAttrName, ComparisonSourceType.Test)
6564
);
6665
}
67-
68-
protected static HtmlDifferenceEngine CreateHtmlDiffEngine(
69-
Func<DiffContext, SourceCollection, SourceCollection, IEnumerable<Comparison>>? nodeMatcher = null,
70-
Func<DiffContext, SourceMap, SourceMap, IEnumerable<AttributeComparison>>? attrMatcher = null,
71-
Func<ComparisonSource, FilterDecision>? nodeFilter = null,
72-
Func<AttributeComparisonSource, FilterDecision>? attrFilter = null,
73-
Func<Comparison, CompareResult>? nodeComparer = null,
74-
Func<AttributeComparison, CompareResult>? attrComparer = null
75-
)
76-
{
77-
return new HtmlDifferenceEngine(
78-
new MockFilterStrategy(nodeFilter, attrFilter),
79-
new MockMatcherStrategy(nodeMatcher, attrMatcher),
80-
new MockCompareStrategy(nodeComparer, attrComparer)
81-
);
82-
}
83-
84-
class MockMatcherStrategy : IMatcherStrategy
85-
{
86-
private readonly Func<DiffContext, SourceCollection, SourceCollection, IEnumerable<Comparison>>? _nodeMatcher;
87-
private readonly Func<DiffContext, SourceMap, SourceMap, IEnumerable<AttributeComparison>>? _attrMatcher;
88-
89-
public MockMatcherStrategy(
90-
Func<DiffContext, SourceCollection, SourceCollection, IEnumerable<Comparison>>? nodeMatcher = null,
91-
Func<DiffContext, SourceMap, SourceMap, IEnumerable<AttributeComparison>>? attrMatcher = null)
92-
{
93-
_nodeMatcher = nodeMatcher;
94-
_attrMatcher = attrMatcher;
95-
}
96-
97-
public IEnumerable<Comparison> Match(
98-
DiffContext context,
99-
SourceCollection controlNodes,
100-
SourceCollection testNodes) => _nodeMatcher!(context, controlNodes, testNodes);
101-
102-
public IEnumerable<AttributeComparison> Match(
103-
DiffContext context,
104-
SourceMap controlAttributes,
105-
SourceMap testAttributes) => _attrMatcher!(context, controlAttributes, testAttributes);
106-
}
107-
108-
class MockFilterStrategy : IFilterStrategy
109-
{
110-
private readonly Func<ComparisonSource, FilterDecision>? _nodeFilter;
111-
private readonly Func<AttributeComparisonSource, FilterDecision>? _attrFilter;
112-
113-
public MockFilterStrategy(Func<ComparisonSource, FilterDecision>? nodeFilter = null, Func<AttributeComparisonSource, FilterDecision>? attrFilter = null)
114-
{
115-
_nodeFilter = nodeFilter;
116-
_attrFilter = attrFilter;
117-
}
118-
119-
public FilterDecision Filter(in AttributeComparisonSource attributeComparisonSource)
120-
=> _attrFilter!(attributeComparisonSource);
121-
122-
public FilterDecision Filter(in ComparisonSource comparisonSource)
123-
=> _nodeFilter!(comparisonSource);
124-
}
125-
126-
class MockCompareStrategy : ICompareStrategy
127-
{
128-
private readonly Func<Comparison, CompareResult>? _nodeCompare;
129-
private readonly Func<AttributeComparison, CompareResult>? _attrCompare;
130-
131-
public MockCompareStrategy(Func<Comparison, CompareResult>? nodeCompare = null, Func<AttributeComparison, CompareResult>? attrCompare = null)
132-
{
133-
_nodeCompare = nodeCompare;
134-
_attrCompare = attrCompare;
135-
}
136-
137-
public CompareResult Compare(in Comparison comparison)
138-
=> _nodeCompare!(comparison);
139-
140-
public CompareResult Compare(in AttributeComparison comparison)
141-
=> _attrCompare!(comparison);
142-
}
14366
}
14467
}

tests/Core/HtmlDifferenceEngineTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace Egil.AngleSharp.Diffing.Core
88
{
9-
public class HtmlDifferenceEngineTest : DiffingTestBase
9+
public class HtmlDifferenceEngineTest : DiffingEngineTestBase
1010
{
1111
[Fact(DisplayName = "Unmatched nodes in control/test are returned as missing/unexpected diffs")]
1212
public void UnmatchedNodesBecomesMissingUnexpectedDiffs()

tests/Core/SourceMapTest.cs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,18 @@ namespace Egil.AngleSharp.Diffing.Core
77
{
88
public class SourceMapTest : DiffingTestBase
99
{
10-
private ComparisonSource CreateSource(string html, ComparisonSourceType sourceType = ComparisonSourceType.Control)
11-
{
12-
return ToNode(html).ToComparisonSource(0, sourceType);
13-
}
14-
1510
[Fact(DisplayName = "When initialized with a non-element an exception is thrown")]
1611
public void Test0()
1712
{
18-
var source = CreateSource(@"textnode", ComparisonSourceType.Test);
13+
var source = ToComparisonSource(@"textnode", ComparisonSourceType.Test);
1914

2015
Should.Throw<ArgumentException>(() => new SourceMap(source));
2116
}
2217

2318
[Fact(DisplayName = "When initializing with an element source, its source type is used and its attributes are added at sources to the map")]
2419
public void Test1()
2520
{
26-
var elementSource = CreateSource(@"<p foo=""bar"" baz=""foo""></p>", ComparisonSourceType.Test);
21+
var elementSource = ToComparisonSource(@"<p foo=""bar"" baz=""foo""></p>", ComparisonSourceType.Test);
2722
var sut = new SourceMap(elementSource);
2823

2924
sut.SourceType.ShouldBe(ComparisonSourceType.Test);
@@ -41,7 +36,7 @@ public void Test1()
4136
[Fact(DisplayName = "Accessing the indexer with a attr name that is not in the set throws")]
4237
public void Test2()
4338
{
44-
var elementSource = CreateSource(@"<p></p>");
39+
var elementSource = ToComparisonSource(@"<p></p>");
4540
var sut = new SourceMap(elementSource);
4641

4742
Should.Throw<ArgumentException>(() => sut["foo"])
@@ -53,7 +48,7 @@ public void Test2()
5348
[InlineData(@"<p>", false)]
5449
public void Tests3(string html, bool expectedResult)
5550
{
56-
var elementSource = CreateSource(html);
51+
var elementSource = ToComparisonSource(html);
5752
var sut = new SourceMap(elementSource);
5853

5954
sut.Contains("foo").ShouldBe(expectedResult);
@@ -62,7 +57,7 @@ public void Tests3(string html, bool expectedResult)
6257
[Fact(DisplayName = "Sources can be removed from map by passing a predicate to the Remove method")]
6358
public void Test4()
6459
{
65-
var elementSource = CreateSource(@"<p foo=""bar"" baz=""foo""></p>");
60+
var elementSource = ToComparisonSource(@"<p foo=""bar"" baz=""foo""></p>");
6661
var sut = new SourceMap(elementSource);
6762

6863
sut.Remove((in AttributeComparisonSource cs) => cs.Attribute.Name == "foo" ? FilterDecision.Exclude : FilterDecision.Keep);
@@ -74,7 +69,7 @@ public void Test4()
7469
[Fact(DisplayName = "When a source is marked as matched, it is not returned in GetUnmatched")]
7570
public void Test5()
7671
{
77-
var elementSource = CreateSource(@"<p foo=""bar"" baz=""foo""></p>");
72+
var elementSource = ToComparisonSource(@"<p foo=""bar"" baz=""foo""></p>");
7873
var sut = new SourceMap(elementSource);
7974
var foo = sut["foo"];
8075

tests/Strategies/IgnoreStrategies/IgnoreDiffAttributesFilterTest.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ public class IgnoreDiffAttributesFilterTest : DiffingTestBase
1717
[InlineData(@"<p diff:ignore=""true"">", "diff:ignore")]
1818
public void Test1(string elementHtml, string diffAttrName)
1919
{
20-
var elmSource = ToComparisonSource(elementHtml);
21-
var attr = ((IElement)elmSource.Node).Attributes[diffAttrName];
22-
var source = new AttributeComparisonSource(attr, elmSource);
20+
var source = ToAttributeComparisonSource(elementHtml, diffAttrName);
2321

2422
IgnoreDiffAttributesFilter.Filter(source, FilterDecision.Keep).ShouldBe(FilterDecision.Exclude);
2523
}
@@ -30,9 +28,7 @@ public void Test1(string elementHtml, string diffAttrName)
3028
[InlineData(@"<p diffx=""foo"">", "diffx")]
3129
public void Test2(string elementHtml, string diffAttrName)
3230
{
33-
var elmSource = ToComparisonSource(elementHtml);
34-
var attr = ((IElement)elmSource.Node).Attributes[diffAttrName];
35-
var source = new AttributeComparisonSource(attr, elmSource);
31+
var source = ToAttributeComparisonSource(elementHtml, diffAttrName);
3632

3733
IgnoreDiffAttributesFilter.Filter(source, FilterDecision.Keep).ShouldBe(FilterDecision.Keep);
3834
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace Egil.AngleSharp.Diffing.Strategies.IgnoreStrategies
6+
{
7+
public class InlineIgnoreAttributeMatcherTest
8+
{
9+
// When a control attribute has the ':ignore' postfix, the postfix should not be used when matching with test attributes
10+
}
11+
}

0 commit comments

Comments
 (0)