2 // MonoTests.System.Collections.Generic.DictionaryTest
5 // Sureshkumar T (tsureshkumar@novell.com)
6 // Ankit Jain (radical@corewars.org)
7 // David Waite (mass@akuma.org)
9 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
10 // Copyright (C) 2005 David Waite (mass@akuma.org)
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System.Collections;
35 using System.Collections.Generic;
37 using System.Runtime.Serialization.Formatters.Binary;
39 using System.Threading;
41 using NUnit.Framework;
43 namespace MonoTests.System.Collections.Generic {
45 public class DictionaryTest {
49 public MyClass (int a, int b)
54 public override int GetHashCode ()
59 public override bool Equals (object obj)
61 if (!(obj is MyClass))
63 return ((MyClass)obj).Value == a;
73 Dictionary <string, object> _dictionary = null;
74 Dictionary <MyClass, MyClass> _dictionary2 = null;
75 Dictionary <int, int> _dictionary3 = null;
80 _dictionary = new Dictionary <string, object> ();
81 _dictionary2 = new Dictionary <MyClass, MyClass> ();
82 _dictionary3 = new Dictionary <int, int>();
86 public void AddTest ()
88 _dictionary.Add ("key1", "value");
89 Assert.AreEqual ("value", _dictionary ["key1"].ToString (), "Add failed!");
93 public void AddTest2 ()
95 MyClass m1 = new MyClass (10,5);
96 MyClass m2 = new MyClass (20,5);
97 MyClass m3 = new MyClass (12,3);
98 _dictionary2.Add (m1,m1);
99 _dictionary2.Add (m2, m2);
100 _dictionary2.Add (m3, m3);
101 Assert.AreEqual (20, _dictionary2 [m2].Value, "#1");
102 Assert.AreEqual (10, _dictionary2 [m1].Value, "#2");
103 Assert.AreEqual (12, _dictionary2 [m3].Value, "#3");
107 public void AddTest3 ()
109 _dictionary3.Add (1, 2);
110 _dictionary3.Add (2, 3);
111 _dictionary3.Add (3, 4);
112 Assert.AreEqual (2, _dictionary3[1], "#1");
113 Assert.AreEqual (3, _dictionary3[2], "#2");
114 Assert.AreEqual (4, _dictionary3[3], "#3");
117 [Test, ExpectedException(typeof(ArgumentNullException))]
118 public void AddNullTest ()
120 _dictionary.Add (null, "");
123 [Test, ExpectedException(typeof(ArgumentException))]
124 public void AddDuplicateTest ()
126 _dictionary.Add("foo", "bar");
127 _dictionary.Add("foo", "bar");
130 //Tests Add when resize takes place
132 public void AddLargeTest ()
134 int i, numElems = 50;
136 for (i = 0; i < numElems; i++)
138 _dictionary3.Add (i, i);
142 foreach (KeyValuePair <int, int> entry in _dictionary3)
147 Assert.AreEqual (i, numElems, "Add with resize failed!");
151 public void IndexerGetExistingTest ()
153 _dictionary.Add ("key1", "value");
154 Assert.AreEqual ("value", _dictionary ["key1"].ToString (), "Add failed!");
157 [Test, ExpectedException(typeof(KeyNotFoundException))]
158 public void IndexerGetNonExistingTest ()
160 object foo = _dictionary ["foo"];
163 [Test, ExpectedException(typeof(ArgumentNullException))]
164 public void IndexerGetNullTest()
166 object s = _dictionary[null];
170 public void IndexerSetExistingTest ()
172 _dictionary.Add ("key1", "value1");
173 _dictionary ["key1"] = "value2";
174 Assert.AreEqual (1, _dictionary.Count);
175 Assert.AreEqual ("value2", _dictionary ["key1"]);
179 public void IndexerSetNonExistingTest ()
181 _dictionary ["key1"] = "value1";
182 Assert.AreEqual (1, _dictionary.Count);
183 Assert.AreEqual ("value1", _dictionary ["key1"]);
187 public void RemoveTest ()
189 _dictionary.Add ("key1", "value1");
190 _dictionary.Add ("key2", "value2");
191 _dictionary.Add ("key3", "value3");
192 _dictionary.Add ("key4", "value4");
193 Assert.IsTrue (_dictionary.Remove ("key3"));
194 Assert.IsFalse (_dictionary.Remove ("foo"));
195 Assert.AreEqual (3, _dictionary.Count);
196 Assert.IsFalse (_dictionary.ContainsKey ("key3"));
200 public void RemoveTest2 ()
202 MyClass m1 = new MyClass (10, 5);
203 MyClass m2 = new MyClass (20, 5);
204 MyClass m3 = new MyClass (12, 3);
205 _dictionary2.Add (m1, m1);
206 _dictionary2.Add (m2, m2);
207 _dictionary2.Add (m3, m3);
208 _dictionary2.Remove (m1); // m2 is in rehash path
209 Assert.AreEqual (20, _dictionary2 [m2].Value, "#4");
214 [Category ("NotWorking")]
215 public void Remove_ZeroOut ()
217 object key = new object ();
218 object value = new object ();
220 WeakReference wrKey = new WeakReference (key);
221 WeakReference wrValue = new WeakReference (value);
223 Dictionary <object, object> dictionary = new Dictionary <object, object> ();
224 dictionary.Add (key, value);
225 dictionary.Remove (key);
232 Assert.IsNull (wrKey.Target, "#1");
233 Assert.IsNull (wrValue.Target, "#2");
236 [Test, ExpectedException(typeof(ArgumentNullException))]
237 public void IndexerSetNullTest()
239 _dictionary[null] = "bar";
243 public void ClearTest ()
245 _dictionary.Add ("key1", "value1");
246 _dictionary.Add ("key2", "value2");
247 _dictionary.Add ("key3", "value3");
248 _dictionary.Add ("key4", "value4");
249 _dictionary.Clear ();
250 Assert.AreEqual (0, _dictionary.Count, "Clear method failed!");
251 Assert.IsFalse (_dictionary.ContainsKey ("key2"));
255 public void Clear_Iterators ()
257 Dictionary<object, object> d = new Dictionary <object, object> ();
259 d [new object ()] = new object ();
262 foreach (object o in d) {
263 hash += o.GetHashCode ();
268 [Category ("NotWorking")]
269 public void Clear_ZeroOut ()
271 object key = new object ();
272 object value = new object ();
274 WeakReference wrKey = new WeakReference (key);
275 WeakReference wrValue = new WeakReference (value);
277 Dictionary <object, object> dictionary = new Dictionary <object, object> ();
278 dictionary.Add (key, value);
286 Assert.IsNull (wrKey.Target, "#1");
287 Assert.IsNull (wrValue.Target, "#2");
291 public void ContainsKeyTest ()
293 _dictionary.Add ("key1", "value1");
294 _dictionary.Add ("key2", "value2");
295 _dictionary.Add ("key3", "value3");
296 _dictionary.Add ("key4", "value4");
297 bool contains = _dictionary.ContainsKey ("key4");
298 Assert.IsTrue (contains, "ContainsKey does not return correct value!");
299 contains = _dictionary.ContainsKey ("key5");
300 Assert.IsFalse (contains, "ContainsKey for non existant does not return correct value!");
303 [Test, ExpectedException (typeof (ArgumentNullException))]
304 public void ContainsKeyTest2 ()
306 _dictionary.ContainsKey (null);
310 public void ContainsValueTest ()
312 _dictionary.Add ("key1", "value1");
313 _dictionary.Add ("key2", "value2");
314 _dictionary.Add ("key3", "value3");
315 _dictionary.Add ("key4", "value4");
316 bool contains = _dictionary.ContainsValue ("value2");
317 Assert.IsTrue(contains, "ContainsValue does not return correct value!");
318 contains = _dictionary.ContainsValue ("@@daisofja@@");
319 Assert.IsFalse (contains, "ContainsValue for non existant does not return correct value!");
323 public void TryGetValueTest()
325 _dictionary.Add ("key1", "value1");
326 _dictionary.Add ("key2", "value2");
327 _dictionary.Add ("key3", "value3");
328 _dictionary.Add ("key4", "value4");
330 bool retrieved = _dictionary.TryGetValue ("key4", out value);
331 Assert.IsTrue (retrieved);
332 Assert.AreEqual ("value4", (string)value, "TryGetValue does not return value!");
334 retrieved = _dictionary.TryGetValue ("key7", out value);
335 Assert.IsFalse (retrieved);
336 Assert.IsNull (value, "value for non existant value should be null!");
340 public void ValueTypeTest ()
342 Dictionary <int, float> dict = new Dictionary <int, float> ();
343 dict.Add (10, 10.3f);
344 dict.Add (11, 10.4f);
345 dict.Add (12, 10.5f);
346 Assert.AreEqual (10.4f, dict [11], "#5");
354 public MyTest (string name, int number)
360 public override int GetHashCode ()
362 return Name.GetHashCode () ^ RollNo;
365 public override bool Equals (object obj)
367 MyTest myt = obj as MyTest;
368 return myt.Name.Equals (this.Name) &&
369 myt.RollNo.Equals (this.RollNo);
374 public void ObjectAsKeyTest ()
376 Dictionary <object, object> dict = new Dictionary <object, object> ();
377 MyTest key1, key2, key3;
378 dict.Add ( (key1 = new MyTest ("key1", 234)), "value1");
379 dict.Add ( (key2 = new MyTest ("key2", 444)), "value2");
380 dict.Add ( (key3 = new MyTest ("key3", 5655)), "value3");
382 Assert.AreEqual ("value2", dict [key2], "value is not returned!");
383 Assert.AreEqual ("value3", dict [key3], "neg: exception should not be thrown!");
386 [Test, ExpectedException (typeof (ArgumentException))]
387 public void IDictionaryAddTest ()
389 IDictionary iDict = _dictionary as IDictionary;
390 iDict.Add ("key1", "value1");
391 iDict.Add ("key2", "value3");
392 Assert.AreEqual (2, iDict.Count, "IDictioanry interface add is not working!");
395 iDict.Add (12, "value");
396 iDict.Add ("key", 34);
400 public void IEnumeratorTest ()
402 _dictionary.Add ("key1", "value1");
403 _dictionary.Add ("key2", "value2");
404 _dictionary.Add ("key3", "value3");
405 _dictionary.Add ("key4", "value4");
406 IEnumerator itr = ((IEnumerable)_dictionary).GetEnumerator ();
407 while (itr.MoveNext ()) {
408 object o = itr.Current;
409 Assert.AreEqual (typeof (KeyValuePair<string,object>), o.GetType (), "Current should return a type of KeyValuePair");
410 KeyValuePair<string,object> entry = (KeyValuePair<string,object>) itr.Current;
412 Assert.AreEqual ("value4", _dictionary ["key4"].ToString (), "");
417 public void IEnumeratorGenericTest ()
419 _dictionary.Add ("key1", "value1");
420 _dictionary.Add ("key2", "value2");
421 _dictionary.Add ("key3", "value3");
422 _dictionary.Add ("key4", "value4");
423 IEnumerator <KeyValuePair <string, object>> itr = ((IEnumerable <KeyValuePair <string, object>>)_dictionary).GetEnumerator ();
424 while (itr.MoveNext ()) {
425 object o = itr.Current;
426 Assert.AreEqual (typeof (KeyValuePair <string, object>), o.GetType (), "Current should return a type of KeyValuePair<object,string>");
427 KeyValuePair <string, object> entry = (KeyValuePair <string, object>)itr.Current;
429 Assert.AreEqual ("value4", _dictionary ["key4"].ToString (), "");
433 public void IDictionaryEnumeratorTest ()
435 _dictionary.Add ("key1", "value1");
436 _dictionary.Add ("key2", "value2");
437 _dictionary.Add ("key3", "value3");
438 _dictionary.Add ("key4", "value4");
439 IDictionaryEnumerator itr = ((IDictionary)_dictionary).GetEnumerator ();
440 while (itr.MoveNext ()) {
441 object o = itr.Current;
442 Assert.AreEqual (typeof (DictionaryEntry), o.GetType (), "Current should return a type of DictionaryEntry");
443 DictionaryEntry entry = (DictionaryEntry) itr.Current;
445 Assert.AreEqual ("value4", _dictionary ["key4"].ToString (), "");
449 public void ForEachTest ()
451 _dictionary.Add ("key1", "value1");
452 _dictionary.Add ("key2", "value2");
453 _dictionary.Add ("key3", "value3");
454 _dictionary.Add ("key4", "value4");
457 foreach (KeyValuePair <string, object> entry in _dictionary)
459 Assert.AreEqual(4, i, "fail1: foreach entry failed!");
462 foreach (KeyValuePair <string, object> entry in ((IEnumerable)_dictionary))
464 Assert.AreEqual(4, i, "fail2: foreach entry failed!");
467 foreach (DictionaryEntry entry in ((IDictionary)_dictionary))
469 Assert.AreEqual (4, i, "fail3: foreach entry failed!");
473 public void ResizeTest ()
475 Dictionary <string, object> dictionary = new Dictionary <string, object> (3);
476 dictionary.Add ("key1", "value1");
477 dictionary.Add ("key2", "value2");
478 dictionary.Add ("key3", "value3");
480 Assert.AreEqual (3, dictionary.Count);
482 dictionary.Add ("key4", "value4");
483 Assert.AreEqual (4, dictionary.Count);
484 Assert.AreEqual ("value1", dictionary ["key1"].ToString (), "");
485 Assert.AreEqual ("value2", dictionary ["key2"].ToString (), "");
486 Assert.AreEqual ("value4", dictionary ["key4"].ToString (), "");
487 Assert.AreEqual ("value3", dictionary ["key3"].ToString (), "");
491 public void KeyCollectionTest ()
493 _dictionary.Add ("key1", "value1");
494 _dictionary.Add ("key2", "value2");
495 _dictionary.Add ("key3", "value3");
496 _dictionary.Add ("key4", "value4");
498 ICollection <string> keys = ((IDictionary <string, object>)_dictionary).Keys;
499 Assert.AreEqual (4, keys.Count);
501 foreach (string key in keys)
505 Assert.AreEqual(4, i);
509 public void KeyValueEnumeratorTest ()
511 IDictionary<int, int> d = new Dictionary<int, int>();
513 // Values are chosen such that two keys map to the same bucket.
514 // Default dictionary table size == 10
519 Assert.AreEqual (d.Count, d.Keys.Count, "d and d.Keys don't appear to match");
520 Assert.AreEqual (d.Values.Count, d.Keys.Count, "d.Keys and d.Values don't appear to match");
523 foreach (int i in d.Values)
525 Assert.AreEqual (count, d.Values.Count, "d.Values doesn't have the correct number of elements");
528 foreach (int i in d.Keys)
530 Assert.AreEqual (count, d.Keys.Count, "d.Keys doesn't have the correct number of elements");
534 foreach (int i in d.Keys) {
536 if (count++ >= nkeys)
537 Assert.Fail ("Reading a value appears to trash enumerator state");
542 public void SliceCollectionsEnumeratorTest ()
544 Dictionary<string, int> values = new Dictionary<string, int> ();
546 IEnumerator <string> ke = values.Keys.GetEnumerator ();
547 IEnumerator <int> ve = values.Values.GetEnumerator ();
549 Assert.IsTrue (ke is Dictionary<string, int>.KeyCollection.Enumerator);
550 Assert.IsTrue (ve is Dictionary<string, int>.ValueCollection.Enumerator);
554 public void PlainEnumeratorReturnTest ()
556 // Test that we return a KeyValuePair even for non-generic dictionary iteration
557 _dictionary["foo"] = "bar";
558 IEnumerator<KeyValuePair<string, object>> enumerator = _dictionary.GetEnumerator();
559 Assert.IsTrue(enumerator.MoveNext(), "#1");
560 Assert.AreEqual (typeof (KeyValuePair<string,object>), ((IEnumerator)enumerator).Current.GetType (), "#2");
561 Assert.AreEqual (typeof (DictionaryEntry), ((IDictionaryEnumerator)enumerator).Entry.GetType (), "#3");
562 Assert.AreEqual (typeof (KeyValuePair<string,object>), ((IDictionaryEnumerator)enumerator).Current.GetType (), "#4");
563 Assert.AreEqual (typeof (KeyValuePair<string,object>), ((object) enumerator.Current).GetType (), "#5");
566 [Test, ExpectedException (typeof (InvalidOperationException))]
567 public void FailFastTest1 ()
569 Dictionary<int, int> d = new Dictionary<int, int> ();
572 foreach (KeyValuePair<int, int> kv in d) {
573 d [kv.Key + 1] = kv.Value + 1;
575 Assert.Fail ("Should not be reached");
577 Assert.Fail ("Should not be reached");
580 [Test, ExpectedException (typeof (InvalidOperationException))]
581 public void FailFastTest2 ()
583 Dictionary<int, int> d = new Dictionary<int, int> ();
586 foreach (int i in d.Keys) {
589 Assert.Fail ("Should not be reached");
591 Assert.Fail ("Should not be reached");
594 [Test, ExpectedException (typeof (InvalidOperationException))]
595 public void FailFastTest3 ()
597 Dictionary<int, int> d = new Dictionary<int, int> ();
600 foreach (int i in d.Keys) {
603 Assert.Fail ("Should not be reached");
605 Assert.Fail ("Should not be reached");
609 public void SerializationTest()
611 for (int i = 0; i < 50; i++)
613 _dictionary3.Add(i, i);
616 BinaryFormatter formatter = new BinaryFormatter();
617 MemoryStream stream = new MemoryStream();
618 formatter.Serialize(stream, _dictionary3);
621 object deserialized = formatter.Deserialize(stream);
623 Assert.IsNotNull(deserialized);
624 Assert.IsFalse(deserialized == _dictionary3);
626 Assert.IsTrue(deserialized is Dictionary<int, int>);
627 Dictionary<int, int> d3 = deserialized as Dictionary<int, int>;
629 Assert.AreEqual(50, d3.Count);
630 for (int i = 0; i < 50; i++)
632 Assert.AreEqual(i, d3[i]);
638 public void SerializationCompatibilty ()
640 /* Serialization output from .net
642 var dict = new Dictionary<string, string> ();
643 dict.Add ("key", "value");
645 var dictSerializedStream = new MemoryStream ();
646 fmt.Serialize (dictSerializedStream, dict);
648 dictSerializedStream.Seek (0, SeekOrigin.Begin);
649 var res = Convert.ToBase64String (dictSerializedStream.ToArray (), Base64FormattingOptions.InsertLineBreaks);
653 var x = "AAEAAAD/////AQAAAAAAAAAEAQAAAOIBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlv" +
654 "bmFyeWAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJl" +
655 "PW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uU3RyaW5n" +
656 "LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRv" +
657 "a2VuPWI3N2E1YzU2MTkzNGUwODldXQQAAAAHVmVyc2lvbghDb21wYXJlcghIYXNoU2l6ZQ1LZXlW" +
658 "YWx1ZVBhaXJzAAMAAwiSAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVhbGl0" +
659 "eUNvbXBhcmVyYDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1" +
660 "bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCOYBU3lzdGVt" +
661 "LkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5TdHJpbmcsIG1zY29y" +
662 "bGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3" +
663 "YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAs" +
664 "IEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dW10BAAAA" +
665 "CQIAAAADAAAACQMAAAAEAgAAAJIBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0Vx" +
666 "dWFsaXR5Q29tcGFyZXJgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAu" +
667 "MCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0AAAAA" +
668 "BwMAAAAAAQAAAAEAAAAD5AFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJg" +
669 "MltbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0" +
670 "cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlN0cmluZywgbXNj" +
671 "b3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1i" +
672 "NzdhNWM1NjE5MzRlMDg5XV0E/P///+QBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFs" +
673 "dWVQYWlyYDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1" +
674 "cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJp" +
675 "bmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5" +
676 "VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAANrZXkFdmFsdWUBAQYFAAAAA2tleQYGAAAABXZh" +
679 var dict = new Dictionary<string, string> ();
680 dict.Add ("key", "value");
682 BinaryFormatter fmt = new BinaryFormatter ();
683 var mdict = (Dictionary<string, string>) fmt.Deserialize (new MemoryStream (Convert.FromBase64String (x)));
685 Assert.AreEqual (1, dict.Count);
686 Assert.AreEqual (dict.Comparer.GetType (), mdict.Comparer.GetType ());
691 public void ZeroCapacity ()
693 Dictionary<int, int> x = new Dictionary <int, int> (0);
696 x = new Dictionary <int, int> (0);
699 x = new Dictionary <int, int> (0);
702 x = new Dictionary <int, int> (0);
705 } catch (KeyNotFoundException){
709 b = x.ContainsKey (10);
710 b = x.ContainsValue (10);
712 x = new Dictionary <int, int> (0);
715 x = new Dictionary <int, int> (0);
717 x.TryGetValue (1, out intv);
720 object ob = x.Values;
721 foreach (KeyValuePair<int,int> a in x){
726 public void Empty_KeysValues_CopyTo ()
728 Dictionary<int, int> d = new Dictionary<int, int> ();
729 int[] array = new int[1];
730 d.Keys.CopyTo (array, array.Length);
731 d.Values.CopyTo (array, array.Length);
735 public void Empty_CopyTo ()
737 Dictionary<int, int> d = new Dictionary<int, int> ();
738 ICollection c = (ICollection) d;
739 DictionaryEntry [] array = new DictionaryEntry [1];
740 c.CopyTo (array, array.Length);
742 ICollection<KeyValuePair<int,int>> c2 = d;
743 KeyValuePair<int,int> [] array2 = new KeyValuePair<int,int> [1];
744 c2.CopyTo (array2, array2.Length);
748 public void IDictionary_Contains ()
750 IDictionary d = new Dictionary<int, int> ();
752 Assert.IsTrue (d.Contains (1));
753 Assert.IsFalse (d.Contains (2));
754 Assert.IsFalse (d.Contains ("x"));
757 [Test, ExpectedException (typeof (ArgumentNullException))]
758 public void IDictionary_Contains2 ()
760 IDictionary d = new Dictionary<int, int> ();
764 [Test, ExpectedException (typeof (ArgumentNullException))]
765 public void IDictionary_Add1 ()
767 IDictionary d = new Dictionary<int, int> ();
771 [Test, ExpectedException (typeof (ArgumentException))]
772 public void IDictionary_Add2 ()
774 IDictionary d = new Dictionary<int, int> ();
778 [Test, ExpectedException (typeof (ArgumentException))]
779 public void IDictionary_Add3 ()
781 IDictionary d = new Dictionary<int, int> ();
786 public void IDictionary_Add_Null ()
788 IDictionary d = new Dictionary<int, string> ();
792 Assert.IsNull (d [1]);
793 Assert.IsNull (d [2]);
797 [ExpectedException (typeof (ArgumentNullException))]
798 public void IDictionary_Add_Null_2 ()
800 IDictionary d = new Dictionary<int, int> ();
805 public void IDictionary_Remove1 ()
807 IDictionary d = new Dictionary<int, int> ();
814 [Test, ExpectedException (typeof (ArgumentNullException))]
815 public void IDictionary_Remove2 ()
817 IDictionary d = new Dictionary<int, int> ();
822 public void IDictionary_IndexerGetNonExistingTest ()
824 IDictionary d = new Dictionary<int, int> ();
827 Assert.IsNull(d["foo"]);
830 [Test] // bug #332534
831 public void Dictionary_MoveNext ()
833 Dictionary<int,int> a = new Dictionary<int,int>();
837 IEnumerator en = a.GetEnumerator();
838 for (int i = 1; i < 10; i++)
843 public void CopyToArray ()
845 Dictionary<string, string> test = new Dictionary<string, string> ();
846 test.Add ("monkey", "singe");
847 test.Add ("singe", "mono");
848 test.Add ("mono", "monkey");
849 Assert.AreEqual (3, test.Keys.Count, "Dictionary.Count");
851 ArrayList list = new ArrayList (test.Keys);
852 Assert.AreEqual (3, list.Count, "ArrayList.Count");
853 Assert.IsTrue (list.Contains ("monkey"), "monkey");
854 Assert.IsTrue (list.Contains ("singe"), "singe");
855 Assert.IsTrue (list.Contains ("mono"), "mono");
859 public void KeyObjectMustNotGetChangedIfKeyAlreadyExists ()
861 Dictionary<String, int> d = new Dictionary<string, int> ();
863 string s2 = "Tes" + "T".ToLowerInvariant();
866 string comp = String.Empty;
867 foreach (String s in d.Keys)
869 Assert.IsTrue (Object.ReferenceEquals (s1, comp));
873 public void ResetKeysEnumerator ()
875 Dictionary<string, string> test = new Dictionary<string, string> ();
876 test.Add ("monkey", "singe");
877 test.Add ("singe", "mono");
878 test.Add ("mono", "monkey");
880 IEnumerator enumerator = test.Keys.GetEnumerator ();
882 Assert.IsTrue (enumerator.MoveNext ());
883 Assert.IsTrue (enumerator.MoveNext ());
887 Assert.IsTrue (enumerator.MoveNext ());
888 Assert.IsTrue (enumerator.MoveNext ());
889 Assert.IsTrue (enumerator.MoveNext ());
890 Assert.IsFalse (enumerator.MoveNext ());
894 public void ResetValuesEnumerator ()
896 Dictionary<string, string> test = new Dictionary<string, string> ();
897 test.Add ("monkey", "singe");
898 test.Add ("singe", "mono");
899 test.Add ("mono", "monkey");
901 IEnumerator enumerator = test.Values.GetEnumerator ();
903 Assert.IsTrue (enumerator.MoveNext ());
904 Assert.IsTrue (enumerator.MoveNext ());
908 Assert.IsTrue (enumerator.MoveNext ());
909 Assert.IsTrue (enumerator.MoveNext ());
910 Assert.IsTrue (enumerator.MoveNext ());
911 Assert.IsFalse (enumerator.MoveNext ());
915 public void ResetShimEnumerator ()
917 IDictionary test = new Dictionary<string, string> ();
918 test.Add ("monkey", "singe");
919 test.Add ("singe", "mono");
920 test.Add ("mono", "monkey");
922 IEnumerator enumerator = test.GetEnumerator ();
924 Assert.IsTrue (enumerator.MoveNext ());
925 Assert.IsTrue (enumerator.MoveNext ());
929 Assert.IsTrue (enumerator.MoveNext ());
930 Assert.IsTrue (enumerator.MoveNext ());
931 Assert.IsTrue (enumerator.MoveNext ());
932 Assert.IsFalse (enumerator.MoveNext ());
936 public void ICollectionOfKeyValuePairContains ()
938 var dictionary = new Dictionary<string, int> ();
939 dictionary.Add ("foo", 42);
940 dictionary.Add ("bar", 12);
942 var collection = dictionary as ICollection<KeyValuePair<string, int>>;
944 Assert.AreEqual (2, collection.Count);
946 Assert.IsFalse (collection.Contains (new KeyValuePair<string, int> ("baz", 13)));
947 Assert.IsFalse (collection.Contains (new KeyValuePair<string, int> ("foo", 13)));
948 Assert.IsTrue (collection.Contains (new KeyValuePair<string, int> ("foo", 42)));
952 public void ICollectionOfKeyValuePairRemove ()
954 var dictionary = new Dictionary<string, int> ();
955 dictionary.Add ("foo", 42);
956 dictionary.Add ("bar", 12);
958 var collection = dictionary as ICollection<KeyValuePair<string, int>>;
960 Assert.AreEqual (2, collection.Count);
962 Assert.IsFalse (collection.Remove (new KeyValuePair<string, int> ("baz", 13)));
963 Assert.IsFalse (collection.Remove (new KeyValuePair<string, int> ("foo", 13)));
964 Assert.IsTrue (collection.Remove (new KeyValuePair<string, int> ("foo", 42)));
966 Assert.AreEqual (12, dictionary ["bar"]);
967 Assert.IsFalse (dictionary.ContainsKey ("foo"));
971 public void ICollectionCopyToKeyValuePairArray ()
973 var dictionary = new Dictionary<string, int> ();
974 dictionary.Add ("foo", 42);
976 var collection = dictionary as ICollection;
978 Assert.AreEqual (1, collection.Count);
980 var pairs = new KeyValuePair<string, int> [1];
982 collection.CopyTo (pairs, 0);
984 Assert.AreEqual ("foo", pairs [0].Key);
985 Assert.AreEqual (42, pairs [0].Value);
989 public void ICollectionCopyToDictionaryEntryArray ()
991 var dictionary = new Dictionary<string, int> ();
992 dictionary.Add ("foo", 42);
994 var collection = dictionary as ICollection;
996 Assert.AreEqual (1, collection.Count);
998 var entries = new DictionaryEntry [1];
1000 collection.CopyTo (entries, 0);
1002 Assert.AreEqual ("foo", (string) entries [0].Key);
1003 Assert.AreEqual (42, (int) entries [0].Value);
1007 public void ICollectionCopyToObjectArray ()
1009 var dictionary = new Dictionary<string, int> ();
1010 dictionary.Add ("foo", 42);
1012 var collection = dictionary as ICollection;
1014 Assert.AreEqual (1, collection.Count);
1016 var array = new object [1];
1018 collection.CopyTo (array, 0);
1020 var pair = (KeyValuePair<string, int>) array [0];
1022 Assert.AreEqual ("foo", pair.Key);
1023 Assert.AreEqual (42, pair.Value);
1027 [ExpectedException (typeof (ArgumentException))]
1028 public void ICollectionCopyToInvalidArray ()
1030 var dictionary = new Dictionary<string, int> ();
1031 dictionary.Add ("foo", 42);
1033 var collection = dictionary as ICollection;
1035 Assert.AreEqual (1, collection.Count);
1037 var array = new int [1];
1039 collection.CopyTo (array, 0);
1043 public void ValuesCopyToObjectArray ()
1045 var dictionary = new Dictionary<string, string> { { "foo", "bar" } };
1047 var values = dictionary.Values as ICollection;
1049 var array = new object [values.Count];
1051 values.CopyTo (array, 0);
1053 Assert.AreEqual ("bar", array [0]);
1068 // based on #491858, #517415
1069 public void Enumerator_Current ()
1071 var e1 = new Dictionary<int,int>.Enumerator ();
1072 Assert.IsFalse (Throws (delegate { var x = e1.Current; }));
1074 var d = new Dictionary<int,int> ();
1075 var e2 = d.GetEnumerator ();
1076 Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
1078 Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
1080 Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
1082 var e3 = ((IEnumerable<KeyValuePair<int,int>>) d).GetEnumerator ();
1083 Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
1085 Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
1087 Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
1089 var e4 = ((IEnumerable) d).GetEnumerator ();
1090 Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
1092 Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
1093 ((IDisposable) e4).Dispose ();
1094 Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
1098 // based on #491858, #517415
1099 public void KeyEnumerator_Current ()
1101 var e1 = new Dictionary<int,int>.KeyCollection.Enumerator ();
1102 Assert.IsFalse (Throws (delegate { var x = e1.Current; }));
1104 var d = new Dictionary<int,int> ().Keys;
1105 var e2 = d.GetEnumerator ();
1106 Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
1108 Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
1110 Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
1112 var e3 = ((IEnumerable<int>) d).GetEnumerator ();
1113 Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
1115 Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
1117 Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
1119 var e4 = ((IEnumerable) d).GetEnumerator ();
1120 Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
1122 Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
1123 ((IDisposable) e4).Dispose ();
1124 Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
1128 // based on #491858, #517415
1129 public void ValueEnumerator_Current ()
1131 var e1 = new Dictionary<int,int>.ValueCollection.Enumerator ();
1132 Assert.IsFalse (Throws (delegate { var x = e1.Current; }));
1134 var d = new Dictionary<int,int> ().Values;
1135 var e2 = d.GetEnumerator ();
1136 Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
1138 Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
1140 Assert.IsFalse (Throws (delegate { var x = e2.Current; }));
1142 var e3 = ((IEnumerable<int>) d).GetEnumerator ();
1143 Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
1145 Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
1147 Assert.IsFalse (Throws (delegate { var x = e3.Current; }));
1149 var e4 = ((IEnumerable) d).GetEnumerator ();
1150 Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
1152 Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
1153 ((IDisposable) e4).Dispose ();
1154 Assert.IsTrue (Throws (delegate { var x = e4.Current; }));
1158 public void ICollectionCopyTo ()
1160 var d = new Dictionary<int, string> ();
1163 c.CopyTo (new object [0], 0);
1164 c.CopyTo (new string [0], 0);
1165 c.CopyTo (new MyClass [0], 0);
1168 c.CopyTo (new object [0], 0);
1169 c.CopyTo (new ValueType [0], 0);
1172 c.CopyTo (new object [0], 0);
1173 c.CopyTo (new MyClass [0], 0);
1178 c.CopyTo (new object [1], 0);
1179 c.CopyTo (new ValueType [1], 0);
1182 c.CopyTo (new object [1], 0);
1183 c.CopyTo (new MyClass [1], 0);
1186 public void ICollectionCopyTo_ex1 ()
1188 var d = new Dictionary<int, string> ();
1189 ICollection c = d.Keys;
1190 c.CopyTo (new string [1], 0);
1193 [Test, ExpectedException (typeof (ArgumentException))]
1194 public void ICollectionCopyTo_ex2 ()
1196 var d = new Dictionary<int, string> ();
1197 ICollection c = d.Values;
1198 c.CopyTo (new int [1], 0);
1201 [Test, ExpectedException (typeof (ArgumentException))]
1202 public void ICollectionCopyTo_ex3 ()
1204 var d = new Dictionary<int, string> ();
1207 ICollection c = d.Keys;
1208 c.CopyTo (new MyClass [1], 0);
1211 [Test, ExpectedException (typeof (ArgumentException))]
1212 public void ICollectionCopyTo_ex4 ()
1214 var d = new Dictionary<int, string> ();
1217 ICollection c = d.Values;
1218 c.CopyTo (new MyClass [1], 0);
1221 [Test] // bug 474009
1222 public void DeserializeEmptyDictionary ()
1224 // contains a Dictionary<string, int> with Count = 0
1225 // serialized with MS.NET 3.5
1227 @"AAEAAAD/////AQAAAAAAAAAEAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlv
1228 bmFyeWAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJl
1229 PW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50MzIs
1230 IG1zY29ybGliLCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9r
1231 ZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAdWZXJzaW9uCENvbXBhcmVyCEhhc2hTaXplAAMACJIB
1232 U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5Q29tcGFyZXJgMVtbU3lz
1233 dGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQ
1234 dWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0IAAAAAAkCAAAAAAAAAAQCAAAAkgFTeXN0
1235 ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljRXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0ZW0u
1236 U3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1Ymxp
1237 Y0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQAAAAAL";
1239 var stream = new MemoryStream (Convert.FromBase64String (data));
1240 var fmt = new BinaryFormatter ();
1241 var dict = (Dictionary <string, int>) fmt.Deserialize (stream);
1242 Assert.AreEqual (0, dict.Count);
1246 public void DeserializeNonEmptyDictionary ()
1248 // contains a Dictionary<string, int> with Count = 2
1249 // and dict [i.ToString()] == i for each i.
1250 // serialized with MS.NET 3.5
1252 @"AAEAAAD/////AQAAAAAAAAAEAQAAAOEBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlv
1253 bmFyeWAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJl
1254 PW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uSW50MzIs
1255 IG1zY29ybGliLCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9r
1256 ZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAdWZXJzaW9uCENvbXBhcmVyCEhhc2hTaXplDUtleVZh
1257 bHVlUGFpcnMAAwADCJIBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuR2VuZXJpY0VxdWFsaXR5
1258 Q29tcGFyZXJgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249Mi4wLjAuMCwgQ3Vs
1259 dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0I5QFTeXN0ZW0u
1260 Q29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLlN0cmluZywgbXNjb3Js
1261 aWIsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdh
1262 NWM1NjE5MzRlMDg5XSxbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj0yLjAuMC4wLCBD
1263 dWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXVtdAgAAAAkC
1264 AAAAAwAAAAkDAAAABAIAAACSAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkdlbmVyaWNFcXVh
1265 bGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTIuMC4wLjAs
1266 IEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAAAAAAcD
1267 AAAAAAEAAAACAAAAA+MBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJb
1268 W1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJh
1269 bCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5JbnQzMiwgbXNjb3Js
1270 aWIsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdh
1271 NWM1NjE5MzRlMDg5XV0E/P///+MBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQ
1272 YWlyYDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9
1273 bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5JbnQzMiwg
1274 bXNjb3JsaWIsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tl
1275 bj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAAA2tleQV2YWx1ZQEACAYFAAAAATAAAAAAAfr////8////
1277 var stream = new MemoryStream (Convert.FromBase64String (data));
1278 var fmt = new BinaryFormatter ();
1279 var dict = (Dictionary <string, int>) fmt.Deserialize (stream);
1280 Assert.AreEqual (2, dict.Count);
1281 for (int i = 0; i < dict.Count; i++)
1282 Assert.AreEqual (i, dict[i.ToString ()]);