-
Notifications
You must be signed in to change notification settings - Fork 203
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added BaseObjectEqualityComparer.cs for use in LINQ statements.
- Loading branch information
wmccafferty
committed
May 22, 2009
1 parent
9b5ca3e
commit e154db0
Showing
4 changed files
with
155 additions
and
0 deletions.
There are no files selected for viewing
24 changes: 24 additions & 0 deletions
24
src/SharpArch/SharpArch.Core/DomainModel/BaseObjectEqualityComparer.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
129 changes: 129 additions & 0 deletions
129
src/SharpArch/SharpArch.Tests/SharpArch.Core/DomainModel/BaseObjectEqualityComparerTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; } | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters