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. |