/
ConversionSelector.cs
83 lines (71 loc) · 2.59 KB
/
ConversionSelector.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
74
75
76
77
78
79
80
81
82
83
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
namespace FluentAssertions.Equivalency
{
/// <summary>
/// Collects the members that need to be converted by the <see cref="TryConversionStep"/>.
/// </summary>
public class ConversionSelector
{
private class ConversionSelectorRule
{
public Func<IMemberInfo, bool> Predicate { get; }
public string Description { get; }
public ConversionSelectorRule(Func<IMemberInfo, bool> predicate, string description)
{
Predicate = predicate;
Description = description;
}
}
private List<ConversionSelectorRule> inclusions = new List<ConversionSelectorRule>();
private List<ConversionSelectorRule> exclusions = new List<ConversionSelectorRule>();
public void IncludeAll()
{
inclusions.Add(new ConversionSelectorRule(_ => true, "Try conversion of all members. "));
}
public void Include(Expression<Func<IMemberInfo, bool>> predicate)
{
inclusions.Add(new ConversionSelectorRule(
predicate.Compile(),
$"Try conversion of member {predicate.Body}. "));
}
public void Exclude(Expression<Func<IMemberInfo, bool>> predicate)
{
exclusions.Add(new ConversionSelectorRule(
predicate.Compile(),
$"Do not convert member {predicate.Body}."));
}
public bool RequiresConversion(IMemberInfo info)
{
return inclusions.Any(p => p.Predicate(info)) && !exclusions.Any(p => p.Predicate(info));
}
public override string ToString()
{
if (inclusions.Count == 0 && exclusions.Count == 0)
{
return "Without automatic conversion.";
}
StringBuilder descriptionBuilder = new StringBuilder();
foreach (var inclusion in inclusions)
{
descriptionBuilder.Append(inclusion.Description);
}
foreach (var exclusion in exclusions)
{
descriptionBuilder.Append(exclusion.Description);
}
return descriptionBuilder.ToString();
}
public ConversionSelector Clone()
{
return new ConversionSelector
{
inclusions = new List<ConversionSelectorRule>(inclusions),
exclusions = new List<ConversionSelectorRule>(exclusions),
};
}
}
}