diff UnitTests/CS/EditableObjects/EditableArrayListTest.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/EditableArrayListTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,623 @@
+using System;
+using System.ComponentModel;
+using System.IO;
+using System.Runtime.Serialization.Formatters.Binary;
+using System.Windows.Forms;
+
+using NUnit.Framework;
+
+using BLToolkit.EditableObjects;
+using BLToolkit.Reflection;
+
+namespace EditableObjects
+{
+	[Serializable]
+	public abstract class SerializableObject : EditableObject
+	{
+		public abstract int    ID   { get; set; }
+		public abstract Guid   UUID { get; set; }
+		public abstract string Name { get; set; }
+
+		public abstract EditableList<string> Array { get; set; }
+	}
+
+	[TestFixture]
+	public class EditableArrayListTest
+	{
+		public abstract class EditableTestObject : EditableObject
+		{
+			public abstract int    ID      { get; set; }
+			public abstract string Name    { get; set; }
+			public abstract int    Seconds { get; set; }
+
+			public static EditableTestObject CreateInstance()
+			{
+				return (EditableTestObject)TypeAccessor.CreateInstance(typeof(EditableTestObject));
+			}
+			
+			public static EditableTestObject CreateInstance(int id, string name, int seconds)
+			{
+				var instance = CreateInstance();
+
+				instance.ID = id;
+				instance.Name = name;
+				instance.Seconds = seconds;
+				
+				return instance;
+			}
+
+			public override string ToString()
+			{
+				return string.Format("EditableTestObject - ID:({0}) Name: ({1}) Seconds({2})", ID, Name, Seconds);
+			}
+		}
+		
+		private static readonly EditableTestObject[] _testObjects = new EditableTestObject[]
+			{
+				EditableTestObject.CreateInstance(0, "Smith",  24),
+				EditableTestObject.CreateInstance(1, "John",   22),
+				EditableTestObject.CreateInstance(2, "Anna",   48),
+				EditableTestObject.CreateInstance(3, "Tim",    56),
+				EditableTestObject.CreateInstance(4, "Xiniu",  39),
+				EditableTestObject.CreateInstance(5, "Kirill", 30)
+			};
+		
+		public EditableArrayListTest()
+		{
+			_testList = new EditableArrayList(typeof(EditableTestObject));
+			_testList.ListChanged += TestList_ListChanged;
+		}
+
+		private readonly EditableArrayList _testList;
+		
+		private void TestList_ListChanged(object sender, ListChangedEventArgs e)
+		{
+			var array = sender as EditableArrayList;
+			
+			Assert.IsNotNull(array);
+			if (e.ListChangedType != ListChangedType.Reset)
+				Assert.That(array.IsDirty);
+
+			if(e.ListChangedType == ListChangedType.ItemAdded)
+			{
+				var o = array[e.NewIndex];
+
+				Assert.IsNotNull(o);
+				Assert.That(array.NewItems.Contains(o));
+			}
+
+			if (e.ListChangedType != ListChangedType.ItemDeleted && e.ListChangedType != ListChangedType.Reset)
+				Console.WriteLine("ListChanged (ID:{3}). Type: {0}, OldIndex: {1}, NewIndex: {2}", e.ListChangedType, e.OldIndex, e.NewIndex, (e.NewIndex >= 0 && e.NewIndex < _testList.Count) ? ((EditableTestObject)_testList[e.NewIndex]).ID : -1);
+			else
+				Console.WriteLine("ListChanged (ID:???). Type: {0}, OldIndex: {1}, NewIndex: {2}", e.ListChangedType, e.OldIndex, e.NewIndex);
+		}
+		
+		[Test]
+		public void TestAdd()
+		{
+			Console.WriteLine("--- TestAdd ---");
+			_testList.Clear();
+			_testList.RemoveSort();
+
+			for (var i = 0; i < 3; i++)
+				_testList.Add(_testObjects[i]);
+			
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[0], _testObjects[0]);
+			Assert.AreEqual(_testList[1], _testObjects[1]);
+			Assert.AreEqual(_testList[2], _testObjects[2]);
+			
+			var _subArray = new EditableTestObject[3];
+
+			for (var i = 3; i < _testObjects.Length; i++)
+				_subArray[i-3] = _testObjects[i];
+
+			_testList.AddRange(_subArray);
+			Assert.AreEqual(_testList.Count, 6);
+			
+			for (var i = 3; i < _testObjects.Length; i++)
+				Assert.AreEqual(_subArray[i - 3], _testObjects[i]);
+
+			PrintList();
+			
+			_testList.Clear();
+		}
+
+		[Test]
+		public void TestAddNew()
+		{
+			var list = new EditableList<EditableTestObject>();
+			var listChangedFired = false;
+
+			list.ListChanged += (sender, args) => listChangedFired = true;
+
+			list.AddNew();
+			Assert.That(listChangedFired);
+			Assert.AreEqual(1, list.Count);
+			Assert.AreEqual(1, list.NewItems.Count);
+
+			listChangedFired = false;
+			list.CancelNew(0);
+			Assert.That(listChangedFired);
+			Assert.IsEmpty(list);
+			Assert.IsEmpty(list.NewItems);
+		}
+
+		[Test]
+		public void TestInsert()
+		{
+			Console.WriteLine("--- TestInsert ---");
+			_testList.Clear();
+			_testList.RemoveSort();
+
+			for (var i = 0; i < 3; i++)
+				_testList.Insert(0, _testObjects[i]);
+
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[0], _testObjects[2]);
+			Assert.AreEqual(_testList[1], _testObjects[1]);
+			Assert.AreEqual(_testList[2], _testObjects[0]);
+
+			var _subArray = new EditableTestObject[3];
+
+			for (var i = 3; i < _testObjects.Length; i++)
+				_subArray[i-3] = _testObjects[i];
+
+			_testList.InsertRange(0, _subArray);
+			Assert.AreEqual(_testList.Count, 6);
+
+			Assert.AreEqual(_testList[0], _testObjects[3]);
+			Assert.AreEqual(_testList[1], _testObjects[4]);
+			Assert.AreEqual(_testList[2], _testObjects[5]);
+
+			PrintList();
+
+			_testList.Clear();
+		}
+		
+		[Test]
+		public void TestRemove()
+		{
+			Console.WriteLine("--- TestRemove ---");
+
+			_testList.Clear();
+			_testList.RemoveSort();
+			_testList.AddRange(_testObjects);
+
+			_testList.RemoveAt(2);
+			Assert.AreEqual(_testList.Count, 5);
+			Assert.IsEmpty(_testList.DelItems);
+
+			_testList.AcceptChanges();
+			Assert.IsEmpty(_testList.NewItems);
+
+			_testList.Remove(_testList[0]);
+			Assert.AreEqual(_testList.Count, 4);
+			Assert.IsNotEmpty(_testList.DelItems);
+
+			_testList.Clear();
+			Assert.AreEqual(_testList.Count, 0);
+		}
+
+		[Test]
+		public void TestRemoveRange()
+		{
+			Console.WriteLine("--- TestRemoveRange ---");
+
+			_testList.Clear();
+			_testList.RemoveSort();
+			_testList.AcceptChanges();
+			_testList.AddRange(_testObjects);
+
+			Assert.AreEqual(6, _testList.Count);
+			Assert.AreEqual(6, _testList.NewItems.Count);
+			Assert.AreEqual(0, _testList.DelItems.Count);
+
+			_testList.RemoveRange(1, 3);
+
+			Assert.AreEqual(3, _testList.Count);
+			Assert.AreEqual(3, _testList.NewItems.Count);
+			Assert.AreEqual(0, _testList.DelItems.Count);
+			Assert.AreEqual(0, ((EditableTestObject)_testList[0]).ID);
+			Assert.AreEqual(4, ((EditableTestObject)_testList[1]).ID);
+
+			_testList.AcceptChanges();
+
+			Assert.AreEqual(3, _testList.Count);
+			Assert.AreEqual(0, _testList.NewItems.Count);
+			Assert.AreEqual(0, _testList.DelItems.Count);
+
+			_testList.RemoveRange(0, 1);
+
+			Assert.AreEqual(2, _testList.Count);
+			Assert.AreEqual(0, _testList.NewItems.Count);
+			Assert.AreEqual(1, _testList.DelItems.Count);
+			
+			_testList.Clear();
+
+			Assert.AreEqual(0, _testList.Count);
+			Assert.AreEqual(0, _testList.NewItems.Count);
+			Assert.AreEqual(3, _testList.DelItems.Count);
+			
+			_testList.AcceptChanges();
+
+			Assert.AreEqual(0, _testList.Count);
+			Assert.AreEqual(0, _testList.NewItems.Count);
+			Assert.AreEqual(0, _testList.DelItems.Count);
+		}
+
+		[Test]
+		public void TestSortedAdd()
+		{
+			Console.WriteLine("--- TestSortedAdd ---");
+			_testList.Clear();
+			_testList.RemoveSort();
+			_testList.ApplySort(_testList.GetItemProperties(null)["Seconds"], ListSortDirection.Descending);
+
+			for (var i = 0; i < 3; i++)
+				_testList.Add(_testObjects[i]);
+
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[1], _testObjects[0]);
+			Assert.AreEqual(_testList[2], _testObjects[1]);
+			Assert.AreEqual(_testList[0], _testObjects[2]);
+
+			var _subArray = new EditableTestObject[3];
+
+			for (var i = 3; i < _testObjects.Length; i++)
+				_subArray[i-3] = _testObjects[i];
+
+			_testList.AddRange(_subArray);
+			Assert.AreEqual(_testList.Count, 6);
+
+			Assert.AreEqual(_testList[0], _testObjects[3]);
+			Assert.AreEqual(_testList[2], _testObjects[4]);
+			Assert.AreEqual(_testList[3], _testObjects[5]);
+
+			PrintList();
+
+			_testList.Clear();
+			Assert.AreEqual(_testList.Count, 0);
+
+			_testList.ApplySort(_testList.GetItemProperties(null)["Seconds"], ListSortDirection.Ascending);
+
+			for (var i = 0; i < 3; i++)
+				_testList.Add(_testObjects[i]);
+
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[1], _testObjects[0]);
+			Assert.AreEqual(_testList[0], _testObjects[1]);
+			Assert.AreEqual(_testList[2], _testObjects[2]);
+
+			_testList.AddRange(_subArray);
+			Assert.AreEqual(_testList.Count, 6);
+
+			Assert.AreEqual(_testList[5], _testObjects[3]);
+			Assert.AreEqual(_testList[3], _testObjects[4]);
+			Assert.AreEqual(_testList[2], _testObjects[5]);
+
+			PrintList();
+
+			_testList.Clear();
+		}
+		
+		[Test]
+		public void TestSortedInsert()
+		{
+			Console.WriteLine("--- TestSortedInsert ---");
+			_testList.Clear();
+			_testList.RemoveSort();
+			_testList.ApplySort(_testList.GetItemProperties(null)["Seconds"], ListSortDirection.Descending);
+
+			for (var i = 0; i < 3; i++)
+				_testList.Insert(0, _testObjects[i]);
+
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[0], _testObjects[2]);
+			Assert.AreEqual(_testList[1], _testObjects[0]);
+			Assert.AreEqual(_testList[2], _testObjects[1]);
+
+			var _subArray = new EditableTestObject[3];
+
+			for (var i = 3; i < _testObjects.Length; i++)
+				_subArray[i-3] = _testObjects[i];
+
+			_testList.InsertRange(0, _subArray);
+			Assert.AreEqual(_testList.Count, 6);
+
+			Assert.AreEqual(_testList[0], _testObjects[3]);
+			Assert.AreEqual(_testList[2], _testObjects[4]);
+			Assert.AreEqual(_testList[3], _testObjects[5]);
+
+			PrintList();
+
+			_testList.Clear();
+			Assert.AreEqual(_testList.Count, 0);
+
+			_testList.ApplySort(_testList.GetItemProperties(null)["Seconds"], ListSortDirection.Ascending);
+
+			for (var i = 0; i < 3; i++)
+				_testList.Insert(0, _testObjects[i]);
+
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[0], _testObjects[1]);
+			Assert.AreEqual(_testList[1], _testObjects[0]);
+			Assert.AreEqual(_testList[2], _testObjects[2]);
+
+			_testList.InsertRange(0, _subArray);
+			Assert.AreEqual(_testList.Count, 6);
+
+			Assert.AreEqual(_testList[2], _testObjects[5]);
+			Assert.AreEqual(_testList[3], _testObjects[4]);
+			Assert.AreEqual(_testList[5], _testObjects[3]);
+
+			PrintList();
+
+			_testList.Clear();
+		}
+		
+		[Test]
+		public void TestSortedPropertyChange()
+		{
+			Console.WriteLine("--- TestSortedPropertyChange ---");
+			_testList.Clear();
+			_testList.RemoveSort();
+			_testList.ApplySort(_testList.GetItemProperties(null)["Seconds"], ListSortDirection.Descending);
+			_testList.AddRange(_testObjects);
+
+			var eto = EditableTestObject.CreateInstance(6, "Dummy", 10);
+
+			_testList.Add(eto);
+			Assert.AreEqual(_testList.Count, 7);
+			Assert.AreEqual(_testList[6], eto);
+
+			eto.Seconds = 20;
+			Assert.AreEqual(_testList[6], eto);
+
+			eto.Seconds = 23;
+			Assert.AreEqual(_testList[5], eto);
+
+			eto.Seconds = 30;
+			Assert.AreEqual(_testList[4], eto);
+
+			eto.Seconds = 40;
+			Assert.AreEqual(_testList[2], eto);
+
+			eto.Seconds = 50;
+			Assert.AreEqual(_testList[1], eto);
+
+			eto.Seconds = 60;
+			Assert.AreEqual(_testList[0], eto);
+		}
+		
+		private void PrintList()
+		{
+			Console.WriteLine("--- Print List ---");
+			foreach (EditableTestObject o in _testList)
+				Console.WriteLine(o);
+		}
+
+		[Test]
+		public void SerializationTest()
+		{
+			//Configuration.NotifyOnEqualSet = true;
+
+			var test   = TypeAccessor<SerializableObject>.CreateInstance();
+			var stream = new MemoryStream();
+			var bf     = new BinaryFormatter();
+
+			bf.Serialize(stream, test);
+
+			//Configuration.NotifyOnChangesOnly = false;
+		}
+
+		//////[Test] Resharpe 8 issue
+		public void SerializationTest2()
+		{
+			//Configuration.NotifyOnChangesOnly = true;
+
+			var list = new EditableList<SerializableObject> { TypeAccessor<SerializableObject>.CreateInstance() };
+
+			var formatter = new BinaryFormatter();
+
+			using (var stream = new MemoryStream())
+			{
+				formatter.Serialize(stream, list);
+				stream.Position = 0;
+
+				var result = formatter.Deserialize(stream);
+
+				Assert.IsNotNull(result);
+
+				var eal = (EditableList<SerializableObject>)result;
+
+				Console.WriteLine(eal.Count);
+
+				eal.ListChanged += eal_ListChanged;
+
+				eal[0].ID = 0;
+				_notificationCount = 0;
+				eal[0].ID = -100;
+				eal[0].ID = -100;
+				eal[0].ID = -100;
+				eal[0].ID = -100;
+				eal[0].ID = -100;
+				eal[0].ID = -100;
+
+				Console.WriteLine(eal.Count);
+
+				//Assert.AreEqual(_notificationCount, 1);
+			}
+
+			//Configuration.NotifyOnChangesOnly = false;
+		}
+
+		private static int _notificationCount;
+
+		static void eal_ListChanged(object sender, ListChangedEventArgs e)
+		{
+			Console.WriteLine(e.ListChangedType);
+			_notificationCount++;
+		}
+
+		[Test]
+		public void SortTest()
+		{
+			var dataList = new EditableList<EditableTestObject>
+			{
+				EditableTestObject.CreateInstance(1, "John",   60),
+				EditableTestObject.CreateInstance(1, "John",   60),
+				EditableTestObject.CreateInstance(1, "John",   60),
+				EditableTestObject.CreateInstance(2, "Tester", 70),
+				EditableTestObject.CreateInstance(2, "Tester", 70),
+				EditableTestObject.CreateInstance(2, "Tester", 70),
+				EditableTestObject.CreateInstance(3, "Tester", 70),
+				EditableTestObject.CreateInstance(3, "Tester", 70),
+				EditableTestObject.CreateInstance(3, "Tester", 70)
+			};
+
+			var bindingSource = new BindingSource(dataList, null) { Sort = "ID" };
+			var prev          = 0;
+
+			foreach (var o in dataList)
+			{
+				Assert.IsTrue(o.ID >= prev);
+				prev = o.ID;
+			}
+
+			bindingSource[0] = EditableTestObject.CreateInstance(2, "John", 60);
+
+			prev = 0;
+
+			foreach (var o in dataList)
+			{
+				Assert.IsTrue(o.ID >= prev);
+				prev = o.ID;
+			}
+		}
+
+		public class DerivedEditableList<T> : EditableList<T>
+		{
+			public event EventHandler OnListChangedCalled;
+
+			protected void OnOnListChangedCalled()
+			{
+				if (OnListChangedCalled != null)
+					OnListChangedCalled(this, EventArgs.Empty);
+			}
+
+			protected override void OnListChanged(ListChangedEventArgs e)
+			{
+				OnOnListChangedCalled();
+				base.OnListChanged(e);
+			}
+		}
+
+
+		[Test]
+		public void DerivedOnListChanged()
+		{
+			var called = false;
+			var list   = new DerivedEditableList<int>();
+
+			list.OnListChangedCalled += (sender, args) => called = true;
+
+			list.Add(1);
+
+			Assert.IsTrue(called);
+			Assert.AreEqual(1, list.NewItems.Count);
+			Assert.AreEqual(1, list.Count);
+			Assert.AreEqual(0, list.DelItems.Count);
+
+			called = false;
+			list.RemoveAt(0);
+			
+			Assert.IsTrue(called);
+			Assert.AreEqual(0, list.NewItems.Count);
+			Assert.AreEqual(0, list.Count);
+			Assert.AreEqual(0, list.DelItems.Count);
+		}
+
+		[Test]
+		public void CloneTest()
+		{
+			var src   = new EditableList<int> { 1, 2, 3 };
+			var clone = (EditableList<int>)src.Clone();
+
+			Assert.AreEqual(src.Count,          clone.Count);
+			Assert.AreEqual(src.NewItems.Count, clone.NewItems.Count);
+			Assert.AreEqual(src.DelItems.Count, clone.DelItems.Count);
+
+			src.AcceptChanges();
+
+			clone = (EditableList<int>)src.Clone();
+			
+			Assert.AreEqual(src.Count,          clone.Count);
+			Assert.AreEqual(src.NewItems.Count, clone.NewItems.Count);
+			Assert.AreEqual(src.DelItems.Count, clone.DelItems.Count);
+
+			src.RemoveAt(1);
+
+			clone = (EditableList<int>)src.Clone();
+			
+			Assert.AreEqual(src.Count,          clone.Count);
+			Assert.AreEqual(src.NewItems.Count, clone.NewItems.Count);
+			Assert.AreEqual(src.DelItems.Count, clone.DelItems.Count);
+		}
+
+		[Test]
+		public void CreateCleanTest()
+		{
+			var list = new EditableList<int>(new[] { 1, 2, 3 });
+
+			Assert.IsFalse(list.IsDirty);
+
+			Assert.AreEqual(3, list.Count);
+			Assert.AreEqual(0, list.NewItems.Count);
+			Assert.AreEqual(0, list.DelItems.Count);
+			
+			list = new EditableList<int>(new int[] { });
+
+			Assert.IsFalse(list.IsDirty);
+
+			Assert.AreEqual(0, list.Count);
+			Assert.AreEqual(0, list.NewItems.Count);
+			Assert.AreEqual(0, list.DelItems.Count);		
+		}
+
+		[Test]
+		public void IsDirtyTest()
+		{
+			var list = new EditableList<EditableTestObject>();
+
+			list.AddNew();
+			list.AddNew();
+
+			Assert.IsTrue(list.IsDirty);
+
+			list.AcceptChanges();
+
+			Assert.IsFalse(list.IsDirty);
+
+			list[1].ID = 101;
+
+			Assert.IsTrue(list[1].IsDirty);
+			Assert.IsTrue(list.IsDirty);
+		}
+
+		[Test]
+		public void CreateWithDirtyTest()
+		{
+			var to = EditableTestObject.CreateInstance();
+
+			to.ID = 10;
+
+			Assert.IsTrue(to.IsDirty);
+
+			var list = new EditableList<EditableTestObject>(new[] { to });
+
+			Assert.IsTrue(to.IsDirty);
+			Assert.IsTrue(list.IsDirty);
+		}
+	}
+}
\ No newline at end of file