Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

341 lines
8.4 KiB
C#

//
// System.Collections.CollectionBase
// Test suite for System.Collections.CollectionBase
//
// Authors:
// Nick D. Drochak II
// Gonzalo Paniagua Javier (gonzalo@ximian.com)
//
// (C) 2001 Nick D. Drochak II
// (c) 2003 Ximian, Inc. (http://www.ximian.com)
//
using System;
using System.Collections;
using NUnit.Framework;
namespace MonoTests.System.Collections
{
[TestFixture]
public class CollectionBaseTest
{
// 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;
public int mustThrowException;
public bool onValidateFired;
// 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);
}
}
void CheckIfThrow ()
{
if (mustThrowException > 0) {
mustThrowException--;
if (mustThrowException == 0)
throw new Exception ();
}
}
// 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];
}
protected override void OnValidate (object value) {
this.onValidateFired = true;
CheckIfThrow ();
base.OnValidate (value);
}
// Mark the flag if this hook is fired
protected override void OnClear() {
this.onClearFired = true;
CheckIfThrow ();
}
// Mark the flag if this hook is fired
protected override void OnClearComplete()
{
this.onClearCompleteFired = true;
CheckIfThrow ();
}
// 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;
CheckIfThrow ();
}
// 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;
CheckIfThrow ();
}
// 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;
CheckIfThrow ();
}
// 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;
CheckIfThrow ();
}
// 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;
CheckIfThrow ();
}
// 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;
CheckIfThrow ();
}
public IList BaseList {
get { return base.List; }
}
} // public class ConcreteCollection
// Check the count property
[Test]
public void Count() {
ConcreteCollection myCollection;
myCollection = new ConcreteCollection(4);
Assert.IsTrue (4 == myCollection.Count);
}
// Make sure GetEnumerator returns an object
[Test]
public void GetEnumerator() {
ConcreteCollection myCollection;
myCollection = new ConcreteCollection(4);
Assert.IsTrue (null != myCollection.GetEnumerator());
}
// OnValid disallows nulls
[Test]
[ExpectedException(typeof(ArgumentNullException))]
public void OnValid() {
ConcreteCollection myCollection;
myCollection = new ConcreteCollection();
}
// Test various Insert paths
[Test]
public void Insert() {
ConcreteCollection myCollection;
int numberOfItems;
numberOfItems = 3;
// The constructor inserts
myCollection = new ConcreteCollection(numberOfItems);
Assert.IsTrue (myCollection.onInsertFired);
Assert.IsTrue (myCollection.onInsertCompleteFired);
// Using the IList interface, check inserts in the middle
IList listObj = myCollection;
listObj.Insert(1, 9);
Assert.IsTrue (myCollection.onInsertIndex == 1);
Assert.IsTrue (myCollection.onInsertCompleteIndex == 1);
Assert.IsTrue (myCollection.PeekAt(1) == 9);
}
// Test Clear and it's hooks
[Test]
public void Clear()
{
ConcreteCollection myCollection;
int numberOfItems;
numberOfItems = 1;
myCollection = new ConcreteCollection(numberOfItems);
myCollection.Clear();
Assert.IsTrue (myCollection.Count == 0);
Assert.IsTrue (myCollection.onClearFired);
Assert.IsTrue (myCollection.onClearCompleteFired);
}
// Test RemoveAt, other removes and the hooks
[Test]
public void Remove()
{
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.IsTrue (myCollection.PeekAt(1) == 2);
Assert.IsTrue (myCollection.onRemoveFired);
Assert.IsTrue (myCollection.onRemoveIndex == 1);
Assert.IsTrue (myCollection.onRemoveCompleteFired);
Assert.IsTrue (myCollection.onRemoveCompleteIndex == 1);
IList listObj = myCollection;
listObj.Remove(0);
// Confirm parameters are being passed to the hooks
Assert.IsTrue (myCollection.onRemoveIndex == 0);
Assert.IsTrue (myCollection.onRemoveCompleteIndex == 0);
}
// Test the random access feature
[Test]
public void Set()
{
ConcreteCollection myCollection;
int numberOfItems;
numberOfItems = 3;
myCollection = new ConcreteCollection(numberOfItems);
IList listObj = myCollection;
listObj[0] = 99;
Assert.IsTrue ((int) listObj[0] == 99);
Assert.IsTrue (myCollection.onSetFired);
Assert.IsTrue (myCollection.onSetCompleteFired);
Assert.IsTrue (myCollection.onSetOldValue == 0);
Assert.IsTrue (myCollection.onSetCompleteOldValue == 0);
Assert.IsTrue (myCollection.onSetNewValue == 99);
Assert.IsTrue (myCollection.onSetCompleteNewValue == 99);
}
[Test]
public void InsertComplete_Add ()
{
ConcreteCollection coll = new ConcreteCollection (0);
coll.mustThrowException = 1;
try {
coll.BaseList.Add (0);
} catch {
}
Assert.AreEqual (0, coll.Count);
}
[Test]
[ExpectedException (typeof (ArgumentOutOfRangeException))]
public void ValidateCalled ()
{
ConcreteCollection coll = new ConcreteCollection (0);
coll.mustThrowException = 1;
try {
coll.BaseList [5] = 8888;
} catch (ArgumentOutOfRangeException) {
throw;
} finally {
Assert.AreEqual (false, coll.onValidateFired);
}
}
[Test]
public void SetCompleteCalled ()
{
ConcreteCollection coll = new ConcreteCollection (0);
coll.BaseList.Add (88);
coll.mustThrowException = 1;
try {
coll.BaseList [0] = 11;
} catch {
} finally {
Assert.AreEqual (false, coll.onSetCompleteFired);
}
}
[Test]
public void SetCompleteUndo ()
{
ConcreteCollection coll = new ConcreteCollection (0);
bool throwsException = true;
coll.BaseList.Add (88);
coll.onValidateFired = false;
coll.onInsertFired = false;
coll.onSetCompleteFired = false;
coll.mustThrowException = 3;
try {
coll.BaseList [0] = 11;
throwsException = false;
} catch {
} finally {
Assert.IsTrue (throwsException);
Assert.IsTrue (coll.onValidateFired);
Assert.IsTrue (coll.onSetFired);
Assert.IsTrue (coll.onSetCompleteFired);
Assert.AreEqual (88, coll.BaseList [0]);
}
}
[Test]
[ExpectedException (typeof (ArgumentException))]
public void InvalidRemove ()
{
ConcreteCollection coll = new ConcreteCollection (0);
coll.BaseList.Remove (10);
}
}
}