Merge pull request #943 from ermshiperete/bug-novell-325669
[mono.git] / mcs / class / Mono.C5 / Test / InterfacesTest.cs
1 /*
2  Copyright (c) 2003-2006 Niels Kokholm and Peter Sestoft
3  Permission is hereby granted, free of charge, to any person obtaining a copy
4  of this software and associated documentation files (the "Software"), to deal
5  in the Software without restriction, including without limitation the rights
6  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7  copies of the Software, and to permit persons to whom the Software is
8  furnished to do so, subject to the following conditions:
9  
10  The above copyright notice and this permission notice shall be included in
11  all copies or substantial portions of the Software.
12  
13  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19  SOFTWARE.
20 */
21
22 using System;
23 using C5;
24 using NUnit.Framework;
25 using SCG = System.Collections.Generic;
26
27
28 namespace C5UnitTests.interfaces
29 {
30   [TestFixture]
31   public class ICollectionsTests
32   {
33     public void TryC5Coll(ICollection<double> coll)
34     {
35       Assert.AreEqual(0, coll.Count);
36       double[] arr = { };
37       coll.CopyTo(arr, 0);
38       Assert.IsFalse(coll.IsReadOnly);
39       coll.Add(2.3);
40       coll.Add(3.2);
41       Assert.AreEqual(2, coll.Count);
42       Assert.IsTrue(coll.Contains(2.3));
43       Assert.IsFalse(coll.Contains(3.1));
44       Assert.IsFalse(coll.Remove(3.1));
45       Assert.IsTrue(coll.Remove(3.2));
46       Assert.IsFalse(coll.Contains(3.1));
47       Assert.AreEqual(1, coll.Count);
48       coll.Clear();
49       Assert.AreEqual(0, coll.Count);
50       Assert.IsFalse(coll.Remove(3.1));
51     }
52
53     public void TrySCGColl(SCG.ICollection<double> coll)
54     {
55       // All members of SCG.ICollection<T>
56       Assert.AreEqual(0, coll.Count);
57       double[] arr = { };
58       coll.CopyTo(arr, 0);
59       Assert.IsFalse(coll.IsReadOnly);
60       coll.Add(2.3);
61       coll.Add(3.2);
62       Assert.AreEqual(2, coll.Count);
63       Assert.IsTrue(coll.Contains(2.3));
64       Assert.IsFalse(coll.Contains(3.1));
65       Assert.IsFalse(coll.Remove(3.1));
66       Assert.IsTrue(coll.Remove(3.2));
67       Assert.IsFalse(coll.Contains(3.1));
68       Assert.AreEqual(1, coll.Count);
69       coll.Clear();
70       Assert.AreEqual(0, coll.Count);
71       Assert.IsFalse(coll.Remove(3.1));
72     }
73
74     public void TryBothColl(ICollection<double> coll)
75     {
76       TryC5Coll(coll);
77       TrySCGColl(coll);
78     }
79
80
81     [Test]
82     public void Test1()
83     {
84       TryBothColl(new HashSet<double>());
85       TryBothColl(new HashBag<double>());
86       TryBothColl(new TreeSet<double>());
87       TryBothColl(new TreeBag<double>());
88       TryBothColl(new ArrayList<double>());
89       TryBothColl(new LinkedList<double>());
90       TryBothColl(new HashedArrayList<double>());
91       TryBothColl(new HashedLinkedList<double>());
92       TryBothColl(new SortedArray<double>());
93     }
94   }
95
96   [TestFixture]
97   public class SCIListTests
98   {
99     class A { }
100     class B : A { }
101     class C : B { }
102
103     public void TrySCIList(System.Collections.IList list)
104     {
105       // Should be called with a C5.IList<B> which is not a WrappedArray
106       Assert.AreEqual(0, list.Count);
107       list.CopyTo(new A[0], 0);
108       list.CopyTo(new B[0], 0);
109       list.CopyTo(new C[0], 0);
110       Assert.IsTrue(!list.IsFixedSize);
111       Assert.IsFalse(list.IsReadOnly);
112       Assert.IsFalse(list.IsSynchronized);
113       Assert.AreNotEqual(null, list.SyncRoot);
114       Object b1 = new B(), b2 = new B(), c1 = new C(), c2 = new C();
115       Assert.AreEqual(0, list.Add(b1));
116       Assert.AreEqual(1, list.Add(c1));
117       Assert.AreEqual(2, list.Count);
118       Assert.IsTrue(list.Contains(c1));
119       Assert.IsFalse(list.Contains(b2));
120       list[0] = b2;
121       Assert.AreEqual(b2, list[0]);
122       list[1] = c2;
123       Assert.AreEqual(c2, list[1]);
124       Assert.IsTrue(list.Contains(b2));
125       Assert.IsTrue(list.Contains(c2));
126       Array arrA = new A[2], arrB = new B[2];
127       list.CopyTo(arrA, 0);
128       list.CopyTo(arrB, 0);
129       Assert.AreEqual(b2, arrA.GetValue(0));
130       Assert.AreEqual(b2, arrB.GetValue(0));
131       Assert.AreEqual(c2, arrA.GetValue(1));
132       Assert.AreEqual(c2, arrB.GetValue(1));
133       Assert.AreEqual(0, list.IndexOf(b2));
134       Assert.AreEqual(-1, list.IndexOf(b1));
135       list.Remove(b1);
136       list.Remove(b2);
137       Assert.IsFalse(list.Contains(b2));
138       Assert.AreEqual(1, list.Count); // Contains c2 only
139       list.Insert(0, b2);
140       list.Insert(2, b1);
141       Assert.AreEqual(b2, list[0]);
142       Assert.AreEqual(c2, list[1]);
143       Assert.AreEqual(b1, list[2]);
144       list.Remove(c2);
145       Assert.AreEqual(b2, list[0]);
146       Assert.AreEqual(b1, list[1]);
147       list.RemoveAt(1);
148       Assert.AreEqual(b2, list[0]); 
149       list.Clear();
150       Assert.AreEqual(0, list.Count);
151       list.Remove(b1);
152     }
153
154     [Test]
155     public void Test1()
156     {
157       TrySCIList(new ArrayList<B>());
158       TrySCIList(new HashedArrayList<B>());
159       TrySCIList(new LinkedList<B>());
160       TrySCIList(new HashedLinkedList<B>());
161     }
162
163     [Test]
164     public void TryWrappedArrayAsSCIList1()
165     {
166       B[] myarray = new B[] { new B(), new B(), new C() };
167       System.Collections.IList list = new WrappedArray<B>(myarray);
168       // Should be called with a three-element WrappedArray<B>
169       Assert.AreEqual(3, list.Count);
170       Assert.IsTrue(list.IsFixedSize);
171       Assert.IsFalse(list.IsSynchronized);
172       Assert.AreNotEqual(null, list.SyncRoot);
173       Assert.AreEqual(myarray.SyncRoot, list.SyncRoot);
174       Object b1 = new B(), b2 = new B(), c1 = new C(), c2 = new C();
175       list[0] = b2;
176       Assert.AreEqual(b2, list[0]);
177       list[1] = c2;
178       Assert.AreEqual(c2, list[1]);
179       Assert.IsTrue(list.Contains(b2));
180       Assert.IsTrue(list.Contains(c2));
181       Array arrA = new A[3], arrB = new B[3];
182       list.CopyTo(arrA, 0);
183       list.CopyTo(arrB, 0);
184       Assert.AreEqual(b2, arrA.GetValue(0));
185       Assert.AreEqual(b2, arrB.GetValue(0));
186       Assert.AreEqual(c2, arrA.GetValue(1));
187       Assert.AreEqual(c2, arrB.GetValue(1));
188       Assert.AreEqual(0, list.IndexOf(b2));
189       Assert.AreEqual(-1, list.IndexOf(b1));
190       Assert.AreEqual(-1, list.IndexOf(c1));
191       Assert.IsFalse(list.Contains(b1));
192       Assert.IsFalse(list.Contains(c1));
193     }
194
195     [Test]
196     public void TryWrappedArrayAsSCIList2()
197     {
198       B[] myarray = new B[] { };
199       System.Collections.IList list = new WrappedArray<B>(myarray);
200       // Should be called with an empty WrappedArray<B>
201       Assert.AreEqual(0, list.Count);
202       list.CopyTo(new A[0], 0);
203       list.CopyTo(new B[0], 0);
204       list.CopyTo(new C[0], 0);
205       Assert.IsFalse(list.IsSynchronized);
206       Assert.AreNotEqual(null, list.SyncRoot);
207       Object b1 = new B(), b2 = new B(), c1 = new C(), c2 = new C();
208       Assert.IsFalse(list.Contains(b2));
209       Assert.IsFalse(list.Contains(c2));
210       Assert.AreEqual(-1, list.IndexOf(b1));
211       Assert.AreEqual(-1, list.IndexOf(c1));
212     }
213
214     [Test]
215     public void TryGuardedListAsSCIList1()
216     {
217       B b1_ = new B(), b2_ = new B();
218       C c1_ = new C(), c2_ = new C();
219       ArrayList<B> mylist = new ArrayList<B>();
220       mylist.AddAll(new B[] { b1_, b2_, c1_ });
221       System.Collections.IList list = new GuardedList<B>(mylist);
222       Object b1 = b1_, b2 = b2_, c1 = c1_, c2 = c2_;
223       // Should be called with a three-element GuardedList<B>
224       Assert.AreEqual(3, list.Count);
225       Assert.IsTrue(list.IsFixedSize);
226       Assert.IsTrue(list.IsReadOnly);
227       Assert.IsFalse(list.IsSynchronized);
228       Assert.AreNotEqual(null, list.SyncRoot);
229       Assert.AreEqual(list.SyncRoot, ((System.Collections.IList)mylist).SyncRoot);
230       Assert.IsTrue(list.Contains(b1)); 
231       Assert.IsTrue(list.Contains(b2));
232       Assert.IsTrue(list.Contains(c1));
233       Assert.IsFalse(list.Contains(c2));
234       Array arrA = new A[3], arrB = new B[3];
235       list.CopyTo(arrA, 0);
236       list.CopyTo(arrB, 0);
237       Assert.AreEqual(b1, arrA.GetValue(0));
238       Assert.AreEqual(b1, arrB.GetValue(0));
239       Assert.AreEqual(b2, arrA.GetValue(1));
240       Assert.AreEqual(b2, arrB.GetValue(1));
241       Assert.AreEqual(0, list.IndexOf(b1));
242       Assert.AreEqual(-1, list.IndexOf(c2));
243     }
244
245     [Test]
246     public void TryGuardedListAsSCIList2()
247     {
248       System.Collections.IList list = new GuardedList<B>(new ArrayList<B>());
249       // Should be called with an empty GuardedList<B>
250       Assert.AreEqual(0, list.Count);
251       list.CopyTo(new A[0], 0);
252       list.CopyTo(new B[0], 0);
253       list.CopyTo(new C[0], 0);
254       Assert.IsFalse(list.IsSynchronized);
255       Assert.AreNotEqual(null, list.SyncRoot);
256       Object b1 = new B(), b2 = new B(), c1 = new C(), c2 = new C();
257       Assert.IsFalse(list.Contains(b2));
258       Assert.IsFalse(list.Contains(c2));
259       Assert.AreEqual(-1, list.IndexOf(b1));
260       Assert.AreEqual(-1, list.IndexOf(c1));
261     }
262
263     [Test]
264     public void TryViewOfGuardedListAsSCIList1()
265     {
266       B b1_ = new B(), b2_ = new B();
267       C c1_ = new C(), c2_ = new C();
268       ArrayList<B> mylist = new ArrayList<B>();
269       mylist.AddAll(new B[] { new B(), b1_, b2_, c1_, new B()});
270       System.Collections.IList list = new GuardedList<B>(mylist).View(1, 3);
271       Object b1 = b1_, b2 = b2_, c1 = c1_, c2 = c2_;
272       // Should be called with a three-element view of a GuardedList<B>
273       Assert.AreEqual(3, list.Count);
274       Assert.IsTrue(list.IsFixedSize);
275       Assert.IsTrue(list.IsReadOnly);
276       Assert.IsFalse(list.IsSynchronized);
277       Assert.AreNotEqual(null, list.SyncRoot);
278       Assert.AreEqual(list.SyncRoot, ((System.Collections.IList)mylist).SyncRoot);
279       Assert.IsTrue(list.Contains(b1));
280       Assert.IsTrue(list.Contains(b2));
281       Assert.IsTrue(list.Contains(c1));
282       Assert.IsFalse(list.Contains(c2));
283       Array arrA = new A[3], arrB = new B[3];
284       list.CopyTo(arrA, 0);
285       list.CopyTo(arrB, 0);
286       Assert.AreEqual(b1, arrA.GetValue(0));
287       Assert.AreEqual(b1, arrB.GetValue(0));
288       Assert.AreEqual(b2, arrA.GetValue(1));
289       Assert.AreEqual(b2, arrB.GetValue(1));
290       Assert.AreEqual(0, list.IndexOf(b1));
291       Assert.AreEqual(-1, list.IndexOf(c2));
292     }
293
294     [Test]
295     public void TryViewOfGuardedListAsSCIList2()
296     {
297       System.Collections.IList list = new GuardedList<B>(new ArrayList<B>()).View(0, 0);
298       Assert.AreEqual(0, list.Count);
299       list.CopyTo(new A[0], 0);
300       list.CopyTo(new B[0], 0);
301       list.CopyTo(new C[0], 0);
302       Assert.IsFalse(list.IsSynchronized);
303       Assert.AreNotEqual(null, list.SyncRoot);
304       Object b1 = new B(), b2 = new B(), c1 = new C(), c2 = new C();
305       Assert.IsFalse(list.Contains(b2));
306       Assert.IsFalse(list.Contains(c2));
307       Assert.AreEqual(-1, list.IndexOf(b1));
308       Assert.AreEqual(-1, list.IndexOf(c1));
309     }
310
311     void TryListViewAsSCIList1(IList<B> mylist)
312     {
313       B b1_ = new B(), b2_ = new B();
314       C c1_ = new C(), c2_ = new C();
315       mylist.AddAll(new B[] { new B(), b1_, b2_, c1_, new B() });
316       System.Collections.IList list = mylist.View(1, 3);
317       Object b1 = b1_, b2 = b2_, c1 = c1_, c2 = c2_;
318       // Should be called with a three-element view on ArrayList<B>
319       Assert.AreEqual(3, list.Count);
320       Assert.IsFalse(list.IsSynchronized);
321       Assert.AreNotEqual(null, list.SyncRoot);
322       Assert.AreEqual(list.SyncRoot, mylist.SyncRoot);
323       Assert.IsTrue(list.Contains(b1));
324       Assert.IsTrue(list.Contains(b2));
325       Assert.IsTrue(list.Contains(c1));
326       Assert.IsFalse(list.Contains(c2));
327       Array arrA = new A[3], arrB = new B[3];
328       list.CopyTo(arrA, 0);
329       list.CopyTo(arrB, 0);
330       Assert.AreEqual(b1, arrA.GetValue(0));
331       Assert.AreEqual(b1, arrB.GetValue(0));
332       Assert.AreEqual(b2, arrA.GetValue(1));
333       Assert.AreEqual(b2, arrB.GetValue(1));
334       Assert.AreEqual(0, list.IndexOf(b1));
335       Assert.AreEqual(-1, list.IndexOf(c2));
336     }
337
338     void TryListViewAsSCIList2(IList<B> mylist)
339     {
340       System.Collections.IList list = mylist.View(0, 0);
341       Assert.AreEqual(0, list.Count);
342       list.CopyTo(new A[0], 0);
343       list.CopyTo(new B[0], 0);
344       list.CopyTo(new C[0], 0);
345       Assert.IsFalse(list.IsSynchronized);
346       Assert.AreNotEqual(null, list.SyncRoot);
347       Assert.AreEqual(list.SyncRoot, mylist.SyncRoot);
348       Object b1 = new B(), b2 = new B(), c1 = new C(), c2 = new C();
349       Assert.IsFalse(list.Contains(b2));
350       Assert.IsFalse(list.Contains(c2));
351       Assert.AreEqual(-1, list.IndexOf(b1));
352       Assert.AreEqual(-1, list.IndexOf(c1));
353     }
354
355     [Test]
356     public void TryArrayListViewAsSCIList()
357     {
358       TryListViewAsSCIList1(new ArrayList<B>());
359       TryListViewAsSCIList2(new ArrayList<B>());
360     }
361
362     [Test]
363     public void TryLinkedListViewAsSCIList()
364     {
365       TryListViewAsSCIList1(new LinkedList<B>());
366       TryListViewAsSCIList2(new LinkedList<B>());
367     }
368
369     [Test]
370     public void TryHashedArrayListViewAsSCIList()
371     {
372       TryListViewAsSCIList1(new HashedArrayList<B>());
373       TryListViewAsSCIList2(new HashedArrayList<B>());
374     }
375
376     [Test]
377     public void TryHashedLinkedListViewAsSCIList()
378     {
379       TryListViewAsSCIList1(new HashedLinkedList<B>());
380       TryListViewAsSCIList2(new HashedLinkedList<B>());
381     }
382
383     [Test]
384     public void TryGuardedViewAsSCIList()
385     {
386       ArrayList<B> mylist = new ArrayList<B>();
387       TryListViewAsSCIList2(new GuardedList<B>(mylist));
388     }
389   }
390
391   [TestFixture]
392   public class IDictionaryTests
393   {
394     public void TryDictionary(IDictionary<string,string> dict)
395     {
396       Assert.AreEqual(0, dict.Count);
397       Assert.IsTrue(dict.IsEmpty);
398       Assert.IsFalse(dict.IsReadOnly);
399       KeyValuePair<string,string>[] arr = { };
400       dict.CopyTo(arr, 0);
401       dict["R"] = "A";
402       dict["S"] = "B";
403       dict["T"] = "C";
404       String old;
405       Assert.IsTrue(dict.Update("R", "A1"));
406       Assert.AreEqual("A1", dict["R"]);
407
408       Assert.IsFalse(dict.Update("U", "D1"));
409       Assert.IsFalse(dict.Contains("U"));
410       
411       Assert.IsTrue(dict.Update("R", "A2", out old));
412       Assert.AreEqual("A2", dict["R"]);
413       Assert.AreEqual("A1", old);
414       
415       Assert.IsFalse(dict.Update("U", "D2", out old));
416       Assert.AreEqual(null, old);
417       Assert.IsFalse(dict.Contains("U"));
418
419       Assert.IsTrue(dict.UpdateOrAdd("R", "A3"));
420       Assert.AreEqual("A3", dict["R"]);
421       
422       Assert.IsFalse(dict.UpdateOrAdd("U", "D3"));
423       Assert.IsTrue(dict.Contains("U"));
424       Assert.AreEqual("D3", dict["U"]);
425
426       Assert.IsTrue(dict.UpdateOrAdd("R", "A4", out old));
427       Assert.AreEqual("A4", dict["R"]);
428       Assert.AreEqual("A3", old);
429       
430       Assert.IsTrue(dict.UpdateOrAdd("U", "D4", out old));
431       Assert.IsTrue(dict.Contains("U"));
432       Assert.AreEqual("D4", dict["U"]);
433       Assert.AreEqual("D3", old);
434
435       Assert.IsFalse(dict.UpdateOrAdd("V", "E1", out old));
436       Assert.IsTrue(dict.Contains("V"));
437       Assert.AreEqual("E1", dict["V"]);
438       Assert.AreEqual(null, old);
439     }
440
441     [Test]
442     public void TestHashDictionary()
443     {
444       TryDictionary(new HashDictionary<string,string>());
445     }
446
447     [Test]
448     public void TestTreeDictionary()
449     {
450       TryDictionary(new TreeDictionary<string, string>());
451     }
452   }
453 }