Skip to content

Commit

Permalink
Added BaseObjectEqualityComparer.cs for use in LINQ statements.
Browse files Browse the repository at this point in the history
  • Loading branch information
wmccafferty committed May 22, 2009
1 parent 9b5ca3e commit e154db0
Show file tree
Hide file tree
Showing 4 changed files with 155 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using System.Collections.Generic;

namespace SharpArch.Core.DomainModel
{
/// <summary>
/// Provides a comparer for supporting LINQ methods such as Intersect, Union and Distinct
/// </summary>
public class BaseObjectEqualityComparer : IEqualityComparer<BaseObject>
{
public bool Equals(BaseObject firstObject, BaseObject secondObject) {
if (firstObject == null && secondObject == null)
return true;

if (firstObject == null ^ secondObject == null)
return false;

return firstObject.Equals(secondObject);
}

public int GetHashCode(BaseObject obj) {
return obj.GetHashCode();
}
}
}
1 change: 1 addition & 0 deletions src/SharpArch/SharpArch.Core/SharpArch.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
<Compile Include="CommonValidator\IValidator.cs" />
<Compile Include="DomainModel\BaseObject.cs" />
<Compile Include="DesignByContract.cs" />
<Compile Include="DomainModel\BaseObjectEqualityComparer.cs" />
<Compile Include="DomainModel\Entity.cs" />
<Compile Include="DomainModel\IEntityWithTypedId.cs" />
<Compile Include="DomainModel\IHasAssignedId.cs" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
using NUnit.Framework;
using SharpArch.Core.DomainModel;
using System.Reflection;
using System.Collections.Generic;
using NUnit.Framework.SyntaxHelpers;
using SharpArch.Testing;

namespace Tests.SharpArch.Core.DomainModel
{
[TestFixture]
public class BaseObjectEqualityComparerTests
{
[Test]
public void CanCompareNulls() {
BaseObjectEqualityComparer comparer = new BaseObjectEqualityComparer();
Assert.That(comparer.Equals(null, null));
Assert.That(comparer.Equals(null, new ConcreteBaseObject()), Is.False);
Assert.That(comparer.Equals(new ConcreteBaseObject(), null), Is.False);
}

[Test]
public void CannotSuccessfullyCompareDifferentlyTypedObjectsThatDeriveFromBaseObject() {
BaseObjectEqualityComparer comparer = new BaseObjectEqualityComparer();

ConcreteBaseObject object1 = new ConcreteBaseObject() {
Name = "Whatever"
};
ConcreteValueObject object2 = new ConcreteValueObject() {
Name = "Whatever"
};

Assert.That(comparer.Equals(object1, object2), Is.False);
}

[Test]
public void CanCompareBaseObjects() {
BaseObjectEqualityComparer comparer = new BaseObjectEqualityComparer();

ConcreteBaseObject object1 = new ConcreteBaseObject() {
Name = "Whatever"
};
ConcreteBaseObject object2 = new ConcreteBaseObject() {
Name = "Whatever"
};
Assert.That(comparer.Equals(object1, object2));

object2.Name = "Mismatch";
Assert.That(comparer.Equals(object1, object2), Is.False);
}

[Test]
public void CanCompareValueObjects() {
BaseObjectEqualityComparer comparer = new BaseObjectEqualityComparer();

ConcreteValueObject object1 = new ConcreteValueObject() {
Name = "Whatever"
};
ConcreteValueObject object2 = new ConcreteValueObject() {
Name = "Whatever"
};
Assert.That(comparer.Equals(object1, object2));

object2.Name = "Mismatch";
Assert.That(comparer.Equals(object1, object2), Is.False);
}

[Test]
public void CanCompareEntitiesWithNoDomainSignatureProperties() {
BaseObjectEqualityComparer comparer = new BaseObjectEqualityComparer();

ConcreteEntityWithNoDomainSignatureProperties object1 = new ConcreteEntityWithNoDomainSignatureProperties() {
Name = "Whatever"
};
ConcreteEntityWithNoDomainSignatureProperties object2 = new ConcreteEntityWithNoDomainSignatureProperties() {
Name = "Whatever"
};
Assert.That(comparer.Equals(object1, object2), Is.False);

EntityIdSetter.SetIdOf<int>(object1, 1);
EntityIdSetter.SetIdOf<int>(object2, 1);
Assert.That(comparer.Equals(object1, object2));
}

[Test]
public void CanCompareEntitiesWithDomainSignatureProperties() {
BaseObjectEqualityComparer comparer = new BaseObjectEqualityComparer();

ConcreteEntityWithDomainSignatureProperties object1 = new ConcreteEntityWithDomainSignatureProperties() {
Name = "Whatever"
};
ConcreteEntityWithDomainSignatureProperties object2 = new ConcreteEntityWithDomainSignatureProperties() {
Name = "Whatever"
};
Assert.That(comparer.Equals(object1, object2));

object2.Name = "Mismatch";
Assert.That(comparer.Equals(object1, object2), Is.False);

EntityIdSetter.SetIdOf<int>(object1, 1);
EntityIdSetter.SetIdOf<int>(object2, 1);
Assert.That(comparer.Equals(object1, object2));
}

private class ConcreteBaseObject : BaseObject
{
protected override IEnumerable<PropertyInfo> GetTypeSpecificSignatureProperties() {
return GetType().GetProperties();
}

public string Name { get; set; }
}

private class ConcreteEntityWithNoDomainSignatureProperties : Entity
{
public string Name { get; set; }
}

private class ConcreteEntityWithDomainSignatureProperties : Entity
{
[DomainSignature]
public string Name { get; set; }
}

private class ConcreteValueObject : ValueObject
{
public string Name { get; set; }
}
}
}
1 change: 1 addition & 0 deletions src/SharpArch/SharpArch.Tests/SharpArch.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SharpArch.Core.NHibernateValidator\CommonValidatorAdapter\ValidatorTests.cs" />
<Compile Include="SharpArch.Core\DesignByContractTests.cs" />
<Compile Include="SharpArch.Core\DomainModel\BaseObjectEqualityComparerTests.cs" />
<Compile Include="SharpArch.Core\DomainModel\EntityTests.cs" />
<Compile Include="SharpArch.Core\DomainModel\ValueObjectTests.cs" />
<Compile Include="SharpArch.Core\CommonValidator\NHibernateValidator\HasUniqueEntitySignatureValidatorTests.cs" />
Expand Down

0 comments on commit e154db0

Please sign in to comment.