2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / Mono.C5 / Test / hashing / HashDictionaryTests.cs
1 #if NET_2_0\r
2 /*\r
3  Copyright (c) 2003-2004 Niels Kokholm <kokholm@itu.dk> and Peter Sestoft <sestoft@dina.kvl.dk>\r
4  Permission is hereby granted, free of charge, to any person obtaining a copy\r
5  of this software and associated documentation files (the "Software"), to deal\r
6  in the Software without restriction, including without limitation the rights\r
7  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
8  copies of the Software, and to permit persons to whom the Software is\r
9  furnished to do so, subject to the following conditions:\r
10  \r
11  The above copyright notice and this permission notice shall be included in\r
12  all copies or substantial portions of the Software.\r
13  \r
14  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
15  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
16  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
17  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
18  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
19  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
20  SOFTWARE.\r
21 */\r
22 \r
23 using System;\r
24 using C5;\r
25 using NUnit.Framework;\r
26 using MSG = System.Collections.Generic;\r
27 namespace nunit.hashtable.dictionary\r
28 {\r
29         [TestFixture]\r
30         public class HashDict\r
31         {\r
32                 private HashDictionary<string,string> dict;\r
33 \r
34 \r
35                 [SetUp]\r
36                 public void Init()\r
37                 {\r
38                         dict = new HashDictionary<string,string>();\r
39                         //dict = TreeDictionary<string,string>.MakeNaturalO<string,string>();\r
40                 }\r
41 \r
42 \r
43                 [TearDown]\r
44                 public void Dispose()\r
45                 {\r
46                         dict = null;\r
47                 }\r
48 \r
49 \r
50                 [Test]\r
51                 public void Initial()\r
52                 {\r
53                         bool res;\r
54 \r
55                         Assert.IsFalse(dict.IsReadOnly);\r
56                         Assert.AreEqual(0, dict.Count, "new dict should be empty");\r
57                         dict.Add("A", "B");\r
58                         Assert.AreEqual(1, dict.Count, "bad count");\r
59                         Assert.AreEqual("B", dict["A"], "Wrong value for dict[A]");\r
60                         dict.Add("C", "D");\r
61                         Assert.AreEqual(2, dict.Count, "bad count");\r
62                         Assert.AreEqual("B", dict["A"], "Wrong value");\r
63                         Assert.AreEqual("D", dict["C"], "Wrong value");\r
64                         res = dict.Remove("A");\r
65                         Assert.IsTrue(res, "bad return value from Remove(A)");\r
66                         Assert.AreEqual(1, dict.Count, "bad count");\r
67                         Assert.AreEqual("D", dict["C"], "Wrong value of dict[C]");\r
68                         res = dict.Remove("Z");\r
69                         Assert.IsFalse(res, "bad return value from Remove(Z)");\r
70                         Assert.AreEqual(1, dict.Count, "bad count");\r
71                         Assert.AreEqual("D", dict["C"], "Wrong value of dict[C] (2)");\r
72                 }\r
73 \r
74 \r
75                 [Test]\r
76                 public void Contains()\r
77                 {\r
78                         dict.Add("C", "D");\r
79                         Assert.IsTrue(dict.Contains("C"));\r
80                         Assert.IsFalse(dict.Contains("D"));\r
81                 }\r
82 \r
83 \r
84                 [Test]\r
85                 [ExpectedException(typeof(ArgumentException), "Item has already been added.  Key in dictionary: 'A'  Key being added: 'A'")]\r
86                 public void IllegalAdd()\r
87                 {\r
88                         dict.Add("A", "B");\r
89                         dict.Add("A", "B");\r
90                 }\r
91 \r
92 \r
93                 [Test]\r
94                 [ExpectedException(typeof(ArgumentException), "Key not present in Dictionary")]\r
95                 public void GettingNonExisting()\r
96                 {\r
97                         Console.WriteLine(dict["R"]);\r
98                 }\r
99 \r
100 \r
101                 [Test]\r
102                 public void Setter()\r
103                 {\r
104                         dict["R"] = "UYGUY";\r
105                         Assert.AreEqual("UYGUY", dict["R"]);\r
106                         dict["R"] = "UIII";\r
107                         Assert.AreEqual("UIII", dict["R"]);\r
108                         dict["S"] = "VVV";\r
109                         Assert.AreEqual("UIII", dict["R"]);\r
110                         Assert.AreEqual("VVV", dict["S"]);\r
111                         //dict.dump();\r
112                 }\r
113 \r
114                 [Test]\r
115                 public void CombinedOps()\r
116                 {\r
117                         dict["R"] = "UIII";\r
118                         dict["S"] = "VVV";\r
119                         dict["T"] = "XYZ";\r
120 \r
121                         string s;\r
122 \r
123                         Assert.IsTrue(dict.Remove("S", out s));\r
124                         Assert.AreEqual("VVV", s);\r
125                         Assert.IsFalse(dict.Contains("S"));\r
126                         Assert.IsFalse(dict.Remove("A", out s));\r
127 \r
128                         //\r
129                         Assert.IsTrue(dict.Find("T", out s));\r
130                         Assert.AreEqual("XYZ", s);\r
131                         Assert.IsFalse(dict.Find("A", out s));\r
132 \r
133                         //\r
134                         Assert.IsTrue(dict.Update("R", "UHU"));\r
135                         Assert.AreEqual("UHU", dict["R"]);\r
136                         Assert.IsFalse(dict.Update("A", "W"));\r
137                         Assert.IsFalse(dict.Contains("A"));\r
138 \r
139                         //\r
140                         s = "KKK";\r
141                         Assert.IsFalse(dict.FindOrAdd("B", ref s));\r
142                         Assert.AreEqual("KKK", dict["B"]);\r
143                         Assert.IsTrue(dict.FindOrAdd("T", ref s));\r
144                         Assert.AreEqual("XYZ", s);\r
145 \r
146                         //\r
147                         s = "LLL";\r
148                         Assert.IsTrue(dict.UpdateOrAdd("R", s));\r
149                         Assert.AreEqual("LLL", dict["R"]);\r
150                         s = "MMM";\r
151                         Assert.IsFalse(dict.UpdateOrAdd("C", s));\r
152                         Assert.AreEqual("MMM", dict["C"]);\r
153                 }\r
154 \r
155                 [Test]\r
156                 public void DeepBucket()\r
157                 {\r
158                         HashDictionary<int,int> dict2 = new HashDictionary<int,int>();\r
159 \r
160                         for (int i = 0; i < 5; i++)\r
161                                 dict2[16 * i] = 5 * i;\r
162 \r
163                         for (int i = 0; i < 5; i++)\r
164                                 Assert.AreEqual(5 * i, dict2[16 * i]);\r
165 \r
166                         for (int i = 0; i < 5; i++)\r
167                                 dict2[16 * i] = 7 * i + 1;\r
168 \r
169                         for (int i = 0; i < 5; i++)\r
170                                 Assert.AreEqual(7 * i + 1, dict2[16 * i]);\r
171                         Assert.IsTrue(dict.Check());\r
172                 }\r
173         }\r
174 \r
175 \r
176 \r
177         [TestFixture]\r
178         public class Enumerators\r
179         {\r
180                 private HashDictionary<string,string> dict;\r
181 \r
182                 private MSG.IEnumerator<KeyValuePair<string,string>> dictenum;\r
183 \r
184 \r
185                 [SetUp]\r
186                 public void Init()\r
187                 {\r
188                         dict = new HashDictionary<string,string>();\r
189                         dict["S"] = "A";\r
190                         dict["T"] = "B";\r
191                         dict["R"] = "C";\r
192                         dictenum = dict.GetEnumerator();\r
193                 }\r
194 \r
195 \r
196                 [TearDown]\r
197                 public void Dispose()\r
198                 {\r
199                         dictenum = null;\r
200                         dict = null;\r
201                 }\r
202 \r
203 \r
204                 [Test]\r
205                 [Ignore("This is also failing on windows. Martin")]\r
206                 public void Keys()\r
207                 {\r
208                         MSG.IEnumerator<string> keys = dict.Keys.GetEnumerator();\r
209 \r
210                         Assert.IsTrue(keys.MoveNext());\r
211                         Assert.AreEqual("R", keys.Current);\r
212                         Assert.IsTrue(keys.MoveNext());\r
213                         Assert.AreEqual("T", keys.Current);\r
214                         Assert.IsTrue(keys.MoveNext());\r
215                         Assert.AreEqual("S", keys.Current);\r
216                         Assert.IsFalse(keys.MoveNext());\r
217                 }\r
218 \r
219 \r
220                 [Test]\r
221                 [Ignore("This is also failing on windows. Martin")]\r
222                 public void Values()\r
223                 {\r
224                         MSG.IEnumerator<string> values = dict.Values.GetEnumerator();\r
225 \r
226                         Assert.IsTrue(values.MoveNext());\r
227                         Assert.AreEqual("C", values.Current);\r
228                         Assert.IsTrue(values.MoveNext());\r
229                         Assert.AreEqual("B", values.Current);\r
230                         Assert.IsTrue(values.MoveNext());\r
231                         Assert.AreEqual("A", values.Current);\r
232                         Assert.IsFalse(values.MoveNext());\r
233                 }\r
234 \r
235 \r
236                 [Test]\r
237                 [Ignore("This is also failing on windows. Martin")]\r
238                 public void NormalUse()\r
239                 {\r
240                         Assert.IsTrue(dictenum.MoveNext());\r
241                         Assert.AreEqual(dictenum.Current, new KeyValuePair<string,string>("R", "C"));\r
242                         Assert.IsTrue(dictenum.MoveNext());\r
243                         Assert.AreEqual(dictenum.Current, new KeyValuePair<string,string>("T", "B"));\r
244                         Assert.IsTrue(dictenum.MoveNext());\r
245                         Assert.AreEqual(dictenum.Current, new KeyValuePair<string,string>("S", "A"));\r
246                         Assert.IsFalse(dictenum.MoveNext());\r
247                 }\r
248         }\r
249 }\r
250 #endif\r