|
From: <fab...@us...> - 2011-05-02 15:41:59
|
Revision: 5795
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5795&view=rev
Author: fabiomaulo
Date: 2011-05-02 15:41:52 +0000 (Mon, 02 May 2011)
Log Message:
-----------
Fixed NH-2686
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Linq/ResultTransformer.cs
trunk/nhibernate/src/NHibernate/Transform/AliasToBeanConstructorResultTransformer.cs
trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs
trunk/nhibernate/src/NHibernate/Transform/AliasToEntityMapResultTransformer.cs
trunk/nhibernate/src/NHibernate/Transform/DistinctRootEntityResultTransformer.cs
trunk/nhibernate/src/NHibernate/Transform/PassThroughResultTransformer.cs
trunk/nhibernate/src/NHibernate/Transform/RootEntityResultTransformer.cs
trunk/nhibernate/src/NHibernate/Transform/ToListResultTransformer.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/TransformTests/ImplementationOfEqualityTests.cs
Modified: trunk/nhibernate/src/NHibernate/Linq/ResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Linq/ResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate/Linq/ResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -57,5 +57,33 @@
var list = new ArrayList {transformResult};
return list;
}
+
+ public bool Equals(ResultTransformer other)
+ {
+ if (ReferenceEquals(null, other))
+ {
+ return false;
+ }
+ if (ReferenceEquals(this, other))
+ {
+ return true;
+ }
+ return Equals(other._listTransformation, _listTransformation) && Equals(other._itemTransformation, _itemTransformation);
+ }
+
+ public override bool Equals(object obj)
+ {
+ return Equals(obj as ResultTransformer);
+ }
+
+ public override int GetHashCode()
+ {
+ unchecked
+ {
+ var lt = (_listTransformation != null ? _listTransformation.GetHashCode() : 0);
+ var it = (_itemTransformation != null ? _itemTransformation.GetHashCode() : 0);
+ return (lt * 397) ^ (it * 17);
+ }
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Transform/AliasToBeanConstructorResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Transform/AliasToBeanConstructorResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate/Transform/AliasToBeanConstructorResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -7,10 +7,14 @@
[Serializable]
public class AliasToBeanConstructorResultTransformer : IResultTransformer
{
- private ConstructorInfo constructor;
+ private readonly ConstructorInfo constructor;
public AliasToBeanConstructorResultTransformer(ConstructorInfo constructor)
{
+ if (constructor == null)
+ {
+ throw new ArgumentNullException("constructor");
+ }
this.constructor = constructor;
}
@@ -33,5 +37,28 @@
{
return collection;
}
+
+ public bool Equals(AliasToBeanConstructorResultTransformer other)
+ {
+ if (ReferenceEquals(null, other))
+ {
+ return false;
+ }
+ if (ReferenceEquals(this, other))
+ {
+ return true;
+ }
+ return Equals(other.constructor, constructor);
+ }
+
+ public override bool Equals(object obj)
+ {
+ return Equals(obj as AliasToBeanConstructorResultTransformer);
+ }
+
+ public override int GetHashCode()
+ {
+ return constructor.GetHashCode();
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -111,5 +111,28 @@
{
return collection;
}
+
+ public override bool Equals(object obj)
+ {
+ return Equals(obj as AliasToBeanResultTransformer);
+ }
+
+ public bool Equals(AliasToBeanResultTransformer other)
+ {
+ if (ReferenceEquals(null, other))
+ {
+ return false;
+ }
+ if (ReferenceEquals(this, other))
+ {
+ return true;
+ }
+ return Equals(other.resultClass, resultClass);
+ }
+
+ public override int GetHashCode()
+ {
+ return resultClass.GetHashCode();
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Transform/AliasToEntityMapResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Transform/AliasToEntityMapResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate/Transform/AliasToEntityMapResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -6,6 +6,8 @@
[Serializable]
public class AliasToEntityMapResultTransformer : IResultTransformer
{
+ private static readonly object Hasher = new object();
+
public object TransformTuple(object[] tuple, string[] aliases)
{
IDictionary result = new Hashtable();
@@ -26,5 +28,19 @@
{
return collection;
}
+
+ public override bool Equals(object obj)
+ {
+ if (obj == null)
+ {
+ return false;
+ }
+ return obj.GetHashCode() == Hasher.GetHashCode();
+ }
+
+ public override int GetHashCode()
+ {
+ return Hasher.GetHashCode();
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Transform/DistinctRootEntityResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Transform/DistinctRootEntityResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate/Transform/DistinctRootEntityResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -10,6 +10,7 @@
public class DistinctRootEntityResultTransformer : IResultTransformer
{
private static readonly IInternalLogger log = LoggerProvider.LoggerFor(typeof(DistinctRootEntityResultTransformer));
+ private static readonly object Hasher = new object();
internal sealed class Identity
{
@@ -58,5 +59,19 @@
}
return result;
}
+
+ public override bool Equals(object obj)
+ {
+ if (obj == null)
+ {
+ return false;
+ }
+ return obj.GetHashCode() == Hasher.GetHashCode();
+ }
+
+ public override int GetHashCode()
+ {
+ return Hasher.GetHashCode();
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Transform/PassThroughResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Transform/PassThroughResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate/Transform/PassThroughResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -6,6 +6,8 @@
[Serializable]
public class PassThroughResultTransformer : IResultTransformer
{
+ private static readonly object Hasher = new object();
+
#region IResultTransformer Members
public object TransformTuple(object[] tuple, string[] aliases)
@@ -19,5 +21,19 @@
}
#endregion
+
+ public override bool Equals(object obj)
+ {
+ if (obj == null)
+ {
+ return false;
+ }
+ return obj.GetHashCode() == Hasher.GetHashCode();
+ }
+
+ public override int GetHashCode()
+ {
+ return Hasher.GetHashCode();
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Transform/RootEntityResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Transform/RootEntityResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate/Transform/RootEntityResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -6,6 +6,8 @@
[Serializable]
public class RootEntityResultTransformer : IResultTransformer
{
+ private static readonly object Hasher = new object();
+
public object TransformTuple(object[] tuple, string[] aliases)
{
return tuple[tuple.Length - 1];
@@ -15,5 +17,19 @@
{
return collection;
}
+
+ public override bool Equals(object obj)
+ {
+ if (obj == null)
+ {
+ return false;
+ }
+ return obj.GetHashCode() == Hasher.GetHashCode();
+ }
+
+ public override int GetHashCode()
+ {
+ return Hasher.GetHashCode();
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Transform/ToListResultTransformer.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Transform/ToListResultTransformer.cs 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate/Transform/ToListResultTransformer.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -10,6 +10,8 @@
[Serializable]
public class ToListResultTransformer : IResultTransformer
{
+ private static readonly object Hasher = new object();
+
public object TransformTuple(object[] tuple, string[] aliases)
{
return new ArrayList(tuple);
@@ -19,5 +21,19 @@
{
return list;
}
+
+ public override bool Equals(object obj)
+ {
+ if (obj == null)
+ {
+ return false;
+ }
+ return obj.GetHashCode() == Hasher.GetHashCode();
+ }
+
+ public override int GetHashCode()
+ {
+ return Hasher.GetHashCode();
+ }
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-02 14:26:59 UTC (rev 5794)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-02 15:41:52 UTC (rev 5795)
@@ -856,6 +856,7 @@
<Compile Include="TestDialect.cs" />
<Compile Include="TestDialects\PostgreSQL82TestDialect.cs" />
<Compile Include="TestDialects\SQLiteTestDialect.cs" />
+ <Compile Include="TransformTests\ImplementationOfEqualityTests.cs" />
<Compile Include="TypesTest\CharClass.cs" />
<Compile Include="TypesTest\CharClassFixture.cs" />
<Compile Include="TypesTest\DateTimeClass.cs" />
Added: trunk/nhibernate/src/NHibernate.Test/TransformTests/ImplementationOfEqualityTests.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TransformTests/ImplementationOfEqualityTests.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/TransformTests/ImplementationOfEqualityTests.cs 2011-05-02 15:41:52 UTC (rev 5795)
@@ -0,0 +1,95 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using NHibernate.Linq;
+using NHibernate.Transform;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.TransformTests
+{
+ public class ImplementationOfEqualityTests
+ {
+ private readonly IEnumerable<System.Type> transformerTypes = typeof(IResultTransformer).Assembly.GetTypes().Where(t => typeof(IResultTransformer).IsAssignableFrom(t) && t.IsClass).ToList();
+
+ [Test]
+ public void AllEmbeddedTransformersOverridesEqualsAndGetHashCode()
+ {
+ foreach (var transformerType in transformerTypes)
+ {
+ var declaredMethods = transformerType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
+ declaredMethods.Select(x => x.Name).Should("The type "+transformerType+" does not implement Equals").Contain("Equals");
+ declaredMethods.Select(x => x.Name).Should("The type " + transformerType + " does not implement GetHashCode").Contain("GetHashCode");
+ }
+ }
+
+ [Test]
+ public void AllEmbeddedTransformersWithDefaultCtorHasEqualityWorkingAsSingleton()
+ {
+ foreach (var transformerType in transformerTypes)
+ {
+ IResultTransformer transformer1;
+ try
+ {
+ transformer1 = (IResultTransformer)Activator.CreateInstance(transformerType);
+ }
+ catch (Exception e)
+ {
+ // The transformer does not have default ctor
+ Console.WriteLine(transformerType);
+ Console.WriteLine(e);
+ continue;
+ }
+ var transformer2= (IResultTransformer)Activator.CreateInstance(transformerType);
+ transformer1.Should().Be.EqualTo(transformer2);
+ transformer1.GetHashCode().Should().Be.EqualTo(transformer2.GetHashCode());
+ }
+ }
+
+ [Test]
+ public void AliasToBeanResultTransformer_ShouldHaveEqualityBasedOnCtorParameter()
+ {
+ var transformer1 = new AliasToBeanResultTransformer(typeof(object));
+ var transformer2 = new AliasToBeanResultTransformer(typeof(object));
+ transformer1.Should().Be.EqualTo(transformer2);
+ transformer1.GetHashCode().Should().Be.EqualTo(transformer2.GetHashCode());
+
+ var transformer3 = new AliasToBeanResultTransformer(typeof(int));
+ transformer1.Should().Not.Be.EqualTo(transformer3);
+ transformer1.GetHashCode().Should().Not.Be.EqualTo(transformer3.GetHashCode());
+ }
+
+ [Test]
+ public void AliasToBeanConstructorResultTransformer_ShouldHaveEqualityBasedOnCtorParameter()
+ {
+ var emptyCtor = new System.Type[0];
+ var transformer1 = new AliasToBeanConstructorResultTransformer(typeof(object).GetConstructor(emptyCtor));
+ var transformer2 = new AliasToBeanConstructorResultTransformer(typeof(object).GetConstructor(emptyCtor));
+ transformer1.Should().Be.EqualTo(transformer2);
+ transformer1.GetHashCode().Should().Be.EqualTo(transformer2.GetHashCode());
+
+ var transformer3 = new AliasToBeanConstructorResultTransformer(typeof(ImplementationOfEqualityTests).GetConstructor(emptyCtor));
+ transformer1.Should().Not.Be.EqualTo(transformer3);
+ transformer1.GetHashCode().Should().Not.Be.EqualTo(transformer3.GetHashCode());
+ }
+
+ public delegate void DoNothingDelegate();
+ public delegate void DoNothingDelegate1();
+ [Test]
+ public void LinqResultTransformer_ShouldHaveEqualityBasedOnCtorParameter()
+ {
+ DoNothingDelegate d1 = () => { };
+ DoNothingDelegate d2 = () => { };
+ var transformer1 = new ResultTransformer(d1, d2);
+ var transformer2 = new ResultTransformer(d1, d2);
+ transformer1.Should().Be.EqualTo(transformer2);
+ transformer1.GetHashCode().Should().Be.EqualTo(transformer2.GetHashCode());
+
+ DoNothingDelegate1 d3 = () => { };
+ var transformer3 = new ResultTransformer(d1, d3);
+ transformer1.Should().Not.Be.EqualTo(transformer3);
+ transformer1.GetHashCode().Should().Not.Be.EqualTo(transformer3.GetHashCode());
+ }
+ }
+}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|