diff --git a/CHANGELOG.md b/CHANGELOG.md index 4824e71..fd409a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 1.1.1 + +- Fixed marking comaprison results in the pipeline so that strategies down the line see if there is a diff. By [@egil](https://github.com/egil) and [@linkdotnet](https://github.com/linkdotnet). + # 1.1.0 - An ':ignore' marked attributes will no longer show up as a diff if the ignored attribute was NOT found in the test html. By [@RiRiSharp](https://github.com/RiRiSharp). diff --git a/src/AngleSharp.Diffing.Tests/Strategies/ElementStrategies/IgnoreAttributesElementComparerTest.cs b/src/AngleSharp.Diffing.Tests/Strategies/ElementStrategies/IgnoreAttributesElementComparerTest.cs index 261a655..b8d9571 100644 --- a/src/AngleSharp.Diffing.Tests/Strategies/ElementStrategies/IgnoreAttributesElementComparerTest.cs +++ b/src/AngleSharp.Diffing.Tests/Strategies/ElementStrategies/IgnoreAttributesElementComparerTest.cs @@ -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(@"

")] + [InlineData(@"

")] + public void Test004(string controlHtml) + { + var comparison = ToComparison(controlHtml, "

"); + + IgnoreAttributesElementComparer.Compare(comparison, CompareResult.Different).ShouldBe(CompareResult.DifferentAndSkipAttributes); + } + + [Theory(DisplayName = "When control has 'diff:ignoreAttributes' and current decision is DifferentAndSkipChildren, returns DifferentAndSkipChildrenAndSkipAttributes")] + [InlineData(@"

")] + [InlineData(@"

")] + public void Test005(string controlHtml) + { + var comparison = ToComparison(controlHtml, "

"); + + IgnoreAttributesElementComparer.Compare(comparison, CompareResult.DifferentAndSkipChildren).ShouldBe(CompareResult.DifferentAndSkipChildrenAndSkipAttributes); + } } diff --git a/src/AngleSharp.Diffing.Tests/Strategies/ElementStrategies/IgnoreChildrenElementComparerTest.cs b/src/AngleSharp.Diffing.Tests/Strategies/ElementStrategies/IgnoreChildrenElementComparerTest.cs index 96b064a..f186f86 100644 --- a/src/AngleSharp.Diffing.Tests/Strategies/ElementStrategies/IgnoreChildrenElementComparerTest.cs +++ b/src/AngleSharp.Diffing.Tests/Strategies/ElementStrategies/IgnoreChildrenElementComparerTest.cs @@ -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(@"

")] + [InlineData(@"

")] + public void Test004(string controlHtml) + { + var comparison = ToComparison(controlHtml, "

"); + + IgnoreChildrenElementComparer.Compare(comparison, CompareResult.Different).ShouldBe(CompareResult.DifferentAndSkipChildren); + } + + [Theory(DisplayName = "When control has 'diff:ignoreChildren' and current decision is DifferentAndSkipAttributes, returns DifferentAndSkipChildrenAndSkipAttributes")] + [InlineData(@"

")] + [InlineData(@"

")] + public void Test005(string controlHtml) + { + var comparison = ToComparison(controlHtml, "

"); + + IgnoreChildrenElementComparer.Compare(comparison, CompareResult.DifferentAndSkipAttributes).ShouldBe(CompareResult.DifferentAndSkipChildrenAndSkipAttributes); + } } diff --git a/src/AngleSharp.Diffing/Core/CompareDecision.cs b/src/AngleSharp.Diffing/Core/CompareDecision.cs index 73d626d..b8944f8 100644 --- a/src/AngleSharp.Diffing/Core/CompareDecision.cs +++ b/src/AngleSharp.Diffing/Core/CompareDecision.cs @@ -30,5 +30,17 @@ public enum CompareDecision /// Use when the comparison should skip any attributes. /// SkipAttributes = 16, + /// + /// Use when the comparison is different and should skip children. + /// + DifferentAndSkipChildren = Different | SkipChildren, + /// + /// Use when the comparison is different and should skip attributes. + /// + DifferentAndSkipAttributes = Different | SkipAttributes, + /// + /// Use when the comparison is different and should skip both children and attributes. + /// + DifferentAndSkipChildrenAndSkipAttributes = Different | SkipChildren | SkipAttributes, } diff --git a/src/AngleSharp.Diffing/Core/CompareResult.cs b/src/AngleSharp.Diffing/Core/CompareResult.cs index cd3de65..31f0f27 100644 --- a/src/AngleSharp.Diffing/Core/CompareResult.cs +++ b/src/AngleSharp.Diffing/Core/CompareResult.cs @@ -33,7 +33,22 @@ public readonly record struct CompareResult(CompareDecision Decision, IDiff? Dif public static readonly CompareResult SkipAttributes = new(CompareDecision.SkipAttributes); /// - /// Use when the comparison should skip any attributes. + /// Use when the comparison should skip any attributes but has element differences. + /// + public static readonly CompareResult DifferentAndSkipAttributes = new(CompareDecision.Different | CompareDecision.SkipAttributes); + + /// + /// Use when the comparison should skip any attributes and children but has element differences. + /// + public static readonly CompareResult DifferentAndSkipChildrenAndSkipAttributes = new(CompareDecision.Different | CompareDecision.SkipChildren | CompareDecision.SkipAttributes); + + /// + /// Use when the comparison should skip children but has element differences. + /// + public static readonly CompareResult DifferentAndSkipChildren = new(CompareDecision.Different | CompareDecision.SkipChildren); + + /// + /// Use when the comparison should skip any children and any attributes. /// public static readonly CompareResult SkipChildrenAndAttributes = new(CompareDecision.SkipChildren | CompareDecision.SkipAttributes); @@ -50,7 +65,7 @@ public readonly record struct CompareResult(CompareDecision Decision, IDiff? Dif public static CompareResult FromDiff(IDiff diff) => new(CompareDecision.Different, diff); /// - /// Checks if a is either a or . + /// Checks if a is either a or . /// - public bool IsSameOrSkip => this == Same || this == Skip; + public bool IsSameOrSkip => Decision.HasFlag(CompareDecision.Same) || Decision.HasFlag(CompareDecision.Skip); } \ No newline at end of file diff --git a/src/AngleSharp.Diffing/Core/HtmlDifferenceEngine.cs b/src/AngleSharp.Diffing/Core/HtmlDifferenceEngine.cs index 35734aa..66f7ee9 100644 --- a/src/AngleSharp.Diffing/Core/HtmlDifferenceEngine.cs +++ b/src/AngleSharp.Diffing/Core/HtmlDifferenceEngine.cs @@ -187,7 +187,7 @@ private IEnumerable CompareAttributes(IEnumerable 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); } diff --git a/src/AngleSharp.Diffing/Strategies/AttributeStrategies/BooleanAttributeComparer.cs b/src/AngleSharp.Diffing/Strategies/AttributeStrategies/BooleanAttributeComparer.cs index feb77b2..4baa745 100644 --- a/src/AngleSharp.Diffing/Strategies/AttributeStrategies/BooleanAttributeComparer.cs +++ b/src/AngleSharp.Diffing/Strategies/AttributeStrategies/BooleanAttributeComparer.cs @@ -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) diff --git a/src/AngleSharp.Diffing/Strategies/ElementStrategies/ElementComparer.cs b/src/AngleSharp.Diffing/Strategies/ElementStrategies/ElementComparer.cs index 4c5d12a..346f693 100644 --- a/src/AngleSharp.Diffing/Strategies/ElementStrategies/ElementComparer.cs +++ b/src/AngleSharp.Diffing/Strategies/ElementStrategies/ElementComparer.cs @@ -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."); diff --git a/src/AngleSharp.Diffing/Strategies/ElementStrategies/IgnoreAttributesElementComparer.cs b/src/AngleSharp.Diffing/Strategies/ElementStrategies/IgnoreAttributesElementComparer.cs index a5cd052..94d0795 100644 --- a/src/AngleSharp.Diffing/Strategies/ElementStrategies/IgnoreAttributesElementComparer.cs +++ b/src/AngleSharp.Diffing/Strategies/ElementStrategies/IgnoreAttributesElementComparer.cs @@ -12,7 +12,7 @@ public static class IgnoreAttributesElementComparer /// 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)) @@ -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, }; } diff --git a/src/AngleSharp.Diffing/Strategies/ElementStrategies/IgnoreChildrenElementComparer.cs b/src/AngleSharp.Diffing/Strategies/ElementStrategies/IgnoreChildrenElementComparer.cs index 966fe7b..a0904a6 100644 --- a/src/AngleSharp.Diffing/Strategies/ElementStrategies/IgnoreChildrenElementComparer.cs +++ b/src/AngleSharp.Diffing/Strategies/ElementStrategies/IgnoreChildrenElementComparer.cs @@ -12,7 +12,7 @@ public static class IgnoreChildrenElementComparer /// 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)) @@ -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, CompareDecision.SkipAttributes => CompareResult.SkipChildrenAndAttributes, _ => currentDecision, }; diff --git a/src/AngleSharp.Diffing/Strategies/ElementStrategies/IgnoreElementComparer.cs b/src/AngleSharp.Diffing/Strategies/ElementStrategies/IgnoreElementComparer.cs index ad1cef1..9743ff8 100644 --- a/src/AngleSharp.Diffing/Strategies/ElementStrategies/IgnoreElementComparer.cs +++ b/src/AngleSharp.Diffing/Strategies/ElementStrategies/IgnoreElementComparer.cs @@ -12,7 +12,7 @@ public static class IgnoreElementComparer /// public static CompareResult Compare(in Comparison comparison, CompareResult currentDecision) { - if (currentDecision == CompareResult.Skip) + if (currentDecision.Decision.HasFlag(CompareDecision.Skip)) return currentDecision; return ControlHasTruthyIgnoreAttribute(comparison)