diff UnitTests/CS/Data/ComplexMappingTest.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/ComplexMappingTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,222 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.EditableObjects;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection.MetadataProvider;
+using BLToolkit.Reflection;
+
+namespace Data
+{
+	[TestFixture]
+	public class ComplexMappingTest
+	{
+		private const string _parentChildquery = @"
+			SELECT       1 AS ParentId
+			UNION SELECT 2 AS ParentId
+
+			SELECT       1 AS ChildId, 1 AS ParentId
+			UNION SELECT 2 AS ChildId, 1 AS ParentId
+			UNION SELECT 3 AS ChildId, 2 AS ParentId
+			UNION SELECT 4 AS ChildId, 2 AS ParentId";
+
+		public abstract class Parent : EditableObject
+		{
+			[MapField("ParentId"), PrimaryKey]
+			public abstract int         Id       { get; set; }
+			[Relation(typeof(Child))]
+			public abstract List<Child> Children { get; set; }
+		}
+
+		[MapField("ParentId", "Parent.Id")]
+		public abstract class Child : EditableObject
+		{
+			[MapField("ChildId"), PrimaryKey]
+			public abstract int    Id     { get; set; }
+			[Relation]
+			public abstract Parent Parent { get; set; }
+		}
+
+		[Test]
+		public void Test1()
+		{
+			List<Parent> parents = new List<Parent>();
+			MapResultSet[] sets = new MapResultSet[2];
+
+			sets[0] = new MapResultSet(typeof(Parent), parents);
+			sets[1] = new MapResultSet(typeof(Child));
+
+			sets[0].AddRelation(sets[1], "ParentID", "ParentID", "Children");
+			sets[1].AddRelation(sets[0], "ParentID", "ParentID", "Parent");
+
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetCommand(_parentChildquery)
+					.ExecuteResultSet(sets);
+			}
+
+			foreach (Parent p in parents)
+			{
+				Assert.That(p.IsDirty == false);
+
+				foreach (Child c in p.Children)
+					Assert.That(c.IsDirty == false);
+			}
+		}
+
+		[Test]
+		public void RelationAttributeTest1()
+		{
+			bool isSet;
+			List<MapRelationBase> relations
+				 = Map.DefaultSchema.MetadataProvider.GetRelations(Map.DefaultSchema, 
+							Map.DefaultSchema.Extensions, typeof(Parent), typeof(Child), out isSet);
+
+			Assert.That(isSet);
+			Assert.That(relations.Count == 1);
+
+			Assert.That(relations[0].ContainerName == "Children");
+			Assert.That(relations[0].SlaveIndex.Fields[0].Name == "ParentId");
+
+			relations
+				 = Map.DefaultSchema.MetadataProvider.GetRelations(Map.DefaultSchema, 
+							Map.DefaultSchema.Extensions, typeof(Child), typeof(Parent), out isSet);
+
+			Assert.That(isSet);
+			Assert.That(relations.Count == 1);
+
+			Assert.That(relations[0].ContainerName == "Parent");
+			Assert.That(relations[0].SlaveIndex.Fields[0].Name == "ParentId");
+		}
+	
+		public abstract class Master
+		{
+			[PrimaryKey, Nullable]
+			public abstract int          MasterId {get; set;}
+			[Relation(typeof(Detail))]
+			public abstract List<Detail> Details  {get; set;}
+			public abstract string       Name     {get; set;}
+		}
+
+		[MapField("MasterId", "Master.MasterId")]
+		public abstract class Detail
+		{
+			[PrimaryKey, MapField("Id"), Nullable]
+			public abstract int             DetailId   {get; set;}
+
+			[Relation]
+			public abstract Master          Master     {get; set;}
+
+			[Relation(typeof(SubDetail), "DetailId", "Id")]
+			public abstract List<SubDetail> SubDetails {get; set;}
+		}
+
+		[MapField("DetailId", "Master.DetailId")]
+		public abstract class SubDetail
+		{
+			[PrimaryKey]
+			public abstract int             SubDetailId {get; set;}
+
+			[Relation("Id", "DetailId"), Nullable]
+			public abstract Detail          Master      {get; set;}
+		}
+
+		[Test]
+		public void RelationAttributeTest2()
+		{
+			MappingSchema        ms = Map.DefaultSchema;
+			MetadataProviderBase mp = ms.MetadataProvider;
+			bool                 isSet;
+
+			List<MapRelationBase> relations = mp.GetRelations(ms, ms.Extensions, typeof(Master), typeof(Detail), out isSet);
+			
+			//sets[0] = new MapResultSet(typeof(Master),    masters);
+			//sets[1] = new MapResultSet(typeof(Detail),    details);
+			//sets[2] = new MapResultSet(typeof(SubDetail), subdetails);
+
+			//sets[0].AddRelation(sets[1], "MasterId", "MasterId", "Details");
+			//sets[1].AddRelation(sets[0], "MasterId", "MasterId", "Master");
+			//sets[1].AddRelation(sets[2], "DetailId",       "Id", "SubDetails");
+			//sets[2].AddRelation(sets[1], "Id",       "DetailId", "Master");
+
+
+			Assert.That(isSet);
+			Assert.That(relations.Count == 1);
+			Assert.AreEqual("MasterId", relations[0].MasterIndex.Fields[0].Name);
+			Assert.AreEqual("MasterId", relations[0].SlaveIndex.Fields[0].Name);
+			Assert.AreEqual("Details",  relations[0].ContainerName);
+
+			relations = mp.GetRelations(ms, ms.Extensions, typeof(Detail), typeof(Master), out isSet);
+			
+			Assert.That(isSet);
+			Assert.That(relations.Count == 1);
+			Assert.AreEqual("MasterId", relations[0].MasterIndex.Fields[0].Name);
+			Assert.AreEqual("MasterId", relations[0].SlaveIndex.Fields[0].Name);
+			Assert.AreEqual("Master",   relations[0].ContainerName);
+
+			relations = mp.GetRelations(ms, ms.Extensions, typeof(Detail), typeof(SubDetail), out isSet);
+			
+			Assert.That(isSet);
+			Assert.That(relations.Count == 1);
+			Assert.AreEqual("Id",         relations[0].MasterIndex.Fields[0].Name);
+			Assert.AreEqual("DetailId",   relations[0].SlaveIndex.Fields[0].Name);
+			Assert.AreEqual("SubDetails", relations[0].ContainerName );
+
+			relations = mp.GetRelations(ms, ms.Extensions, typeof(SubDetail), typeof(Detail), out isSet);
+			
+			Assert.That(isSet);
+			Assert.That(relations.Count == 1);
+			Assert.AreEqual("DetailId", relations[0].MasterIndex.Fields[0].Name);
+			Assert.AreEqual("Id",       relations[0].SlaveIndex.Fields[0].Name);
+			Assert.AreEqual("Master",   relations[0].ContainerName);
+		}
+		
+		[Test]
+		public void RelationAttributeTest3()
+		{
+			MappingSchema        ms = Map.DefaultSchema;
+			MetadataProviderBase mp = ms.MetadataProvider;
+			bool                 isSet;
+
+			List<MapRelationBase> relations = mp.GetRelations(ms, ms.Extensions, typeof(Detail), null, out isSet);
+
+			Assert.That(relations.Count == 2);
+
+		}
+
+		[Test]
+		public void NullKeyTest()
+		{
+			Master m = TypeAccessor.CreateInstance<Master>();
+			Detail d = TypeAccessor.CreateInstance<Detail>();
+			
+			List<Master> masters = new List<Master>();
+			List<Detail> details = new List<Detail>();
+
+			masters.Add(m);
+			details.Add(d);
+
+			Map.ResultSets(new MapResultSet[] { new MapResultSet(typeof(Master), masters), 
+												new MapResultSet(typeof(Detail), details) });
+
+			Assert.IsFalse (object.ReferenceEquals(d.Master, m));
+			Assert.AreEqual(0, m.Details.Count);
+
+			m.MasterId = 1;
+			d.DetailId = 1;
+			d.Master.MasterId = 1;
+
+			Map.ResultSets(new MapResultSet[] { new MapResultSet(typeof(Master), masters), 
+												new MapResultSet(typeof(Detail), details) });
+
+			
+			Assert.IsTrue  (object.ReferenceEquals(d.Master, m));
+			Assert.AreEqual(1, m.Details.Count);
+		}
+	}
+}