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
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,24 @@ public void Test003(string controlHtml, string testHtml)
IgnoreAttributesElementComparer.Compare(comparison, CompareResult.SkipChildren).ShouldBe(CompareResult.SkipChildrenAndAttributes);
IgnoreAttributesElementComparer.Compare(comparison, CompareResult.SkipAttributes).ShouldBe(CompareResult.SkipAttributes);
}

[Theory(DisplayName = "When control has 'diff:ignoreAttributes' and current decision is Different, returns DifferentAndSkipAttributes")]
[InlineData(@"<p diff:ignoreAttributes></p>")]
[InlineData(@"<p diff:ignoreAttributes=""true""></p>")]
public void Test004(string controlHtml)
{
var comparison = ToComparison(controlHtml, "<p></p>");

IgnoreAttributesElementComparer.Compare(comparison, CompareResult.Different).ShouldBe(CompareResult.DifferentAndSkipAttributes);
}

[Theory(DisplayName = "When control has 'diff:ignoreAttributes' and current decision is DifferentAndSkipChildren, returns DifferentAndSkipChildrenAndSkipAttributes")]
[InlineData(@"<p diff:ignoreAttributes></p>")]
[InlineData(@"<p diff:ignoreAttributes=""true""></p>")]
public void Test005(string controlHtml)
{
var comparison = ToComparison(controlHtml, "<p></p>");

IgnoreAttributesElementComparer.Compare(comparison, CompareResult.DifferentAndSkipChildren).ShouldBe(CompareResult.DifferentAndSkipChildrenAndSkipAttributes);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,24 @@ public void Test003(string controlHtml, string testHtml)
IgnoreChildrenElementComparer.Compare(comparison, CompareResult.SkipAttributes).ShouldBe(CompareResult.SkipChildrenAndAttributes);
IgnoreChildrenElementComparer.Compare(comparison, CompareResult.SkipChildren).ShouldBe(CompareResult.SkipChildren);
}

[Theory(DisplayName = "When control has 'diff:ignoreChildren' and current decision is Different, returns DifferentAndSkipChildren")]
[InlineData(@"<p diff:ignoreChildren></p>")]
[InlineData(@"<p diff:ignoreChildren=""true""></p>")]
public void Test004(string controlHtml)
{
var comparison = ToComparison(controlHtml, "<p></p>");

IgnoreChildrenElementComparer.Compare(comparison, CompareResult.Different).ShouldBe(CompareResult.DifferentAndSkipChildren);
}

[Theory(DisplayName = "When control has 'diff:ignoreChildren' and current decision is DifferentAndSkipAttributes, returns DifferentAndSkipChildrenAndSkipAttributes")]
[InlineData(@"<p diff:ignoreChildren></p>")]
[InlineData(@"<p diff:ignoreChildren=""true""></p>")]
public void Test005(string controlHtml)
{
var comparison = ToComparison(controlHtml, "<p></p>");

IgnoreChildrenElementComparer.Compare(comparison, CompareResult.DifferentAndSkipAttributes).ShouldBe(CompareResult.DifferentAndSkipChildrenAndSkipAttributes);
}
}
12 changes: 12 additions & 0 deletions src/AngleSharp.Diffing/Core/CompareDecision.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,17 @@ public enum CompareDecision
/// Use when the comparison should skip any attributes.
/// </summary>
SkipAttributes = 16,
/// <summary>
/// Use when the comparison is different and should skip children.
/// </summary>
DifferentAndSkipChildren = Different | SkipChildren,
/// <summary>
/// Use when the comparison is different and should skip attributes.
/// </summary>
DifferentAndSkipAttributes = Different | SkipAttributes,
/// <summary>
/// Use when the comparison is different and should skip both children and attributes.
/// </summary>
DifferentAndSkipChildrenAndSkipAttributes = Different | SkipChildren | SkipAttributes,
}

