From: <fab...@us...> - 2010-12-24 20:24:50
|
Revision: 5335 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5335&view=rev Author: fabiomaulo Date: 2010-12-24 20:24:43 +0000 (Fri, 24 Dec 2010) Log Message: ----------- Test for NH-2470 (does not fail) Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/Class1Class2Classes.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/Class1Class2DTOs.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/Class1Class2Tests.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/DTO.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/DomainObject.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/Mappings.hbm.xml Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/Class1Class2Classes.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/Class1Class2Classes.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/Class1Class2Classes.cs 2010-12-24 20:24:43 UTC (rev 5335) @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace NHibernate.Test.NHSpecificTest.NH2470 +{ + public class Class1 : DomainObject + { + private IList<Class2> _class2List = new List<Class2>(); + + public virtual void AddClass2(Class2 toAdd) + { + if (false == _class2List.Contains(toAdd)) + { + _class2List.Add(toAdd); + toAdd.AddClass1(this); + } + } + + public virtual ReadOnlyCollection<Class2> Class2List + { + get { return new ReadOnlyCollection<Class2>(_class2List); } + } + } + + public class Class2 : DomainObject + { + private IList<Class1> _class1List = new List<Class1>(); + + public virtual void AddClass1(Class1 toAdd) + { + if (false == _class1List.Contains(toAdd)) + { + _class1List.Add(toAdd); + toAdd.AddClass2(this); + } + } + + public virtual ReadOnlyCollection<Class1> Class1List + { + get { return new ReadOnlyCollection<Class1>(_class1List); } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/Class1Class2DTOs.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/Class1Class2DTOs.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/Class1Class2DTOs.cs 2010-12-24 20:24:43 UTC (rev 5335) @@ -0,0 +1,9 @@ +namespace NHibernate.Test.NHSpecificTest.NH2470 +{ + public class Class2DTO : DTO { } + + public class Class1DTO : DTO + { + public Class2DTO[] Class2Ary { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/Class1Class2Tests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/Class1Class2Tests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/Class1Class2Tests.cs 2010-12-24 20:24:43 UTC (rev 5335) @@ -0,0 +1,286 @@ +using System; +using System.Linq; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH2470 +{ + [TestFixture] + public class Class1_Class2_Tests : BugTestCase + { + public void Clean() + { + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from Class1"); + s.Delete("from Class2"); + tx.Commit(); + } + } + } + + [Test] + public void Test0() + { + Class1 c1; + Class2 c2; + Class1DTO class1dto; + + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + c1 = new Class1(); + c2 = new Class2(); + + c1.AddClass2(c2); + + s.Save(c2); + s.Save(c1); + + class1dto = new Class1DTO {ID = c1.ID, EntityVersion = c1.EntityVersion}; + + class1dto.Class2Ary = c1.Class2List.Select(cl2 => new Class2DTO {ID = cl2.ID, EntityVersion = cl2.EntityVersion}).ToArray(); + + tx.Commit(); + } + + Assert.AreEqual(1, c1.EntityVersion); + Assert.AreEqual(1, c2.EntityVersion); + Assert.AreEqual(1, class1dto.EntityVersion); + } + + Assert.AreEqual(1, c1.EntityVersion); + Assert.AreEqual(1, c2.EntityVersion); + Assert.AreEqual(1, class1dto.EntityVersion); + Clean(); + } + + [Test] + public void Test1() + { + Class1 c1; + Class2 c2; + Class1DTO dto; + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + c1 = new Class1(); + c2 = new Class2(); + + c1.AddClass2(c2); + + s.Save(c2); + s.Save(c1); + + tx.Commit(); + } + + using (ITransaction tx = s.BeginTransaction()) + { + // NH-2470 If inverse="true" in Class1.hbm.xml you must add the next line to prevent erroneous version increment + // s.Refresh(c1, LockMode.None); + dto = new Class1DTO {ID = c1.ID, EntityVersion = c1.EntityVersion}; + tx.Commit(); + } + + Assert.AreEqual(1, c1.EntityVersion); + Assert.AreEqual(1, c2.EntityVersion); + Assert.AreEqual(1, dto.EntityVersion); + } + + Assert.AreEqual(1, c1.EntityVersion); + Assert.AreEqual(1, c2.EntityVersion); + Assert.AreEqual(1, dto.EntityVersion); + Clean(); + } + + [Test] + public void Test2() + { + Class1 c1; + Class2 c2; + Class1DTO dto; + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + c1 = new Class1(); + c2 = new Class2(); + + c1.AddClass2(c2); + + s.Save(c2); + + s.Save(c1); + + dto = new Class1DTO {ID = c1.ID, EntityVersion = c1.EntityVersion}; + + tx.Commit(); + } + + Assert.AreEqual(1, c1.EntityVersion); + Assert.AreEqual(1, c2.EntityVersion); + Assert.AreEqual(c1.ID, dto.ID); + Assert.AreEqual(1, dto.EntityVersion); + } + + Assert.AreEqual(1, c1.EntityVersion); + Assert.AreEqual(1, c2.EntityVersion); + Assert.AreEqual(c1.ID, dto.ID); + Assert.AreEqual(1, dto.EntityVersion); + Clean(); + } + + [Test] + public void Test3() + { + Class1 c1; + Class2 c2; + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + c1 = new Class1(); + c2 = new Class2(); + + c1.AddClass2(c2); + + s.Save(c2); + s.Save(c1); + + tx.Commit(); + } + + Assert.AreEqual(1, c1.EntityVersion); + Assert.AreEqual(1, c2.EntityVersion); + + using (ITransaction tx = s.BeginTransaction()) + { + // NH-2470 If inverse="true" in Class1.hbm.xml you must add the next line to prevent erroneous version increment + // s.Refresh(c1, LockMode.None); + var class1dto = new Class1DTO {ID = c1.ID, EntityVersion = c1.EntityVersion}; + class1dto.Class2Ary = c1.Class2List.Select(cl2 => new Class2DTO {ID = cl2.ID, EntityVersion = cl2.EntityVersion}).ToArray(); + tx.Commit(); + } + Assert.AreEqual(1, c1.EntityVersion); + Assert.AreEqual(1, c2.EntityVersion); + } + Assert.AreEqual(1, c1.EntityVersion); + Assert.AreEqual(1, c2.EntityVersion); + Clean(); + } + + [Test] + public void Test4() + { + Guid c1id; + int c1ev, c2ev; + Class1DTO class1dto; + using (ISession s = OpenSession()) + { + Class1 c1; + using (ITransaction tx = s.BeginTransaction()) + { + Class2 c2; + + c1 = new Class1(); + c2 = new Class2(); + + c1.AddClass2(c2); + + s.Save(c2); + + s.Save(c1); + + tx.Commit(); + + c1id = c1.ID; + c1ev = c1.EntityVersion; + c2ev = c2.EntityVersion; + } + + Assert.AreEqual(1, c1ev); + Assert.AreEqual(1, c2ev); + + using (ITransaction tx = s.BeginTransaction()) + { + // NH-2470 If inverse="true" in Class1.hbm.xml you must add the next line to prevent erroneous version increment + // s.Refresh(c1); + class1dto = new Class1DTO {ID = c1.ID, EntityVersion = c1.EntityVersion}; + class1dto.Class2Ary = c1.Class2List.Select(cl2 => new Class2DTO {ID = cl2.ID, EntityVersion = cl2.EntityVersion}).ToArray(); + tx.Commit(); + c1ev = c1.EntityVersion; + Assert.AreEqual(1, c1ev); + } + Assert.AreEqual(1, c1.EntityVersion); + } + + Assert.AreEqual(1, c1ev); + Assert.AreEqual(1, class1dto.EntityVersion); + Assert.IsTrue(class1dto.Class2Ary.All(cl2 => cl2.EntityVersion == 1)); + + Class1 cl1; + using (ISession s = OpenSession()) + { + cl1 = s.Get<Class1>(c1id); + } + Assert.AreEqual(1, cl1.EntityVersion); + Clean(); + } + + [Test] + public void Test5() + { + Guid c1id; + using (ISession s = OpenSession()) + { + Class1 c1; + Class2 c2; + + using (ITransaction tx = s.BeginTransaction()) + { + c1 = new Class1(); + c2 = new Class2(); + + c1.AddClass2(c2); + + s.Save(c2); + + s.Save(c1); + + tx.Commit(); + } + + Assert.AreEqual(1, c1.EntityVersion); + Assert.AreEqual(1, c2.EntityVersion); + + c1id = c1.ID; + } + + // NH-2470 Since we're using a totally separate session, this test always passes. + Class1 cl1; + Class1DTO class1dto; + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + cl1 = s.Get<Class1>(c1id); + + class1dto = new Class1DTO {ID = cl1.ID, EntityVersion = cl1.EntityVersion}; + class1dto.Class2Ary = cl1.Class2List.Select(cl2 => new Class2DTO {ID = cl2.ID, EntityVersion = cl2.EntityVersion}).ToArray(); + + tx.Commit(); + } + + Assert.AreEqual(1, cl1.EntityVersion); + } + + Assert.AreEqual(1, cl1.EntityVersion); + Assert.IsTrue(class1dto.Class2Ary.All(cl2 => cl2.EntityVersion == 1)); + Clean(); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/DTO.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/DTO.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/DTO.cs 2010-12-24 20:24:43 UTC (rev 5335) @@ -0,0 +1,10 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.NH2470 +{ + public abstract class DTO + { + public Guid ID; + public int EntityVersion; + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/DomainObject.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/DomainObject.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/DomainObject.cs 2010-12-24 20:24:43 UTC (rev 5335) @@ -0,0 +1,10 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.NH2470 +{ + public abstract class DomainObject + { + public virtual Guid ID { get; set; } + public virtual int EntityVersion { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2470/Mappings.hbm.xml 2010-12-24 20:24:43 UTC (rev 5335) @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2470"> + + <class name="Class1"> + + <id name="ID"> + <generator class="guid.comb"/> + </id> + + <version name="EntityVersion"/> + + <!-- NH2470 - I used to have inverse="true" here --> + <idbag name="Class2List" table="Class1_Class2" access="field.camelcase-underscore"> + <collection-id column="ID" type="Guid"> + <generator class="guid.comb" /> + </collection-id> + <key column="Class1ID" foreign-key="FK_Class2_Class1" /> + <many-to-many class="Class2" column="Class2ID" foreign-key="FK_Class1_Class2" /> + </idbag> + + </class> + <class name="Class2"> + + <id name="ID"> + <generator class="guid.comb"/> + </id> + + <version name="EntityVersion"/> + + <idbag name="Class1List" table="Class1_Class2" access="field.camelcase-underscore"> + <collection-id column="ID" type="Guid"> + <generator class="guid.comb" /> + </collection-id> + <key column="Class2ID" foreign-key="FK_Class1_Class2" /> + <many-to-many class="Class1" column="Class1ID" foreign-key="FK_Class2_Class1" /> + </idbag> + + </class> + +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-12-22 17:30:48 UTC (rev 5334) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-12-24 20:24:43 UTC (rev 5335) @@ -574,6 +574,11 @@ <Compile Include="NHSpecificTest\NH2420\MyTable.cs" /> <Compile Include="NHSpecificTest\NH2441\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2441\Model.cs" /> + <Compile Include="NHSpecificTest\NH2470\Class1Class2Classes.cs" /> + <Compile Include="NHSpecificTest\NH2470\Class1Class2DTOs.cs" /> + <Compile Include="NHSpecificTest\NH2470\Class1Class2Tests.cs" /> + <Compile Include="NHSpecificTest\NH2470\DomainObject.cs" /> + <Compile Include="NHSpecificTest\NH2470\DTO.cs" /> <Compile Include="NHSpecificTest\Properties\CompositePropertyRefTest.cs" /> <Compile Include="NHSpecificTest\Properties\DynamicEntityTest.cs" /> <Compile Include="NHSpecificTest\Properties\Model.cs" /> @@ -2363,6 +2368,7 @@ <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="NHSpecificTest\NH2470\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2056\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2043\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2037\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |