2 // MonoTests.System.Collections.Generic.Test.ListTest
5 // David Waite (mass@akuma.org)
6 // Andres G. Aragoneses (andres.aragoneses@7digital.com)
8 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
9 // Copyright (C) 2005 David Waite (mass@akuma.org)
10 // Copyright 2011 Xamarin Inc (http://www.xamarin.com).
11 // Copyright 2012 7digital Ltd (http://www.7digital.com).
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System.Collections;
35 using System.Collections.Generic;
36 using System.Collections.ObjectModel;
38 using System.Runtime.Serialization.Formatters.Binary;
42 using NUnit.Framework;
44 namespace MonoTests.System.Collections.Generic {
46 class GenericComparer<T> : IComparer<T> {
48 private bool called = false;
58 public int Compare (T x, T y)
68 static byte [] _serializedList = new byte [] {
69 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00,
70 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00,
71 0x7e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x43, 0x6f, 0x6c,
72 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65,
73 0x6e, 0x65, 0x72, 0x69, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x60,
74 0x31, 0x5b, 0x5b, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x49,
75 0x6e, 0x74, 0x33, 0x32, 0x2c, 0x20, 0x6d, 0x73, 0x63, 0x6f, 0x72,
76 0x6c, 0x69, 0x62, 0x2c, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
77 0x6e, 0x3d, 0x32, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2c, 0x20,
78 0x43, 0x75, 0x6c, 0x74, 0x75, 0x72, 0x65, 0x3d, 0x6e, 0x65, 0x75,
79 0x74, 0x72, 0x61, 0x6c, 0x2c, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69,
80 0x63, 0x4b, 0x65, 0x79, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x3d, 0x62,
81 0x37, 0x37, 0x61, 0x35, 0x63, 0x35, 0x36, 0x31, 0x39, 0x33, 0x34,
82 0x65, 0x30, 0x38, 0x39, 0x5d, 0x5d, 0x03, 0x00, 0x00, 0x00, 0x06,
83 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x05, 0x5f, 0x73, 0x69, 0x7a,
84 0x65, 0x08, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x07,
85 0x00, 0x00, 0x08, 0x08, 0x08, 0x09, 0x02, 0x00, 0x00, 0x00, 0x03,
86 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0f, 0x02, 0x00, 0x00,
87 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00,
88 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
90 int [] _list1_contents;
96 // FIXME arrays currently do not support generic collection
98 _list1_contents = new int [] { 55, 50, 22, 80, 56, 52, 40, 63 };
99 // _list1 = new List <int> (_list1_contents);
101 _list1 = new List <int> (8);
102 foreach (int i in _list1_contents)
106 [Test] // This was for bug #74980
107 public void InsertTest ()
109 List <string> test = new List <string> ();
110 test.Insert (0, "a");
111 test.Insert (0, "b");
112 test.Insert (1, "c");
114 Assert.AreEqual (3, test.Count);
115 Assert.AreEqual ("b", test [0]);
116 Assert.AreEqual ("c", test [1]);
117 Assert.AreEqual ("a", test [2]);
121 public void InsertRangeTest ()
123 int count = _list1.Count;
124 // FIXME arrays currently do not support generic collection
126 int [] items = {1, 2, 3};
127 // List <int> newRange = new List <int> (items);
128 List <int> newRange = new List <int> (3);
129 foreach (int i in items)
131 _list1.InsertRange (1, newRange);
132 Assert.AreEqual (count + 3, _list1.Count);
133 Assert.AreEqual (55, _list1 [0]);
134 Assert.AreEqual (1, _list1 [1]);
135 Assert.AreEqual (2, _list1 [2]);
136 Assert.AreEqual (3, _list1 [3]);
137 Assert.AreEqual (50, _list1 [4]);
139 newRange = new List <int> ();
140 List <int> li = new List <int> ();
142 newRange.InsertRange (0, li);
143 newRange.InsertRange (newRange.Count, li);
144 Assert.AreEqual (2, newRange.Count);
148 public void InsertSelfTest()
150 List <int> range = new List <int> (5);
151 for (int i = 0; i < 5; ++ i)
154 range.InsertRange(2, range);
155 Assert.AreEqual (10, range.Count);
156 Assert.AreEqual (0, range [0]);
157 Assert.AreEqual (1, range [1]);
158 Assert.AreEqual (0, range [2]);
159 Assert.AreEqual (1, range [3]);
160 Assert.AreEqual (2, range [4]);
161 Assert.AreEqual (3, range [5]);
162 Assert.AreEqual (4, range [6]);
163 Assert.AreEqual (2, range [7]);
164 Assert.AreEqual (3, range [8]);
165 Assert.AreEqual (4, range [9]);
168 [Test, ExpectedException (typeof (ArgumentNullException))]
169 public void InsertRangeNullTest ()
171 IEnumerable <int> n = null;
172 _list1.InsertRange (0, n);
175 [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
176 public void InsertRangeNegativeIndexTest ()
178 _list1.InsertRange (-1, _list1);
182 public void IndexOfTest ()
184 List <int> l = new List <int> ();
189 Assert.AreEqual (1, l.IndexOf (200), "Could not find value");
192 [Test, ExpectedException(typeof (ArgumentException))]
193 public void IList_InsertInvalidType1 ()
195 IList list = _list1 as IList;
196 list.Insert(0, new object());
199 [Test, ExpectedException(typeof (ArgumentNullException))]
200 public void IList_InsertInvalidType2 ()
202 IList list = _list1 as IList;
203 list.Insert(0, null);
206 [Test, ExpectedException(typeof (ArgumentException))]
207 public void IList_AddInvalidType1()
209 IList list = _list1 as IList;
210 list.Add(new object());
213 [Test, ExpectedException(typeof (ArgumentNullException))]
214 public void IList_AddInvalidType2()
216 IList list = _list1 as IList;
221 public void IList_RemoveInvalidType()
223 IList list = _list1 as IList;
224 int nCount = list.Count;
225 list.Remove(new object());
226 Assert.AreEqual(nCount, list.Count);
229 Assert.AreEqual(nCount, list.Count);
232 [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
233 public void IndexOfOutOfRangeTest ()
235 List <int> l = new List <int> (4);
240 public void GetRangeTest ()
242 List <int> r = _list1.GetRange (2, 4);
243 Assert.AreEqual (4, r.Count);
244 Assert.AreEqual (22, r [0]);
245 Assert.AreEqual (80, r [1]);
246 Assert.AreEqual (56, r [2]);
247 Assert.AreEqual (52, r [3]);
251 public void EnumeratorTest ()
253 List <int>.Enumerator e = _list1.GetEnumerator ();
254 for (int i = 0; i < _list1_contents.Length; i++)
256 Assert.IsTrue (e.MoveNext ());
257 Assert.AreEqual (_list1_contents [i], e.Current);
259 Assert.IsFalse (e.MoveNext ());
263 public void ConstructWithSizeTest ()
265 List <object> l_1 = new List <object> (1);
266 List <object> l_2 = new List <object> (50);
267 List <object> l_3 = new List <object> (0);
269 Assert.AreEqual (1, l_1.Capacity);
270 Assert.AreEqual (50, l_2.Capacity);
271 Assert.AreEqual (0, l_3.Capacity);
274 [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
275 public void ConstructWithInvalidSizeTest ()
277 List <int> l = new List <int> (-1);
281 public void ConstructWithCollectionTest ()
283 List <int> l1 = new List <int> (_list1);
284 Assert.AreEqual (_list1.Count, l1.Count);
285 Assert.AreEqual (l1.Count, l1.Capacity);
286 for (int i = 0; i < l1.Count; i++)
287 Assert.AreEqual (_list1 [i], l1 [i]);
289 var input = new [] { "a", "b", "c" };
290 var l2 = new List<string>(input);
291 Assert.AreEqual (3, l2.Capacity);
294 [Test, ExpectedException (typeof (ArgumentNullException))]
295 public void ConstructWithInvalidCollectionTest ()
298 List <int> l1 = new List <int> (n);
302 public void AddTest ()
304 int count = _list1.Count;
306 Assert.AreEqual (count + 1, _list1.Count);
307 Assert.AreEqual (-1, _list1 [_list1.Count - 1]);
311 public void AddRangeTest ()
313 int count = _list1.Count;
314 // FIXME arrays currently do not support generic collection
316 int [] range = { -1, -2, -3 };
317 List <int> tmp = new List <int> (3);
318 foreach (int i in range)
320 // _list1.AddRange (range);
321 _list1.AddRange (tmp);
323 Assert.AreEqual (count + 3, _list1.Count);
324 Assert.AreEqual (-1, _list1 [_list1.Count - 3]);
325 Assert.AreEqual (-2, _list1 [_list1.Count - 2]);
326 Assert.AreEqual (-3, _list1 [_list1.Count - 1]);
329 [Test, ExpectedException (typeof (ArgumentNullException))]
330 public void AddNullRangeTest ()
337 public void BinarySearchTest ()
339 List <int> l = new List <int> (_list1);
341 Assert.AreEqual (0, l.BinarySearch (22));
342 Assert.AreEqual (-2, l.BinarySearch (23));
343 Assert.AreEqual (- (l.Count + 1), l.BinarySearch (int.MaxValue));
348 public void DeserializeTest ()
350 MemoryStream ms = new MemoryStream ();
351 ms.Write (_serializedList, 0, _serializedList.Length);
354 BinaryFormatter bf = new BinaryFormatter ();
355 List<int> list = (List<int>) bf.Deserialize (ms);
356 Assert.AreEqual (3, list.Count, "#1");
357 Assert.AreEqual (5, list [0], "#2");
358 Assert.AreEqual (0, list [1], "#3");
359 Assert.AreEqual (7, list [2], "#4");
363 public void SortTest ()
365 List <int> l = new List <int> (_list1);
367 Assert.AreEqual (_list1.Count, l.Count);
368 Assert.AreEqual (22, l [0]);
372 Assert.IsTrue (minimum <= i);
378 public void SortTestTrickyPivot ()
380 int[] array = new int[] { 1, 3, 5, 2, 6, 6, 6, 6, 6, 6, 6,7 ,4 };
382 var list = array.ToList<int>();
384 list.Sort(delegate (int x, int y)
386 return x < y ? -1 : 1;
389 var res = string.Join (",", list);
390 Assert.AreEqual ("1,2,3,4,5,6,6,6,6,6,6,6,7", res);
394 public void ClearTest ()
396 int capacity = _list1.Capacity;
398 Assert.AreEqual (0, _list1.Count);
399 Assert.AreEqual (capacity, _list1.Capacity);
403 public void ContainsTest ()
405 Assert.IsTrue (_list1.Contains (22));
406 Assert.IsFalse (_list1.Contains (23));
409 private string StringConvert (int i)
411 return i.ToString ();
415 public void ConvertAllTest ()
417 List <string> s = _list1.ConvertAll ( (Converter <int, string>)StringConvert);
418 Assert.AreEqual (_list1.Count, s.Count);
419 Assert.AreEqual ("55", s [0]);
423 public void CopyToTest ()
425 int [] a = new int [2];
426 _list1.CopyTo (1, a, 0, 2);
427 Assert.AreEqual (50, a [0]);
428 Assert.AreEqual (22, a [1]);
430 int [] b = new int [_list1.Count + 1];
431 b [_list1.Count] = 555;
433 Assert.AreEqual (55, b [0]);
434 Assert.AreEqual (555, b [_list1.Count]);
437 _list1.CopyTo (b, 1);
438 Assert.AreEqual (888, b [0]);
439 Assert.AreEqual (55, b [1]);
442 [Test, ExpectedException (typeof (ArgumentNullException))]
443 public void CopyToNullTest ()
446 _list1.CopyTo (0, a, 0, 0);
449 static bool FindMultipleOfThree (int i)
454 static bool FindMultipleOfFour (int i)
459 static bool FindMultipleOfTwelve (int i)
461 return (i % 12) == 0;
465 public void FindTest ()
467 int i = _list1.Find (FindMultipleOfThree);
468 Assert.AreEqual (63, i);
470 i = _list1.Find (FindMultipleOfTwelve);
471 Assert.AreEqual (default (int), i);
474 [Test, ExpectedException (typeof (ArgumentNullException))]
475 public void FindNullTest ()
477 int i = _list1.Find (null);
481 public void FindAllSmallTest ()
483 List <int> findings = _list1.FindAll (FindMultipleOfFour);
484 Assert.AreEqual (4, findings.Count);
485 Assert.AreEqual (80, findings [0]);
486 Assert.AreEqual (56, findings [1]);
487 Assert.AreEqual (52, findings [2]);
488 Assert.AreEqual (40, findings [3]);
490 findings = _list1.FindAll (FindMultipleOfTwelve);
491 Assert.IsNotNull (findings);
492 Assert.AreEqual (0, findings.Count);
496 public void FindAllMediumTest ()
498 List <int> integers = new List <int> (10000);
499 for (int i = 1; i <= 10000; i++)
502 List <int> results = integers.FindAll (FindMultipleOfFour);
504 Assert.IsNotNull (results);
505 Assert.AreEqual (2500, results.Count);
507 results = integers.FindAll (FindMultipleOfTwelve);
509 Assert.IsNotNull (results);
510 Assert.AreEqual (833, results.Count);
514 public void FindAllLargeTest ()
516 List <int> integers = new List <int> (70000);
517 for (int i = 1; i <= 80000; i++)
520 List <int> results = integers.FindAll (FindMultipleOfFour);
522 Assert.IsNotNull (results);
523 Assert.AreEqual (20000, results.Count);
525 results = integers.FindAll (FindMultipleOfTwelve);
527 Assert.IsNotNull (results);
528 Assert.AreEqual (6666, results.Count);
531 [Test, ExpectedException (typeof (ArgumentNullException))]
532 public void FindAllNullTest ()
534 List <int> findings = _list1.FindAll (null);
538 public void FindIndexTest ()
540 int i = _list1.FindIndex (FindMultipleOfThree);
541 Assert.AreEqual (7, i);
543 i = _list1.FindIndex (FindMultipleOfTwelve);
544 Assert.AreEqual (-1, i);
546 var a = new List<int> () { 2, 2, 2, 3, 2 };
547 Assert.AreEqual (2, a.FindIndex (2, 2, l => true));
551 public void FindIndex_Invalid ()
554 _list1.FindIndex (null);
556 } catch (ArgumentNullException) {
560 _list1.FindIndex (-1, l => true);
562 } catch (ArgumentOutOfRangeException) {
566 _list1.FindIndex (-1, 0, l => true);
568 } catch (ArgumentOutOfRangeException) {
572 _list1.FindIndex (0, -1, l => true);
574 } catch (ArgumentOutOfRangeException) {
578 _list1.FindIndex (100, l => true);
580 } catch (ArgumentOutOfRangeException) {
584 _list1.FindIndex (100, 0, l => true);
586 } catch (ArgumentOutOfRangeException) {
590 _list1.FindIndex (7, 2, l => true);
592 } catch (ArgumentOutOfRangeException) {
597 public void FindLastTest ()
599 int i = _list1.FindLast (FindMultipleOfFour);
600 Assert.AreEqual (40, i);
602 i = _list1.FindLast (FindMultipleOfTwelve);
603 Assert.AreEqual (default (int), i);
606 [Test, ExpectedException (typeof (ArgumentNullException))]
607 public void FindLastNullTest ()
609 int i = _list1.FindLast (null);
613 public void ForEachTest ()
616 _list1.ForEach (delegate (int j) { i += j; });
618 Assert.AreEqual (418, i);
622 public void ForEach_Modified ()
625 _list1.ForEach (l => _list1.Add (0));
627 } catch (InvalidOperationException) {
632 public void FindLastIndexTest ()
634 int i = _list1.FindLastIndex (FindMultipleOfFour);
635 Assert.AreEqual (6, i);
637 i = _list1.FindLastIndex (5, FindMultipleOfFour);
638 Assert.AreEqual (5, i);
640 i = _list1.FindIndex (FindMultipleOfTwelve);
641 Assert.AreEqual (-1, i);
643 Assert.AreEqual (2, _list1.FindLastIndex (2, 3, l => true));
644 Assert.AreEqual (2, _list1.FindLastIndex (2, 2, l => true));
645 Assert.AreEqual (1, _list1.FindLastIndex (1, 2, l => true));
649 public void FindLastIndex_Invalid ()
652 _list1.FindLastIndex (null);
654 } catch (ArgumentNullException) {
658 _list1.FindLastIndex (-1, l => true);
660 } catch (ArgumentOutOfRangeException) {
664 _list1.FindLastIndex (-1, 0, l => true);
666 } catch (ArgumentOutOfRangeException) {
670 _list1.FindLastIndex (0, -1, l => true);
672 } catch (ArgumentOutOfRangeException) {
676 _list1.FindLastIndex (100, l => true);
678 } catch (ArgumentOutOfRangeException) {
682 _list1.FindLastIndex (100, 0, l => true);
684 } catch (ArgumentOutOfRangeException) {
688 _list1.FindLastIndex (2, 4, l => true);
690 } catch (ArgumentOutOfRangeException) {
695 public void RemoveTest ()
697 int count = _list1.Count;
698 bool result = _list1.Remove (22);
699 Assert.IsTrue (result);
700 Assert.AreEqual (count - 1, _list1.Count);
702 Assert.AreEqual (-1, _list1.IndexOf (22));
704 result = _list1.Remove (0);
705 Assert.IsFalse (result);
709 public void RemoveAllTest ()
711 int count = _list1.Count;
712 int removedCount = _list1.RemoveAll (FindMultipleOfFour);
713 Assert.AreEqual (4, removedCount);
714 Assert.AreEqual (count - 4, _list1.Count);
716 removedCount = _list1.RemoveAll (FindMultipleOfTwelve);
717 Assert.AreEqual (0, removedCount);
718 Assert.AreEqual (count - 4, _list1.Count);
722 public void RemoveAtTest ()
724 int count = _list1.Count;
726 Assert.AreEqual (count - 1, _list1.Count);
727 Assert.AreEqual (50, _list1 [0]);
730 [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
731 public void RemoveOutOfRangeTest ()
733 _list1.RemoveAt (_list1.Count);
737 public void RemoveRangeTest ()
739 int count = _list1.Count;
740 _list1.RemoveRange (1, 2);
741 Assert.AreEqual (count - 2, _list1.Count);
742 Assert.AreEqual (55, _list1 [0]);
743 Assert.AreEqual (80, _list1 [1]);
745 _list1.RemoveRange (0, 0);
746 Assert.AreEqual (count - 2, _list1.Count);
750 public void RemoveRangeFromEmptyListTest ()
752 List<int> l = new List<int> ();
753 l.RemoveRange (0, 0);
756 [Test, ExpectedException (typeof (ArgumentException))]
757 public void RemoveRangeOutOfRangeTest ()
759 _list1.RemoveRange (1, _list1.Count);
763 public void ReverseTest ()
765 int count = _list1.Count;
767 Assert.AreEqual (count, _list1.Count);
769 Assert.AreEqual (63, _list1 [0]);
770 Assert.AreEqual (55, _list1 [count - 1]);
772 _list1.Reverse (0, 2);
774 Assert.AreEqual (40, _list1 [0]);
775 Assert.AreEqual (63, _list1 [1]);
778 [Test, ExpectedException (typeof (ArgumentException))]
779 public void ReverseOutOfRangeTest ()
781 _list1.Reverse (1, _list1.Count);
785 public void ToArrayTest ()
787 int [] copiedContents = _list1.ToArray ();
788 Assert.IsFalse (ReferenceEquals (copiedContents, _list1_contents));
790 Assert.AreEqual (_list1.Count, copiedContents.Length);
791 Assert.AreEqual (_list1 [0], copiedContents [0]);
795 public void TrimExcessTest ()
797 List <string> l = new List <string> ();
800 Assert.IsTrue (l.Count < l.Capacity);
802 Assert.AreEqual (l.Count, l.Capacity);
805 bool IsPositive (int i)
811 public void TrueForAllTest ()
813 Assert.IsFalse (_list1.TrueForAll (FindMultipleOfFour));
814 Assert.IsTrue (_list1.TrueForAll (IsPositive));
817 [Test, ExpectedException (typeof (ArgumentNullException))]
818 public void TrueForAllNullTest ()
820 _list1.TrueForAll (null);
823 [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
824 public void CapacityOutOfRangeTest ()
826 _list1.Capacity = _list1.Count - 1;
830 public void BinarySearch_EmptyList ()
832 GenericComparer<int> comparer = new GenericComparer<int> ();
833 List<int> l = new List<int> ();
834 Assert.AreEqual (-1, l.BinarySearch (0, comparer), "BinarySearch");
835 // bug 77030 - the comparer isn't called for an empty array/list
836 Assert.IsFalse (comparer.Called, "Called");
840 public void BinarySearch2_EmptyList ()
842 GenericComparer<int> comparer = new GenericComparer<int> ();
843 List<int> l = new List<int> ();
844 Assert.AreEqual (-1, l.BinarySearch (0, 0, 0, comparer), "BinarySearch");
845 // bug 77030 - the comparer isn't called for an empty array/list
846 Assert.IsFalse (comparer.Called, "Called");
850 public void AddRange_Bug77019 ()
852 List<int> l = new List<int> ();
853 Dictionary<string, int> d = new Dictionary<string, int> ();
854 l.AddRange (d.Values);
855 Assert.AreEqual (0, l.Count, "Count");
859 public void VersionCheck_Add ()
861 List<int> list = new List<int> ();
862 IEnumerator enumerator = list.GetEnumerator ();
866 enumerator.MoveNext ();
868 } catch (InvalidOperationException) {
874 } catch (InvalidOperationException) {
877 enumerator = list.GetEnumerator ();
878 enumerator.MoveNext ();
882 public void VersionCheck_AddRange ()
884 List<int> list = new List<int> ();
885 IEnumerator enumerator = list.GetEnumerator ();
886 list.AddRange (new int [] { 5, 7 });
889 enumerator.MoveNext ();
891 } catch (InvalidOperationException) {
897 } catch (InvalidOperationException) {
900 enumerator = list.GetEnumerator ();
901 enumerator.MoveNext ();
905 public void VersionCheck_Clear ()
907 List<int> list = new List<int> ();
908 IEnumerator enumerator = list.GetEnumerator ();
912 enumerator.MoveNext ();
914 } catch (InvalidOperationException) {
920 } catch (InvalidOperationException) {
923 enumerator = list.GetEnumerator ();
924 enumerator.MoveNext ();
928 public void VersionCheck_Insert ()
930 List<int> list = new List<int> ();
931 IEnumerator enumerator = list.GetEnumerator ();
935 enumerator.MoveNext ();
937 } catch (InvalidOperationException) {
943 } catch (InvalidOperationException) {
946 enumerator = list.GetEnumerator ();
947 enumerator.MoveNext ();
951 public void VersionCheck_InsertRange ()
953 List<int> list = new List<int> ();
954 IEnumerator enumerator = list.GetEnumerator ();
955 list.InsertRange (0, new int [] { 5, 7 });
958 enumerator.MoveNext ();
960 } catch (InvalidOperationException) {
966 } catch (InvalidOperationException) {
969 enumerator = list.GetEnumerator ();
970 enumerator.MoveNext ();
974 public void VersionCheck_Remove ()
976 List<int> list = new List<int> ();
978 IEnumerator enumerator = list.GetEnumerator ();
979 // version number is not incremented if item does not exist in list
981 enumerator.MoveNext ();
985 enumerator.MoveNext ();
987 } catch (InvalidOperationException) {
993 } catch (InvalidOperationException) {
996 enumerator = list.GetEnumerator ();
997 enumerator.MoveNext ();
1001 public void VersionCheck_RemoveAll ()
1003 List<int> list = new List<int> ();
1005 IEnumerator enumerator = list.GetEnumerator ();
1006 // version is not incremented if there are no items to remove
1007 list.RemoveAll (FindMultipleOfFour);
1008 enumerator.MoveNext ();
1011 enumerator = list.GetEnumerator ();
1012 list.RemoveAll (FindMultipleOfFour);
1015 enumerator.MoveNext ();
1017 } catch (InvalidOperationException) {
1021 enumerator.Reset ();
1023 } catch (InvalidOperationException) {
1026 enumerator = list.GetEnumerator ();
1027 enumerator.MoveNext ();
1031 public void VersionCheck_RemoveAt ()
1033 List<int> list = new List<int> ();
1035 IEnumerator enumerator = list.GetEnumerator ();
1039 enumerator.MoveNext ();
1041 } catch (InvalidOperationException) {
1045 enumerator.Reset ();
1047 } catch (InvalidOperationException) {
1050 enumerator = list.GetEnumerator ();
1051 enumerator.MoveNext ();
1055 public void VersionCheck_RemoveRange ()
1057 List<int> list = new List<int> ();
1059 IEnumerator enumerator = list.GetEnumerator ();
1060 // version is not incremented if count is zero
1061 list.RemoveRange (0, 0);
1062 enumerator.MoveNext ();
1063 enumerator.Reset ();
1064 list.RemoveRange (0, 1);
1067 enumerator.MoveNext ();
1069 } catch (InvalidOperationException) {
1073 enumerator.Reset ();
1075 } catch (InvalidOperationException) {
1078 enumerator = list.GetEnumerator ();
1079 enumerator.MoveNext ();
1082 [Test, ExpectedException (typeof (InvalidOperationException))] // #699182
1083 public void VersionCheck_Indexer ()
1085 var list = new List<int> () { 0, 2, 3 };
1086 var enumerator = list.GetEnumerator ();
1090 enumerator.MoveNext ();
1094 public void VersionCheck_Reverse ()
1096 List<int> list = new List<int> ();
1097 IEnumerator enumerator = list.GetEnumerator ();
1101 enumerator.MoveNext ();
1102 Assert.Fail ("#A1");
1103 } catch (InvalidOperationException) {
1107 enumerator.Reset ();
1108 Assert.Fail ("#A2");
1109 } catch (InvalidOperationException) {
1112 enumerator = list.GetEnumerator ();
1113 list.Reverse (0, 0);
1116 enumerator.MoveNext ();
1117 Assert.Fail ("#B1");
1118 } catch (InvalidOperationException) {
1122 enumerator.Reset ();
1123 Assert.Fail ("#B2");
1124 } catch (InvalidOperationException) {
1127 enumerator = list.GetEnumerator ();
1128 enumerator.MoveNext ();
1131 class SortTestComparer: IComparer<string> {
1133 public int Compare (string s1, string s2)
1135 return String.Compare (s1, s2);
1140 public void Sort_Bug76361 ()
1142 SortTestComparer comparer = new SortTestComparer ();
1143 List<string> l = new List<string> ();
1147 Assert.AreEqual ("bar", l[0], "0");
1148 Assert.AreEqual ("foo", l[1], "1");
1149 Assert.AreEqual (2, l.Count, "Count");
1152 // for bug #77039 test case
1153 class GenericIComparable: IComparable<GenericIComparable> {
1154 private int _NumberToSortOn;
1156 public int NumberToSortOn {
1157 get { return _NumberToSortOn; }
1158 set { _NumberToSortOn = value; }
1161 public GenericIComparable (int val)
1163 _NumberToSortOn = val;
1166 public int CompareTo (GenericIComparable other)
1168 return NumberToSortOn.CompareTo (other.NumberToSortOn);
1173 public void Sort_GenericIComparable_Bug77039 ()
1175 List<GenericIComparable> l = new List<GenericIComparable> ();
1176 l.Add (new GenericIComparable (2));
1177 l.Add (new GenericIComparable (1));
1178 l.Add (new GenericIComparable (3));
1180 Assert.AreEqual (1, l[0].NumberToSortOn, "0");
1181 Assert.AreEqual (2, l[1].NumberToSortOn, "1");
1182 Assert.AreEqual (3, l[2].NumberToSortOn, "2");
1185 class NonGenericIComparable: IComparable {
1186 private int _NumberToSortOn;
1188 public int NumberToSortOn {
1189 get { return _NumberToSortOn; }
1190 set { _NumberToSortOn = value; }
1193 public NonGenericIComparable (int val)
1195 _NumberToSortOn = val;
1198 public int CompareTo (object obj)
1200 return NumberToSortOn.CompareTo ((obj as NonGenericIComparable).NumberToSortOn);
1205 public void Sort_NonGenericIComparable ()
1207 List<NonGenericIComparable> l = new List<NonGenericIComparable> ();
1208 l.Add (new NonGenericIComparable (2));
1209 l.Add (new NonGenericIComparable (1));
1210 l.Add (new NonGenericIComparable (3));
1212 Assert.AreEqual (1, l[0].NumberToSortOn, "0");
1213 Assert.AreEqual (2, l[1].NumberToSortOn, "1");
1214 Assert.AreEqual (3, l[2].NumberToSortOn, "2");
1217 class NonComparable {
1221 public void Sort_GenericNonIComparable ()
1223 List<NonComparable> l = new List<NonComparable> ();
1225 // no element -> no sort -> no exception
1226 l.Add (new NonComparable ());
1228 // one element -> no sort -> no exception
1232 [ExpectedException (typeof (InvalidOperationException))]
1233 public void Sort_GenericNonIComparable_2 ()
1235 List<NonComparable> l = new List<NonComparable> ();
1236 l.Add (new NonComparable ());
1237 l.Add (new NonComparable ());
1239 // two element -> sort -> exception!
1243 public void IList_Contains_InvalidType()
1245 List<string> list = new List<string>();
1247 Assert.IsFalse (((IList)list).Contains(new object()));
1249 Assert.IsFalse (((IList)_list1).Contains(null));
1253 public void IList_IndexOf_InvalidType()
1255 List<string> list = new List<string>();
1257 Assert.AreEqual (-1, ((IList)list).IndexOf(new object()));
1259 Assert.AreEqual (-1, ((IList)_list1).IndexOf(null));
1262 // for bug #77277 test case
1264 public void Test_ContainsAndIndexOf_EquatableItem ()
1266 List<EquatableClass> list = new List<EquatableClass> ();
1267 EquatableClass item0 = new EquatableClass (0);
1268 EquatableClass item1 = new EquatableClass (1);
1274 Assert.AreEqual (true, list.Contains (item0), "#0");
1275 Assert.AreEqual (true, list.Contains (new EquatableClass (0)), "#1");
1276 Assert.AreEqual (0, list.IndexOf (item0), "#2");
1277 Assert.AreEqual (0, list.IndexOf (new EquatableClass (0)), "#3");
1278 Assert.AreEqual (2, list.LastIndexOf (item0), "#4");
1279 Assert.AreEqual (2, list.LastIndexOf (new EquatableClass (0)), "#5");
1282 // for bug #81387 test case
1284 public void Test_Contains_After_Remove ()
1286 List<int> list = new List<int> ();
1291 Assert.AreEqual (false, list.Contains (2), "#0");
1295 [ExpectedException (typeof (ArgumentOutOfRangeException))]
1296 public void SetItem_OutOfRange()
1298 List<string> list = new List<string>();
1303 [ExpectedException (typeof (ArgumentOutOfRangeException))]
1304 public void SetItem_IList_OutOfRange()
1306 IList<string> list = new List<string>();
1310 public class EquatableClass : IEquatable<EquatableClass>
1313 public EquatableClass (int x)
1318 public bool Equals (EquatableClass other)
1320 return this._x == other._x;
1336 // based on #491858, #517415
1337 public void Enumerator_Current ()
1339 var e1 = new List<int>.Enumerator ();
1340 Assert.IsFalse (Throws (delegate { var x = e1.Current; }));
1342 var d = new List<int> ();
1343 var e2 = d.GetEnumerator ();
1344 Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
1346 Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
1348 Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
1350 var e3 = ((IEnumerable<int>) d).GetEnumerator ();
1351 Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
1353 Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
1355 Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
1357 var e4 = ((IEnumerable) d).GetEnumerator ();
1358 Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
1360 Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
1361 ((IDisposable) e4).Dispose ();
1362 Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
1366 public void Enumerator_Reset ()
1368 var l = new List<int> () {
1372 IEnumerator<int> e = l.GetEnumerator ();
1373 Assert.IsTrue (e.MoveNext (), "#1");
1374 Assert.AreEqual (4, e.Current, "#2");
1376 Assert.AreEqual (0, e.Current, "#3");
1379 [Test] //bug #672907
1380 public void ICollectionCopyToExceptions ()
1382 var l = new List <int> ();
1387 } catch (Exception e) {
1388 Assert.IsTrue (e is ArgumentNullException, "#2");
1392 x.CopyTo (new int [10], -1);
1394 } catch (Exception e) {
1395 Assert.IsTrue (e is ArgumentOutOfRangeException, "#4");
1399 x.CopyTo (new int [10, 1], 0);
1401 } catch (Exception e) {
1402 Assert.IsTrue (e is ArgumentException, "#6");
1406 x.CopyTo (Array.CreateInstance (typeof (int), new int [] { 10 }, new int[] { 1 }), 0);
1408 } catch (Exception e) {
1409 Assert.IsTrue (e is ArgumentOutOfRangeException, "#8");
1412 l.Add (10); l.Add (20);
1414 x.CopyTo (new int [1], 0);
1416 } catch (Exception e) {
1417 Assert.IsTrue (e is ArgumentException, "#10");
1422 public void LastIndexOfEmpty_2558 () {
1423 var l = new List<int> ();
1424 Assert.AreEqual (-1, l.IndexOf (-1));
1428 #region Enumerator mutability
1434 class Foo : IEnumerable<Bar>
1440 enumerator = new Baz ();
1443 public IEnumerator<Bar> GetEnumerator ()
1448 IEnumerator IEnumerable.GetEnumerator ()
1454 class Baz : IEnumerator<Bar>
1456 public bool DisposeWasCalled = false;
1458 public void Dispose ()
1460 DisposeWasCalled = true;
1463 public bool MoveNext ()
1465 return false; //assume empty collection
1468 public void Reset ()
1474 get { return null; }
1477 object IEnumerator.Current
1479 get { return Current; }
1484 public void PremiseAboutDisposeBeingCalledWhenLooping ()
1486 Foo enumerable = new Foo ();
1487 Baz enumerator = enumerable.GetEnumerator () as Baz;
1488 Assert.IsNotNull (enumerator);
1489 Assert.AreEqual (false, enumerator.DisposeWasCalled);
1490 foreach (var element in enumerable) ; //sic
1491 Assert.AreEqual (true, enumerator.DisposeWasCalled);
1495 public void TwoEnumeratorsOfTwoDifferentListsAreDifferent ()
1497 var twoThree = new List<int> { 2, 3 };
1498 var oneTwo = new List<int> { 2, 4 };
1499 Assert.IsFalse (oneTwo.GetEnumerator ().Equals (twoThree.GetEnumerator ()));
1503 public void TwoEnumeratorsOfTwoDifferentListsWithSameElementsAreDifferent ()
1505 var twoThree = new List<int> { 2, 3 };
1506 var anotherTwoThree = new List<int> { 2, 3 };
1507 Assert.IsFalse(twoThree.GetEnumerator ().Equals (anotherTwoThree.GetEnumerator ()));
1511 public void EnumeratorIsSameInSameListAfterSubsequentCalls ()
1513 var enumerable = new List<Bar> ();
1514 var enumerator = enumerable.GetEnumerator ();
1515 var enumerator2 = enumerable.GetEnumerator ();
1517 Assert.IsFalse (ReferenceEquals (enumerator2, enumerator)); //because they are value-types
1519 Assert.IsTrue (enumerator2.Equals (enumerator));
1523 [Test] // was bug in Mono 2.10.9
1524 public void EnumeratorIsStillSameInSubsequentCallsEvenHavingADisposalInBetween ()
1526 var enumerable = new List<Bar> ();
1527 var enumerator = enumerable.GetEnumerator ();
1528 enumerator.Dispose ();
1529 var enumerator2 = enumerable.GetEnumerator ();
1531 Assert.IsFalse (ReferenceEquals (enumerator2, enumerator)); //because they are value-types
1533 Assert.IsTrue (enumerator2.Equals (enumerator));
1537 public void EnumeratorIsObviouslyDifferentAfterListChanges ()
1539 var enumerable = new List<Bar> ();
1540 var enumerator = enumerable.GetEnumerator ();
1541 enumerable.Add (new Bar ());
1542 var enumerator2 = enumerable.GetEnumerator ();
1544 Assert.IsFalse (ReferenceEquals (enumerator2, enumerator)); //because they are value-types
1546 Assert.IsFalse (enumerator2.Equals (enumerator));
1549 [Test] // was bug in Mono 2.10.9
1550 public void DotNetDoesntThrowObjectDisposedExceptionAfterSubsequentDisposes()
1552 var enumerable = new List<Bar> ();
1553 var enumerator = enumerable.GetEnumerator ();
1554 Assert.AreEqual (false, enumerator.MoveNext ());
1555 enumerator.Dispose();
1556 Assert.AreEqual (false, enumerator.MoveNext ());