21 changes: 18 additions & 3 deletions src/AngleSharp.Diffing/Core/CompareResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,22 @@ public readonly record struct CompareResult(CompareDecision Decision, IDiff? Dif
public static readonly CompareResult SkipAttributes = new(CompareDecision.SkipAttributes);

/// <summary>
/// Use when the comparison should skip any attributes.
/// Use when the comparison should skip any attributes but has element differences.
/// </summary>
public static readonly CompareResult DifferentAndSkipAttributes = new(CompareDecision.Different | CompareDecision.SkipAttributes);

/// <summary>
/// Use when the comparison should skip any attributes and children but has element differences.
/// </summary>
public static readonly CompareResult DifferentAndSkipChildrenAndSkipAttributes = new(CompareDecision.Different | CompareDecision.SkipChildren | CompareDecision.SkipAttributes);

/// <summary>
/// Use when the comparison should skip children but has element differences.
/// </summary>
public static readonly CompareResult DifferentAndSkipChildren = new(CompareDecision.Different | CompareDecision.SkipChildren);

/// <summary>
/// Use when the comparison should skip any children and any attributes.
/// </summary>
public static readonly CompareResult SkipChildrenAndAttributes = new(CompareDecision.SkipChildren | CompareDecision.SkipAttributes);

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

/// <summary>
/// Checks if a <see cref="CompareResult"/> is either a <see cref="CompareResult.Same"/> or <see cref="CompareResult.Skip"/>.
/// Checks if a <see cref="CompareResult"/> is either a <see cref="CompareDecision.Same"/> or <see cref="CompareDecision.Skip"/>.
/// </summary>
public bool IsSameOrSkip => this == Same || this == Skip;
public bool IsSameOrSkip => Decision.HasFlag(CompareDecision.Same) || Decision.HasFlag(CompareDecision.Skip);
}
2 changes: 1 addition & 1 deletion src/AngleSharp.Diffing/Core/HtmlDifferenceEngine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ private IEnumerable<IDiff> CompareAttributes(IEnumerable<AttributeComparison> co
foreach (var comparison in comparisons)
{
var compareRes = _diffingStrategy.Compare(comparison);
if (compareRes.Decision == CompareDecision.Different)
if (compareRes.Decision.HasFlag(CompareDecision.Different))
{
yield return compareRes.Diff ?? new AttrDiff(comparison, AttrDiffKind.Unspecified);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,9 @@ public CompareResult Compare(in AttributeComparison comparison, CompareResult cu
? CompareStrict(comparison)
: true;

return hasSameValue ?
CompareResult.Same :
CompareResult.FromDiff(new AttrDiff(comparison, AttrDiffKind.Value));
return hasSameValue
? CompareResult.Same
: CompareResult.FromDiff(new AttrDiff(comparison, AttrDiffKind.Value));
}

private static bool IsAttributeNamesEqual(in AttributeComparison comparison)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public CompareResult Compare(in Comparison comparison, CompareResult currentDeci
? CompareResult.Same
: CompareResult.FromDiff(new ElementDiff(comparison, ElementDiffKind.Name));

if (EnforceTagClosing && result == CompareResult.Same)
if (EnforceTagClosing && result.Decision.HasFlag(CompareDecision.Same))
{
if (testElement.SourceReference is not HtmlTagToken testTag)
throw new InvalidOperationException("No source reference attached to test element, cannot determine element tag closing style.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public static class IgnoreAttributesElementComparer
/// </summary>
public static CompareResult Compare(in Comparison comparison, CompareResult currentDecision)
{
if (currentDecision == CompareResult.Skip || currentDecision == CompareResult.SkipAttributes || currentDecision == CompareResult.SkipChildrenAndAttributes)
if (currentDecision.Decision.HasFlag(CompareDecision.Skip) || currentDecision.Decision.HasFlag(CompareDecision.SkipAttributes))
return currentDecision;

if (!ControlHasTruthyIgnoreAttributesAttribute(comparison))
Expand All @@ -22,8 +22,9 @@ public static CompareResult Compare(in Comparison comparison, CompareResult curr
{
CompareDecision.None => CompareResult.SkipAttributes,
CompareDecision.Same => CompareResult.SkipAttributes,
CompareDecision.Different => CompareResult.SkipAttributes,
CompareDecision.Different => CompareResult.DifferentAndSkipAttributes,
CompareDecision.SkipChildren => CompareResult.SkipChildrenAndAttributes,
CompareDecision.DifferentAndSkipChildren => CompareResult.DifferentAndSkipChildrenAndSkipAttributes,
_ => currentDecision,
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public static class IgnoreChildrenElementComparer
/// </summary>
public static CompareResult Compare(in Comparison comparison, CompareResult currentDecision)
{
if (currentDecision == CompareResult.Skip || currentDecision == CompareResult.SkipChildren || currentDecision == CompareResult.SkipChildrenAndAttributes)
if (currentDecision.Decision.HasFlag(CompareDecision.SkipChildren) || currentDecision.Decision.HasFlag(CompareDecision.Skip))
return currentDecision;

if (!ControlHasTruthyIgnoreChildrenAttribute(comparison))
Expand All @@ -22,7 +22,8 @@ public static CompareResult Compare(in Comparison comparison, CompareResult curr
{
CompareDecision.None => CompareResult.SkipChildren,
CompareDecision.Same => CompareResult.SkipChildren,
CompareDecision.Different => CompareResult.SkipChildren,
CompareDecision.Different => CompareResult.DifferentAndSkipChildren,
CompareDecision.Different | CompareDecision.SkipAttributes => CompareResult.DifferentAndSkipChildrenAndSkipAttributes,
Copy link

Copilot AI Dec 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] Consider using the named enum member CompareDecision.DifferentAndSkipAttributes instead of the inline bitwise OR pattern CompareDecision.Different | CompareDecision.SkipAttributes for consistency with line 27 in IgnoreAttributesElementComparer.cs, which uses CompareDecision.DifferentAndSkipChildren. This would improve code clarity and maintainability.

Suggested change
CompareDecision.Different | CompareDecision.SkipAttributes => CompareResult.DifferentAndSkipChildrenAndSkipAttributes,
CompareDecision.DifferentAndSkipAttributes => CompareResult.DifferentAndSkipChildrenAndSkipAttributes,

Copilot uses AI. Check for mistakes.
CompareDecision.SkipAttributes => CompareResult.SkipChildrenAndAttributes,
_ => currentDecision,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public static class IgnoreElementComparer
/// </summary>
public static CompareResult Compare(in Comparison comparison, CompareResult currentDecision)
{
if (currentDecision == CompareResult.Skip)
if (currentDecision.Decision.HasFlag(CompareDecision.Skip))
return currentDecision;

return ControlHasTruthyIgnoreAttribute(comparison)
Expand Down
Loading