In System.Collections:
[mono.git] / mcs / class / corlib / Test / System.Collections / DictionaryBaseTest.cs
index 92866ebd4d6e57b80f696a3495664725c22fbc7d..96a5eecddf076f8890a29a138b564616cc72ee83 100644 (file)
@@ -8,30 +8,30 @@
 
 using System;
 using System.Collections;
+
 using NUnit.Framework;
 
-namespace MonoTests.System.Collections 
+namespace MonoTests.System.Collections
 {
-
        [TestFixture]
-       public class DictionaryBaseTest: Assertion
+       public class DictionaryBaseTest
        {
-               static void Main(string[] args)
-               {
-               }
-
                public class ConcreteDictionary : DictionaryBase
                {
                        public bool onInsertFired;
                        public bool onInsertCompleteFired;
                        public bool onValidateFired;
+                       public bool onValidateExist;
                        public bool onRemoveFired;
+                       public bool onRemoveExist;
                        public bool onRemoveCompleteFired;
                        public bool onClearFired;
                        public bool onClearCompleteFired;
                        public bool onSetFired;
+                       public bool onSetExist;
                        public bool onSetCompleteFired;
                        public bool onGetFired;
+                       public bool onGetExist;
 
                        public bool onInsertMustThrowException;
                        public bool onInsertCompleteMustThrowException;
@@ -44,26 +44,22 @@ namespace MonoTests.System.Collections
                        public bool onSetCompleteMustThrowException;
                        public bool onGetMustThrowException;
 
-                       public ConcreteDictionary() 
+                       public ConcreteDictionary ()
                        {
                        }
 
-                       public ConcreteDictionary(int i) 
+                       public ConcreteDictionary (int i)
                        {
-                               for (int j = 0; j < i; j++) 
-                               {
-                                       ((IDictionary) this).Add(j, j*2);
-                               }
-
+                               for (int j = 0; j < i; j++)
+                                       ((IDictionary) this).Add (j, j * 2);
                                ClearFlags();
                        }
 
-            public IDictionary BaseDictionary 
-                       {
+                       public IDictionary BaseDictionary {
                                get { return this.Dictionary; }
                        }
 
-                       public void ClearFlags() 
+                       public void ClearFlags ()
                        {
                                onInsertFired = false;
                                onInsertCompleteFired = false;
@@ -77,546 +73,772 @@ namespace MonoTests.System.Collections
                                onGetFired = false;
                        }
 
-                       protected override void OnValidate(object key, object value)
+                       protected override void OnValidate (object key, object value)
                        {
                                onValidateFired = true;
+                               if (key != null)
+                                       Assert.AreEqual (onValidateExist, BaseDictionary.Contains (key));
                                if (onValidateMustThrowException)
-                                       throw new Exception();
+                                       throw new Exception ();
                                base.OnValidate (key, value);
                        }
 
-                       protected override void OnInsert(object key, object value)
+                       protected override void OnInsert (object key, object value)
                        {
                                onInsertFired = true;
+                               Assert.IsFalse (BaseDictionary.Contains (key));
                                if (onInsertMustThrowException)
-                                       throw new Exception();
+                                       throw new Exception ();
                                base.OnInsert (key, value);
                        }
 
-                       protected override void OnInsertComplete(object key, object value)
+                       protected override void OnInsertComplete (object key, object value)
                        {
                                onInsertCompleteFired = true;
+                               Assert.IsTrue (BaseDictionary.Contains (key));
                                if (onInsertCompleteMustThrowException)
-                                       throw new Exception();
+                                       throw new Exception ();
                                base.OnInsertComplete (key, value);
                        }
 
-                       protected override void OnRemove(object key, object value)
+                       protected override void OnRemove (object key, object value)
                        {
                                onRemoveFired = true;
+                               Assert.AreEqual (onRemoveExist, BaseDictionary.Contains (key));
                                if (onRemoveMustThrowException)
-                                       throw new Exception();
+                                       throw new Exception ();
                                base.OnRemove (key, value);
                        }
 
-                       protected override void OnRemoveComplete(object key, object value)
+                       protected override void OnRemoveComplete (object key, object value)
                        {
                                onRemoveCompleteFired = true;
+                               Assert.IsFalse (BaseDictionary.Contains (key));
                                if (onRemoveCompleteMustThrowException)
-                                       throw new Exception();
+                                       throw new Exception ();
                                base.OnRemoveComplete (key, value);
                        }
 
-
-                       protected override void OnClear()
+                       protected override void OnClear ()
                        {
                                onClearFired = true;
                                if (onClearMustThrowException)
-                                       throw new Exception();
+                                       throw new Exception ();
                                base.OnClear ();
                        }
 
-                       protected override void OnClearComplete()
+                       protected override void OnClearComplete ()
                        {
                                onClearCompleteFired = true;
+                               Assert.AreEqual (0, BaseDictionary.Count);
                                if (onClearCompleteMustThrowException)
-                                       throw new Exception();
+                                       throw new Exception ();
                                base.OnClearComplete ();
                        }
 
-                       protected override object OnGet(object key, object currentValue)
+                       protected override object OnGet (object key, object currentValue)
                        {
                                onGetFired = true;
+                               Assert.AreEqual (onGetExist, BaseDictionary.Contains (key));
                                if (onGetMustThrowException)
-                                       throw new Exception();
+                                       throw new Exception ();
                                return base.OnGet (key, currentValue);
                        }
 
-                       protected override void OnSet(object key, object oldValue, object newValue)
+                       protected override void OnSet (object key, object oldValue, object newValue)
                        {
                                onSetFired = true;
+                               Assert.AreEqual (onSetExist, BaseDictionary.Contains (key));
                                if (onSetMustThrowException)
-                                       throw new Exception();
+                                       throw new Exception ();
                                base.OnSet (key, oldValue, newValue);
                        }
 
-                       protected override void OnSetComplete(object key, object oldValue, object newValue)
+                       protected override void OnSetComplete (object key, object oldValue, object newValue)
                        {
                                onSetCompleteFired = true;
+                               Assert.IsTrue (BaseDictionary.Contains (key));
                                if (onSetCompleteMustThrowException)
-                                       throw new Exception();
+                                       throw new Exception ();
                                base.OnSetComplete (key, oldValue, newValue);
                        }
                }
 
                [Test]
-               public void Add() 
+               public void Add ()
                {
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(10);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (10);
                        myDictionary.BaseDictionary.Add(100, 1);
 
-                       Assert("OnValidate must be fired", myDictionary.onValidateFired);
-                       Assert("OnInsert must be fired", myDictionary.onInsertFired);
-                       Assert("OnInsertComplete must be fired", myDictionary.onInsertCompleteFired);
-                       AssertEquals("Count", 11, myDictionary.Count);
-                       AssertEquals(1, myDictionary.BaseDictionary[100]);
+                       Assert.IsTrue (myDictionary.onInsertFired, "#1");
+                       Assert.IsTrue (myDictionary.onInsertCompleteFired, "#2");
+                       Assert.IsTrue (myDictionary.onValidateFired, "#3");
+                       Assert.IsFalse (myDictionary.onRemoveFired, "#4");
+                       Assert.IsFalse (myDictionary.onRemoveCompleteFired, "#5");
+                       Assert.IsFalse (myDictionary.onClearFired, "#6");
+                       Assert.IsFalse (myDictionary.onClearCompleteFired, "#7");
+                       Assert.IsFalse (myDictionary.onSetFired, "#8");
+                       Assert.IsFalse (myDictionary.onSetCompleteFired, "#9");
+                       Assert.IsFalse (myDictionary.onGetFired, "#10");
+                       Assert.AreEqual (11, myDictionary.Count, "#11");
+                       myDictionary.onGetExist = true;
+                       Assert.AreEqual (1, myDictionary.BaseDictionary [100], "#12");
                }
 
                [Test]
-               public void AddOnValidateExcept() 
+               public void AddOnValidateExcept ()
                {
-                       bool exceptionThrown = false;
-
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(30);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (30);
                        myDictionary.onValidateMustThrowException = true;
 
                        try {
                                myDictionary.BaseDictionary.Add(111,222);
-                       } catch {
-                               exceptionThrown = true;
-                       } finally {
-                               Assert("Exception must be thrown", exceptionThrown);
-                               Assert("OnValidate must be fired", myDictionary.onValidateFired);
-                               Assert("OnInsert must not be fired", !myDictionary.onInsertFired);
-                               Assert("OnInsertComplete must not be fired", !myDictionary.onInsertCompleteFired);
-                               AssertEquals("Count", 30, myDictionary.Count);
+                               Assert.Fail ("#A1");
+                       } catch (AssertionException) {
+                               throw;
+                       } catch (Exception ex) {
+                               Assert.AreEqual (typeof (Exception), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
                        }
 
+                       Assert.IsFalse (myDictionary.onInsertFired, "#B1");
+                       Assert.IsFalse (myDictionary.onInsertCompleteFired, "#B2");
+                       Assert.IsTrue (myDictionary.onValidateFired, "#B3");
+                       Assert.IsFalse (myDictionary.onRemoveFired, "#B4");
+                       Assert.IsFalse (myDictionary.onRemoveCompleteFired, "#B5");
+                       Assert.IsFalse (myDictionary.onClearFired, "#B6");
+                       Assert.IsFalse (myDictionary.onClearCompleteFired, "#B7");
+                       Assert.IsFalse (myDictionary.onSetFired, "#B8");
+                       Assert.IsFalse (myDictionary.onSetCompleteFired, "#B9");
+                       Assert.IsFalse (myDictionary.onGetFired, "#B10");
+                       Assert.AreEqual (30, myDictionary.Count, "#B11");
                }
 
                [Test]
-               public void AddOnInsertExcept() 
+               public void AddOnInsertExcept ()
                {
-                       bool exceptionThrown = false;
-
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(30);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (30);
                        myDictionary.onInsertMustThrowException = true;
 
                        try {
-                               myDictionary.BaseDictionary.Add(666,222);
-                       } catch {
-                               exceptionThrown = true;
-                       } finally {
-                               Assert("Exception must be thrown", exceptionThrown);
-                               Assert("OnValidate must be fired", myDictionary.onValidateFired);
-                               Assert("OnInsert must be fired", myDictionary.onInsertFired);
-                               Assert("OnInsertComplete must not be fired", !myDictionary.onInsertCompleteFired);
-                               AssertEquals("Count", 30, myDictionary.Count);
+                               myDictionary.BaseDictionary.Add (666, 222);
+                               Assert.Fail ("#A1");
+                       } catch (AssertionException) {
+                               throw;
+                       } catch (Exception ex) {
+                               Assert.AreEqual (typeof (Exception), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
                        }
 
+                       Assert.IsTrue (myDictionary.onValidateFired, "#B1");
+                       Assert.IsTrue (myDictionary.onInsertFired, "#B2");
+                       Assert.IsFalse (myDictionary.onInsertCompleteFired, "#B3");
+                       Assert.AreEqual (30, myDictionary.Count, "#B4");
                }
 
                [Test]
-               public void AddOnInsertCompleteExcept() 
+               public void AddOnInsertCompleteExcept ()
                {
-                       bool exceptionThrown = false;
-
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(5);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (5);
                        myDictionary.onInsertCompleteMustThrowException = true;
 
                        try {
-                               myDictionary.BaseDictionary.Add(888,999);
-                       } catch {
-                               exceptionThrown = true;
-                       } finally {
-                               Assert("Exception must be thrown", exceptionThrown);
-                               Assert("OnValidate must be fired", myDictionary.onValidateFired);
-                               Assert("OnInsert must be fired", myDictionary.onInsertFired);
-                               Assert("OnInsertComplete must be fired", myDictionary.onInsertCompleteFired);
-                               AssertEquals("Count", 5, myDictionary.Count);
+                               myDictionary.BaseDictionary.Add (888, 999);
+                               Assert.Fail ("#A1");
+                       } catch (AssertionException) {
+                               throw;
+                       } catch (Exception ex) {
+                               Assert.AreEqual (typeof (Exception), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
                        }
 
+                       Assert.IsTrue (myDictionary.onValidateFired, "#B1");
+                       Assert.IsTrue (myDictionary.onInsertFired, "#B2");
+                       Assert.IsTrue (myDictionary.onInsertCompleteFired, "#B3");
+                       Assert.AreEqual (5, myDictionary.Count, "#B4");
                }
 
                [Test]
-               public void AddNullKey() 
+               public void AddNullKey ()
                {
-                       bool exceptionThrown = false;
+                       ConcreteDictionary myDictionary = new ConcreteDictionary ();
 
-                       ConcreteDictionary myDictionary = new ConcreteDictionary();
                        try {
-                               myDictionary.BaseDictionary.Add(null, 11);
-                       } catch (ArgumentNullException) {
-                               exceptionThrown = true;
-                       } finally {
-                               Assert("OnValidate must be fired", myDictionary.onValidateFired);
-                               Assert("OnInsert must be fired", myDictionary.onInsertFired);
-                               Assert("OnInsertComplete must not be fired", !myDictionary.onInsertCompleteFired);
-                               Assert("ArgumentNullException must be thrown", exceptionThrown);
+                               myDictionary.BaseDictionary.Add (null, 11);
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentNullException ex) {
+                               Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                               Assert.AreEqual ("key", ex.ParamName, "#A5");
                        }
+
+                       Assert.IsTrue (myDictionary.onValidateFired, "#B1");
+                       Assert.IsTrue (myDictionary.onInsertFired, "#B2");
+                       Assert.IsFalse (myDictionary.onInsertCompleteFired, "#B3");
                }
 
                [Test]
-               public void Clear() 
+               public void Clear ()
                {
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(30);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (30);
                        myDictionary.Clear();
 
-                       Assert("OnClear must be fired", myDictionary.onClearFired);
-                       Assert("OnClearComplete must be fired", myDictionary.onClearCompleteFired);
-                       AssertEquals("Count", 0, myDictionary.Count);
+                       Assert.IsTrue (myDictionary.onClearFired, "#1");
+                       Assert.IsTrue (myDictionary.onClearCompleteFired, "#2");
+                       Assert.AreEqual (0, myDictionary.Count, "#3");
                }
 
                [Test]
-               public void ClearOnClearExcept() 
+               public void ClearOnClearExcept ()
                {
-                       bool exceptionThrown = false;
-
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(30);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (30);
                        myDictionary.onClearMustThrowException = true;
 
                        try {
-                               myDictionary.Clear();
-                       } catch {
-                               exceptionThrown = true;
-                       } finally {
-                               Assert("Exception must be thrown", exceptionThrown);
-                               Assert("OnClear must be fired", myDictionary.onClearFired);
-                               Assert("OnClearComplete must not be fired", !myDictionary.onClearCompleteFired);
-                               AssertEquals("Count", 30, myDictionary.Count);
+                               myDictionary.Clear ();
+                               Assert.Fail ("#A1");
+                       } catch (AssertionException) {
+                               throw;
+                       } catch (Exception ex) {
+                               Assert.AreEqual (typeof (Exception), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
                        }
 
+                       Assert.IsTrue (myDictionary.onClearFired, "#B1");
+                       Assert.IsFalse (myDictionary.onClearCompleteFired, "#B2");
+                       Assert.AreEqual (30, myDictionary.Count, "#B3");
                }
 
                [Test]
-               public void ClearOnClearCompleteExcept() 
+               public void ClearOnClearCompleteExcept ()
                {
-                       bool exceptionThrown = false;
-
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(30);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (30);
                        myDictionary.onClearCompleteMustThrowException = true;
 
                        try {
                                myDictionary.Clear();
-                       } catch {
-                               exceptionThrown = true;
-                       } finally {
-                               Assert("Exception must be thrown", exceptionThrown);
-                               Assert("OnClear must be fired", myDictionary.onClearFired);
-                               Assert("OnClearComplete must be fired", myDictionary.onClearCompleteFired);
-                               AssertEquals("Count", 0, myDictionary.Count);
+                               Assert.Fail ("#A1");
+                       } catch (AssertionException) {
+                               throw;
+                       } catch (Exception ex) {
+                               Assert.AreEqual (typeof (Exception), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
                        }
 
+                       Assert.IsFalse (myDictionary.onInsertFired, "#B1");
+                       Assert.IsFalse (myDictionary.onInsertCompleteFired, "#B2");
+                       Assert.IsFalse (myDictionary.onValidateFired, "#B3");
+                       Assert.IsFalse (myDictionary.onRemoveFired, "#B4");
+                       Assert.IsFalse (myDictionary.onRemoveCompleteFired, "#B5");
+                       Assert.IsTrue (myDictionary.onClearFired, "#B6");
+                       Assert.IsTrue (myDictionary.onClearCompleteFired, "#B7");
+                       Assert.IsFalse (myDictionary.onSetFired, "#B8");
+                       Assert.IsFalse (myDictionary.onSetCompleteFired, "#B9");
+                       Assert.IsFalse (myDictionary.onGetFired, "#B10");
+                       Assert.AreEqual (0, myDictionary.Count, "#B11");
                }
 
                [Test]
-               public void Count() 
+               public void Count ()
                {
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(19);
-                       AssertEquals(19, myDictionary.Count);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (19);
+                       Assert.AreEqual (19, myDictionary.Count);
                }
 
                [Test]
-               public void Remove() 
+               public void Remove ()
                {
                        ConcreteDictionary myDictionary = new ConcreteDictionary(8);
-                       myDictionary.BaseDictionary.Remove(5);
-
-                       Assert("OnValidate must be fired", myDictionary.onValidateFired);
-                       Assert("OnRemove must be fired", myDictionary.onRemoveFired);
-                       Assert("OnRemoveComplete must be fired", myDictionary.onRemoveCompleteFired);
-                       AssertEquals("Count", 7, myDictionary.Count);
-                       AssertEquals(null, myDictionary.BaseDictionary[5]);
+                       myDictionary.onValidateExist = true;
+                       myDictionary.onRemoveExist = true;
+                       myDictionary.BaseDictionary.Remove (5);
+
+                       Assert.IsFalse (myDictionary.onInsertFired, "#1");
+                       Assert.IsFalse (myDictionary.onInsertCompleteFired, "#2");
+                       Assert.IsTrue (myDictionary.onValidateFired, "#3");
+                       Assert.IsTrue (myDictionary.onRemoveFired, "#4");
+                       Assert.IsTrue (myDictionary.onRemoveCompleteFired, "#5");
+                       Assert.IsFalse (myDictionary.onClearFired, "#6");
+                       Assert.IsFalse (myDictionary.onClearCompleteFired, "#7");
+                       Assert.IsFalse (myDictionary.onSetFired, "#8");
+                       Assert.IsFalse (myDictionary.onSetCompleteFired, "#9");
+                       Assert.IsFalse (myDictionary.onGetFired, "#10");
+                       Assert.AreEqual (7, myDictionary.Count, "#11");
+                       Assert.IsNull (myDictionary.BaseDictionary [5], "#12");
                }
 
                [Test]
-               public void RemoveOnValidateExcept() 
+               public void RemoveOnValidateExcept ()
                {
-                       bool exceptionThrown = false;
-
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(28);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (28);
+                       myDictionary.onValidateExist = true;
                        myDictionary.onValidateMustThrowException = true;
 
                        try {
-                               myDictionary.BaseDictionary.Remove(11);
-                       } catch {
-                               exceptionThrown = true;
-                       } finally {
-                               Assert("Exception must be thrown in this test", exceptionThrown);
-                               Assert("OnValidate must be fired", myDictionary.onValidateFired);
-                               Assert("OnRemove must not be fired", !myDictionary.onRemoveFired);
-                               Assert("OnRemoveComplete must not be fired", !myDictionary.onRemoveCompleteFired);
-                               AssertEquals("Count", 28, myDictionary.Count);
-                               AssertEquals(22, myDictionary.BaseDictionary[11]);
+                               myDictionary.BaseDictionary.Remove (11);
+                               Assert.Fail ("#A1");
+                       } catch (AssertionException) {
+                               throw;
+                       } catch (Exception ex) {
+                               Assert.AreEqual (typeof (Exception), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
                        }
 
+                       Assert.IsFalse (myDictionary.onInsertFired, "#B1");
+                       Assert.IsFalse (myDictionary.onInsertCompleteFired, "#B2");
+                       Assert.IsTrue (myDictionary.onValidateFired, "#B3");
+                       Assert.IsFalse (myDictionary.onRemoveFired, "#B4");
+                       Assert.IsFalse (myDictionary.onRemoveCompleteFired, "#B5");
+                       Assert.IsFalse (myDictionary.onClearFired, "#B6");
+                       Assert.IsFalse (myDictionary.onClearCompleteFired, "#B7");
+                       Assert.IsFalse (myDictionary.onSetFired, "#B8");
+                       Assert.IsFalse (myDictionary.onSetCompleteFired, "#B9");
+                       Assert.IsFalse (myDictionary.onGetFired, "#B10");
+                       Assert.AreEqual (28, myDictionary.Count, "#B11");
+                       myDictionary.onGetExist = true;
+                       Assert.AreEqual (22, myDictionary.BaseDictionary [11], "#B12");
                }
 
                [Test]
-               public void RemoveOnRemoveExcept() 
+               public void RemoveOnRemoveExcept ()
                {
-                       bool exceptionThrown = false;
-
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(28);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (28);
+                       myDictionary.onValidateExist = true;
+                       myDictionary.onRemoveExist = true;
                        myDictionary.onRemoveMustThrowException = true;
 
                        try {
-                               myDictionary.BaseDictionary.Remove(11);
-                       } catch {
-                               exceptionThrown = true;
-                       } finally {
-                               Assert("Exception must be thrown", exceptionThrown);
-                               Assert("OnValidate must be fired", myDictionary.onValidateFired);
-                               Assert("OnRemove must be fired", myDictionary.onRemoveFired);
-                               Assert("OnRemoveComplete must not be fired", !myDictionary.onRemoveCompleteFired);
-                               AssertEquals("Count", 28, myDictionary.Count);
-                               AssertEquals(22, myDictionary.BaseDictionary[11]);
+                               myDictionary.BaseDictionary.Remove (11);
+                               Assert.Fail ("#A1");
+                       } catch (AssertionException) {
+                               throw;
+                       } catch (Exception ex) {
+                               Assert.AreEqual (typeof (Exception), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
                        }
 
+                       Assert.IsFalse (myDictionary.onInsertFired, "#B1");
+                       Assert.IsFalse (myDictionary.onInsertCompleteFired, "#B2");
+                       Assert.IsTrue (myDictionary.onValidateFired, "#B3");
+                       Assert.IsTrue (myDictionary.onRemoveFired, "#B4");
+                       Assert.IsFalse (myDictionary.onRemoveCompleteFired, "#B5");
+                       Assert.IsFalse (myDictionary.onClearFired, "#B6");
+                       Assert.IsFalse (myDictionary.onClearCompleteFired, "#B7");
+                       Assert.IsFalse (myDictionary.onSetFired, "#B8");
+                       Assert.IsFalse (myDictionary.onSetCompleteFired, "#B9");
+                       Assert.IsFalse (myDictionary.onGetFired, "#B10");
+                       Assert.AreEqual (28, myDictionary.Count, "#B11");
+                       myDictionary.onGetExist = true;
+                       Assert.AreEqual (22, myDictionary.BaseDictionary [11], "#B12");
                }
 
                [Test]
-               public void RemoveOnRemoveCompleteExcept() 
+               public void RemoveOnRemoveCompleteExcept ()
                {
-                       bool exceptionThrown = false;
-
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(28);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (28);
+                       myDictionary.onValidateExist = true;
+                       myDictionary.onRemoveExist = true;
                        myDictionary.onRemoveCompleteMustThrowException = true;
 
-                       try 
-                       {
-                               myDictionary.BaseDictionary.Remove(11);
-                       } 
-                       catch 
-                       {
-                               exceptionThrown = true;
-                       } 
-                       finally 
-                       {
-                               Assert("Exception must be thrown", exceptionThrown);
-                               Assert("OnValidate must be fired", myDictionary.onValidateFired);
-                               Assert("OnRemove must be fired", myDictionary.onRemoveFired);
-                               Assert("OnRemoveComplete must be fired", myDictionary.onRemoveCompleteFired);
-                               AssertEquals("Count", 27, myDictionary.Count);
-                               AssertEquals(null, myDictionary.BaseDictionary[11]);
+                       try {
+                               myDictionary.BaseDictionary.Remove (11);
+                               Assert.Fail ("#A1");
+                       } catch (AssertionException) {
+                               throw;
+                       } catch (Exception ex) {
+                               Assert.AreEqual (typeof (Exception), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
                        }
 
+                       Assert.IsFalse (myDictionary.onInsertFired, "#B1");
+                       Assert.IsFalse (myDictionary.onInsertCompleteFired, "#B2");
+                       Assert.IsTrue (myDictionary.onValidateFired, "#B3");
+                       Assert.IsTrue (myDictionary.onRemoveFired, "#B4");
+                       Assert.IsTrue (myDictionary.onRemoveCompleteFired, "#B5");
+                       Assert.IsFalse (myDictionary.onClearFired, "#B6");
+                       Assert.IsFalse (myDictionary.onClearCompleteFired, "#B7");
+                       Assert.IsFalse (myDictionary.onSetFired, "#B8");
+                       Assert.IsFalse (myDictionary.onSetCompleteFired, "#B9");
+                       Assert.IsFalse (myDictionary.onGetFired, "#B10");
+#if NET_2_0
+                       myDictionary.onGetExist = true;
+                       Assert.AreEqual (28, myDictionary.Count, "#B11");
+                       Assert.AreEqual (22, myDictionary.BaseDictionary [11], "#B12");
+#else
+                       Assert.AreEqual (27, myDictionary.Count, "#B11");
+                       Assert.IsNull (myDictionary.BaseDictionary [11], "#B12");
+#endif
                }
 
                [Test]
-               public void RemoveKeyNotInDictionary() 
-               {
-               
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(28);
-
-                       myDictionary.BaseDictionary.Remove(80);
-                       Assert("OnValidate must be fired", myDictionary.onValidateFired);
-                       Assert("OnRemove must be fired", myDictionary.onRemoveFired);
-                       Assert("OnRemoveComplete must be fired", myDictionary.onRemoveCompleteFired);
-                }
+               public void RemoveKeyNotInDictionary ()
+               {
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (28);
+                       myDictionary.BaseDictionary.Remove (80);
+
+                       Assert.IsFalse (myDictionary.onInsertFired, "#B1");
+                       Assert.IsFalse (myDictionary.onInsertCompleteFired, "#B2");
+#if NET_2_0
+                       Assert.IsFalse (myDictionary.onValidateFired, "#1");
+                       Assert.IsFalse (myDictionary.onRemoveFired, "#2");
+                       Assert.IsFalse (myDictionary.onRemoveCompleteFired, "#3");
+#else
+                       Assert.IsTrue (myDictionary.onValidateFired, "#1");
+                       Assert.IsTrue (myDictionary.onRemoveFired, "#2");
+                       Assert.IsTrue (myDictionary.onRemoveCompleteFired, "#3");
+#endif
+                       Assert.IsFalse (myDictionary.onClearFired, "#B6");
+                       Assert.IsFalse (myDictionary.onClearCompleteFired, "#B7");
+                       Assert.IsFalse (myDictionary.onSetFired, "#B8");
+                       Assert.IsFalse (myDictionary.onSetCompleteFired, "#B9");
+                       Assert.IsFalse (myDictionary.onGetFired, "#B10");
+               }
 
                [Test]
-               public void Items() 
+               public void Items ()
                {
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(19);
-                       for (int i = 0; i < 19; i++) 
-                       {
-                               AssertEquals(i*2, (int) myDictionary.BaseDictionary[i]);
-                       }
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (19);
+                       myDictionary.onGetExist = true;
+
+                       for (int i = 0; i < 19; i++)
+                               Assert.AreEqual (i * 2, (int) myDictionary.BaseDictionary [i]);
                }
 
                [Test]
-               public void Contains() 
+               public void Contains ()
                {
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(14);
-                       for (int i = 0; i < 14; i++) 
-                       {
-                               Assert("Must contain " + i, myDictionary.BaseDictionary.Contains(i));
-                       }
-                       for (int i = 14; i < 34; i++) 
-                       {
-                               Assert("Must not contain " + i, !myDictionary.BaseDictionary.Contains(i));
-                       }
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (14);
+                       for (int i = 0; i < 14; i++)
+                               Assert.IsTrue (myDictionary.BaseDictionary.Contains (i), "Must contain " + i);
+                       for (int i = 14; i < 34; i++)
+                               Assert.IsFalse (myDictionary.BaseDictionary.Contains (i), "Must not contain " + i);
                }
 
                [Test]
-               public void GetEnumerator() 
+               public void GetEnumerator ()
                {
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(4);
-                       
-                       AssertNotNull(myDictionary.GetEnumerator());
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (4);
+                       Assert.IsNotNull (myDictionary.GetEnumerator ());
                }
 
                [Test]
-               public void Keys() 
+               public void Keys ()
                {
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(5);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (5);
                        ICollection keys = myDictionary.BaseDictionary.Keys;
 
                        int total = 0;
-                       foreach (int i in keys) 
+                       foreach (int i in keys)
                                total += i;
-                       AssertEquals(10, total);
-                       AssertEquals(5, keys.Count);
+                       Assert.AreEqual (10, total, "#1");
+                       Assert.AreEqual (5, keys.Count, "#2");
                }
 
                [Test]
-               public void Values() 
+               public void Values ()
                {
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(5);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (5);
                        ICollection values = myDictionary.BaseDictionary.Values;
 
                        int total = 0;
-                       foreach (int i in values) 
+                       foreach (int i in values)
                                total += i;
-                       AssertEquals(20, total);
-                       AssertEquals(5, values.Count);
+                       Assert.AreEqual (20, total, "#1");
+                       Assert.AreEqual (5, values.Count, "#2");
                }
 
                [Test]
-               public void Get() 
+               public void Get ()
                {
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(18);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (18);
+                       myDictionary.onGetExist = true;
                        int v = (int) myDictionary.BaseDictionary[10];
 
-                       Assert("OnGet must be fired", myDictionary.onGetFired);
-                       AssertEquals(v, 20);
+                       Assert.IsFalse (myDictionary.onInsertFired, "#1");
+                       Assert.IsFalse (myDictionary.onInsertCompleteFired, "#2");
+                       Assert.IsFalse (myDictionary.onValidateFired, "#3");
+                       Assert.IsFalse (myDictionary.onRemoveFired, "#4");
+                       Assert.IsFalse (myDictionary.onRemoveCompleteFired, "#5");
+                       Assert.IsFalse (myDictionary.onClearFired, "#6");
+                       Assert.IsFalse (myDictionary.onClearCompleteFired, "#7");
+                       Assert.IsFalse (myDictionary.onSetFired, "#8");
+                       Assert.IsFalse (myDictionary.onSetCompleteFired, "#9");
+                       Assert.IsTrue (myDictionary.onGetFired, "#10");
+                       Assert.AreEqual (20, v, "#11");
                }
 
                [Test]
-               public void GetOnGetExcept() 
+               public void GetOnGetExcept ()
                {
-                       bool exceptionThrown = false;
-
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(18);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (18);
+                       myDictionary.onGetExist = true;
                        myDictionary.onGetMustThrowException = true;
 
                        try {
-                               int v = (int) myDictionary.BaseDictionary[10];
-                       } catch {
-                               exceptionThrown = true;
-                       } finally {
-                               Assert("Exception must be thrown", exceptionThrown);
-                               Assert("OnGet must be fired", myDictionary.onGetFired);
+                               int v = (int) myDictionary.BaseDictionary [10];
+                               Assert.Fail ("#1:" + v);
+                       } catch (AssertionException) {
+                               throw;
+                       } catch (Exception ex) {
+                               Assert.AreEqual (typeof (Exception), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
                        }
+
+                       Assert.IsFalse (myDictionary.onInsertFired, "#B1");
+                       Assert.IsFalse (myDictionary.onInsertCompleteFired, "#B2");
+                       Assert.IsFalse (myDictionary.onValidateFired, "#B3");
+                       Assert.IsFalse (myDictionary.onRemoveFired, "#B4");
+                       Assert.IsFalse (myDictionary.onRemoveCompleteFired, "#B5");
+                       Assert.IsFalse (myDictionary.onClearFired, "#B6");
+                       Assert.IsFalse (myDictionary.onClearCompleteFired, "#B7");
+                       Assert.IsFalse (myDictionary.onSetFired, "#B8");
+                       Assert.IsFalse (myDictionary.onSetCompleteFired, "#B9");
+                       Assert.IsTrue (myDictionary.onGetFired, "#B10");
                }
 
                [Test]
-               public void GetNoKey() 
+               public void GetNoKey ()
                {
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(18);
-                       AssertNull(myDictionary.BaseDictionary[100]);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (18);
+                       Assert.IsNull (myDictionary.BaseDictionary [100]);
                }
 
                [Test]
-               public void Set() 
+               public void Set ()
                {
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(18);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (18);
+                       myDictionary.onValidateExist = true;
+                       myDictionary.onSetExist = true;
                        myDictionary.BaseDictionary[10] = 50;
 
-                       Assert("OnValidate must be fired", myDictionary.onValidateFired);
-                       Assert("OnSet must be fired", myDictionary.onSetFired);
-                       Assert("OnSetComplete must be fired", myDictionary.onSetCompleteFired);
-                       AssertEquals(50, myDictionary.BaseDictionary[10]);
+                       Assert.IsFalse (myDictionary.onInsertFired, "#1");
+                       Assert.IsFalse (myDictionary.onInsertCompleteFired, "#2");
+                       Assert.IsTrue (myDictionary.onValidateFired, "#3");
+                       Assert.IsFalse (myDictionary.onRemoveFired, "#4");
+                       Assert.IsFalse (myDictionary.onRemoveCompleteFired, "#5");
+                       Assert.IsFalse (myDictionary.onClearFired, "#6");
+                       Assert.IsFalse (myDictionary.onClearCompleteFired, "#7");
+                       Assert.IsTrue (myDictionary.onSetFired, "#8");
+                       Assert.IsTrue (myDictionary.onSetCompleteFired, "#9");
+                       Assert.IsFalse (myDictionary.onGetFired, "#10");
+                       myDictionary.onGetExist = true;
+                       Assert.AreEqual (50, myDictionary.BaseDictionary [10], "#11");
                }
 
                [Test]
-               public void SetNewKey() 
+               public void SetNewKey ()
                {
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(18);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (18);
                        myDictionary.BaseDictionary[111] = 222;
 
-                       Assert("OnValidate must be fired", myDictionary.onValidateFired);
-                       Assert("OnSet must be fired", myDictionary.onSetFired);
-                       Assert("OnSetComplete must be fired", myDictionary.onSetCompleteFired);
-                       Assert("OnInsert must not be fired", !myDictionary.onInsertFired);
-                       Assert("OnInsertComplete must not be fired", !myDictionary.onInsertCompleteFired);
-                       AssertEquals(222, myDictionary.BaseDictionary[111]);
-                       AssertEquals(19, myDictionary.Count);
+                       Assert.IsFalse (myDictionary.onInsertFired, "#1");
+                       Assert.IsFalse (myDictionary.onInsertCompleteFired, "#2");
+                       Assert.IsTrue (myDictionary.onValidateFired, "#3");
+                       Assert.IsFalse (myDictionary.onRemoveFired, "#4");
+                       Assert.IsFalse (myDictionary.onRemoveCompleteFired, "#5");
+                       Assert.IsFalse (myDictionary.onClearFired, "#6");
+                       Assert.IsFalse (myDictionary.onClearCompleteFired, "#7");
+                       Assert.IsTrue (myDictionary.onSetFired, "#8");
+                       Assert.IsTrue (myDictionary.onSetCompleteFired, "#9");
+                       Assert.IsFalse (myDictionary.onGetFired, "#10");
+                       myDictionary.onGetExist = true;
+                       Assert.AreEqual (222, myDictionary.BaseDictionary [111], "#11");
+                       Assert.AreEqual (19, myDictionary.Count, "#12");
                }
 
                [Test]
-               public void SetOnValidateExcept() 
+               public void SetOnValidateExcept()
                {
-                       bool exceptionThrown = false;
-
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(18);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (18);
+                       myDictionary.onValidateExist = true;
                        myDictionary.onValidateMustThrowException = true;
                        
                        try {
                                myDictionary.BaseDictionary[10] = 50;
-                       } catch {
-                               exceptionThrown = true;
-                       } finally {
-                               Assert("Exception must be thrown", exceptionThrown);
-                               Assert("OnValidate must be fired", myDictionary.onValidateFired);
-                               Assert("OnSet must not be fired", !myDictionary.onSetFired);
-                               Assert("OnSetComplete not must be fired", !myDictionary.onSetCompleteFired);
-                               AssertEquals(20, myDictionary.BaseDictionary[10]);
+                               Assert.Fail ("#A1");
+                       } catch (AssertionException) {
+                               throw;
+                       } catch (Exception ex) {
+                               Assert.AreEqual (typeof (Exception), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
                        }
+
+                       Assert.IsFalse (myDictionary.onInsertFired, "#B1");
+                       Assert.IsFalse (myDictionary.onInsertCompleteFired, "#B2");
+                       Assert.IsTrue (myDictionary.onValidateFired, "#B3");
+                       Assert.IsFalse (myDictionary.onRemoveFired, "#B4");
+                       Assert.IsFalse (myDictionary.onRemoveCompleteFired, "#B5");
+                       Assert.IsFalse (myDictionary.onClearFired, "#B6");
+                       Assert.IsFalse (myDictionary.onClearCompleteFired, "#B7");
+                       Assert.IsFalse (myDictionary.onSetFired, "#B8");
+                       Assert.IsFalse (myDictionary.onSetCompleteFired, "#B9");
+                       Assert.IsFalse (myDictionary.onGetFired, "#B10");
+                       myDictionary.onGetExist = true;
+                       Assert.AreEqual (20, myDictionary.BaseDictionary [10], "#B11");
                }
 
                [Test]
-               public void SetOnSetExcept() 
+               public void SetOnSetExcept()
                {
-                       bool exceptionThrown = false;
-
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(18);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (18);
+                       myDictionary.onValidateExist = true;
+                       myDictionary.onSetExist = true;
                        myDictionary.onSetMustThrowException = true;
                        
                        try {
                                myDictionary.BaseDictionary[10] = 50;
-                       } catch {
-                               exceptionThrown = true;
-                       } finally {
-                               Assert("Exception must be thrown", exceptionThrown);
-                               Assert("OnValidate must be fired", myDictionary.onValidateFired);
-                               Assert("OnSet must be fired", myDictionary.onSetFired);
-                               Assert("OnSetComplete must not be fired", !myDictionary.onSetCompleteFired);
-                               AssertEquals(20, myDictionary.BaseDictionary[10]);
+                               Assert.Fail ("#A1");
+                       } catch (AssertionException) {
+                               throw;
+                       } catch (Exception ex) {
+                               Assert.AreEqual (typeof (Exception), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
                        }
+
+                       Assert.IsFalse (myDictionary.onInsertFired, "#B1");
+                       Assert.IsFalse (myDictionary.onInsertCompleteFired, "#B2");
+                       Assert.IsTrue (myDictionary.onValidateFired, "#B3");
+                       Assert.IsFalse (myDictionary.onRemoveFired, "#B4");
+                       Assert.IsFalse (myDictionary.onRemoveCompleteFired, "#B5");
+                       Assert.IsFalse (myDictionary.onClearFired, "#B6");
+                       Assert.IsFalse (myDictionary.onClearCompleteFired, "#B7");
+                       Assert.IsTrue (myDictionary.onSetFired, "#B8");
+                       Assert.IsFalse (myDictionary.onSetCompleteFired, "#B9");
+                       Assert.IsFalse (myDictionary.onGetFired, "#B10");
+                       myDictionary.onGetExist = true;
+                       Assert.AreEqual (20, myDictionary.BaseDictionary [10], "#B11");
                }
 
                [Test]
                public void SetOnSetCompleteExcept() 
                {
-                       bool exceptionThrown = false;
-
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(18);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (18);
+                       myDictionary.onValidateExist = true;
+                       myDictionary.onSetExist = true;
                        myDictionary.onSetCompleteMustThrowException = true;
                        
                        try {
                                myDictionary.BaseDictionary[10] = 50;
-                       } catch {
-                               exceptionThrown = true;
-                       } finally {
-                               Assert("Exception must be thrown", exceptionThrown);
-                               Assert("OnValidate must be fired", myDictionary.onValidateFired);
-                               Assert("OnSet must be fired", myDictionary.onSetFired);
-                               Assert("OnSetComplete must be fired", myDictionary.onSetCompleteFired);
-                               AssertEquals(20, myDictionary.BaseDictionary[10]);
+                               Assert.Fail ("#A1");
+                       } catch (AssertionException) {
+                               throw;
+                       } catch (Exception ex) {
+                               Assert.AreEqual (typeof (Exception), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
                        }
+
+                       Assert.IsFalse (myDictionary.onInsertFired, "#B1");
+                       Assert.IsFalse (myDictionary.onInsertCompleteFired, "#B2");
+                       Assert.IsTrue (myDictionary.onValidateFired, "#B3");
+                       Assert.IsFalse (myDictionary.onRemoveFired, "#B4");
+                       Assert.IsFalse (myDictionary.onRemoveCompleteFired, "#B5");
+                       Assert.IsFalse (myDictionary.onClearFired, "#B6");
+                       Assert.IsFalse (myDictionary.onClearCompleteFired, "#B7");
+                       Assert.IsTrue (myDictionary.onSetFired, "#B8");
+                       Assert.IsTrue (myDictionary.onSetCompleteFired, "#B9");
+                       Assert.IsFalse (myDictionary.onGetFired, "#B10");
+                       myDictionary.onGetExist = true;
+                       Assert.AreEqual (20, myDictionary.BaseDictionary [10], "#B11");
                }
 
                [Test]
                public void IsReadOnly() 
                {
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(1);
-                       Assert(!myDictionary.BaseDictionary.IsReadOnly);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (1);
+                       Assert.IsFalse (myDictionary.BaseDictionary.IsReadOnly);
                }
 
                [Test]
                public void IsFixedSize() 
                {
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(1);
-                       Assert(!myDictionary.BaseDictionary.IsFixedSize);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (1);
+                       Assert.IsFalse (myDictionary.BaseDictionary.IsFixedSize);
                }
 
                [Test]
                public void DictionaryProperty()
                {
-                       ConcreteDictionary myDictionary = new ConcreteDictionary(1);
-                       AssertEquals(myDictionary, myDictionary.BaseDictionary);
+                       ConcreteDictionary myDictionary = new ConcreteDictionary (1);
+                       Assert.AreEqual (myDictionary, myDictionary.BaseDictionary);
+               }
+
+               public class NullDictionary : DictionaryBase
+               {
+                       protected override object OnGet (object key, object currentValue)
+                       {
+                               return null;
+                       }
+               }
+
+               [Test]
+               public void NullDictionary_Get ()
+               {
+                       IDictionary dictionary = new NullDictionary ();
+                       dictionary ["a"] = "b";
+                       Assert.AreEqual ("b", dictionary ["a"]);
+               }
+
+               public class ModifyDictionary : DictionaryBase
+               {
+                       protected override object OnGet (object key, object currentValue)
+                       {
+                               (this as IDictionary) [key] = key;
+                               return key;
+                       }
+               }
+
+               [Test]
+               public void ModifyDictionary_Get ()
+               {
+                       IDictionary dictionary = new ModifyDictionary ();
+                       dictionary ["a"] = "b";
+#if NET_2_0
+                       // first time we return "b" - because the value was cached
+                       Assert.AreEqual ("b", dictionary ["a"], "#1");
+#else
+                       Assert.AreEqual ("a", dictionary ["a"], "#1");
+#endif
+                       // second time we return "a" - because it's the value in the dictionary
+                       Assert.AreEqual ("a", dictionary ["a"], "#2");
+               }
+
+               public class ThrowDictionary : DictionaryBase
+               {
+                       protected override object OnGet (object key, object currentValue)
+                       {
+                               throw new ArgumentException ((string) key, (string) currentValue);
+                       }
+               }
+
+               [Test]
+               public void ThrowDictionary_Get ()
+               {
+                       IDictionary dictionary = new ThrowDictionary ();
+                       dictionary ["a"] = "b";
+
+                       try {
+                               object value = dictionary ["a"];
+                               Assert.Fail ("#1: " + value);
+                       } catch (ArgumentException ex) {
+                               Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.IsTrue (ex.Message.StartsWith ("a"), "#5");
+                               Assert.AreEqual ("b", ex.ParamName, "#6");
+                       }
                }
        }
 }