2 // MonoTests.System.Collections.Generic.Test.DictionaryTest
5 // David Waite (mass@akuma.org)
7 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
8 // Copyright (C) 2005 David Waite (mass@akuma.org)
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.
33 using System.Collections;
34 using System.Collections.Generic;
35 using System.Collections.ObjectModel;
37 using NUnit.Framework;
39 namespace MonoTests.System.Collections.Generic {
45 int [] _list1_contents;
51 // FIXME arrays currently do not support generic collection
53 _list1_contents = new int [] { 55, 50, 22, 80, 56, 52, 40, 63 };
54 // _list1 = new List <int> (_list1_contents);
56 _list1 = new List <int> (8);
57 foreach (int i in _list1_contents)
61 [Test] // This was for bug #74980
62 public void InsertTest ()
64 List <string> test = new List <string> ();
69 Assert.AreEqual (3, test.Count);
70 Assert.AreEqual ("b", test [0]);
71 Assert.AreEqual ("c", test [1]);
72 Assert.AreEqual ("a", test [2]);
76 public void InsertRangeTest ()
78 int count = _list1.Count;
79 // FIXME arrays currently do not support generic collection
81 int [] items = {1, 2, 3};
82 // List <int> newRange = new List <int> (items);
83 List <int> newRange = new List <int> (3);
84 foreach (int i in items)
86 _list1.InsertRange (1, newRange);
87 Assert.AreEqual (count + 3, _list1.Count);
88 Assert.AreEqual (55, _list1 [0]);
89 Assert.AreEqual (1, _list1 [1]);
90 Assert.AreEqual (2, _list1 [2]);
91 Assert.AreEqual (3, _list1 [3]);
92 Assert.AreEqual (50, _list1 [4]);
95 [Test, ExpectedException (typeof (ArgumentNullException))]
96 public void InsertRangeNullTest ()
98 IEnumerable <int> n = null;
99 _list1.InsertRange (0, n);
103 public void IndexOfTest ()
105 List <int> l = new List <int> ();
110 Assert.AreEqual (1, l.IndexOf (200), "Could not find value");
113 [Test, ExpectedException (typeof (ArgumentException))]
114 public void IndexOfOutOfRangeTest ()
116 List <int> l = new List <int> (4);
121 public void GetRangeTest ()
123 List <int> r = _list1.GetRange (2, 4);
124 Assert.AreEqual (4, r.Count);
125 Assert.AreEqual (22, r [0]);
126 Assert.AreEqual (80, r [1]);
127 Assert.AreEqual (56, r [2]);
128 Assert.AreEqual (52, r [3]);
132 public void EnumeratorTest ()
134 List <int>.Enumerator e = _list1.GetEnumerator ();
135 for (int i = 0; i < _list1_contents.Length; i++)
137 Assert.IsTrue (e.MoveNext ());
138 Assert.AreEqual (_list1_contents [i], e.Current);
140 Assert.IsFalse (e.MoveNext ());
144 public void ConstructWithSizeTest ()
146 List <object> l_1 = new List <object> (1);
147 List <object> l_2 = new List <object> (50);
148 List <object> l_3 = new List <object> (0);
150 Assert.AreEqual (1, l_1.Capacity);
151 Assert.AreEqual (50, l_2.Capacity);
152 Assert.AreEqual (0, l_3.Capacity);
155 [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
156 public void ConstructWithInvalidSizeTest ()
158 List <int> l = new List <int> (-1);
162 public void ConstructWithCollectionTest ()
164 List <int> l1 = new List <int> (_list1);
165 Assert.AreEqual (_list1.Count, l1.Count);
166 Assert.AreEqual (l1.Count, l1.Capacity);
167 for (int i = 0; i < l1.Count; i++)
168 Assert.AreEqual (_list1 [i], l1 [i]);
171 [Test, ExpectedException (typeof (ArgumentNullException))]
172 public void ConstructWithInvalidCollectionTest ()
175 List <int> l1 = new List <int> (n);
179 public void AddTest ()
181 int count = _list1.Count;
183 Assert.AreEqual (count + 1, _list1.Count);
184 Assert.AreEqual (-1, _list1 [_list1.Count - 1]);
188 public void AddRangeTest ()
190 int count = _list1.Count;
191 // FIXME arrays currently do not support generic collection
193 int [] range = { -1, -2, -3 };
194 List <int> tmp = new List <int> (3);
195 foreach (int i in range)
197 // _list1.AddRange (range);
198 _list1.AddRange (tmp);
200 Assert.AreEqual (count + 3, _list1.Count);
201 Assert.AreEqual (-1, _list1 [_list1.Count - 3]);
202 Assert.AreEqual (-2, _list1 [_list1.Count - 2]);
203 Assert.AreEqual (-3, _list1 [_list1.Count - 1]);
206 [Test, ExpectedException (typeof (ArgumentNullException))]
207 public void AddNullRangeTest ()
214 public void AsReadOnlyTest ()
216 // FIXME: workaround for lack of ReadOnlyCollection <T>
217 ReadOnlyCollection <int> l = _list1.AsReadOnly ();
218 Assert.IsTrue (l.IsReadOnly);
219 Assert.AreEqual (_list1.Count, l.Count);
223 Assert.Fail ("must fail to modify read-only collection");
225 catch (NotSupportedException)
230 public void BinarySearchTest ()
232 List <int> l = new List <int> (_list1);
234 Assert.AreEqual (0, l.BinarySearch (22));
235 Assert.AreEqual (-2, l.BinarySearch (23));
236 Assert.AreEqual (- (l.Count + 1), l.BinarySearch (int.MaxValue));
240 public void SortTest ()
242 List <int> l = new List <int> (_list1);
244 Assert.AreEqual (_list1.Count, l.Count);
245 Assert.AreEqual (22, l [0]);
249 Assert.IsTrue (minimum <= i);
255 public void ClearTest ()
257 int capacity = _list1.Capacity;
259 Assert.AreEqual (0, _list1.Count);
260 Assert.AreEqual (capacity, _list1.Capacity);
264 public void ContainsTest ()
266 Assert.IsTrue (_list1.Contains (22));
267 Assert.IsFalse (_list1.Contains (23));
270 private string StringConvert (int i)
272 return i.ToString ();
276 public void ConvertAllTest ()
278 List <string> s = _list1.ConvertAll ( (Converter <int, string>)StringConvert);
279 Assert.AreEqual (_list1.Count, s.Count);
280 Assert.AreEqual ("55", s [0]);
284 public void CopyToTest ()
286 int [] a = new int [2];
287 _list1.CopyTo (1, a, 0, 2);
288 Assert.AreEqual (50, a [0]);
289 Assert.AreEqual (22, a [1]);
291 int [] b = new int [_list1.Count + 1];
292 b [_list1.Count] = 555;
294 Assert.AreEqual (55, b [0]);
295 Assert.AreEqual (555, b [_list1.Count]);
298 _list1.CopyTo (b, 1);
299 Assert.AreEqual (888, b [0]);
300 Assert.AreEqual (55, b [1]);
303 [Test, ExpectedException (typeof (ArgumentNullException))]
304 public void CopyToNullTest ()
307 _list1.CopyTo (0, a, 0, 0);
310 static bool FindMultipleOfThree (int i)
315 static bool FindMultipleOfFour (int i)
320 static bool FindMultipleOfTwelve (int i)
322 return (i % 12) == 0;
326 public void FindTest ()
328 int i = _list1.Find (FindMultipleOfThree);
329 Assert.AreEqual (63, i);
331 i = _list1.Find (FindMultipleOfTwelve);
332 Assert.AreEqual (default (int), i);
335 [Test, ExpectedException (typeof (ArgumentNullException))]
336 public void FindNullTest ()
338 int i = _list1.Find (null);
342 public void FindAllTest ()
344 List <int> findings = _list1.FindAll (FindMultipleOfFour);
345 Assert.AreEqual (4, findings.Count);
346 Assert.AreEqual (80, findings [0]);
347 Assert.AreEqual (56, findings [1]);
348 Assert.AreEqual (52, findings [2]);
349 Assert.AreEqual (40, findings [3]);
351 findings = _list1.FindAll (FindMultipleOfTwelve);
352 Assert.IsNotNull (findings);
353 Assert.AreEqual (0, findings.Count);
356 [Test, ExpectedException (typeof (ArgumentNullException))]
357 public void FindAllNullTest ()
359 List <int> findings = _list1.FindAll (null);
363 public void FindIndexTest ()
365 int i = _list1.FindIndex (FindMultipleOfThree);
366 Assert.AreEqual (7, i);
368 i = _list1.FindIndex (FindMultipleOfTwelve);
369 Assert.AreEqual (-1, i);
372 [Test, ExpectedException (typeof (ArgumentNullException))]
373 public void FindIndexNullTest ()
375 int i = _list1.FindIndex (null);
379 public void FindLastTest ()
381 int i = _list1.FindLast (FindMultipleOfFour);
382 Assert.AreEqual (40, i);
384 i = _list1.FindLast (FindMultipleOfTwelve);
385 Assert.AreEqual (default (int), i);
388 [Test, ExpectedException (typeof (ArgumentNullException))]
389 public void FindLastNullTest ()
391 int i = _list1.FindLast (null);
394 // FIXME currently generates Invalid IL Code error
397 public void ForEachTest ()
400 _list1.ForEach (delegate (int j) { i += j; });
402 Assert.AreEqual (418, i);
406 public void FindLastIndexTest ()
408 int i = _list1.FindLastIndex (FindMultipleOfFour);
409 Assert.AreEqual (6, i);
411 i = _list1.FindLastIndex (5, FindMultipleOfFour);
412 Assert.AreEqual (5, i);
414 i = _list1.FindIndex (FindMultipleOfTwelve);
415 Assert.AreEqual (-1, i);
418 [Test, ExpectedException (typeof (ArgumentNullException))]
419 public void FindLastIndexNullTest ()
421 int i = _list1.FindLastIndex (null);
425 public void RemoveTest ()
427 int count = _list1.Count;
428 bool result = _list1.Remove (22);
429 Assert.IsTrue (result);
430 Assert.AreEqual (count - 1, _list1.Count);
432 Assert.AreEqual (-1, _list1.IndexOf (22));
434 result = _list1.Remove (0);
435 Assert.IsFalse (result);
439 public void RemoveAllTest ()
441 int count = _list1.Count;
442 int removedCount = _list1.RemoveAll (FindMultipleOfFour);
443 Assert.AreEqual (4, removedCount);
444 Assert.AreEqual (count - 4, _list1.Count);
446 removedCount = _list1.RemoveAll (FindMultipleOfTwelve);
447 Assert.AreEqual (0, removedCount);
448 Assert.AreEqual (count - 4, _list1.Count);
452 public void RemoveAtTest ()
454 int count = _list1.Count;
456 Assert.AreEqual (count - 1, _list1.Count);
457 Assert.AreEqual (50, _list1 [0]);
460 [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
461 public void RemoveOutOfRangeTest ()
463 _list1.RemoveAt (_list1.Count);
467 public void RemoveRangeTest ()
469 int count = _list1.Count;
470 _list1.RemoveRange (1, 2);
471 Assert.AreEqual (count - 2, _list1.Count);
472 Assert.AreEqual (55, _list1 [0]);
473 Assert.AreEqual (80, _list1 [1]);
475 _list1.RemoveRange (0, 0);
476 Assert.AreEqual (count - 2, _list1.Count);
480 public void RemoveRangeFromEmptyListTest ()
482 List<int> l = new List<int> ();
483 l.RemoveRange (0, 0);
486 [Test, ExpectedException (typeof (ArgumentException))]
487 public void RemoveRangeOutOfRangeTest ()
489 _list1.RemoveRange (1, _list1.Count);
493 public void ReverseTest ()
495 int count = _list1.Count;
497 Assert.AreEqual (count, _list1.Count);
499 Assert.AreEqual (63, _list1 [0]);
500 Assert.AreEqual (55, _list1 [count - 1]);
502 _list1.Reverse (0, 2);
504 Assert.AreEqual (40, _list1 [0]);
505 Assert.AreEqual (63, _list1 [1]);
508 [Test, ExpectedException (typeof (ArgumentException))]
509 public void ReverseOutOfRangeTest ()
511 _list1.Reverse (1, _list1.Count);
515 public void ToArrayTest ()
517 int [] copiedContents = _list1.ToArray ();
518 Assert.IsFalse (ReferenceEquals (copiedContents, _list1_contents));
520 Assert.AreEqual (_list1.Count, copiedContents.Length);
521 Assert.AreEqual (_list1 [0], copiedContents [0]);
525 public void TrimExcessTest ()
527 List <string> l = new List <string> ();
530 Assert.IsTrue (l.Count < l.Capacity);
532 Assert.AreEqual (l.Count, l.Capacity);
535 bool IsPositive (int i)
541 public void TrueForAllTest ()
543 Assert.IsFalse (_list1.TrueForAll (FindMultipleOfFour));
544 Assert.IsTrue (_list1.TrueForAll (IsPositive));
547 [Test, ExpectedException (typeof (ArgumentNullException))]
548 public void TrueForAllNullTest ()
550 _list1.TrueForAll (null);
553 [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
554 public void CapacityOutOfRangeTest ()
556 _list1.Capacity = _list1.Count - 1;