Skip to content

Commit d99c828

Browse files
committed
renamed builder for more flexibility and usecases
1 parent 5d4a245 commit d99c828

18 files changed

Lines changed: 284 additions & 217 deletions
Lines changed: 20 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
1-
using System;
2-
using AngleSharp.Diffing.Core;
1+
using System;
2+
using Egil.AngleSharp.Diffing.Strategies;
33
using Shouldly;
44
using Xunit;
55

6-
namespace AngleSharp.Diffing
6+
namespace Egil.AngleSharp.Diffing
77
{
8+
89
public class DiffBuilderTest
910
{
11+
private DiffingStrategyPipeline DefaultStrategy { get; } = new DiffingStrategyPipelineBuilder().WithDefaultOptions().Build();
12+
1013
[Fact(DisplayName = "Control and test html are set correctly")]
1114
public void Test001()
1215
{
1316
var control = "<p>control</p>";
1417
var test = "<p>test</p>";
1518

16-
var sut = DiffBuilder
19+
var sut = new DiffBuilder(DefaultStrategy)
1720
.Compare(control)
1821
.WithTest(test);
1922

@@ -24,90 +27,42 @@ public void Test001()
2427
[Fact(DisplayName = "Builder throws if null is passed to control and test")]
2528
public void Test002()
2629
{
27-
Should.Throw<ArgumentNullException>(() => DiffBuilder.Compare(null!)).ParamName.ShouldBe(nameof(DiffBuilder.Control));
28-
Should.Throw<ArgumentNullException>(() => DiffBuilder.Compare("").WithTest(null!)).ParamName.ShouldBe(nameof(DiffBuilder.Test));
30+
Should.Throw<ArgumentNullException>(() => new DiffBuilder(DefaultStrategy).Compare(null!)).ParamName.ShouldBe(nameof(DiffBuilder.Control));
31+
Should.Throw<ArgumentNullException>(() => new DiffBuilder(DefaultStrategy).Compare("").WithTest(null!)).ParamName.ShouldBe(nameof(DiffBuilder.Test));
2932
}
3033

31-
32-
[Fact(DisplayName = "Calling .Build() without adding strategies throws")]
34+
[Fact(DisplayName = "Creating DiffBuilder with null strategies throws")]
3335
public void Test3()
3436
{
35-
var control = "<p>control</p>";
36-
var test = "<p>test</p>";
37-
38-
Should.Throw<InvalidOperationException>(() => DiffBuilder.Compare(control).WithTest(test).Build());
37+
Should.Throw<ArgumentNullException>(() => new DiffBuilder(null!));
3938
}
4039

41-
[Fact(DisplayName = "Calling .Build() without adding strategies throws")]
42-
public void Test4()
43-
{
44-
var control = "<p>control</p>";
45-
var test = "<p>test</p>";
46-
47-
Should.Throw<InvalidOperationException>(
48-
() => DiffBuilder.Compare(control)
49-
.WithTest(test)
50-
.Build());
51-
}
52-
53-
[Fact(DisplayName = "Calling .Build() without adding strategies throws")]
54-
public void Test5()
55-
{
56-
var control = "<p>control</p>";
57-
var test = "<p>test</p>";
58-
59-
Should.Throw<InvalidOperationException>(
60-
() => DiffBuilder.Compare(control)
61-
.WithTest(test)
62-
.WithOneToOneNodeMatcher()
63-
.WithAttributeNameMatcher()
64-
.Build());
65-
}
66-
67-
6840
[Fact(DisplayName = "Calling Build() with DefaultOptions() returns expected diffs")]
6941
public void Test6()
7042
{
7143
var control = "<p>hello <em>world</em></p>";
7244
var test = "<p>world says <strong>hello</strong></p>";
7345

74-
var diffs = DiffBuilder.Compare(control)
46+
var diffs = new DiffBuilder(DefaultStrategy)
47+
.Compare(control)
7548
.WithTest(test)
76-
.WithDefaultOptions()
7749
.Build();
7850

7951
diffs.ShouldNotBeEmpty();
8052
}
8153

82-
[Fact(DisplayName = "Adding custom strategies works")]
83-
public void Test7()
54+
[Fact(DisplayName = "Test")]
55+
public void MyTestMethod()
8456
{
85-
var nodeFilterCalled = false;
86-
var attrFilterCalled = false;
87-
var nodeMatcherCalled = false;
88-
var attrMatcherCalled = false;
89-
var nodeComparerCalled = false;
90-
var attrComparerCalled = false;
91-
var control = @"<p foo=""bar"">hello <em>world</em></p>";
92-
var test = @"<p foo=""bar"">world says <strong>hello</strong></p>";
57+
var control = "\r\n <h1>Hello world</h1>\r\n <h1>Hello world</h1>\r\n ";
58+
var test = "\r\n <h1>Hello world</h1>\r\n <h1>Hello world</h1>\r\n ";
9359

94-
DiffBuilder.Compare(control)
60+
var diffs = new DiffBuilder(DefaultStrategy)
61+
.Compare(control)
9562
.WithTest(test)
96-
.WithDefaultOptions()
97-
.WithFilter((in ComparisonSource source, FilterDecision currentDecision) => { nodeFilterCalled = true; return currentDecision; })
98-
.WithFilter((in AttributeComparisonSource source, FilterDecision currentDecision) => { attrFilterCalled = true; return currentDecision; })
99-
.WithMatcher((ctx, ctrlSrc, testSrc) => { nodeMatcherCalled = true; return Array.Empty<Comparison>(); })
100-
.WithMatcher((ctx, ctrlSrc, testSrc) => { attrMatcherCalled = true; return Array.Empty<AttributeComparison>(); })
101-
.WithComparer((in Comparison comparison, CompareResult currentDecision) => { nodeComparerCalled = true; return currentDecision; })
102-
.WithComparer((in AttributeComparison comparison, CompareResult currentDecision) => { attrComparerCalled = true; return currentDecision; })
10363
.Build();
10464

105-
nodeFilterCalled.ShouldBeTrue();
106-
attrFilterCalled.ShouldBeTrue();
107-
nodeMatcherCalled.ShouldBeTrue();
108-
attrMatcherCalled.ShouldBeTrue();
109-
nodeComparerCalled.ShouldBeTrue();
110-
attrComparerCalled.ShouldBeTrue();
65+
diffs.ShouldBeEmpty();
11166
}
11267
}
11368
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
using System;
2+
using System.Linq;
3+
using Egil.AngleSharp.Diffing.Core;
4+
using Shouldly;
5+
using Xunit;
6+
7+
namespace Egil.AngleSharp.Diffing
8+
{
9+
public class DiffingStrategyPipelineBuilderTest : DiffingTestBase
10+
{
11+
public DiffingStrategyPipelineBuilderTest(DiffingTestFixture fixture) : base(fixture)
12+
{
13+
}
14+
15+
[Fact(DisplayName = "Calling .Build() without adding strategies throws")]
16+
public void Test1()
17+
{
18+
Should.Throw<InvalidOperationException>(
19+
() => new DiffingStrategyPipelineBuilder().Build());
20+
}
21+
22+
[Fact(DisplayName = "Calling .Build() without adding compare strategies throws")]
23+
public void Test2()
24+
{
25+
Should.Throw<InvalidOperationException>(
26+
() => new DiffingStrategyPipelineBuilder()
27+
.WithOneToOneNodeMatcher()
28+
.WithAttributeNameMatcher()
29+
.Build());
30+
}
31+
32+
[Fact(DisplayName = "Calling .Build() without adding matcher strategies throws")]
33+
public void Test3()
34+
{
35+
Should.Throw<InvalidOperationException>(
36+
() => new DiffingStrategyPipelineBuilder()
37+
.WithClassAttributeComparer()
38+
.WithNodeNameComparer()
39+
.Build());
40+
}
41+
42+
[Fact(DisplayName = "Adding custom strategies works")]
43+
public void Test4()
44+
{
45+
var context = new DiffContext(null, null);
46+
var nodeFilterCalled = false;
47+
var attrFilterCalled = false;
48+
var nodeMatcherCalled = false;
49+
var attrMatcherCalled = false;
50+
var nodeComparerCalled = false;
51+
var attrComparerCalled = false;
52+
53+
var pipeline = new DiffingStrategyPipelineBuilder()
54+
.WithFilter((in ComparisonSource source, FilterDecision currentDecision) => { nodeFilterCalled = true; return currentDecision; })
55+
.WithFilter((in AttributeComparisonSource source, FilterDecision currentDecision) => { attrFilterCalled = true; return currentDecision; })
56+
.WithMatcher((ctx, ctrlSrc, testSrc) => { nodeMatcherCalled = true; return Array.Empty<Comparison>(); })
57+
.WithMatcher((ctx, ctrlSrc, testSrc) => { attrMatcherCalled = true; return Array.Empty<AttributeComparison>(); })
58+
.WithComparer((in Comparison comparison, CompareResult currentDecision) => { nodeComparerCalled = true; return currentDecision; })
59+
.WithComparer((in AttributeComparison comparison, CompareResult currentDecision) => { attrComparerCalled = true; return currentDecision; })
60+
.Build();
61+
62+
pipeline.Filter(ToComparisonSource("<p>"));
63+
pipeline.Filter(ToAttributeComparisonSource("<p foo>", "foo"));
64+
pipeline.Match(context, ToSourceCollection("<p>"), ToSourceCollection("<p>")).ToList();
65+
pipeline.Match(context, ToSourceMap("<p foo>"), ToSourceMap("<p foo>")).ToList();
66+
pipeline.Compare(ToComparison("<p>","<p>"));
67+
pipeline.Compare(ToAttributeComparison("<p foo>", "foo", "<p foo>", "foo"));
68+
69+
nodeFilterCalled.ShouldBeTrue();
70+
attrFilterCalled.ShouldBeTrue();
71+
nodeMatcherCalled.ShouldBeTrue();
72+
attrMatcherCalled.ShouldBeTrue();
73+
nodeComparerCalled.ShouldBeTrue();
74+
attrComparerCalled.ShouldBeTrue();
75+
}
76+
}
77+
}

src/AngleSharp.Diffing.Tests/Strategies/AttributeStrategies/IgnoreDiffAttributesFilterTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Shouldly;
1+
using Egil.AngleSharp.Diffing.Core;
2+
using Shouldly;
23
using Xunit;
34

45
namespace AngleSharp.Diffing.Strategies.AttributeStrategies

src/AngleSharp.Diffing.Tests/Strategies/CommentStrategies/IgnoreCommentsFilterTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Shouldly;
1+
using Egil.AngleSharp.Diffing.Core;
2+
using Shouldly;
23
using Xunit;
34

45
namespace AngleSharp.Diffing.Strategies.CommentStrategies

src/AngleSharp.Diffing/FilterDecision.cs renamed to src/AngleSharp.Diffing/Core/FilterDecision.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace AngleSharp.Diffing
1+
namespace Egil.AngleSharp.Diffing.Core
22
{
33
public enum FilterDecision
44
{

src/AngleSharp.Diffing/Core/HtmlDifferenceEngine.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.Linq;
44
using AngleSharp.Dom;
@@ -66,18 +66,16 @@ private IEnumerable<Comparison> MatchNodes(DiffContext context, SourceCollection
6666
{
6767
foreach (var comparison in _matcherStrategy.Match(context, controls, tests))
6868
{
69-
MarkSelectedSourcesAsMatched(comparison);
69+
UpdateMatchedTracking(comparison);
7070
yield return comparison;
7171
}
7272

7373
UpdateUnmatchedTracking();
7474

7575
yield break;
7676

77-
void MarkSelectedSourcesAsMatched(in Comparison comparison)
77+
void UpdateMatchedTracking(in Comparison comparison)
7878
{
79-
controls.MarkAsMatched(comparison.Control);
80-
tests.MarkAsMatched(comparison.Test);
8179
context.MissingSources.Remove(comparison.Control);
8280
context.UnexpectedSources.Remove(comparison.Test);
8381
}

src/AngleSharp.Diffing/Core/SourceCollection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
using System;
1+
using System;
22
using System.Collections;
33
using System.Collections.Generic;
44
using System.Linq;
55

66
namespace AngleSharp.Diffing.Core
77
{
8-
public delegate FilterDecision SourceCollectionRemovePredicate(in ComparisonSource source);
8+
internal delegate FilterDecision SourceCollectionRemovePredicate(in ComparisonSource source);
99

1010
public class SourceCollection : IEnumerable<ComparisonSource>
1111
{

src/AngleSharp.Diffing/Core/SourceMap.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
using System;
1+
using System;
22
using System.Collections;
33
using System.Collections.Generic;
44
using System.Diagnostics.CodeAnalysis;
55
using AngleSharp.Dom;
66

77
namespace AngleSharp.Diffing.Core
88
{
9-
public delegate FilterDecision SourceMapRemovePredicate(in AttributeComparisonSource source);
9+
internal delegate FilterDecision SourceMapRemovePredicate(in AttributeComparisonSource source);
1010

1111
[SuppressMessage("Naming", "CA1710:Identifiers should have correct suffix")]
1212
public class SourceMap : IEnumerable<AttributeComparisonSource>

0 commit comments

Comments
 (0)