1 // TODO: add tests for Comparer and HashCodeProvider
\r
5 using System.Collections;
\r
7 using NUnit.Framework;
\r
11 namespace MonoTests.System.Collections {
\r
14 /// <summary>Hashtable test.</summary>
\r
15 public class HashtableTest : TestCase {
\r
16 public static ITest Suite {
\r
18 TestSuite suite = new TestSuite();
\r
20 suite.AddTest(new TestSuite(typeof(HashtableTest)));
\r
21 suite.AddTest(new TestSuite(typeof(HashtableTest2)));
\r
27 protected Hashtable ht;
\r
28 private static Random rnd;
\r
30 public HashtableTest(String name) : base(name) {}
\r
32 protected override void SetUp() {
\r
37 private void SetDefaultData() {
\r
39 ht.Add("k1","another");
\r
41 ht.Add("k3","hashtable");
\r
45 public void TestAddRemoveClear() {
\r
47 Assert(ht.Count==0);
\r
50 Assert(ht.Count==3);
\r
54 ht.Add("k2","cool");
\r
55 } catch (ArgumentException) {thrown=true;}
\r
56 Assert("Must throw ArgumentException!",thrown);
\r
59 Assert(ht.Count==3);
\r
60 Assert(ht["k2"].Equals("cool"));
\r
64 public void TestCopyTo() {
\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
72 public void TestUnderHeavyLoad() {
\r
75 String[] cache=new String[max*2];
\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
90 Assert(ht.Count==n);
\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
103 for (int i=r1;i<r2;i++) {
\r
104 ht.Remove(cache[i]);
\r
108 for (int i=0;i<n;i++) {
\r
109 if (i>=r1 && i<r2) {
\r
110 Assert(ht[cache[i]]==null);
\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
120 ICollection keys=ht.Keys;
\r
122 foreach (Object key in keys) {
\r
123 Assert((key as String) != null);
\r
126 Assert(nKeys==ht.Count);
\r
129 ICollection vals=ht.Values;
\r
131 foreach (Object val in vals) {
\r
132 Assert((val as String) != null);
\r
135 Assert(nVals==ht.Count);
\r
140 private class HashtableTest2 : TestCase {
\r
142 protected Hashtable ht;
\r
143 private static Random rnd;
\r
145 public HashtableTest2 (String name) : base(name)
\r
149 protected override void SetUp ()
\r
151 ht=new Hashtable ();
\r
155 public static ITest Suite
\r
158 return new TestSuite (typeof(HashtableTest2));
\r
162 private void SetDefaultData ()
\r
165 ht.Add ("k1","another");
\r
166 ht.Add ("k2","yet");
\r
167 ht.Add ("k3","hashtable");
\r
171 public void TestAddRemoveClear ()
\r
174 Assert (ht.Count == 0);
\r
177 Assert (ht.Count == 3);
\r
181 ht.Add ("k2","cool");
\r
182 } catch (ArgumentException) {thrown=true;}
\r
183 Assert("Must throw ArgumentException!",thrown);
\r
186 Assert(ht.Count == 3);
\r
187 Assert(ht["k2"].Equals("cool"));
\r
191 public void TestCopyTo ()
\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
200 public void TestUnderHeavyLoad ()
\r
205 String[] cache=new String[max*2];
\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
220 Assert(ht.Count==n);
\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
233 for (int i=r1;i<r2;i++) {
\r
234 ht.Remove(cache[i]);
\r
238 for (int i=0;i<n;i++) {
\r
239 if (i>=r1 && i<r2) {
\r
240 Assert(ht[cache[i]]==null);
\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
250 ICollection keys=ht.Keys;
\r
252 foreach (Object key in keys) {
\r
253 Assert((key as String) != null);
\r
256 Assert(nKeys==ht.Count);
\r
259 ICollection vals=ht.Values;
\r
261 foreach (Object val in vals) {
\r
262 Assert((val as String) != null);
\r
265 Assert(nVals==ht.Count);
\r
270 /// Test hashtable with CaseInsensitiveHashCodeProvider
\r
271 /// and CaseInsensitive comparer.
\r
273 public void TestCaseInsensitive ()
\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
283 ciHashtable ["KEY1"] = "new_value";
\r
284 Assert(ciHashtable ["key1"].Equals ("new_value"));
\r
289 public void TestCopyConstructor ()
\r
293 Hashtable htCopy = new Hashtable (ht);
\r
295 Assert(ht.Count == htCopy.Count);
\r
299 public void TestEnumerator ()
\r
303 IEnumerator e = ht.GetEnumerator ();
\r
305 while (e.MoveNext ()) {}
\r
307 Assert (!e.MoveNext ());
\r