From: <fab...@us...> - 2011-05-15 19:33:20
|
Revision: 5824 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5824&view=rev Author: fabiomaulo Date: 2011-05-15 19:33:14 +0000 (Sun, 15 May 2011) Log Message: ----------- Test ported with bug fix Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/AnyMapperTest.cs Modified: trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs 2011-05-15 19:29:27 UTC (rev 5823) +++ trunk/nhibernate/src/NHibernate/Mapping/ByCode/Impl/AnyMapper.cs 2011-05-15 19:33:14 UTC (rev 5824) @@ -20,7 +20,7 @@ private readonly MemberInfo member; public AnyMapper(MemberInfo member, System.Type foreignIdType, HbmAny any, HbmMapping mapDoc) - : this(member, foreignIdType, new AccessorPropertyMapper(member.DeclaringType, member.Name, x => any.access = x), any, mapDoc) {} + : this(member, foreignIdType, member == null ? (IAccessorPropertyMapper)new NoMemberPropertyMapper() : new AccessorPropertyMapper(member.DeclaringType, member.Name, x => any.access = x), any, mapDoc) { } public AnyMapper(MemberInfo member, System.Type foreignIdType, IAccessorPropertyMapper accessorMapper, HbmAny any, HbmMapping mapDoc) { Added: trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/AnyMapperTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/AnyMapperTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/MappingByCode/MappersTests/AnyMapperTest.cs 2011-05-15 19:33:14 UTC (rev 5824) @@ -0,0 +1,302 @@ +using System; +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode.Impl; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.MappingByCode.MappersTests +{ + public class AnyMapperTest + { + private class MyClass + { + public int Id { get; set; } + public MyReferenceClass MyReferenceClass { get; set; } + } + + private class MyReferenceClass + { + public int Id { get; set; } + } + + [Test] + public void AtCreationSetIdType() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + hbmAny.idtype.Should().Be("Int32"); + } + + [Test] + public void AtCreationSetTheTwoRequiredColumnsNodes() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + hbmAny.Columns.Should().Have.Count.EqualTo(2); + hbmAny.Columns.Select(c => c.name).All(n => n.Satisfy(name => !string.IsNullOrEmpty(name))); + } + + [Test] + public void CanSetIdTypeThroughIType() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.IdType(NHibernateUtil.Int64); + hbmAny.idtype.Should().Be("Int64"); + } + + [Test] + public void CanSetIdTypeThroughGenericMethod() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.IdType<long>(); + hbmAny.idtype.Should().Be("Int64"); + } + + [Test] + public void CanSetIdTypeThroughType() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.IdType(typeof(long)); + hbmAny.idtype.Should().Be("Int64"); + } + + [Test] + public void CanSetMetaTypeThroughIType() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.MetaType(NHibernateUtil.Character); + hbmAny.MetaType.Should().Be("Char"); + } + + [Test] + public void CanSetMetaTypeThroughGenericMethod() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.MetaType<char>(); + hbmAny.MetaType.Should().Be("Char"); + } + + [Test] + public void CanSetMetaTypeThroughType() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.MetaType(typeof(char)); + hbmAny.MetaType.Should().Be("Char"); + } + + [Test] + public void CanSetCascade() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.Cascade(Mapping.ByCode.Cascade.All); + hbmAny.cascade.Should().Be("all"); + } + + [Test] + public void AutoCleanInvalidCascade() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.Cascade(Mapping.ByCode.Cascade.All | Mapping.ByCode.Cascade.DeleteOrphans); + hbmAny.cascade.Should().Be("all"); + } + + [Test] + public void CanSetIndex() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.Index("pizza"); + hbmAny.index.Should().Be("pizza"); + } + + [Test] + public void CanSetLazy() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.Lazy(true); + hbmAny.lazy.Should().Be(true); + } + + [Test] + public void WhenSetIdColumnPropertiesThenWorkOnSameHbmColumnCreatedAtCtor() + { + const int idColumnIndex = 1; + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + var columnsBefore = hbmAny.Columns.ToArray(); + mapper.Columns(idcm => idcm.Length(10), metacm => { }); + var columnsAfter = hbmAny.Columns.ToArray(); + columnsBefore[idColumnIndex].Should().Be.SameInstanceAs(columnsAfter[idColumnIndex]); + columnsBefore[idColumnIndex].length.Should().Be("10"); + } + + [Test] + public void WhenSetMetaColumnPropertiesThenWorkOnSameHbmColumnCreatedAtCtor() + { + // The first column in the mapping is the MetaValue + const int metaValueColumnIndex = 0; + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + var columnsBefore = hbmAny.Columns.ToArray(); + mapper.Columns(idcm => { }, metacm => metacm.Length(500)); + var columnsAfter = hbmAny.Columns.ToArray(); + columnsBefore[metaValueColumnIndex].Should().Be.SameInstanceAs(columnsAfter[metaValueColumnIndex]); + columnsBefore[metaValueColumnIndex].length.Should().Be("500"); + } + + [Test] + public void MetaTypeShouldBeImmutable() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.MetaValue('A', typeof(MyReferenceClass)); + Executing.This(() => mapper.MetaType(NHibernateUtil.Int32)).Should().Throw<ArgumentException>(); + Executing.This(mapper.MetaType<int>).Should().Throw<ArgumentException>(); + } + + [Test] + public void WhenNullParameterThenThrow() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + Executing.This(() => mapper.MetaValue(null, typeof(MyReferenceClass))).Should().Throw<ArgumentNullException>(); + Executing.This(() => mapper.MetaValue('A', null)).Should().Throw<ArgumentNullException>(); + } + + [Test] + public void WhenSetFirstMetaValueThenSetMetaTypeIfNotClass() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.MetaValue('A', typeof(MyReferenceClass)); + hbmAny.MetaType.Should().Be("Char"); + } + + [Test] + public void WhenSetMetaValueWithClassThenThrow() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + Executing.This(() => mapper.MetaValue(typeof(MyReferenceClass), typeof(MyReferenceClass))).Should().Throw<ArgumentOutOfRangeException>(); + } + + [Test] + public void WhenSetSecondMetaValueThenCheckCompatibility() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.MetaValue('A', typeof(MyReferenceClass)); + Executing.This(() => mapper.MetaValue(5, typeof(MyClass))).Should().Throw<ArgumentException>(); + } + + [Test] + public void WhenDuplicatedMetaValueThenRegisterOne() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.MetaValue('A', typeof(MyReferenceClass)); + mapper.MetaValue('A', typeof(MyReferenceClass)); + hbmAny.metavalue.Should().Have.Count.EqualTo(1); + } + + [Test] + public void WhenDuplicatedMetaValueWithDifferentTypeThenThrow() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.MetaValue('A', typeof(MyReferenceClass)); + Executing.This(() => mapper.MetaValue('A', typeof(MyClass))).Should().Throw<ArgumentException>(); + } + + [Test] + public void WhenSetTwoMetaValueThenHasTwoMetaValues() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.MetaValue('A', typeof(MyReferenceClass)); + mapper.MetaValue('B', typeof(MyClass)); + hbmAny.metavalue.Should().Have.Count.EqualTo(2); + hbmAny.metavalue.Select(mv => mv.value).Should().Have.SameValuesAs("A", "B"); + hbmAny.metavalue.Select(mv => mv.@class).Satisfy(c => c.Any(clazz => clazz.Contains("MyReferenceClass"))); + hbmAny.metavalue.Select(mv => mv.@class).Satisfy(c => c.Any(clazz => clazz.Contains("MyClass"))); + } + + [Test] + public void AtCreationSetColumnsUsingMemberName() + { + var member = typeof(MyClass).GetProperty("MyReferenceClass"); + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + new AnyMapper(member, typeof(int), hbmAny, hbmMapping); + hbmAny.Columns.ElementAt(0).name.Should().Contain("MyReferenceClass"); + hbmAny.Columns.ElementAt(1).name.Should().Contain("MyReferenceClass"); + } + + [Test] + public void IdMetaTypeShouldBeImmutableAfterAddMetaValues() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + mapper.MetaValue('A', typeof(MyReferenceClass)); + Executing.This(() => mapper.IdType(NHibernateUtil.Int32)).Should().NotThrow(); + Executing.This(mapper.IdType<int>).Should().NotThrow(); + Executing.This(mapper.IdType<string>).Should().Throw<ArgumentException>(); + Executing.This(() => mapper.IdType(NHibernateUtil.String)).Should().Throw<ArgumentException>(); + } + + [Test] + public void CanSetUpdate() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + + mapper.Update(false); + hbmAny.update.Should().Be.False(); + } + + [Test] + public void CanSetInsert() + { + var hbmMapping = new HbmMapping(); + var hbmAny = new HbmAny(); + var mapper = new AnyMapper(null, typeof(int), hbmAny, hbmMapping); + + mapper.Insert(false); + hbmAny.insert.Should().Be.False(); + } + } +} \ 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-15 19:29:27 UTC (rev 5823) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-05-15 19:33:14 UTC (rev 5824) @@ -552,6 +552,7 @@ <Compile Include="MappingByCode\ExpliticMappingTests\SubclassPropertiesSplitsTests.cs" /> <Compile Include="MappingByCode\ExpliticMappingTests\VersionTests.cs" /> <Compile Include="MappingByCode\For.cs" /> + <Compile Include="MappingByCode\MappersTests\AnyMapperTest.cs" /> <Compile Include="MappingByCode\MappersTests\ManyToOneMapperTest.cs" /> <Compile Include="MappingByCode\MappersTests\AbstractPropertyContainerMapperTest.cs" /> <Compile Include="MappingByCode\MappersTests\ClassMapperTests\CheckMixingPOIDStrategiesTests.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |