# ( ) , .
, , , SemanticComparison , AutoFixture ( NuGet).
: SemanticComparer<T>
[Fact]
public void TestComplexClassEquality()
{
var value = new ComplexMasterObject
{
Child1 = new ChildFirst
{
SomeStringProp1 = "1",
SomeIntProp1 = 2
},
Child2 = new ChildSecond
{
SomeStringProp1 = "3",
SomeIntProp1 = 4
},
SimpleProp = "5"
};
var other = new ComplexMasterObject
{
Child1 = new ChildFirst
{
SomeStringProp1 = "1",
SomeIntProp1 = 2
},
Child2 = new ChildSecond
{
SomeStringProp1 = "3",
SomeIntProp1 = 4
},
SimpleProp = "5"
};
var sut =
new SemanticComparer<ComplexMasterObject>(
new MemberComparer(
new AnyObjectComparer()),
new MemberComparer(
new ChildFirstComparer()),
new MemberComparer(
new ChildSecondComparer()));
var actual = sut.Equals(value, other);
Assert.True(actual);
}
: Likeness<T> Resemblance
[Fact]
public void TestComplexClassEqualityResemblance()
{
var value = new ComplexMasterObject
{
Child1 = new ChildFirst
{
SomeStringProp1 = "1",
SomeIntProp1 = 2
},
Child2 = new ChildSecond
{
SomeStringProp1 = "3",
SomeIntProp1 = 4
},
SimpleProp = "5"
};
var other = new ComplexMasterObject
{
Child1 = new ChildFirst
{
SomeStringProp1 = "1",
SomeIntProp1 = 2
},
Child2 = new ChildSecond
{
SomeStringProp1 = "3",
SomeIntProp1 = 4
},
SimpleProp = "5"
};
var likeness =
new Likeness<ComplexMasterObject>(
value,
new SemanticComparer<ComplexMasterObject>(
new MemberComparer(
new AnyObjectComparer()),
new MemberComparer(
new ChildFirstComparer()),
new MemberComparer(
new ChildSecondComparer())));
var sut = likeness.ToResemblance();
var actual = sut.Equals(other);
Assert.True(actual);
}
public sealed class AnyObjectComparer : IEqualityComparer
{
public new bool Equals(object x, object y)
{
return object.Equals(x, y);
}
public int GetHashCode(object obj)
{
return obj.GetHashCode();
}
}
public sealed class ChildFirstComparer : IEqualityComparer
{
public new bool Equals(object x, object y)
{
var value = x as ChildFirst;
var other = y as ChildFirst;
if (value == null || other == null)
return false;
return value.SomeIntProp1 == other.SomeIntProp1
&& value.SomeStringProp1 == other.SomeStringProp1;
}
public int GetHashCode(object obj)
{
return obj.GetHashCode();
}
}
public sealed class ChildSecondComparer : IEqualityComparer
{
public new bool Equals(object x, object y)
{
var value = x as ChildSecond;
var other = y as ChildSecond;
if (value == null || other == null)
return false;
return value.SomeIntProp1 == other.SomeIntProp1
&& value.SomeStringProp1 == other.SomeStringProp1;
}
public int GetHashCode(object obj)
{
return obj.GetHashCode();
}
}