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 {
41 class GenericComparer<T> : IComparer<T> {
43 private bool called = false;
53 public int Compare (T x, T y)
64 int [] _list1_contents;
70 // FIXME arrays currently do not support generic collection
72 _list1_contents = new int [] { 55, 50, 22, 80, 56, 52, 40, 63 };
73 // _list1 = new List <int> (_list1_contents);
75 _list1 = new List <int> (8);
76 foreach (int i in _list1_contents)
80 [Test] // This was for bug #74980
81 public void InsertTest ()
83 List <string> test = new List <string> ();
88 Assert.AreEqual (3, test.Count);
89 Assert.AreEqual ("b", test [0]);
90 Assert.AreEqual ("c", test [1]);
91 Assert.AreEqual ("a", test [2]);
95 public void InsertRangeTest ()
97 int count = _list1.Count;
98 // FIXME arrays currently do not support generic collection
100 int [] items = {1, 2, 3};
101 // List <int> newRange = new List <int> (items);
102 List <int> newRange = new List <int> (3);
103 foreach (int i in items)
105 _list1.InsertRange (1, newRange);
106 Assert.AreEqual (count + 3, _list1.Count);
107 Assert.AreEqual (55, _list1 [0]);
108 Assert.AreEqual (1, _list1 [1]);
109 Assert.AreEqual (2, _list1 [2]);
110 Assert.AreEqual (3, _list1 [3]);
111 Assert.AreEqual (50, _list1 [4]);
114 [Test, ExpectedException (typeof (ArgumentNullException))]
115 public void InsertRangeNullTest ()
117 IEnumerable <int> n = null;
118 _list1.InsertRange (0, n);
122 public void IndexOfTest ()
124 List <int> l = new List <int> ();
129 Assert.AreEqual (1, l.IndexOf (200), "Could not find value");
132 [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
133 public void IndexOfOutOfRangeTest ()
135 List <int> l = new List <int> (4);
140 public void GetRangeTest ()
142 List <int> r = _list1.GetRange (2, 4);
143 Assert.AreEqual (4, r.Count);
144 Assert.AreEqual (22, r [0]);
145 Assert.AreEqual (80, r [1]);
146 Assert.AreEqual (56, r [2]);
147 Assert.AreEqual (52, r [3]);
151 public void EnumeratorTest ()
153 List <int>.Enumerator e = _list1.GetEnumerator ();
154 for (int i = 0; i < _list1_contents.Length; i++)
156 Assert.IsTrue (e.MoveNext ());
157 Assert.AreEqual (_list1_contents [i], e.Current);
159 Assert.IsFalse (e.MoveNext ());
163 public void ConstructWithSizeTest ()
165 List <object> l_1 = new List <object> (1);
166 List <object> l_2 = new List <object> (50);
167 List <object> l_3 = new List <object> (0);
169 Assert.AreEqual (1, l_1.Capacity);
170 Assert.AreEqual (50, l_2.Capacity);
171 Assert.AreEqual (0, l_3.Capacity);
174 [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
175 public void ConstructWithInvalidSizeTest ()
177 List <int> l = new List <int> (-1);
181 public void ConstructWithCollectionTest ()
183 List <int> l1 = new List <int> (_list1);
184 Assert.AreEqual (_list1.Count, l1.Count);
185 Assert.AreEqual (l1.Count, l1.Capacity);
186 for (int i = 0; i < l1.Count; i++)
187 Assert.AreEqual (_list1 [i], l1 [i]);
190 [Test, ExpectedException (typeof (ArgumentNullException))]
191 public void ConstructWithInvalidCollectionTest ()
194 List <int> l1 = new List <int> (n);
198 public void AddTest ()
200 int count = _list1.Count;
202 Assert.AreEqual (count + 1, _list1.Count);
203 Assert.AreEqual (-1, _list1 [_list1.Count - 1]);
207 public void AddRangeTest ()
209 int count = _list1.Count;
210 // FIXME arrays currently do not support generic collection
212 int [] range = { -1, -2, -3 };
213 List <int> tmp = new List <int> (3);
214 foreach (int i in range)
216 // _list1.AddRange (range);
217 _list1.AddRange (tmp);
219 Assert.AreEqual (count + 3, _list1.Count);
220 Assert.AreEqual (-1, _list1 [_list1.Count - 3]);
221 Assert.AreEqual (-2, _list1 [_list1.Count - 2]);
222 Assert.AreEqual (-3, _list1 [_list1.Count - 1]);
225 [Test, ExpectedException (typeof (ArgumentNullException))]
226 public void AddNullRangeTest ()
233 public void BinarySearchTest ()
235 List <int> l = new List <int> (_list1);
237 Assert.AreEqual (0, l.BinarySearch (22));
238 Assert.AreEqual (-2, l.BinarySearch (23));
239 Assert.AreEqual (- (l.Count + 1), l.BinarySearch (int.MaxValue));
243 public void SortTest ()
245 List <int> l = new List <int> (_list1);
247 Assert.AreEqual (_list1.Count, l.Count);
248 Assert.AreEqual (22, l [0]);
252 Assert.IsTrue (minimum <= i);
258 public void ClearTest ()
260 int capacity = _list1.Capacity;
262 Assert.AreEqual (0, _list1.Count);
263 Assert.AreEqual (capacity, _list1.Capacity);
267 public void ContainsTest ()
269 Assert.IsTrue (_list1.Contains (22));
270 Assert.IsFalse (_list1.Contains (23));
273 private string StringConvert (int i)
275 return i.ToString ();
279 public void ConvertAllTest ()
281 List <string> s = _list1.ConvertAll ( (Converter <int, string>)StringConvert);
282 Assert.AreEqual (_list1.Count, s.Count);
283 Assert.AreEqual ("55", s [0]);
287 public void CopyToTest ()
289 int [] a = new int [2];
290 _list1.CopyTo (1, a, 0, 2);
291 Assert.AreEqual (50, a [0]);
292 Assert.AreEqual (22, a [1]);
294 int [] b = new int [_list1.Count + 1];
295 b [_list1.Count] = 555;
297 Assert.AreEqual (55, b [0]);
298 Assert.AreEqual (555, b [_list1.Count]);
301 _list1.CopyTo (b, 1);
302 Assert.AreEqual (888, b [0]);
303 Assert.AreEqual (55, b [1]);
306 [Test, ExpectedException (typeof (ArgumentNullException))]
307 public void CopyToNullTest ()
310 _list1.CopyTo (0, a, 0, 0);
313 static bool FindMultipleOfThree (int i)
318 static bool FindMultipleOfFour (int i)
323 static bool FindMultipleOfTwelve (int i)
325 return (i % 12) == 0;
329 public void FindTest ()
331 int i = _list1.Find (FindMultipleOfThree);
332 Assert.AreEqual (63, i);
334 i = _list1.Find (FindMultipleOfTwelve);
335 Assert.AreEqual (default (int), i);
338 [Test, ExpectedException (typeof (ArgumentNullException))]
339 public void FindNullTest ()
341 int i = _list1.Find (null);
345 public void FindAllTest ()
347 List <int> findings = _list1.FindAll (FindMultipleOfFour);
348 Assert.AreEqual (4, findings.Count);
349 Assert.AreEqual (80, findings [0]);
350 Assert.AreEqual (56, findings [1]);
351 Assert.AreEqual (52, findings [2]);
352 Assert.AreEqual (40, findings [3]);
354 findings = _list1.FindAll (FindMultipleOfTwelve);
355 Assert.IsNotNull (findings);
356 Assert.AreEqual (0, findings.Count);
359 [Test, ExpectedException (typeof (ArgumentNullException))]
360 public void FindAllNullTest ()
362 List <int> findings = _list1.FindAll (null);
366 public void FindIndexTest ()
368 int i = _list1.FindIndex (FindMultipleOfThree);
369 Assert.AreEqual (7, i);
371 i = _list1.FindIndex (FindMultipleOfTwelve);
372 Assert.AreEqual (-1, i);
375 [Test, ExpectedException (typeof (ArgumentNullException))]
376 public void FindIndexNullTest ()
378 int i = _list1.FindIndex (null);
382 public void FindLastTest ()
384 int i = _list1.FindLast (FindMultipleOfFour);
385 Assert.AreEqual (40, i);
387 i = _list1.FindLast (FindMultipleOfTwelve);
388 Assert.AreEqual (default (int), i);
391 [Test, ExpectedException (typeof (ArgumentNullException))]
392 public void FindLastNullTest ()
394 int i = _list1.FindLast (null);
397 // FIXME currently generates Invalid IL Code error
400 public void ForEachTest ()
403 _list1.ForEach (delegate (int j) { i += j; });
405 Assert.AreEqual (418, i);
409 public void FindLastIndexTest ()
411 int i = _list1.FindLastIndex (FindMultipleOfFour);
412 Assert.AreEqual (6, i);
414 i = _list1.FindLastIndex (5, FindMultipleOfFour);
415 Assert.AreEqual (5, i);
417 i = _list1.FindIndex (FindMultipleOfTwelve);
418 Assert.AreEqual (-1, i);
421 [Test, ExpectedException (typeof (ArgumentNullException))]
422 public void FindLastIndexNullTest ()
424 int i = _list1.FindLastIndex (null);
428 public void RemoveTest ()
430 int count = _list1.Count;
431 bool result = _list1.Remove (22);
432 Assert.IsTrue (result);
433 Assert.AreEqual (count - 1, _list1.Count);
435 Assert.AreEqual (-1, _list1.IndexOf (22));
437 result = _list1.Remove (0);
438 Assert.IsFalse (result);
442 public void RemoveAllTest ()
444 int count = _list1.Count;
445 int removedCount = _list1.RemoveAll (FindMultipleOfFour);
446 Assert.AreEqual (4, removedCount);
447 Assert.AreEqual (count - 4, _list1.Count);
449 removedCount = _list1.RemoveAll (FindMultipleOfTwelve);
450 Assert.AreEqual (0, removedCount);
451 Assert.AreEqual (count - 4, _list1.Count);
455 public void RemoveAtTest ()
457 int count = _list1.Count;
459 Assert.AreEqual (count - 1, _list1.Count);
460 Assert.AreEqual (50, _list1 [0]);
463 [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
464 public void RemoveOutOfRangeTest ()
466 _list1.RemoveAt (_list1.Count);
470 public void RemoveRangeTest ()
472 int count = _list1.Count;
473 _list1.RemoveRange (1, 2);
474 Assert.AreEqual (count - 2, _list1.Count);
475 Assert.AreEqual (55, _list1 [0]);
476 Assert.AreEqual (80, _list1 [1]);
478 _list1.RemoveRange (0, 0);
479 Assert.AreEqual (count - 2, _list1.Count);
483 public void RemoveRangeFromEmptyListTest ()
485 List<int> l = new List<int> ();
486 l.RemoveRange (0, 0);
489 [Test, ExpectedException (typeof (ArgumentException))]
490 public void RemoveRangeOutOfRangeTest ()
492 _list1.RemoveRange (1, _list1.Count);
496 public void ReverseTest ()
498 int count = _list1.Count;
500 Assert.AreEqual (count, _list1.Count);
502 Assert.AreEqual (63, _list1 [0]);
503 Assert.AreEqual (55, _list1 [count - 1]);
505 _list1.Reverse (0, 2);
507 Assert.AreEqual (40, _list1 [0]);
508 Assert.AreEqual (63, _list1 [1]);
511 [Test, ExpectedException (typeof (ArgumentException))]
512 public void ReverseOutOfRangeTest ()
514 _list1.Reverse (1, _list1.Count);
518 public void ToArrayTest ()
520 int [] copiedContents = _list1.ToArray ();
521 Assert.IsFalse (ReferenceEquals (copiedContents, _list1_contents));
523 Assert.AreEqual (_list1.Count, copiedContents.Length);
524 Assert.AreEqual (_list1 [0], copiedContents [0]);
528 public void TrimExcessTest ()
530 List <string> l = new List <string> ();
533 Assert.IsTrue (l.Count < l.Capacity);
535 Assert.AreEqual (l.Count, l.Capacity);
538 bool IsPositive (int i)
544 public void TrueForAllTest ()
546 Assert.IsFalse (_list1.TrueForAll (FindMultipleOfFour));
547 Assert.IsTrue (_list1.TrueForAll (IsPositive));
550 [Test, ExpectedException (typeof (ArgumentNullException))]
551 public void TrueForAllNullTest ()
553 _list1.TrueForAll (null);
556 [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
557 public void CapacityOutOfRangeTest ()
559 _list1.Capacity = _list1.Count - 1;
563 public void BinarySearch_EmptyList ()
565 GenericComparer<int> comparer = new GenericComparer<int> ();
566 List<int> l = new List<int> ();
567 l.BinarySearch (0, comparer);
568 Assert.IsFalse (comparer.Called, "Called");