forked from FluentValidation/FluentValidation
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ITestValidationContinuation.cs
73 lines (61 loc) · 2.27 KB
/
ITestValidationContinuation.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
namespace FluentValidation.TestHelper {
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Results;
public interface ITestValidationWith : ITestValidationContinuation {
}
public interface ITestValidationContinuation : IEnumerable<ValidationFailure> {
IEnumerable<ValidationFailure> MatchedFailures { get; }
IEnumerable<ValidationFailure> UnmatchedFailures { get; }
}
internal class TestValidationContinuation : ITestValidationContinuation, ITestValidationWith {
private readonly IEnumerable<ValidationFailure> _allFailures;
private readonly List<Func<ValidationFailure,bool>> _predicates;
public static TestValidationContinuation Create(IEnumerable<ValidationFailure> failures) =>
new TestValidationContinuation(failures);
public static TestValidationContinuation Create(ITestValidationContinuation continuation) {
if (continuation is TestValidationContinuation instance)
return instance;
var allFailures = continuation.Union(continuation.UnmatchedFailures);
instance = new TestValidationContinuation(allFailures);
instance.ApplyPredicate(failure => !continuation.UnmatchedFailures.Contains(failure));
return instance;
}
private TestValidationContinuation(IEnumerable<ValidationFailure> failures) {
_allFailures = failures;
_predicates = new List<Func<ValidationFailure, bool>>();
}
public void ApplyPredicate(Func<ValidationFailure, bool> failurePredicate) {
_predicates.Add(failurePredicate);
}
public IEnumerator<ValidationFailure> GetEnumerator() {
return MatchedFailures.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() {
return ((IEnumerable) MatchedFailures).GetEnumerator();
}
public IEnumerable<ValidationFailure> MatchedFailures {
get {
var matchedFailures = _allFailures;
foreach (var predicate in _predicates) {
matchedFailures = matchedFailures.Where(predicate);
}
return matchedFailures;
}
}
public IEnumerable<ValidationFailure> UnmatchedFailures {
get {
foreach (var failure in _allFailures) {
foreach (var predicate in _predicates) {
if (!predicate(failure)) {
yield return failure;
break;
}
}
}
}
}
}
}