Adding ArrayListTest to AllTests
[mono.git] / mcs / class / corlib / Test / System.Collections / HashtableTest.cs
1 // TODO: add tests for Comparer and HashCodeProvider\r
2 \r
3 \r
4 using System;\r
5 using System.Collections;\r
6 \r
7 using NUnit.Framework;\r
8 \r
9 \r
10 \r
11 namespace MonoTests.System.Collections {\r
12 \r
13 \r
14         /// <summary>Hashtable test.</summary>\r
15         public class HashtableTest : TestCase {\r
16                 public static ITest Suite {\r
17                         get {\r
18                                 TestSuite suite = new TestSuite();\r
19 \r
20                                 suite.AddTest(new TestSuite(typeof(HashtableTest)));\r
21                                 suite.AddTest(new TestSuite(typeof(HashtableTest2)));\r
22                                 return suite;\r
23                         }\r
24                 }\r
25 \r
26 \r
27                 protected Hashtable ht;\r
28                 private static Random rnd;\r
29 \r
30                 public HashtableTest(String name) : base(name) {}\r
31 \r
32                 protected override void SetUp() {\r
33                         ht=new Hashtable();\r
34                         rnd=new Random();\r
35                 }\r
36 \r
37                 private void SetDefaultData() {\r
38                         ht.Clear();\r
39                         ht.Add("k1","another");\r
40                         ht.Add("k2","yet");\r
41                         ht.Add("k3","hashtable");\r
42                 }\r
43 \r
44 \r
45                 public void TestAddRemoveClear() {\r
46                         ht.Clear();\r
47                         Assert(ht.Count==0);\r
48 \r
49                         SetDefaultData();\r
50                         Assert(ht.Count==3);\r
51 \r
52                         bool thrown=false;\r
53                         try {\r
54                                 ht.Add("k2","cool");\r
55                         } catch (ArgumentException) {thrown=true;}\r
56                         Assert("Must throw ArgumentException!",thrown);\r
57 \r
58                         ht["k2"]="cool";\r
59                         Assert(ht.Count==3);\r
60                         Assert(ht["k2"].Equals("cool"));\r
61 \r
62                 }\r
63 \r
64                 public void TestCopyTo() {\r
65                         SetDefaultData();\r
66                         Object[] entries=new Object[ht.Count];\r
67                         ht.CopyTo(entries,0);\r
68                         Assert("Not an entry.",entries[0] is DictionaryEntry);\r
69                 }\r
70 \r
71 \r
72                 public void TestUnderHeavyLoad() {\r
73                         ht.Clear();\r
74                         int max=100000;\r
75                         String[] cache=new String[max*2];\r
76                         int n=0;\r
77 \r
78                         for (int i=0;i<max;i++) {\r
79                                 int id=rnd.Next()&0xFFFF;\r
80                                 String key=""+id+"-key-"+id;\r
81                                 String val="value-"+id;\r
82                                 if (ht[key]==null) {\r
83                                         ht[key]=val;\r
84                                         cache[n]=key;\r
85                                         cache[n+max]=val;\r
86                                         n++;\r
87                                 }\r
88                         }\r
89 \r
90                         Assert(ht.Count==n);\r
91 \r
92                         for (int i=0;i<n;i++) {\r
93                                 String key=cache[i];\r
94                                 String val=ht[key] as String;\r
95                                 String err="ht[\""+key+"\"]=\""+val+\r
96                                       "\", expected \""+cache[i+max]+"\"";\r
97                                 Assert(err,val!=null && val.Equals(cache[i+max]));\r
98                         }\r
99 \r
100                         int r1=(n/3);\r
101                         int r2=r1+(n/5);\r
102 \r
103                         for (int i=r1;i<r2;i++) {\r
104                                 ht.Remove(cache[i]);\r
105                         }\r
106 \r
107 \r
108                         for (int i=0;i<n;i++) {\r
109                                 if (i>=r1 && i<r2) {\r
110                                         Assert(ht[cache[i]]==null);\r
111                                 } else {\r
112                                         String key=cache[i];\r
113                                         String val=ht[key] as String;\r
114                                         String err="ht[\""+key+"\"]=\""+val+\r
115                                               "\", expected \""+cache[i+max]+"\"";\r
116                                         Assert(err,val!=null && val.Equals(cache[i+max]));\r
117                                 }\r
118                         }\r
119 \r
120                         ICollection keys=ht.Keys;\r
121                         int nKeys=0;\r
122                         foreach (Object key in keys) {\r
123                                 Assert((key as String) != null);\r
124                                 nKeys++;\r
125                         }\r
126                         Assert(nKeys==ht.Count);\r
127 \r
128 \r
129                         ICollection vals=ht.Values;\r
130                         int nVals=0;\r
131                         foreach (Object val in vals) {\r
132                                 Assert((val as String) != null);\r
133                                 nVals++;\r
134                         }\r
135                         Assert(nVals==ht.Count);\r
136 \r
137                 }\r
138 \r
139 \r
140         private class  HashtableTest2 : TestCase {\r
141 \r
142                 protected Hashtable ht;\r
143                 private static Random rnd;\r
144 \r
145                 public HashtableTest2 (String name) : base(name)\r
146                 {\r
147                 }\r
148 \r
149                 protected override void SetUp ()\r
150                 {\r
151                         ht=new Hashtable ();\r
152                         rnd=new Random ();\r
153                 }\r
154 \r
155                 public static ITest Suite\r
156                 {\r
157                         get {\r
158                                 return new TestSuite (typeof(HashtableTest2));\r
159                         }\r
160                 }\r
161 \r
162                 private void SetDefaultData ()\r
163                 {\r
164                         ht.Clear ();\r
165                         ht.Add ("k1","another");\r
166                         ht.Add ("k2","yet");\r
167                         ht.Add ("k3","hashtable");\r
168                 }\r
169 \r
170 \r
171                 public void TestAddRemoveClear ()\r
172                 {\r
173                         ht.Clear ();\r
174                         Assert (ht.Count == 0);\r
175 \r
176                         SetDefaultData ();\r
177                         Assert (ht.Count == 3);\r
178 \r
179                         bool thrown=false;\r
180                         try {\r
181                                 ht.Add ("k2","cool");\r
182                         } catch (ArgumentException) {thrown=true;}\r
183                         Assert("Must throw ArgumentException!",thrown);\r
184 \r
185                         ht["k2"]="cool";\r
186                         Assert(ht.Count == 3);\r
187                         Assert(ht["k2"].Equals("cool"));\r
188 \r
189                 }\r
190 \r
191                 public void TestCopyTo ()\r
192                 {\r
193                         SetDefaultData ();\r
194                         Object[] entries=new Object[ht.Count];\r
195                         ht.CopyTo (entries,0);\r
196                         Assert("Not an entry.",entries[0] is DictionaryEntry);\r
197                 }\r
198 \r
199 \r
200                 public void TestUnderHeavyLoad ()\r
201                 {\r
202                         ht.Clear ();\r
203 \r
204                         int max=100000;\r
205                         String[] cache=new String[max*2];\r
206                         int n=0;\r
207 \r
208                         for (int i=0;i<max;i++) {\r
209                                 int id=rnd.Next()&0xFFFF;\r
210                                 String key=""+id+"-key-"+id;\r
211                                 String val="value-"+id;\r
212                                 if (ht[key]==null) {\r
213                                         ht[key]=val;\r
214                                         cache[n]=key;\r
215                                         cache[n+max]=val;\r
216                                         n++;\r
217                                 }\r
218                         }\r
219 \r
220                         Assert(ht.Count==n);\r
221 \r
222                         for (int i=0;i<n;i++) {\r
223                                 String key=cache[i];\r
224                                 String val=ht[key] as String;\r
225                                 String err="ht[\""+key+"\"]=\""+val+\r
226                                       "\", expected \""+cache[i+max]+"\"";\r
227                                 Assert(err,val!=null && val.Equals(cache[i+max]));\r
228                         }\r
229 \r
230                         int r1=(n/3);\r
231                         int r2=r1+(n/5);\r
232 \r
233                         for (int i=r1;i<r2;i++) {\r
234                                 ht.Remove(cache[i]);\r
235                         }\r
236 \r
237 \r
238                         for (int i=0;i<n;i++) {\r
239                                 if (i>=r1 && i<r2) {\r
240                                         Assert(ht[cache[i]]==null);\r
241                                 } else {\r
242                                         String key=cache[i];\r
243                                         String val=ht[key] as String;\r
244                                         String err="ht[\""+key+"\"]=\""+val+\r
245                                               "\", expected \""+cache[i+max]+"\"";\r
246                                         Assert(err,val!=null && val.Equals(cache[i+max]));\r
247                                 }\r
248                         }\r
249 \r
250                         ICollection keys=ht.Keys;\r
251                         int nKeys=0;\r
252                         foreach (Object key in keys) {\r
253                                 Assert((key as String) != null);\r
254                                 nKeys++;\r
255                         }\r
256                         Assert(nKeys==ht.Count);\r
257 \r
258 \r
259                         ICollection vals=ht.Values;\r
260                         int nVals=0;\r
261                         foreach (Object val in vals) {\r
262                                 Assert((val as String) != null);\r
263                                 nVals++;\r
264                         }\r
265                         Assert(nVals==ht.Count);\r
266 \r
267                 }\r
268 \r
269                 /// <summary>\r
270                 ///  Test hashtable with CaseInsensitiveHashCodeProvider\r
271                 ///  and CaseInsensitive comparer.\r
272                 /// </summary>\r
273                 public void TestCaseInsensitive ()\r
274                 {\r
275                         // Not very meaningfull test, just to make\r
276                         // sure that hcp is set properly set.\r
277                         Hashtable ciHashtable = new Hashtable(11,1.0f,CaseInsensitiveHashCodeProvider.Default,CaseInsensitiveComparer.Default);\r
278                         ciHashtable ["key1"] = "value";\r
279                         ciHashtable ["key2"] = "VALUE";\r
280                         Assert(ciHashtable ["key1"].Equals ("value"));\r
281                         Assert(ciHashtable ["key2"].Equals ("VALUE"));\r
282 \r
283                         ciHashtable ["KEY1"] = "new_value";\r
284                         Assert(ciHashtable ["key1"].Equals ("new_value"));\r
285 \r
286                 }\r
287 \r
288 \r
289                 public void TestCopyConstructor ()\r
290                 {\r
291                         SetDefaultData ();\r
292 \r
293                         Hashtable htCopy = new Hashtable (ht);\r
294 \r
295                         Assert(ht.Count == htCopy.Count);\r
296                 }\r
297 \r
298 \r
299                 public void TestEnumerator ()\r
300                 {\r
301                         SetDefaultData ();\r
302 \r
303                         IEnumerator e = ht.GetEnumerator ();\r
304 \r
305                         while (e.MoveNext ()) {}\r
306 \r
307                         Assert (!e.MoveNext ());\r
308 \r
309                 }\r
310 \r
311 \r
312         }\r
313 \r
314 \r
315         }\r
316 }\r