/
MemberPath.cs
62 lines (51 loc) · 1.91 KB
/
MemberPath.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
using System;
using System.Collections.Generic;
using System.Linq;
namespace FluentAssertions.Common
{
/// <summary>
/// Encapsulates a dotted candidate to a (nested) member of a type as well as the
/// declaring type of the deepest member.
/// </summary>
internal class MemberPath
{
private readonly Type declaringType;
private readonly string dottedPath;
private readonly List<string> segments = new List<string>();
public MemberPath(Type declaringType, string dottedPath)
{
this.declaringType = declaringType;
this.dottedPath = dottedPath;
segments.AddRange(Segmentize(dottedPath));
}
public bool IsParentOrChildOf(string candidate)
{
return IsParent(candidate) || IsChild(candidate);
}
public bool IsSameAs(string candidate, Type memberDeclaringType)
{
string[] candidateSegments = Segmentize(candidate);
return candidateSegments.SequenceEqual(segments) && memberDeclaringType == declaringType;
}
private bool IsChild(string candidate)
{
string[] candidateSegments = Segmentize(candidate);
return candidateSegments.Take(segments.Count).SequenceEqual(segments) &&
candidateSegments.Length > segments.Count;
}
private bool IsParent(string candidate)
{
string[] candidateSegments = Segmentize(candidate);
return candidateSegments.SequenceEqual(segments.Take(candidateSegments.Length))
&& candidateSegments.Length < segments.Count;
}
private static string[] Segmentize(string dottedPath)
{
return dottedPath.Split(new[] { '.', '[', ']' }, StringSplitOptions.RemoveEmptyEntries);
}
public override string ToString()
{
return dottedPath;
}
}
}