2 // ListDictionaryCas.cs - CAS unit tests for
3 // System.Collections.Specialized.ListDictionary
6 // Sebastien Pouliot <sebastien@ximian.com>
8 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using NUnit.Framework;
33 using System.Collections;
34 using System.Collections.Specialized;
35 using System.Runtime.Serialization;
36 using System.Runtime.Serialization.Formatters.Binary;
38 namespace MonoTests.System.Collections.Specialized {
40 public class UnitTestNameObjectCollectionBase: NameObjectCollectionBase {
42 public UnitTestNameObjectCollectionBase ()
46 public UnitTestNameObjectCollectionBase (int capacity)
51 public UnitTestNameObjectCollectionBase (IHashCodeProvider provider, IComparer comparer)
52 : base (provider, comparer)
56 public UnitTestNameObjectCollectionBase (int capacity, IHashCodeProvider provider, IComparer comparer)
57 : base (capacity, provider, comparer)
61 public UnitTestNameObjectCollectionBase (IEqualityComparer comparer)
66 public UnitTestNameObjectCollectionBase (int capacity, IEqualityComparer comparer)
67 : base (capacity, comparer)
70 public bool _IsReadOnly {
71 get { return base.IsReadOnly; }
72 set { base.IsReadOnly = value; }
75 public void Add (string name, object value)
77 base.BaseAdd (name, value);
85 public object Get (int index)
87 return base.BaseGet (index);
90 public string[] GetAllKeys ()
92 return base.BaseGetAllKeys ();
95 public object[] GetAllValues ()
97 return base.BaseGetAllValues ();
100 public object[] GetAllValues (Type type)
102 return base.BaseGetAllValues (type);
105 public string GetKey (int index)
107 return base.BaseGetKey (index);
110 public bool HasKeys ()
112 return base.BaseHasKeys ();
115 public void Remove (string name)
117 base.BaseRemove (name);
120 public void RemoveAt (int index)
122 base.BaseRemoveAt (index);
125 public void Set (int index, object value)
127 base.BaseSet (index, value);
130 public void Set (string name, object value)
132 base.BaseSet (name, value);
136 public class EqualityComparer: IEqualityComparer {
138 bool IEqualityComparer.Equals (object x, object y)
140 return (CaseInsensitiveComparer.DefaultInvariant.Compare (x, y) == 0);
143 public int GetHashCode (object obj)
145 return obj.GetHashCode ();
150 public class NameObjectCollectionBaseTest
152 private void CheckICollection (UnitTestNameObjectCollectionBase coll, int count)
154 ICollection collection = (coll as ICollection);
155 Assert.AreEqual (count, collection.Count, "Count");
156 Assert.IsFalse (collection.IsSynchronized, "IsSynchronized");
157 Assert.IsNotNull (collection.SyncRoot, "SyncRoot");
158 string[] array = new string[count];
159 collection.CopyTo (array, 0);
160 for (int i = 0; i < count; i++) {
161 Assert.AreEqual (coll.GetKey (i), array[i], "#" + i.ToString ());
166 public void Constructor_Default ()
168 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase ();
169 Assert.AreEqual (0, coll.Count, "Count-0");
170 Assert.IsFalse (coll._IsReadOnly, "IsReadOnly");
171 Assert.IsFalse (coll.HasKeys (), "HasKeys-0");
174 CheckICollection (coll, 1);
175 Assert.AreEqual (1, coll.Count, "Count-1");
176 Assert.AreEqual ("1", coll.Get (0), "Get(0)");
177 Assert.AreEqual (1, coll.GetAllKeys ().Length, "GetAllKeys");
178 Assert.IsTrue (coll.HasKeys (), "HasKeys-1");
181 Assert.AreEqual (2, coll.Count, "Count-2");
182 Assert.AreEqual ("b", coll.GetKey (1), "GetKey(1)");
183 Assert.AreEqual (2, coll.GetAllValues ().Length, "GetAllValues");
186 Assert.AreEqual (1, coll.Count, "Count-3");
189 Assert.AreEqual ("3", coll.Get (0), "Get(0)b");
191 Assert.AreEqual ("4", coll.Get (0), "Get(0)c");
194 Assert.AreEqual (0, coll.Count, "Count-4");
195 Assert.IsFalse (coll.HasKeys (), "HasKeys-2");
199 public void Constructor_Int ()
201 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase (0);
202 for (int i = 0; i < 10; i++)
203 coll.Add (i.ToString (), i);
205 CheckICollection (coll, 10);
206 Assert.AreEqual (10, coll.Keys.Count, "Keys");
209 Assert.AreEqual (0, coll.Count, "Count");
210 Assert.IsFalse (coll.HasKeys (), "HasKeys");
214 [ExpectedException (typeof (ArgumentOutOfRangeException))]
215 public void Constructor_Int_MinValue ()
217 new UnitTestNameObjectCollectionBase (Int32.MinValue);
220 public void Constructor_IEqualityComparer ()
222 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase (new EqualityComparer ());
224 CheckICollection (coll, 1);
228 public void Constructor_Int_IEqualityComparer ()
230 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase (5, new EqualityComparer ());
232 CheckICollection (coll, 1);
236 [ExpectedException (typeof (ArgumentOutOfRangeException))]
237 public void Constructor_IntNegative_IEqualityComparer ()
239 new UnitTestNameObjectCollectionBase (-1, new EqualityComparer ());
243 public void GetObjectData_IEqualityComparer ()
245 EqualityComparer comparer = new EqualityComparer ();
246 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase (5, comparer);
249 coll._IsReadOnly = true;
251 SerializationInfo si = new SerializationInfo (typeof (UnitTestNameObjectCollectionBase), new FormatterConverter ());
252 coll.GetObjectData (si, new StreamingContext ());
253 foreach (SerializationEntry se in si) {
256 Assert.AreSame (comparer, se.Value, se.Name);
259 Assert.IsTrue ((bool) se.Value, se.Name);
262 Assert.AreEqual (2, se.Value, se.Name);
265 Assert.AreEqual (2, (se.Value as object[]).Length, se.Name);
268 Assert.AreEqual (2, (se.Value as string[]).Length, se.Name);
271 Assert.AreEqual (4, se.Value, se.Name);
274 string msg = String.Format ("Unexpected {0} information of type {1} with value '{2}'.",
275 se.Name, se.ObjectType, se.Value);
282 public void Constructor_Provider_Comparer ()
284 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase (CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
285 coll.Add (null, null);
286 Assert.AreEqual (1, coll.Count, "Count-1");
288 Assert.AreEqual (0, coll.Count, "Count-0");
292 public void Constructor_Int_Provider_Comparer ()
294 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase (5, CaseInsensitiveHashCodeProvider.DefaultInvariant, CaseInsensitiveComparer.DefaultInvariant);
297 IEnumerator e = coll.GetEnumerator ();
298 while (e.MoveNext ()) {
301 Assert.AreEqual (1, i, "GetEnumerator");
305 [ExpectedException (typeof (ArgumentOutOfRangeException))]
306 public void Constructor_Int_Negative ()
308 new UnitTestNameObjectCollectionBase (-1,
309 CaseInsensitiveHashCodeProvider.DefaultInvariant,
310 CaseInsensitiveComparer.DefaultInvariant);
314 public void GetObjectData_Info_Null ()
316 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase ();
318 coll.GetObjectData (null, new StreamingContext ());
320 } catch (ArgumentNullException ex) {
321 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
322 Assert.IsNull (ex.InnerException, "#3");
323 Assert.IsNotNull (ex.Message, "#4");
324 Assert.IsNotNull (ex.ParamName, "#5");
325 Assert.AreEqual ("info", ex.ParamName, "#6");
330 public void GetObjectData ()
332 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase (CaseInsensitiveHashCodeProvider.DefaultInvariant, CaseInsensitiveComparer.DefaultInvariant);
335 SerializationInfo si = new SerializationInfo (typeof (UnitTestNameObjectCollectionBase), new FormatterConverter ());
336 coll.GetObjectData (si, new StreamingContext ());
337 foreach (SerializationEntry se in si) {
340 Assert.AreSame (CaseInsensitiveHashCodeProvider.DefaultInvariant, se.Value, se.Name);
343 Assert.AreSame (CaseInsensitiveComparer.DefaultInvariant, se.Value, se.Name);
346 Assert.IsFalse ((bool)se.Value, se.Name);
349 Assert.AreEqual (1, se.Value, se.Name);
352 Assert.AreEqual (1, (se.Value as object[]).Length, se.Name);
355 Assert.AreEqual (1, (se.Value as string[]).Length, se.Name);
358 Assert.AreEqual (2, se.Value, se.Name);
361 string msg = String.Format ("Unexpected {0} information of type {1} with value '{2}'.",
362 se.Name, se.ObjectType, se.Value);
370 public void Add_ReadOnly ()
372 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase ();
373 coll._IsReadOnly = true;
377 } catch (NotSupportedException ex) {
378 // Collection is read-only
379 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
380 Assert.IsNull (ex.InnerException, "#3");
381 Assert.IsNotNull (ex.Message, "#4");
386 public void Clear_ReadOnly ()
388 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase ();
389 coll._IsReadOnly = true;
391 // even if we're empty
394 } catch (NotSupportedException ex) {
395 // Collection is read-only
396 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
397 Assert.IsNull (ex.InnerException, "#3");
398 Assert.IsNotNull (ex.Message, "#4");
403 public void Remove_ReadOnly ()
405 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase ();
407 coll._IsReadOnly = true;
411 } catch (NotSupportedException ex) {
412 // Collection is read-only
413 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
414 Assert.IsNull (ex.InnerException, "#3");
415 Assert.IsNotNull (ex.Message, "#4");
420 public void RemoveAt_ReadOnly ()
422 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase ();
424 coll._IsReadOnly = true;
428 } catch (NotSupportedException ex) {
429 // Collection is read-only
430 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
431 Assert.IsNull (ex.InnerException, "#3");
432 Assert.IsNotNull (ex.Message, "#4");
437 public void Set_ReadOnly ()
439 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase ();
441 coll._IsReadOnly = true;
445 } catch (NotSupportedException ex) {
446 // Collection is read-only
447 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
448 Assert.IsNull (ex.InnerException, "#3");
449 Assert.IsNotNull (ex.Message, "#4");
454 [ExpectedException (typeof (ArrayTypeMismatchException))]
455 public void GetAllValues_Type_Mismatch ()
457 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase ();
458 coll.Add ("a", "string");
459 coll.Add ("b", Int32.MinValue);
460 string[] array = (string[]) coll.GetAllValues (typeof (string));
461 Assert.AreEqual (1, array.Length, "Length");
462 Assert.AreEqual ("string", array[0], "[0]");
466 public void GetAllValues_Type ()
468 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase ();
469 coll.Add ("a", "string1");
470 coll.Add ("b", "string2");
471 string[] array = (string[]) coll.GetAllValues (typeof (string));
472 Assert.AreEqual (2, array.Length, "Length");
473 Assert.AreEqual ("string1", array[0], "[0]");
474 Assert.AreEqual ("string2", array[1], "[1]");
478 public void GetAllValues ()
480 UnitTestNameObjectCollectionBase coll = new UnitTestNameObjectCollectionBase ();
481 coll.Add ("a", "string1");
482 coll.Add ("b", "string2");
483 object[] array = (object[]) coll.GetAllValues ();
484 Assert.AreEqual (2, array.Length, "Length");
485 Assert.AreEqual ("string1", array[0], "[0]");
486 Assert.AreEqual ("string2", array[1], "[1]");
490 public void CopyTo_Array_Null ()
492 UnitTestNameObjectCollectionBase c = new UnitTestNameObjectCollectionBase ();
494 ((ICollection)c).CopyTo (null, 0);
496 } catch (ArgumentNullException ex) {
497 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2");
498 Assert.IsNull (ex.InnerException, "#A3");
499 Assert.IsNotNull (ex.Message, "#A4");
500 Assert.IsNotNull (ex.ParamName, "#A5");
501 Assert.AreEqual ("array", ex.ParamName, "#A6");
507 ((ICollection) c).CopyTo (null, 0);
509 } catch (ArgumentNullException ex) {
510 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2");
511 Assert.IsNull (ex.InnerException, "#B3");
512 Assert.IsNotNull (ex.Message, "#B4");
513 Assert.IsNotNull (ex.ParamName, "#B5");
514 Assert.AreEqual ("array", ex.ParamName, "#B6");
519 public void CopyTo_Index_Negative ()
521 string [] array = new string [1];
522 UnitTestNameObjectCollectionBase c = new UnitTestNameObjectCollectionBase ();
525 ((ICollection) c).CopyTo (array, -1);
527 } catch (ArgumentOutOfRangeException ex) {
528 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
529 Assert.IsNull (ex.InnerException, "#3");
530 Assert.IsNotNull (ex.Message, "#4");
531 Assert.IsNotNull (ex.ParamName, "#5");
536 public void CopyTo_NotEnoughSpace ()
538 string [] array = new string [4];
539 UnitTestNameObjectCollectionBase c = new UnitTestNameObjectCollectionBase ();
545 ((ICollection) c).CopyTo (array, 2);
547 } catch (ArgumentException ex) {
548 // Insufficient space in the target location to
549 // copy the information
550 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
551 Assert.IsNull (ex.InnerException, "#3");
552 Assert.IsNotNull (ex.Message, "#4");
553 Assert.IsNull (ex.ParamName, "#5");
558 public void CopyTo_MultipleDimensionStringArray ()
560 string [,] matrix = new string [1,1];
561 UnitTestNameObjectCollectionBase c = new UnitTestNameObjectCollectionBase ();
564 ((ICollection)c).CopyTo (matrix, 0);
566 } catch (ArgumentException ex) {
567 // Multi dimension array is not supported on
569 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
570 Assert.IsNull (ex.InnerException, "#3");
571 Assert.IsNotNull (ex.Message, "#4");
572 Assert.IsNull (ex.ParamName, "#5");