Skip to content

Commit e073536

Browse files
committed
fix: IgnoreComparer should check for CompareDcision.Difference
1 parent 93c89c3 commit e073536

File tree

7 files changed

+76
-7
lines changed

7 files changed

+76
-7
lines changed

src/AngleSharp.Diffing.Tests/Strategies/ElementStrategies/IgnoreAttributesElementComparerTest.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,24 @@ public void Test003(string controlHtml, string testHtml)
4747
IgnoreAttributesElementComparer.Compare(comparison, CompareResult.SkipChildren).ShouldBe(CompareResult.SkipChildrenAndAttributes);
4848
IgnoreAttributesElementComparer.Compare(comparison, CompareResult.SkipAttributes).ShouldBe(CompareResult.SkipAttributes);
4949
}
50+
51+
[Theory(DisplayName = "When control has 'diff:ignoreAttributes' and current decision is Different, returns DifferentAndSkipAttributes")]
52+
[InlineData(@"<p diff:ignoreAttributes></p>")]
53+
[InlineData(@"<p diff:ignoreAttributes=""true""></p>")]
54+
public void Test004(string controlHtml)
55+
{
56+
var comparison = ToComparison(controlHtml, "<p></p>");
57+
58+
IgnoreAttributesElementComparer.Compare(comparison, CompareResult.Different).ShouldBe(CompareResult.DifferentAndSkipAttributes);
59+
}
60+
61+
[Theory(DisplayName = "When control has 'diff:ignoreAttributes' and current decision is DifferentAndSkipChildren, returns DifferentAndSkipChildrenAndSkipAttributes")]
62+
[InlineData(@"<p diff:ignoreAttributes></p>")]
63+
[InlineData(@"<p diff:ignoreAttributes=""true""></p>")]
64+
public void Test005(string controlHtml)
65+
{
66+
var comparison = ToComparison(controlHtml, "<p></p>");
67+
68+
IgnoreAttributesElementComparer.Compare(comparison, CompareResult.DifferentAndSkipChildren).ShouldBe(CompareResult.DifferentAndSkipChildrenAndSkipAttributes);
69+
}
5070
}

src/AngleSharp.Diffing.Tests/Strategies/ElementStrategies/IgnoreChildrenElementComparerTest.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,24 @@ public void Test003(string controlHtml, string testHtml)
4747
IgnoreChildrenElementComparer.Compare(comparison, CompareResult.SkipAttributes).ShouldBe(CompareResult.SkipChildrenAndAttributes);
4848
IgnoreChildrenElementComparer.Compare(comparison, CompareResult.SkipChildren).ShouldBe(CompareResult.SkipChildren);
4949
}
50+
51+
[Theory(DisplayName = "When control has 'diff:ignoreChildren' and current decision is Different, returns DifferentAndSkipChildren")]
52+
[InlineData(@"<p diff:ignoreChildren></p>")]
53+
[InlineData(@"<p diff:ignoreChildren=""true""></p>")]
54+
public void Test004(string controlHtml)
55+
{
56+
var comparison = ToComparison(controlHtml, "<p></p>");
57+
58+
IgnoreChildrenElementComparer.Compare(comparison, CompareResult.Different).ShouldBe(CompareResult.DifferentAndSkipChildren);
59+
}
60+
61+
[Theory(DisplayName = "When control has 'diff:ignoreChildren' and current decision is DifferentAndSkipAttributes, returns DifferentAndSkipChildrenAndSkipAttributes")]
62+
[InlineData(@"<p diff:ignoreChildren></p>")]
63+
[InlineData(@"<p diff:ignoreChildren=""true""></p>")]
64+
public void Test005(string controlHtml)
65+
{
66+
var comparison = ToComparison(controlHtml, "<p></p>");
67+
68+
IgnoreChildrenElementComparer.Compare(comparison, CompareResult.DifferentAndSkipAttributes).ShouldBe(CompareResult.DifferentAndSkipChildrenAndSkipAttributes);
69+
}
5070
}

src/AngleSharp.Diffing/Core/CompareDecision.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,17 @@ public enum CompareDecision
3030
/// Use when the comparison should skip any attributes.
3131
/// </summary>
3232
SkipAttributes = 16,
33+
/// <summary>
34+
/// Use when the comparison is different and should skip children.
35+
/// </summary>
36+
DifferentAndSkipChildren = Different | SkipChildren,
37+
/// <summary>
38+
/// Use when the comparison is different and should skip attributes.
39+
/// </summary>
40+
DifferentAndSkipAttributes = Different | SkipAttributes,
41+
/// <summary>
42+
/// Use when the comparison is different and should skip both children and attributes.
43+
/// </summary>
44+
DifferentAndSkipChildrenAndSkipAttributes = Different | SkipChildren | SkipAttributes,
3345
}
3446

