Navigation

CollectionBaseTest.cs

From Mono

	//
	// System.Collections.CollectionBase
	// Test suite for System.Collections.CollectionBase
	//
	// Author:
	//    Nick D. Drochak II
	//
	// (C) 2001 Nick D. Drochak II
	//


	using System;
	using System.Collections;
	using NUnit.Framework;

	namespace MonoTests.System.Collections
	{

	public class CollectionBaseTest : TestCase 	
	{
		public CollectionBaseTest () : base 
			("System.Collection.CollectionBase testsuite") 
			{}
		public CollectionBaseTest (String name) : base (name) 
			{}

		// We need a concrete class to test the abstract base 
		// class
		public class ConcreteCollection : CollectionBase 
		{
			// These fields are used as markers to test 
			// the On* hooks.
			public bool onClearFired;
			public bool onClearCompleteFired;

			public bool onInsertFired;
			public int onInsertIndex;
			public bool onInsertCompleteFired;
			public int onInsertCompleteIndex;

			public bool onRemoveFired;
			public int onRemoveIndex;
			public bool onRemoveCompleteFired;
			public int onRemoveCompleteIndex;

			public bool onSetFired;
			public int onSetOldValue;
			public int onSetNewValue;
			public bool onSetCompleteFired;
			public int onSetCompleteOldValue;
			public int onSetCompleteNewValue;

			// This constructor is used to test OnValid()
			public ConcreteCollection()	
			{
				IList listObj;
				listObj = this;
				listObj.Add(null);
			}

			// This constructor puts consecutive integers into the list
			public ConcreteCollection(int i) {
				IList listObj;
				listObj = this;

				int j;
				for (j = 0; j< i; j++) {
					listObj.Add(j);
				}
			}

			// A helper method to look at a value in the 
			// list at a specific index
			public int PeekAt(int index)
			{
				IList listObj;
				listObj = this;
				return (int) listObj[index];
			}

			// Mark the flag if this hook is fired
			protected override void OnClear() {
				this.onClearFired = true;
			}

			// Mark the flag if this hook is fired
			protected override void OnClearComplete() 
			{
				this.onClearCompleteFired = true;
			}

			// Mark the flag, and save the paramter if 
			// this hook is fired
			protected override void OnInsert(int index, 
							object value) 
			{
				this.onInsertFired = true;
				this.onInsertIndex = index;
			}

			// Mark the flag, and save the paramter if 
			// this hook is fired
			protected override void OnInsertComplete(int index, 
							object value) 
			{
				this.onInsertCompleteFired = true;
				this.onInsertCompleteIndex = index;
			}
		
			// Mark the flag, and save the paramter if this hook 
			// is fired
			protected override void OnRemove(int index, 
							object value) 
			{
				this.onRemoveFired = true;
				this.onRemoveIndex = index;
			}
		
			// Mark the flag, and save the paramter if this hook 
			// is fired
			protected override void OnRemoveComplete(int index, 
								object value) 
			{
				this.onRemoveCompleteFired = true;
				this.onRemoveCompleteIndex = index;
			}
		
			// Mark the flag, and save the paramters if this hook 
			// is fired
			protected override void OnSet(int index, object oldValue, 
								object newValue) 
			{
				this.onSetFired = true;
				this.onSetOldValue = (int) oldValue;
				this.onSetNewValue = (int) newValue;
			}
		
			// Mark the flag, and save the paramters if this hook 
			// is fired
			protected override void OnSetComplete(int index, 
							object oldValue, 
							object newValue) 
			{
				this.onSetCompleteFired = true;
				this.onSetCompleteOldValue = (int) oldValue;
				this.onSetCompleteNewValue = (int) newValue;
			}
		}  // public class ConcreteCollection

		public static ITest Suite {
			get {
				return new TestSuite 
					(typeof(CollectionBaseTest));
			}
		}

		// Check the count property
		public void TestCount() {
			ConcreteCollection myCollection;
			myCollection = new ConcreteCollection(4);
			Assert(4 == myCollection.Count);
		}

	// Make sure GetEnumerator returns an object
	public void TestGetEnumerator() {
		ConcreteCollection myCollection;
		myCollection = new ConcreteCollection(4);
		Assert(null != myCollection.GetEnumerator());
	}

	// OnValid disallows nulls
	public void TestOnValid() {
		ConcreteCollection myCollection;
		try {
			myCollection = new ConcreteCollection();
		}
		catch (ArgumentNullException) {
		}
	}

	// Test various Insert paths
	public void TestInsert() {
		ConcreteCollection myCollection;
		int numberOfItems;
		numberOfItems = 3;
		// The constructor inserts
		myCollection = new ConcreteCollection(numberOfItems);
		Assert(myCollection.onInsertFired);
		Assert(myCollection.onInsertCompleteFired);

		// Using the IList interface, check inserts in the middle
		IList listObj = myCollection;
		listObj.Insert(1, 9);
		Assert(myCollection.onInsertIndex == 1);
		Assert(myCollection.onInsertCompleteIndex == 1);
		Assert(myCollection.PeekAt(1) == 9);
	}

	// Test Clear and it's hooks
	public void TestClear() 
	{
		ConcreteCollection myCollection;
		int numberOfItems;
		numberOfItems = 1;
		myCollection = new ConcreteCollection(numberOfItems);
		myCollection.Clear();
		Assert(myCollection.Count == 0);
		Assert(myCollection.onClearFired);
		Assert(myCollection.onClearCompleteFired);
	}

	// Test RemoveAt, other removes and the hooks
	public void TestRemove() 
	{
		ConcreteCollection myCollection;
		int numberOfItems;
		numberOfItems = 3;
		// Set up a test collection
		myCollection = new ConcreteCollection(numberOfItems);

		// The list is 0-based.  So if we remove the second one
		myCollection.RemoveAt(1);

		// We should see the original third one in it's place
		Assert(myCollection.PeekAt(1) == 2);
		Assert(myCollection.onRemoveFired);
		Assert(myCollection.onRemoveIndex == 1);
		Assert(myCollection.onRemoveCompleteFired);
		Assert(myCollection.onRemoveCompleteIndex == 1);
		IList listObj = myCollection;
		listObj.Remove(0);
		// Confirm parameters are being passed to the hooks
		Assert(myCollection.onRemoveIndex == 0);
		Assert(myCollection.onRemoveCompleteIndex == 0);
	}

	// Test the random access feature
	public void TestSet() 
	{
		ConcreteCollection myCollection;
		int numberOfItems;
		numberOfItems = 3;
		myCollection = new ConcreteCollection(numberOfItems);
		IList listObj = myCollection;
		listObj[0] = 99;
		Assert((int) listObj[0] == 99);
		Assert(myCollection.onSetFired);
		Assert(myCollection.onSetCompleteFired);
		Assert(myCollection.onSetOldValue == 0);
		Assert(myCollection.onSetCompleteOldValue == 0);
		Assert(myCollection.onSetNewValue == 99);
		Assert(myCollection.onSetCompleteNewValue == 99);
	}
}

}