diff UnitTests/CS/EditableObjects/EditableObjectTest.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/EditableObjects/EditableObjectTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,331 @@
+using System;
+using System.Reflection;
+using System.Xml;
+
+using NUnit.Framework;
+
+using BLToolkit.EditableObjects;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace EditableObjects
+{
+	[TestFixture]
+	public class EditableObjectTest
+	{
+		public class Source
+		{
+			public int         ID   = 10;
+			public string      Name = "20";
+			public XmlDocument Xml;
+		
+			public Source()
+			{
+				Xml = new XmlDocument();
+				Xml.LoadXml("<test/>");
+			}
+		}
+
+		public abstract class Dest: EditableObject
+		{
+			public string ChangedPropertyName;
+
+			public abstract int         ID   { get; set; }
+			public abstract string      Name { get; set; }
+			public abstract XmlDocument Xml  { get; set; }
+
+			protected override void OnPropertyChanged(string propertyName)
+			{
+				ChangedPropertyName = propertyName;
+				if (propertyName == "ID")
+					Assert.That(ID, Is.Not.EqualTo(0));
+				else if (propertyName == "Xml")
+					Assert.That(Xml.InnerXml, Is.Not.EqualTo("<test />"));
+
+			}
+		}
+
+		[Test]
+		public void Notification()
+		{
+			Dest o = Map.ObjectToObject<Dest>(new Source());
+
+			Assert.AreEqual("", o.ChangedPropertyName);
+
+			o.ID = 1;
+			Assert.AreEqual("ID", o.ChangedPropertyName);
+
+			o.Xml.DocumentElement.AppendChild(o.Xml.CreateElement("el"));
+			Assert.AreEqual("Xml", o.ChangedPropertyName);
+		}
+
+		public abstract class Object1: EditableObject<Object1>
+		{
+			[MapField("ObjectId")]
+			public abstract int         ID       { get; }
+			public abstract short       Field1   { get; set; }
+
+			[MapValue(true,  "Y")]
+			[MapValue(false, "N")]
+			public abstract bool        Field2   { get; set; }
+			[Parameter(2, 2, 2)]
+			public abstract DateTime?   Field3   { get; set; }
+			[Parameter(2L)]
+			public abstract long        Field4   { get; set; }
+			public abstract byte        Field5   { get; set; }
+			public abstract char        Field6   { get; set; }
+			public abstract ushort      Field7   { get; set; }
+			public abstract uint        Field8   { get; set; }
+			public abstract ulong       Field9   { get; set; }
+			public abstract sbyte       Field10  { get; set; }
+			public abstract float       Field11  { get; set; }
+			public abstract double      Field12  { get; set; }
+			[Parameter(3.08)]
+			public abstract decimal?    Field13  { get; set; }
+			public abstract string      Field14  { get; set; }
+			public abstract Guid        Field15  { get; set; }
+			public abstract DayOfWeek   Field16  { get; set; }
+			public abstract ulong?      Field17  { get; set; }
+			public abstract XmlDocument XmlField { get; set; }
+		}
+
+		[Test]
+		public void TestCreate()
+		{
+			Object1 o = Object1.CreateInstance();
+
+			Assert.That(o.Field4,  Is.EqualTo(2L));
+			Assert.That(o.Field3,  Is.EqualTo(new DateTime(2,2,2)));
+			Assert.That(o.Field13, Is.EqualTo(3.08m));
+
+			Assert.IsFalse(o.IsDirty);
+
+			TypeAccessor<Object1>.Instance["ID"].SetValue(o, 1);
+
+			Assert.AreEqual(1, o.ID);
+			Assert.IsTrue  (o.IsDirty);
+			Assert.IsTrue  (o.IsDirtyMember("ID"));
+			o.AcceptChanges();
+			Assert.IsFalse (o.IsDirty);
+
+			o.Field16 = DayOfWeek.Saturday;
+
+			Assert.AreEqual(DayOfWeek.Saturday, o.Field16);
+			Assert.IsTrue  (o.IsDirty);
+			Assert.IsTrue  (o.IsDirtyMember("Field16"));
+			o.AcceptChanges();
+			Assert.IsFalse (o.IsDirty);
+
+			o.Field17 = 5;
+
+			Assert.AreEqual(5, o.Field17);
+			Assert.IsTrue  (o.IsDirty);
+			Assert.IsTrue  (o.IsDirtyMember("Field17"));
+			o.AcceptChanges();
+			Assert.IsFalse (o.IsDirty);
+
+			o.XmlField.LoadXml(@"<root><element attribute=""value""/></root>");
+			Assert.IsTrue  (o.IsDirty);
+			o.AcceptChanges();
+
+			o.XmlField.SelectSingleNode("/root/element/@attribute").Value = "changed";
+			Assert.IsTrue  (o.IsDirty);
+			Assert.IsTrue  (o.IsDirtyMember("XmlField"));
+			o.AcceptChanges();
+			Assert.IsFalse (o.IsDirty);
+
+			o.XmlField.SelectSingleNode("/root/element/@attribute").Value = "once again";
+			o.XmlField = new XmlDocument();
+			Assert.IsTrue  (o.IsDirty);
+		}
+
+
+		[Test]
+		public void TestRejectChangesNotification()
+		{
+			Object1 o = Object1.CreateInstance();
+
+			Console.WriteLine("o is dirty: " + o.IsDirty);
+
+			o.PropertyChanged += object_PropertyChanged;
+
+			Console.WriteLine("Changing 3 fields");
+
+			o.Field1 = 10;
+			o.Field2 = !o.Field2;
+			o.Field3 = DateTime.Now;
+			o.XmlField.LoadXml("<root foo=\"bar\"/>");
+			o.XmlField.DocumentElement.Attributes.RemoveAll();
+			o.XmlField.DocumentElement.Attributes.Append(o.XmlField.CreateAttribute("attr"));
+
+			Console.WriteLine("Dirty Members");
+
+			PropertyInfo[] dirtyMembers = o.GetDirtyMembers();
+
+			Assert.AreEqual(4, dirtyMembers.Length);
+
+			foreach (PropertyInfo dirtyMember in dirtyMembers)
+				Console.WriteLine(dirtyMember.Name);
+
+			Console.WriteLine("Rejecting field 1");
+
+			o.RejectMemberChanges("Field1");
+			o.RejectMemberChanges("XmlField");
+
+			Console.WriteLine("Dirty Members");
+
+			dirtyMembers = o.GetDirtyMembers();
+			Assert.AreEqual(2, dirtyMembers.Length);
+
+			foreach (PropertyInfo dirtyMember in dirtyMembers)
+				Console.WriteLine(dirtyMember.Name);
+
+			Console.WriteLine("Rejecting all changes");
+
+			o.RejectChanges();
+
+			Console.WriteLine("Dirty Members");
+
+			dirtyMembers = o.GetDirtyMembers();
+			Assert.AreEqual(dirtyMembers.Length, 0);
+
+			foreach (PropertyInfo dirtyMember in dirtyMembers)
+				Console.WriteLine(dirtyMember.Name);
+		}
+
+		private static void object_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
+		{
+			Console.WriteLine("Property Changed: " + e.PropertyName);
+		}
+
+		[Test]
+		public void IsDirtyTest()
+		{
+			Object1 o = Object1.CreateInstance();
+
+			o.Field1 = 10;
+			o.Field2 = !o.Field2;
+			o.Field3 = DateTime.Now;
+			o.AcceptChanges();
+
+			Object1 c = (Object1)((ICloneable)o).Clone();
+
+			Assert.IsFalse(o.IsDirty);
+			Assert.IsFalse(c.IsDirty);
+
+			o.Field1 = 100;
+			c = (Object1)((ICloneable)o).Clone();
+
+			Assert.IsTrue(o.IsDirty);
+			Assert.IsTrue(c.IsDirty);
+
+			Assert.IsTrue(o.IsDirtyMember("Field1"));
+			Assert.IsTrue(c.IsDirtyMember("Field1"));
+
+			Assert.IsFalse(o.IsDirtyMember("Field2"));
+			Assert.IsFalse(c.IsDirtyMember("Field2"));
+		}
+
+		public class TestClass
+		{
+			public int    ID;
+			public string Str;
+		}
+
+		public struct TestStruct
+		{
+			public int    ID;
+			public string Str;
+		}
+
+		public abstract class TestEditableObject : EditableObject
+		{
+			public abstract int ID { get; set; }
+
+			public static TestEditableObject CreateInstance()
+			{
+				return (TestEditableObject)
+					TypeAccessor.CreateInstanceEx(typeof(TestEditableObject), null);
+			}
+		}
+
+		[Test]
+		public void EqualsTest()
+		{
+			TestClass classInst1 = new TestClass();
+			TestClass classInst2 = new TestClass();
+
+			TestStruct structInst1 = new TestStruct();
+			TestStruct structInst2 = new TestStruct();
+
+			TestEditableObject editableInst1 = TestEditableObject.CreateInstance();
+			TestEditableObject editableInst2 = TestEditableObject.CreateInstance();
+			TestEditableObject editableInst3 = editableInst1;
+
+			classInst1   .ID = classInst2   .ID = 1;
+			structInst1  .ID = structInst2  .ID = 1;
+			editableInst1.ID = editableInst2.ID = 1;
+
+			TestStruct structInst3 = structInst1;
+			TestClass   classInst3 = classInst1;
+
+			Assert.IsTrue(Equals(structInst1,   structInst2));
+			Assert.IsTrue(Equals(structInst1,   structInst3));
+			Assert.IsTrue(Equals(structInst2,   structInst3));
+
+			Assert.IsFalse(Equals(classInst1,    classInst2));
+			Assert.IsFalse(Equals(editableInst1, editableInst2));
+
+			Assert.IsTrue (Equals(classInst1,    classInst3));
+			Assert.IsTrue (Equals(editableInst1, editableInst3));
+
+			Assert.IsFalse(Equals(classInst2,    classInst3));
+			Assert.IsFalse(Equals(editableInst2, editableInst3));
+		}
+
+		[Test]
+		public void EqualsSpeedTest()
+		{
+			TestClass eo1Inst1 = new TestClass();
+			TestClass eo1Inst3 = eo1Inst1;
+
+			TestEditableObject eo2Inst1 = TestEditableObject.CreateInstance();
+			TestEditableObject eo2Inst3 = eo2Inst1;
+
+			eo1Inst1.ID = 1; eo1Inst1.Equals(eo1Inst3);
+			eo2Inst1.ID = 1; eo2Inst1.Equals(eo2Inst3);
+
+			long startTicks = DateTime.Now.Ticks;
+			for (int i = 0; i < 100000; i++)
+				eo1Inst1.Equals(eo1Inst3);
+			Console.WriteLine(".NET: {0}", DateTime.Now.Ticks - startTicks);
+
+			startTicks = DateTime.Now.Ticks;
+			for (int i = 0; i < 100000; i++)
+				eo2Inst1.Equals(eo2Inst3);
+			Console.WriteLine("BLT: {0}", DateTime.Now.Ticks - startTicks);
+		}
+
+		[Test]
+		public void GetHashCodeSpeedTest()
+		{
+			TestClass eo1Inst1 = new TestClass();
+			TestEditableObject eo2Inst1 = TestEditableObject.CreateInstance();
+
+			eo1Inst1.ID = 1; eo1Inst1.GetHashCode();
+			eo2Inst1.ID = 1; eo2Inst1.GetHashCode();
+
+			long startTicks = DateTime.Now.Ticks;
+			for (int i = 0; i < 100000; i++)
+				eo1Inst1.GetHashCode();
+			Console.WriteLine(".NET: {0}", DateTime.Now.Ticks - startTicks);
+
+			startTicks = DateTime.Now.Ticks;
+			for (int i = 0; i < 100000; i++)
+				eo2Inst1.GetHashCode();
+			Console.WriteLine("BLT: {0}", DateTime.Now.Ticks - startTicks);
+		}
+
+	}
+}