2 Copyright (c) 2003-2006 Niels Kokholm and Peter Sestoft
\r
3 Permission is hereby granted, free of charge, to any person obtaining a copy
\r
4 of this software and associated documentation files (the "Software"), to deal
\r
5 in the Software without restriction, including without limitation the rights
\r
6 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
\r
7 copies of the Software, and to permit persons to whom the Software is
\r
8 furnished to do so, subject to the following conditions:
\r
10 The above copyright notice and this permission notice shall be included in
\r
11 all copies or substantial portions of the Software.
\r
13 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
\r
14 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
\r
15 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
\r
16 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
\r
17 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
\r
18 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
\r
24 using NUnit.Framework;
\r
25 using SCG = System.Collections.Generic;
\r
28 namespace C5UnitTests.support
\r
33 public class ArrayBaseTest
\r
35 class ABT : ArrayBase<string>
\r
37 public ABT() : base(8,NaturalEqualityComparer<string>.Default) { }
\r
39 public override string Choose() { if (size > 0) return array[0]; throw new NoSuchItemException(); }
\r
41 public string this[int i] { get { return array[i]; } set { array[i] = value; } }
\r
44 public int thesize { get { return size; } set { size = value; } }
\r
51 ABT abt = new ABT();
\r
55 // Assert.IsFalse(abt.Check());
\r
58 Assert.IsTrue(abt.Check());
\r
66 public class Comparers
\r
68 class dbl : IComparable<dbl>
\r
72 public dbl(double din) { d = din; }
\r
74 public int CompareTo(dbl that)
\r
76 return d < that.d ? -1 : d == that.d ? 0 : 1;
\r
78 public bool Equals(dbl that) { return d == that.d; }
\r
82 [ExpectedException(typeof(NotComparableException))]
\r
83 public void NotComparable()
\r
85 SCG.IComparer<object> foo = Comparer<object>.Default;
\r
89 public void GenericC()
\r
91 SCG.IComparer<dbl> h = new NaturalComparer<dbl>();
\r
92 dbl s = new dbl(3.4);
\r
93 dbl t = new dbl(3.4);
\r
94 dbl u = new dbl(7.4);
\r
96 Assert.AreEqual(0, h.Compare(s, t));
\r
97 Assert.IsTrue(h.Compare(s, u) < 0);
\r
102 public void OrdinaryC()
\r
104 SCG.IComparer<string> h = new NaturalComparerO<string>();
\r
105 string s = "bamse";
\r
106 string t = "bamse";
\r
107 string u = "bimse";
\r
109 Assert.AreEqual(0, h.Compare(s, t));
\r
110 Assert.IsTrue(h.Compare(s, u) < 0);
\r
115 public void GenericCViaBuilder()
\r
117 SCG.IComparer<dbl> h = Comparer<dbl>.Default;
\r
118 dbl s = new dbl(3.4);
\r
119 dbl t = new dbl(3.4);
\r
120 dbl u = new dbl(7.4);
\r
122 Assert.AreEqual(0, h.Compare(s, t));
\r
123 Assert.IsTrue(h.Compare(s, u) < 0);
\r
124 Assert.AreSame(h, Comparer<dbl>.Default);
\r
129 public void OrdinaryCViaBuilder()
\r
131 SCG.IComparer<string> h = Comparer<string>.Default;
\r
132 string s = "bamse";
\r
133 string t = "bamse";
\r
134 string u = "bimse";
\r
136 Assert.AreEqual(0, h.Compare(s, t));
\r
137 Assert.IsTrue(h.Compare(s, u) < 0);
\r
138 Assert.AreSame(h, Comparer<string>.Default);
\r
144 public void ICViaBuilder()
\r
146 SCG.IComparer<int> h = Comparer<int>.Default;
\r
151 Assert.AreEqual(0, h.Compare(s, t));
\r
152 Assert.IsTrue(h.Compare(s, u) < 0);
\r
153 Assert.AreSame(h, Comparer<int>.Default);
\r
158 public void Nulls()
\r
160 Assert.IsTrue(Comparer<string>.Default.Compare(null, "abe") < 0);
\r
161 Assert.IsTrue(Comparer<string>.Default.Compare(null, null) == 0);
\r
162 Assert.IsTrue(Comparer<string>.Default.Compare("abe", null) > 0);
\r
167 public class EqualityComparers
\r
170 public void ReftypeequalityComparer()
\r
172 SCG.IEqualityComparer<string> h = NaturalEqualityComparer<string>.Default;
\r
173 string s = "bamse";
\r
174 string t = "bamse";
\r
175 string u = "bimse";
\r
177 Assert.AreEqual(s.GetHashCode(), h.GetHashCode(s));
\r
178 Assert.IsTrue(h.Equals(s, t));
\r
179 Assert.IsFalse(h.Equals(s, u));
\r
184 public void ValuetypeequalityComparer()
\r
186 SCG.IEqualityComparer<double> h = NaturalEqualityComparer<double>.Default;
\r
191 Assert.AreEqual(s.GetHashCode(), h.GetHashCode(s));
\r
192 Assert.IsTrue(h.Equals(s, t));
\r
193 Assert.IsFalse(h.Equals(s, u));
\r
196 internal class REHTest { public override int GetHashCode() { return 37; } }
\r
199 public void ReferenceEqualityEqualityComparerTest()
\r
201 REHTest rehtest = new REHTest();
\r
202 SCG.IEqualityComparer<REHTest> equalityComparer = ReferenceEqualityComparer<REHTest>.Default;
\r
203 Assert.AreEqual(37, rehtest.GetHashCode());
\r
204 Assert.IsFalse(equalityComparer.GetHashCode(rehtest) == 37);
\r
208 public void ReftypeequalityComparerViaBuilder()
\r
210 SCG.IEqualityComparer<string> h = EqualityComparer<string>.Default;
\r
211 string s = "bamse";
\r
212 string t = "bamse";
\r
213 string u = "bimse";
\r
215 Assert.AreEqual(s.GetHashCode(), h.GetHashCode(s));
\r
216 Assert.IsTrue(h.Equals(s, t));
\r
217 Assert.IsFalse(h.Equals(s, u));
\r
218 Assert.AreSame(h, EqualityComparer<string>.Default);
\r
223 public void ValuetypeequalityComparerViaBuilder()
\r
225 SCG.IEqualityComparer<double> h = EqualityComparer<double>.Default;
\r
230 Assert.AreEqual(s.GetHashCode(), h.GetHashCode(s));
\r
231 Assert.IsTrue(h.Equals(s, t));
\r
232 Assert.IsFalse(h.Equals(s, u));
\r
233 Assert.AreSame(h, EqualityComparer<double>.Default);
\r
238 public void IntequalityComparerViaBuilder()
\r
240 SCG.IEqualityComparer<int> h = EqualityComparer<int>.Default;
\r
245 Assert.AreEqual(s.GetHashCode(), h.GetHashCode(s));
\r
246 Assert.IsTrue(h.Equals(s, t));
\r
247 Assert.IsFalse(h.Equals(s, u));
\r
248 Assert.AreSame(h, EqualityComparer<int>.Default);
\r
252 public void DoubleequalityComparerViaBuilder()
\r
254 SCG.IEqualityComparer<double> h = EqualityComparer<double>.Default;
\r
259 Assert.AreEqual(s.GetHashCode(), h.GetHashCode(s));
\r
260 Assert.IsTrue(h.Equals(s, t));
\r
261 Assert.IsFalse(h.Equals(s, u));
\r
262 Assert.AreSame(h, EqualityComparer<double>.Default);
\r
266 public void CharequalityComparerViaBuilder()
\r
268 SCG.IEqualityComparer<char> h = EqualityComparer<char>.Default;
\r
273 Assert.AreEqual(s.GetHashCode(), h.GetHashCode(s));
\r
274 Assert.IsTrue(h.Equals(s, t));
\r
275 Assert.IsFalse(h.Equals(s, u));
\r
276 Assert.AreSame(h, EqualityComparer<char>.Default);
\r
280 public void ByteequalityComparerViaBuilder()
\r
282 SCG.IEqualityComparer<byte> h = EqualityComparer<byte>.Default;
\r
287 Assert.AreEqual(s.GetHashCode(), h.GetHashCode(s));
\r
288 Assert.IsTrue(h.Equals(s, t));
\r
289 Assert.IsFalse(h.Equals(s, u));
\r
290 Assert.AreSame(h, EqualityComparer<byte>.Default);
\r
294 public void UnseqequalityComparerViaBuilder()
\r
296 SCG.IEqualityComparer<ICollection<int>> h = EqualityComparer<ICollection<int>>.Default;
\r
297 ICollection<int> s = new LinkedList<int>();
\r
298 ICollection<int> t = new LinkedList<int>();
\r
299 ICollection<int> u = new LinkedList<int>();
\r
300 s.Add(1); s.Add(2); s.Add(3);
\r
301 t.Add(3); t.Add(2); t.Add(1);
\r
302 u.Add(3); u.Add(2); u.Add(4);
\r
303 Assert.AreEqual(s.GetUnsequencedHashCode(), h.GetHashCode(s));
\r
304 Assert.IsTrue(h.Equals(s, t));
\r
305 Assert.IsFalse(h.Equals(s, u));
\r
306 Assert.AreSame(h, EqualityComparer<ICollection<int>>.Default);
\r
310 public void SeqequalityComparerViaBuilder2()
\r
312 SCG.IEqualityComparer<LinkedList<int>> h = EqualityComparer<LinkedList<int>>.Default;
\r
313 LinkedList<int> s = new LinkedList<int>();
\r
314 s.Add(1); s.Add(2); s.Add(3);
\r
315 Assert.AreEqual(CHC.sequencedhashcode(1, 2, 3), h.GetHashCode(s));
\r
319 public void UnseqequalityComparerViaBuilder2()
\r
321 SCG.IEqualityComparer<HashSet<int>> h = EqualityComparer<HashSet<int>>.Default;
\r
322 HashSet<int> s = new HashSet<int>();
\r
323 s.Add(1); s.Add(2); s.Add(3);
\r
324 Assert.AreEqual(CHC.unsequencedhashcode(1, 2, 3), h.GetHashCode(s));
\r
327 //generic types implementing collection interfaces
\r
329 public void SeqequalityComparerViaBuilder3()
\r
331 SCG.IEqualityComparer<IList<int>> h = EqualityComparer<IList<int>>.Default;
\r
332 IList<int> s = new LinkedList<int>();
\r
333 s.Add(1); s.Add(2); s.Add(3);
\r
334 Assert.AreEqual(CHC.sequencedhashcode(1, 2, 3), h.GetHashCode(s));
\r
337 interface IFoo<T> : ICollection<T> { void Bamse(); }
\r
339 class Foo<T> : HashSet<T>, IFoo<T>
\r
341 internal Foo() : base() { }
\r
342 public void Bamse() { }
\r
346 public void UnseqequalityComparerViaBuilder3()
\r
348 SCG.IEqualityComparer<IFoo<int>> h = EqualityComparer<IFoo<int>>.Default;
\r
349 IFoo<int> s = new Foo<int>();
\r
350 s.Add(1); s.Add(2); s.Add(3);
\r
351 Assert.AreEqual(CHC.unsequencedhashcode(1, 2, 3), h.GetHashCode(s));
\r
354 //Nongeneric types implementing collection types:
\r
355 interface IBaz : ISequenced<int> { void Bamse(); }
\r
357 class Baz : LinkedList<int>, IBaz
\r
359 internal Baz() : base() { }
\r
360 public void Bamse() { }
\r
361 //int ISequenced<int>.GetHashCode() { return sequencedhashcode(); }
\r
362 //bool ISequenced<int>.Equals(ISequenced<int> that) { return sequencedequals(that); }
\r
365 #warning This test fails because of an error in .Net 2.0
\r
367 public void SeqequalityComparerViaBuilder4()
\r
369 SCG.IEqualityComparer<IBaz> h = EqualityComparer<IBaz>.Default;
\r
370 IBaz s = new Baz();
\r
371 s.Add(1); s.Add(2); s.Add(3);
\r
372 Assert.AreEqual(CHC.sequencedhashcode(1, 2, 3), h.GetHashCode(s));
\r
375 interface IBar : ICollection<int>
\r
380 class Bar : HashSet<int>, IBar
\r
382 internal Bar() : base() { }
\r
383 public void Bamse() { }
\r
385 //TODO: remove all this workaround stuff:
\r
387 bool ICollection<int>.ContainsAll<U>(System.Collections.Generic.IEnumerable<U> items)
\r
389 throw new NotImplementedException();
\r
392 void ICollection<int>.RemoveAll<U>(System.Collections.Generic.IEnumerable<U> items)
\r
394 throw new NotImplementedException();
\r
397 void ICollection<int>.RetainAll<U>(System.Collections.Generic.IEnumerable<U> items)
\r
399 throw new NotImplementedException();
\r
402 void IExtensible<int>.AddAll<U>(System.Collections.Generic.IEnumerable<U> items)
\r
404 throw new NotImplementedException();
\r
410 public void UnseqequalityComparerViaBuilder4()
\r
412 SCG.IEqualityComparer<IBar> h = EqualityComparer<IBar>.Default;
\r
413 IBar s = new Bar();
\r
414 s.Add(1); s.Add(2); s.Add(3);
\r
415 Assert.AreEqual(CHC.unsequencedhashcode(1, 2, 3), h.GetHashCode(s));
\r