From: Michael D. <mik...@us...> - 2004-12-10 16:40:13
|
Update of /cvsroot/nhibernate/nhibernate/src/NHibernate.Test/Subclass In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14749/NHibernate.Test/Subclass Added Files: Subclass.Base.hbm.xml Subclass.hbm.xml Subclass.One.hbm.xml SubclassAssert.cs SubclassBase.cs SubclassExtendsFixture.cs SubclassFixture.cs SubclassOne.cs Log Message: NH-131: Describe joined-subclasses and subclasses in seperate files. Also refactored the test a little bit. Going to being moving away from the NHibernate.DomainModel and just include everything in the TestFixture. Making the domain classes smaller and easier to demonstrate the conepts. Borrowed some of the ideas from hibernate 3 --- NEW FILE: SubclassOne.cs --- using System; namespace NHibernate.Test.Subclass { /// <summary> /// Summary description for JoinedSubclassOne. /// </summary> public class SubclassOne: SubclassBase { private long _oneTestLong; public SubclassOne() {} public long OneTestLong { get {return _oneTestLong;} set {_oneTestLong = value;} } } } --- NEW FILE: SubclassFixture.cs --- using System; using System.Collections; using NUnit.Framework; namespace NHibernate.Test.Subclass { /// <summary> /// Test the use of <c><class></c> and <c><subclass></c> mappings. /// </summary> [TestFixture] public class SubclassFixture : TestCase { private DateTime testDateTime = new DateTime(2003, 8, 16); private DateTime updateDateTime = new DateTime(2003, 8, 17); [SetUp] public virtual void SetUp() { ExportSchema( new string[] { "Subclass.Subclass.hbm.xml" }, true, "NHibernate.Test" ); } [Test] public void TestCRUD() { // test the Save ISession s1 = sessions.OpenSession(); ITransaction t1 = s1.BeginTransaction(); int oneId; int baseId; SubclassOne one1 = new SubclassOne(); one1.TestDateTime = new System.DateTime(2003, 10, 17); one1.TestString = "the test one string"; one1.TestLong = 6; one1.OneTestLong = 1; oneId = (int)s1.Save(one1); SubclassBase base1 = new SubclassBase(); base1.TestDateTime = new System.DateTime(2003, 10, 17); base1.TestString = "the test string"; base1.TestLong = 5; baseId = (int)s1.Save(base1); t1.Commit(); s1.Close(); // lets verify the correct classes were saved ISession s2 = sessions.OpenSession(); ITransaction t2 = s2.BeginTransaction(); // perform a load based on the base class SubclassBase base2 = (SubclassBase)s2.Load(typeof(SubclassBase), baseId); SubclassBase oneBase2 = (SubclassBase)s2.Load(typeof(SubclassBase), oneId); // do some quick checks to make sure s2 loaded an object with the same data as s2 saved. SubclassAssert.AreEqual(base1, base2); // the object with id=2 was loaded using the base class - lets make sure it actually loaded // the sublcass SubclassOne one2 = oneBase2 as SubclassOne; Assert.IsNotNull(one2); // lets update the objects base2.TestString = "Did it get updated"; // update the properties from the subclass and base class one2.TestString = "Updated SubclassOne String"; one2.OneTestLong = 21; // save it through the base class reference and make sure that the // subclass properties get updated. s2.Update(base2); s2.Update(oneBase2); t2.Commit(); s2.Close(); // lets test the Criteria interface for subclassing ISession s3 = sessions.OpenSession(); ITransaction t3 = s3.BeginTransaction(); IList results3 = s3.CreateCriteria(typeof(SubclassBase)) .Add(Expression.Expression.In("TestString", new string[] {"Did it get updated", "Updated SubclassOne String" })) .List(); Assert.AreEqual(2, results3.Count); SubclassBase base3 = null; SubclassOne one3 = null; foreach(SubclassBase obj in results3) { if(obj is SubclassOne) one3 = (SubclassOne)obj; else base3 = obj; } // verify the properties got updated SubclassAssert.AreEqual(base2, base3); SubclassAssert.AreEqual(one2, one3); s3.Delete(base3); s3.Delete(one3); t3.Commit(); s3.Close(); } [Test] public void HqlClassKeyword() { // test the Save ISession s = sessions.OpenSession(); ITransaction t = s.BeginTransaction(); int oneId; int baseId; SubclassOne one1 = new SubclassOne(); one1.TestDateTime = new System.DateTime(2003, 10, 17); one1.TestString = "the test one string"; one1.TestLong = 6; one1.OneTestLong = 1; oneId = (int)s.Save(one1); SubclassBase base1 = new SubclassBase(); base1.TestDateTime = new System.DateTime(2003, 10, 17); base1.TestString = "the test string"; base1.TestLong = 5; baseId = (int)s.Save(base1); t.Commit(); s.Close(); s = sessions.OpenSession(); IList list = s.Find( "from SubclassBase as sb where sb.class=SubclassBase" ); Assert.AreEqual( 1, list.Count ); Assert.AreEqual( typeof(SubclassBase), list[0].GetType(), "should be base" ); list = s.Find( "from SubclassBase as sb where sb.class=SubclassOne" ); Assert.AreEqual( 1, list.Count ); Assert.AreEqual( typeof(SubclassOne), list[0].GetType(), "should be one" ); s.Close(); } } } --- NEW FILE: Subclass.One.hbm.xml --- <?xml version="1.0" encoding="utf-8" ?> <!-- This is the a mapping for the subclass where it is mapped in different hbm.xml file through the use of the "extends" attribute. The order the hbm.xml files are added to nhibernate are important. The base class must be added first and then the subclass can be added. It is used by the SubclassExtendsFixture. --> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0"> <subclass extends="NHibernate.Test.Subclass.SubclassBase, NHibernate.Test" name="NHibernate.Test.Subclass.SubclassOne, NHibernate.Test" discriminator-value="SUB" > <property name="OneTestLong" column="one_test_long" type="Int64" /> </subclass> </hibernate-mapping> --- NEW FILE: Subclass.hbm.xml --- <?xml version="1.0"?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0"> <class name="NHibernate.Test.Subclass.SubclassBase, NHibernate.Test" table="one_tab" discriminator-value="SUPER" > <id name="Id" type="Int32" unsaved-value="0" column="class_id" access="nosetter.camelcase-underscore" > <generator class="native" /> </id> <discriminator column="disc_column" type="String" /> <property name="TestLong" column="test_long" type="Int64" /> <property name="TestString" column="test_string" type="String" /> <property name="TestDateTime" column="test_date_time" type="DateTime" /> <subclass name="NHibernate.Test.Subclass.SubclassOne, NHibernate.Test" discriminator-value="SUB" > <property name="OneTestLong" column="one_test_long" type="Int64" /> </subclass> </class> </hibernate-mapping> --- NEW FILE: SubclassAssert.cs --- using System; using NUnit.Framework; namespace NHibernate.Test.Subclass { /// <summary> /// Summary description for SubclassAssert. /// </summary> public sealed class SubclassAssert { private SubclassAssert() {} internal static void AreEqual(SubclassBase expected, SubclassBase actual) { Assert.AreEqual( expected.Id, actual.Id ); Assert.AreEqual( expected.TestDateTime, actual.TestDateTime ); Assert.AreEqual( expected.TestLong, actual.TestLong ); Assert.AreEqual( expected.TestString, actual.TestString ); } internal static void AreEqual(SubclassOne expected, SubclassOne actual) { AreEqual( (SubclassBase)expected, (SubclassBase)actual ); Assert.AreEqual( expected.OneTestLong, actual.OneTestLong ); } } } --- NEW FILE: SubclassExtendsFixture.cs --- using System; using System.Collections; using NUnit.Framework; namespace NHibernate.Test.Subclass { /// <summary> /// Test the use of <c><class></c> and <c><subclass></c> mappings /// that are in different files through the use of the <c>extends</c> attribute. /// </summary> /// <remarks> /// Inheriting from <see cref="SubclassFixture"/> because the only thing different /// is how the classes are mapped. /// </remarks> [TestFixture] public class SubclassExtendsFixture : SubclassFixture { [SetUp] public override void SetUp() { // order is important! The base classes must be configured before // the subclasses. ArrayList files = new ArrayList(); files.Add( "Subclass.Subclass.Base.hbm.xml" ); files.Add( "Subclass.Subclass.One.hbm.xml" ); ExportSchema( files, true, "NHibernate.Test" ); } } } --- NEW FILE: SubclassBase.cs --- using System; namespace NHibernate.Test.Subclass { /// <summary> /// Summary description for SubclassBase. /// </summary> public class SubclassBase { private int _id = 0; private long _testLong; private string _testString; private System.DateTime _testDate; public SubclassBase() { } public int Id { get { return _id; } } public long TestLong { get { return _testLong; } set { _testLong = value; } } public string TestString { get { return _testString; } set { _testString = value; } } public System.DateTime TestDateTime { get { return _testDate; } set { _testDate = value; } } } } --- NEW FILE: Subclass.Base.hbm.xml --- (This appears to be a binary file; contents omitted.) |