src/AngleSharp.Diffing/Core/CompareResult.cs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,22 @@ public readonly record struct CompareResult(CompareDecision Decision, IDiff? Dif
3333
public static readonly CompareResult SkipAttributes = new(CompareDecision.SkipAttributes);
3434

3535
/// <summary>
36-
/// Use when the comparison should skip any attributes.
36+
/// Use when the comparison should skip any attributes but has element differences.
37+
/// </summary>
38+
public static readonly CompareResult DifferentAndSkipAttributes = new(CompareDecision.Different | CompareDecision.SkipAttributes);
39+
40+
/// <summary>
41+
/// Use when the comparison should skip any attributes and children but has element differences.
42+
/// </summary>
43+
public static readonly CompareResult DifferentAndSkipChildrenAndSkipAttributes = new(CompareDecision.Different | CompareDecision.SkipChildren | CompareDecision.SkipAttributes);
44+
45+
/// <summary>
46+
/// Use when the comparison should skip children but has element differences.
47+
/// </summary>
48+
public static readonly CompareResult DifferentAndSkipChildren = new(CompareDecision.Different | CompareDecision.SkipChildren);
49+
50+
/// <summary>
51+
/// Use when the comparison should skip any children and any attributes.
3752
/// </summary>
3853
public static readonly CompareResult SkipChildrenAndAttributes = new(CompareDecision.SkipChildren | CompareDecision.SkipAttributes);
3954

@@ -50,7 +65,7 @@ public readonly record struct CompareResult(CompareDecision Decision, IDiff? Dif
5065
public static CompareResult FromDiff(IDiff diff) => new(CompareDecision.Different, diff);
5166

5267
/// <summary>
53-
/// Checks if a <see cref="CompareResult"/> is either a <see cref="CompareResult.Same"/> or <see cref="CompareResult.Skip"/>.
68+
/// Checks if a <see cref="CompareResult"/> is either a <see cref="CompareDecision.Same"/> or <see cref="CompareDecision.Skip"/>.
5469
/// </summary>
55-
public bool IsSameOrSkip => this == Same || this == Skip;
70+
public bool IsSameOrSkip => Decision.HasFlag(CompareDecision.Same) || Decision.HasFlag(CompareDecision.Skip);
5671
}

src/AngleSharp.Diffing/Core/HtmlDifferenceEngine.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ private IEnumerable<IDiff> CompareAttributes(IEnumerable<AttributeComparison> co
187187
foreach (var comparison in comparisons)
188188
{
189189
var compareRes = _diffingStrategy.Compare(comparison);
190-
if (compareRes.Decision == CompareDecision.Different)
190+
if (compareRes.Decision.HasFlag(CompareDecision.Different))
191191
{
192192
yield return compareRes.Diff ?? new AttrDiff(comparison, AttrDiffKind.Unspecified);
193193
}

src/AngleSharp.Diffing/Strategies/ElementStrategies/IgnoreAttributesElementComparer.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ public static CompareResult Compare(in Comparison comparison, CompareResult curr
2222
{
2323
CompareDecision.None => CompareResult.SkipAttributes,
2424
CompareDecision.Same => CompareResult.SkipAttributes,
25-
CompareDecision.Different => CompareResult.SkipAttributes,
25+
CompareDecision.Different => CompareResult.DifferentAndSkipAttributes,
2626
CompareDecision.SkipChildren => CompareResult.SkipChildrenAndAttributes,
27+
CompareDecision.DifferentAndSkipChildren => CompareResult.DifferentAndSkipChildrenAndSkipAttributes,
2728
_ => currentDecision,
2829
};
2930
}

src/AngleSharp.Diffing/Strategies/ElementStrategies/IgnoreChildrenElementComparer.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public static class IgnoreChildrenElementComparer
1212
/// </summary>
1313
public static CompareResult Compare(in Comparison comparison, CompareResult currentDecision)
1414
{
15-
if (currentDecision == CompareResult.Skip || currentDecision == CompareResult.SkipChildren || currentDecision == CompareResult.SkipChildrenAndAttributes)
15+
if (currentDecision.Decision.HasFlag(CompareDecision.SkipChildren) || currentDecision.Decision.HasFlag(CompareDecision.Skip))
1616
return currentDecision;
1717

1818
if (!ControlHasTruthyIgnoreChildrenAttribute(comparison))
@@ -22,7 +22,8 @@ public static CompareResult Compare(in Comparison comparison, CompareResult curr
2222
{
2323
CompareDecision.None => CompareResult.SkipChildren,
2424
CompareDecision.Same => CompareResult.SkipChildren,
25-
CompareDecision.Different => CompareResult.SkipChildren,
25+
CompareDecision.Different => CompareResult.DifferentAndSkipChildren,
26+
CompareDecision.Different | CompareDecision.SkipAttributes => CompareResult.DifferentAndSkipChildrenAndSkipAttributes,
2627
CompareDecision.SkipAttributes => CompareResult.SkipChildrenAndAttributes,
2728
_ => currentDecision,
2829
};

0 commit comments

Comments
 (0)