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
11 The above copyright notice and this permission notice shall be included in
\r
12 all copies or substantial portions of the Software.
\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
25 using NUnit.Framework;
\r
26 using MSG = System.Collections.Generic;
\r
28 namespace nunit.trees.TreeSet
\r
31 public class Combined
\r
33 private IIndexedSorted<KeyValuePair<int,int>> lst;
\r
39 lst = new TreeSet<KeyValuePair<int,int>>(new KeyValuePairComparer<int,int>(new IC()));
\r
40 for (int i = 0; i < 10; i++)
\r
41 lst.Add(new KeyValuePair<int,int>(i, i + 30));
\r
46 public void Dispose() { lst = null; }
\r
52 KeyValuePair<int,int> p = new KeyValuePair<int,int>(3, 78);
\r
54 Assert.IsTrue(lst.Find(ref p));
\r
55 Assert.AreEqual(3, p.key);
\r
56 Assert.AreEqual(33, p.value);
\r
57 p = new KeyValuePair<int,int>(13, 78);
\r
58 Assert.IsFalse(lst.Find(ref p));
\r
63 public void FindOrAdd()
\r
65 KeyValuePair<int,int> p = new KeyValuePair<int,int>(3, 78);
\r
67 Assert.IsTrue(lst.FindOrAdd(ref p));
\r
68 Assert.AreEqual(3, p.key);
\r
69 Assert.AreEqual(33, p.value);
\r
70 p = new KeyValuePair<int,int>(13, 79);
\r
71 Assert.IsFalse(lst.FindOrAdd(ref p));
\r
72 Assert.AreEqual(13, lst[10].key);
\r
73 Assert.AreEqual(79, lst[10].value);
\r
78 public void Update()
\r
80 KeyValuePair<int,int> p = new KeyValuePair<int,int>(3, 78);
\r
82 Assert.IsTrue(lst.Update(p));
\r
83 Assert.AreEqual(3, lst[3].key);
\r
84 Assert.AreEqual(78, lst[3].value);
\r
85 p = new KeyValuePair<int,int>(13, 78);
\r
86 Assert.IsFalse(lst.Update(p));
\r
91 public void UpdateOrAdd()
\r
93 KeyValuePair<int,int> p = new KeyValuePair<int,int>(3, 78);
\r
95 Assert.IsTrue(lst.UpdateOrAdd(p));
\r
96 Assert.AreEqual(3, lst[3].key);
\r
97 Assert.AreEqual(78, lst[3].value);
\r
98 p = new KeyValuePair<int,int>(13, 79);
\r
99 Assert.IsFalse(lst.UpdateOrAdd(p));
\r
100 Assert.AreEqual(13, lst[10].key);
\r
101 Assert.AreEqual(79, lst[10].value);
\r
106 public void RemoveWithReturn()
\r
108 KeyValuePair<int,int> p = new KeyValuePair<int,int>(3, 78);
\r
110 Assert.IsTrue(lst.RemoveWithReturn(ref p));
\r
111 Assert.AreEqual(3, p.key);
\r
112 Assert.AreEqual(33, p.value);
\r
113 Assert.AreEqual(4, lst[3].key);
\r
114 Assert.AreEqual(34, lst[3].value);
\r
115 p = new KeyValuePair<int,int>(13, 78);
\r
116 Assert.IsFalse(lst.RemoveWithReturn(ref p));
\r
122 public class Ranges
\r
124 private TreeSet<int> tree;
\r
126 private IComparer<int> c;
\r
133 tree = new TreeSet<int>(c);
\r
134 for (int i = 1; i <= 10; i++)
\r
142 public void Enumerator()
\r
144 MSG.IEnumerator<int> e = tree.RangeFromTo(5, 17).GetEnumerator();
\r
147 while (e.MoveNext())
\r
149 Assert.AreEqual(2 * i++, e.Current);
\r
152 Assert.AreEqual(9, i);
\r
157 [ExpectedException(typeof(InvalidOperationException))]
\r
158 public void Enumerator2()
\r
160 MSG.IEnumerator<int> e = tree.RangeFromTo(5, 17).GetEnumerator();
\r
166 [ExpectedException(typeof(InvalidOperationException))]
\r
167 public void Enumerator3()
\r
169 MSG.IEnumerator<int> e = tree.RangeFromTo(5, 17).GetEnumerator();
\r
171 while (e.MoveNext());
\r
178 public void Remove()
\r
180 int[] all = new int[] { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
\r
182 tree.RemoveRangeFrom(18);
\r
183 Assert.IsTrue(IC.eq(tree, new int[] { 2, 4, 6, 8, 10, 12, 14, 16 }));
\r
184 tree.RemoveRangeFrom(28);
\r
185 Assert.IsTrue(IC.eq(tree, new int[] { 2, 4, 6, 8, 10, 12, 14, 16 }));
\r
186 tree.RemoveRangeFrom(2);
\r
187 Assert.IsTrue(IC.eq(tree));
\r
188 foreach (int i in all) tree.Add(i);
\r
190 tree.RemoveRangeTo(10);
\r
191 Assert.IsTrue(IC.eq(tree, new int[] { 10, 12, 14, 16, 18, 20 }));
\r
192 tree.RemoveRangeTo(2);
\r
193 Assert.IsTrue(IC.eq(tree, new int[] { 10, 12, 14, 16, 18, 20 }));
\r
194 tree.RemoveRangeTo(21);
\r
195 Assert.IsTrue(IC.eq(tree));
\r
196 foreach (int i in all) tree.Add(i);
\r
198 tree.RemoveRangeFromTo(4, 8);
\r
199 Assert.IsTrue(IC.eq(tree, 2, 8, 10, 12, 14, 16, 18, 20));
\r
200 tree.RemoveRangeFromTo(14, 28);
\r
201 Assert.IsTrue(IC.eq(tree, 2, 8, 10, 12));
\r
202 tree.RemoveRangeFromTo(0, 9);
\r
203 Assert.IsTrue(IC.eq(tree, 10, 12));
\r
204 tree.RemoveRangeFromTo(0, 81);
\r
205 Assert.IsTrue(IC.eq(tree));
\r
209 public void Normal()
\r
211 int[] all = new int[] { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
\r
213 Assert.IsTrue(IC.eq(tree, all));
\r
214 Assert.IsTrue(IC.eq(tree.RangeAll(), all));
\r
215 Assert.AreEqual(10, tree.RangeAll().Count);
\r
216 Assert.IsTrue(IC.eq(tree.RangeFrom(11), new int[] { 12, 14, 16, 18, 20 }));
\r
217 Assert.AreEqual(5, tree.RangeFrom(11).Count);
\r
218 Assert.IsTrue(IC.eq(tree.RangeFrom(12), new int[] { 12, 14, 16, 18, 20 }));
\r
219 Assert.IsTrue(IC.eq(tree.RangeFrom(2), all));
\r
220 Assert.IsTrue(IC.eq(tree.RangeFrom(1), all));
\r
221 Assert.IsTrue(IC.eq(tree.RangeFrom(21), new int[] { }));
\r
222 Assert.IsTrue(IC.eq(tree.RangeFrom(20), new int[] { 20 }));
\r
223 Assert.IsTrue(IC.eq(tree.RangeTo(8), new int[] { 2, 4, 6 }));
\r
224 Assert.IsTrue(IC.eq(tree.RangeTo(7), new int[] { 2, 4, 6 }));
\r
225 Assert.AreEqual(3, tree.RangeTo(7).Count);
\r
226 Assert.IsTrue(IC.eq(tree.RangeTo(2), new int[] { }));
\r
227 Assert.IsTrue(IC.eq(tree.RangeTo(1), new int[] { }));
\r
228 Assert.IsTrue(IC.eq(tree.RangeTo(3), new int[] { 2 }));
\r
229 Assert.IsTrue(IC.eq(tree.RangeTo(20), new int[] { 2, 4, 6, 8, 10, 12, 14, 16, 18 }));
\r
230 Assert.IsTrue(IC.eq(tree.RangeTo(21), all));
\r
231 Assert.IsTrue(IC.eq(tree.RangeFromTo(7, 12), new int[] { 8, 10 }));
\r
232 Assert.IsTrue(IC.eq(tree.RangeFromTo(6, 11), new int[] { 6, 8, 10 }));
\r
233 Assert.IsTrue(IC.eq(tree.RangeFromTo(1, 12), new int[] { 2, 4, 6, 8, 10 }));
\r
234 Assert.AreEqual(5, tree.RangeFromTo(1, 12).Count);
\r
235 Assert.IsTrue(IC.eq(tree.RangeFromTo(2, 12), new int[] { 2, 4, 6, 8, 10 }));
\r
236 Assert.IsTrue(IC.eq(tree.RangeFromTo(6, 21), new int[] { 6, 8, 10, 12, 14, 16, 18, 20 }));
\r
237 Assert.IsTrue(IC.eq(tree.RangeFromTo(6, 20), new int[] { 6, 8, 10, 12, 14, 16, 18 }));
\r
242 public void Backwards()
\r
244 int[] all = new int[] { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
\r
245 int[] lla = new int[] { 20, 18, 16, 14, 12, 10, 8, 6, 4, 2 };
\r
247 Assert.IsTrue(IC.eq(tree, all));
\r
248 Assert.IsTrue(IC.eq(tree.RangeAll().Backwards(), lla));
\r
249 Assert.IsTrue(IC.eq(tree.RangeFrom(11).Backwards(), new int[] { 20, 18, 16, 14, 12 }));
\r
250 Assert.IsTrue(IC.eq(tree.RangeFrom(12).Backwards(), new int[] { 20, 18, 16, 14, 12 }));
\r
251 Assert.IsTrue(IC.eq(tree.RangeFrom(2).Backwards(), lla));
\r
252 Assert.IsTrue(IC.eq(tree.RangeFrom(1).Backwards(), lla));
\r
253 Assert.IsTrue(IC.eq(tree.RangeFrom(21).Backwards(), new int[] { }));
\r
254 Assert.IsTrue(IC.eq(tree.RangeFrom(20).Backwards(), new int[] { 20 }));
\r
255 Assert.IsTrue(IC.eq(tree.RangeTo(8).Backwards(), new int[] { 6, 4, 2 }));
\r
256 Assert.IsTrue(IC.eq(tree.RangeTo(7).Backwards(), new int[] { 6, 4, 2 }));
\r
257 Assert.IsTrue(IC.eq(tree.RangeTo(2).Backwards(), new int[] { }));
\r
258 Assert.IsTrue(IC.eq(tree.RangeTo(1).Backwards(), new int[] { }));
\r
259 Assert.IsTrue(IC.eq(tree.RangeTo(3).Backwards(), new int[] { 2 }));
\r
260 Assert.IsTrue(IC.eq(tree.RangeTo(20).Backwards(), new int[] { 18, 16, 14, 12, 10, 8, 6, 4, 2}));
\r
261 Assert.IsTrue(IC.eq(tree.RangeTo(21).Backwards(), lla));
\r
262 Assert.IsTrue(IC.eq(tree.RangeFromTo(7, 12).Backwards(), new int[] { 10, 8 }));
\r
263 Assert.IsTrue(IC.eq(tree.RangeFromTo(6, 11).Backwards(), new int[] { 10, 8, 6 }));
\r
264 Assert.IsTrue(IC.eq(tree.RangeFromTo(1, 12).Backwards(), new int[] { 10, 8, 6, 4, 2 }));
\r
265 Assert.IsTrue(IC.eq(tree.RangeFromTo(2, 12).Backwards(), new int[] { 10, 8, 6, 4, 2 }));
\r
266 Assert.IsTrue(IC.eq(tree.RangeFromTo(6, 21).Backwards(), new int[] { 20, 18, 16, 14, 12, 10, 8, 6 }));
\r
267 Assert.IsTrue(IC.eq(tree.RangeFromTo(6, 20).Backwards(), new int[] { 18, 16, 14, 12, 10, 8, 6 }));
\r
271 public void Direction()
\r
273 Assert.AreEqual(EnumerationDirection.Forwards, tree.Direction);
\r
274 Assert.AreEqual(EnumerationDirection.Forwards, tree.RangeFrom(20).Direction);
\r
275 Assert.AreEqual(EnumerationDirection.Forwards, tree.RangeTo(7).Direction);
\r
276 Assert.AreEqual(EnumerationDirection.Forwards, tree.RangeFromTo(1, 12).Direction);
\r
277 Assert.AreEqual(EnumerationDirection.Forwards, tree.RangeAll().Direction);
\r
278 Assert.AreEqual(EnumerationDirection.Backwards, tree.Backwards().Direction);
\r
279 Assert.AreEqual(EnumerationDirection.Backwards, tree.RangeFrom(20).Backwards().Direction);
\r
280 Assert.AreEqual(EnumerationDirection.Backwards, tree.RangeTo(7).Backwards().Direction);
\r
281 Assert.AreEqual(EnumerationDirection.Backwards, tree.RangeFromTo(1, 12).Backwards().Direction);
\r
282 Assert.AreEqual(EnumerationDirection.Backwards, tree.RangeAll().Backwards().Direction);
\r
287 public void Dispose()
\r
295 public class BagItf
\r
297 private TreeSet<int> tree;
\r
303 tree = new TreeSet<int>(new IC());
\r
304 for (int i = 10; i < 20; i++)
\r
315 Assert.AreEqual(0, tree.ContainsCount(7));
\r
316 Assert.AreEqual(1, tree.ContainsCount(10));
\r
317 tree.RemoveAllCopies(10);
\r
318 Assert.AreEqual(0, tree.ContainsCount(10));
\r
319 tree.RemoveAllCopies(7);
\r
324 public void Dispose()
\r
334 private TreeSet<int> tree;
\r
340 tree = new TreeSet<int>(new IC());
\r
344 private void loadup()
\r
346 for (int i = 10; i < 20; i++)
\r
355 public void NoDuplicates()
\r
357 Assert.IsFalse(tree.AllowsDuplicates);
\r
359 Assert.IsFalse(tree.AllowsDuplicates);
\r
365 Assert.IsTrue(tree.Add(17));
\r
366 Assert.IsFalse(tree.Add(17));
\r
367 Assert.IsTrue(tree.Add(18));
\r
368 Assert.IsFalse(tree.Add(18));
\r
369 Assert.AreEqual(2, tree.Count);
\r
374 public void Dispose()
\r
382 public class FindOrAdd
\r
384 private TreeSet<KeyValuePair<int,string>> bag;
\r
390 bag = new TreeSet<KeyValuePair<int,string>>(new KeyValuePairComparer<int,string>(new IC()));
\r
395 public void Dispose()
\r
404 KeyValuePair<int,string> p = new KeyValuePair<int,string>(3, "tre");
\r
406 Assert.IsFalse(bag.FindOrAdd(ref p));
\r
408 Assert.IsTrue(bag.FindOrAdd(ref p));
\r
409 Assert.AreEqual("tre", p.value);
\r
411 Assert.AreEqual(1, bag.ContainsCount(p));
\r
412 Assert.AreEqual("tre", bag[0].value);
\r
419 public class ArrayTest
\r
421 private TreeSet<int> tree;
\r
429 tree = new TreeSet<int>(new IC());
\r
431 for (int i = 0; i < 10; i++)
\r
437 public void Dispose() { tree = null; }
\r
440 private string aeq(int[] a, params int[] b)
\r
442 if (a.Length != b.Length)
\r
443 return "Lengths differ: " + a.Length + " != " + b.Length;
\r
445 for (int i = 0; i < a.Length; i++)
\r
447 return String.Format("{0}'th elements differ: {1} != {2}", i, a[i], b[i]);
\r
449 return "Alles klar";
\r
454 public void ToArray()
\r
456 Assert.AreEqual("Alles klar", aeq(tree.ToArray()));
\r
459 Assert.AreEqual("Alles klar", aeq(tree.ToArray(), 4, 7));
\r
464 public void CopyTo()
\r
467 Assert.AreEqual("Alles klar", aeq(a, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009));
\r
470 Assert.AreEqual("Alles klar", aeq(a, 1000, 1001, 6, 1003, 1004, 1005, 1006, 1007, 1008, 1009));
\r
474 Assert.AreEqual("Alles klar", aeq(a, 1000, 1001, 6, 1003, 4, 6, 9, 1007, 1008, 1009));
\r
478 Assert.AreEqual("Alles klar", aeq(a, 1000, 1001, 6, 1003, 4, 6, 9, 1007, 1008, 7));
\r
483 [ExpectedException(typeof(ArgumentException))]
\r
484 public void CopyToBad()
\r
487 tree.CopyTo(a, 10);
\r
492 [ExpectedException(typeof(ArgumentOutOfRangeException))]
\r
493 public void CopyToBad2()
\r
495 tree.CopyTo(a, -1);
\r
500 [ExpectedException(typeof(ArgumentException))]
\r
501 public void CopyToTooFar()
\r
513 public class Remove
\r
515 private TreeSet<int> tree;
\r
521 tree = new TreeSet<int>(new IC());
\r
522 for (int i = 10; i < 20; i++)
\r
531 public void SmallTrees()
\r
536 Assert.IsTrue(tree.Remove(7));
\r
537 Assert.IsTrue(tree.Check(""));
\r
542 public void ByIndex()
\r
545 int n = tree.Count;
\r
549 Assert.IsTrue(tree.Check(""));
\r
550 Assert.IsFalse(tree.Contains(i));
\r
551 Assert.AreEqual(n - 1, tree.Count);
\r
554 i = tree.FindMin();
\r
556 Assert.IsTrue(tree.Check(""));
\r
557 Assert.IsFalse(tree.Contains(i));
\r
558 Assert.AreEqual(n - 2, tree.Count);
\r
561 i = tree.FindMax();
\r
562 tree.RemoveAt(tree.Count - 1);
\r
563 Assert.IsTrue(tree.Check(""));
\r
564 Assert.IsFalse(tree.Contains(i));
\r
565 Assert.AreEqual(n - 3, tree.Count);
\r
570 Assert.IsTrue(tree.Check(""));
\r
571 Assert.IsFalse(tree.Contains(i));
\r
572 Assert.AreEqual(n - 4, tree.Count);
\r
577 public void AlmostEmpty()
\r
583 Assert.IsTrue(tree.Check(""));
\r
584 Assert.IsFalse(tree.Contains(3));
\r
585 Assert.AreEqual(0, tree.Count);
\r
590 [ExpectedException(typeof(IndexOutOfRangeException), "Index out of range for sequenced collection")]
\r
591 public void Empty()
\r
599 [ExpectedException(typeof(IndexOutOfRangeException), "Index out of range for sequenced collection")]
\r
600 public void HighIndex()
\r
602 tree.RemoveAt(tree.Count);
\r
607 [ExpectedException(typeof(IndexOutOfRangeException), "Index out of range for sequenced collection")]
\r
608 public void LowIndex()
\r
615 public void Normal()
\r
617 Assert.IsFalse(tree.Remove(-20));
\r
619 //No demote case, with move_item
\r
620 Assert.IsTrue(tree.Remove(20));
\r
621 Assert.IsTrue(tree.Check("T1"));
\r
622 Assert.IsFalse(tree.Remove(20));
\r
625 Assert.IsTrue(tree.Remove(14));
\r
626 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
629 Assert.IsTrue(tree.Remove(25));
\r
630 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
633 Assert.IsTrue(tree.Remove(29));
\r
634 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
637 Assert.IsTrue(tree.Remove(10));
\r
638 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
641 Assert.IsTrue(tree.Remove(12));
\r
642 Assert.IsTrue(tree.Remove(11));
\r
645 Assert.IsTrue(tree.Remove(18));
\r
646 Assert.IsTrue(tree.Remove(13));
\r
647 Assert.IsTrue(tree.Remove(15));
\r
650 for (int i = 0; i < 10; i++)
\r
651 tree.Add(50 - 2 * i);
\r
653 Assert.IsTrue(tree.Remove(42));
\r
654 Assert.IsTrue(tree.Remove(38));
\r
655 Assert.IsTrue(tree.Remove(28));
\r
656 Assert.IsTrue(tree.Remove(40));
\r
659 Assert.IsTrue(tree.Remove(16));
\r
660 Assert.IsTrue(tree.Remove(23));
\r
661 Assert.IsTrue(tree.Remove(17));
\r
662 Assert.IsTrue(tree.Remove(19));
\r
663 Assert.IsTrue(tree.Remove(50));
\r
664 Assert.IsTrue(tree.Remove(26));
\r
665 Assert.IsTrue(tree.Remove(21));
\r
666 Assert.IsTrue(tree.Remove(22));
\r
667 Assert.IsTrue(tree.Remove(24));
\r
668 for (int i = 0; i < 48; i++)
\r
671 //Almost empty tree:
\r
672 Assert.IsFalse(tree.Remove(26));
\r
673 Assert.IsTrue(tree.Remove(48));
\r
674 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
677 Assert.IsFalse(tree.Remove(26));
\r
678 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
683 public void Dispose()
\r
692 public class PredecessorStructure
\r
694 private TreeSet<int> tree;
\r
700 tree = new TreeSet<int>(new IC());
\r
704 private void loadup()
\r
706 for (int i = 0; i < 20; i++)
\r
712 public void Predecessor()
\r
715 Assert.AreEqual(6, tree.Predecessor(7));
\r
716 Assert.AreEqual(6, tree.Predecessor(8));
\r
719 Assert.AreEqual(0, tree.Predecessor(1));
\r
722 Assert.AreEqual(38, tree.Predecessor(39));
\r
727 [ExpectedException(typeof(ArgumentOutOfRangeException), "Below minimum of set\r\nParameter name: item\r\nActual value was -2.")]
\r
728 public void PredecessorTooLow1()
\r
730 tree.Predecessor(-2);
\r
735 [ExpectedException(typeof(ArgumentOutOfRangeException), "Below minimum of set\r\nParameter name: item\r\nActual value was 0.")]
\r
736 public void PredecessorTooLow2()
\r
738 tree.Predecessor(0);
\r
743 public void WeakPredecessor()
\r
746 Assert.AreEqual(6, tree.WeakPredecessor(7));
\r
747 Assert.AreEqual(8, tree.WeakPredecessor(8));
\r
750 Assert.AreEqual(0, tree.WeakPredecessor(1));
\r
751 Assert.AreEqual(0, tree.WeakPredecessor(0));
\r
754 Assert.AreEqual(38, tree.WeakPredecessor(39));
\r
755 Assert.AreEqual(38, tree.WeakPredecessor(38));
\r
760 [ExpectedException(typeof(ArgumentOutOfRangeException), "Below minimum of set\r\nParameter name: item\r\nActual value was -2.")]
\r
761 public void WeakPredecessorTooLow1()
\r
763 tree.WeakPredecessor(-2);
\r
768 public void Successor()
\r
771 Assert.AreEqual(8, tree.Successor(7));
\r
772 Assert.AreEqual(10, tree.Successor(8));
\r
775 Assert.AreEqual(2, tree.Successor(0));
\r
776 Assert.AreEqual(0, tree.Successor(-1));
\r
779 Assert.AreEqual(38, tree.Successor(37));
\r
784 [ExpectedException(typeof(ArgumentOutOfRangeException), "Above maximum of set\r\nParameter name: item\r\nActual value was 38.")]
\r
785 public void SuccessorTooHigh1()
\r
787 tree.Successor(38);
\r
792 [ExpectedException(typeof(ArgumentOutOfRangeException), "Above maximum of set\r\nParameter name: item\r\nActual value was 39.")]
\r
793 public void SuccessorTooHigh2()
\r
795 tree.Successor(39);
\r
800 public void WeakSuccessor()
\r
803 Assert.AreEqual(6, tree.WeakSuccessor(6));
\r
804 Assert.AreEqual(8, tree.WeakSuccessor(7));
\r
807 Assert.AreEqual(0, tree.WeakSuccessor(-1));
\r
808 Assert.AreEqual(0, tree.WeakSuccessor(0));
\r
811 Assert.AreEqual(38, tree.WeakSuccessor(37));
\r
812 Assert.AreEqual(38, tree.WeakSuccessor(38));
\r
817 [ExpectedException(typeof(ArgumentOutOfRangeException), "Above maximum of set\r\nParameter name: item\r\nActual value was 39.")]
\r
818 public void WeakSuccessorTooHigh1()
\r
820 tree.WeakSuccessor(39);
\r
825 public void Dispose()
\r
834 public class PriorityQueue
\r
836 private TreeSet<int> tree;
\r
842 tree = new TreeSet<int>(new IC());
\r
846 private void loadup()
\r
848 foreach (int i in new int[] { 1, 2, 3, 4 })
\r
854 public void Normal()
\r
857 Assert.AreEqual(1, tree.FindMin());
\r
858 Assert.AreEqual(4, tree.FindMax());
\r
859 Assert.AreEqual(1, tree.DeleteMin());
\r
860 Assert.AreEqual(4, tree.DeleteMax());
\r
861 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
862 Assert.AreEqual(2, tree.FindMin());
\r
863 Assert.AreEqual(3, tree.FindMax());
\r
864 Assert.AreEqual(2, tree.DeleteMin());
\r
865 Assert.AreEqual(3, tree.DeleteMax());
\r
866 Assert.IsTrue(tree.Check("Normal test 2"), "Bad tree");
\r
871 [ExpectedException(typeof(InvalidOperationException), "Priority queue is empty")]
\r
872 public void Empty1()
\r
879 [ExpectedException(typeof(InvalidOperationException), "Priority queue is empty")]
\r
880 public void Empty2()
\r
887 [ExpectedException(typeof(InvalidOperationException), "Priority queue is empty")]
\r
888 public void Empty3()
\r
895 [ExpectedException(typeof(InvalidOperationException), "Priority queue is empty")]
\r
896 public void Empty4()
\r
903 public void Dispose()
\r
912 public class IndexingAndCounting
\r
914 private TreeSet<int> tree;
\r
920 tree = new TreeSet<int>(new IC());
\r
924 private void populate()
\r
934 public void ToArray()
\r
938 int[] a = tree.ToArray();
\r
940 Assert.AreEqual(4, a.Length);
\r
941 Assert.AreEqual(10, a[0]);
\r
942 Assert.AreEqual(30, a[1]);
\r
943 Assert.AreEqual(50, a[2]);
\r
944 Assert.AreEqual(70, a[3]);
\r
949 public void GoodIndex()
\r
951 Assert.AreEqual(-1, tree.IndexOf(20));
\r
952 Assert.AreEqual(-1, tree.LastIndexOf(20));
\r
954 Assert.AreEqual(10, tree[0]);
\r
955 Assert.AreEqual(30, tree[1]);
\r
956 Assert.AreEqual(50, tree[2]);
\r
957 Assert.AreEqual(70, tree[3]);
\r
958 Assert.AreEqual(0, tree.IndexOf(10));
\r
959 Assert.AreEqual(1, tree.IndexOf(30));
\r
960 Assert.AreEqual(2, tree.IndexOf(50));
\r
961 Assert.AreEqual(3, tree.IndexOf(70));
\r
962 Assert.AreEqual(-1, tree.IndexOf(20));
\r
963 Assert.AreEqual(-1, tree.IndexOf(0));
\r
964 Assert.AreEqual(-1, tree.IndexOf(90));
\r
965 Assert.AreEqual(0, tree.LastIndexOf(10));
\r
966 Assert.AreEqual(1, tree.LastIndexOf(30));
\r
967 Assert.AreEqual(2, tree.LastIndexOf(50));
\r
968 Assert.AreEqual(3, tree.LastIndexOf(70));
\r
969 Assert.AreEqual(-1, tree.LastIndexOf(20));
\r
970 Assert.AreEqual(-1, tree.LastIndexOf(0));
\r
971 Assert.AreEqual(-1, tree.LastIndexOf(90));
\r
976 [ExpectedException(typeof(IndexOutOfRangeException))]
\r
977 public void IndexTooLarge()
\r
980 Console.WriteLine(tree[4]);
\r
985 [ExpectedException(typeof(IndexOutOfRangeException))]
\r
986 public void IndexTooSmall()
\r
989 Console.WriteLine(tree[-1]);
\r
994 public void FilledTreeOutsideInput()
\r
997 Assert.AreEqual(0, tree.CountFrom(90));
\r
998 Assert.AreEqual(0, tree.CountFromTo(-20, 0));
\r
999 Assert.AreEqual(0, tree.CountFromTo(80, 100));
\r
1000 Assert.AreEqual(0, tree.CountTo(0));
\r
1001 Assert.AreEqual(4, tree.CountTo(90));
\r
1002 Assert.AreEqual(4, tree.CountFromTo(-20, 90));
\r
1003 Assert.AreEqual(4, tree.CountFrom(0));
\r
1008 public void FilledTreeIntermediateInput()
\r
1011 Assert.AreEqual(3, tree.CountFrom(20));
\r
1012 Assert.AreEqual(1, tree.CountFromTo(20, 40));
\r
1013 Assert.AreEqual(2, tree.CountTo(40));
\r
1018 public void FilledTreeMatchingInput()
\r
1021 Assert.AreEqual(3, tree.CountFrom(30));
\r
1022 Assert.AreEqual(2, tree.CountFromTo(30, 70));
\r
1023 Assert.AreEqual(0, tree.CountFromTo(50, 30));
\r
1024 Assert.AreEqual(0, tree.CountFromTo(50, 50));
\r
1025 Assert.AreEqual(0, tree.CountTo(10));
\r
1026 Assert.AreEqual(2, tree.CountTo(50));
\r
1031 public void CountEmptyTree()
\r
1033 Assert.AreEqual(0, tree.CountFrom(20));
\r
1034 Assert.AreEqual(0, tree.CountFromTo(20, 40));
\r
1035 Assert.AreEqual(0, tree.CountTo(40));
\r
1040 public void Dispose()
\r
1049 namespace ModificationCheck
\r
1052 public class Enumerator
\r
1054 private TreeSet<int> tree;
\r
1056 private MSG.IEnumerator<int> e;
\r
1060 public void Init()
\r
1062 tree = new TreeSet<int>(new IC());
\r
1063 for (int i = 0; i < 10; i++)
\r
1066 e = tree.GetEnumerator();
\r
1071 public void CurrentAfterModification()
\r
1075 Assert.AreEqual(0, e.Current);
\r
1080 [ExpectedException(typeof(InvalidOperationException), "Collection was modified")]
\r
1081 public void MoveNextAfterAdd()
\r
1091 [ExpectedException(typeof(InvalidOperationException), "Collection was modified")]
\r
1092 public void MoveNextAfterRemove()
\r
1100 [ExpectedException(typeof(InvalidOperationException), "Collection was modified")]
\r
1101 public void MoveNextAfterClear()
\r
1109 public void Dispose()
\r
1119 public class RangeEnumerator
\r
1121 private TreeSet<int> tree;
\r
1123 private MSG.IEnumerator<int> e;
\r
1127 public void Init()
\r
1129 tree = new TreeSet<int>(new IC());
\r
1130 for (int i = 0; i < 10; i++)
\r
1133 e = tree.RangeFromTo(3, 7).GetEnumerator();
\r
1138 public void CurrentAfterModification()
\r
1142 Assert.AreEqual(3, e.Current);
\r
1147 [ExpectedException(typeof(InvalidOperationException), "Collection was modified")]
\r
1148 public void MoveNextAfterAdd()
\r
1158 [ExpectedException(typeof(InvalidOperationException), "Collection was modified")]
\r
1159 public void MoveNextAfterRemove()
\r
1167 [ExpectedException(typeof(InvalidOperationException), "Collection was modified")]
\r
1168 public void MoveNextAfterClear()
\r
1176 public void Dispose()
\r
1187 namespace PathcopyPersistence
\r
1190 public class Navigation
\r
1192 private TreeSet<int> tree, snap;
\r
1194 private IComparer<int> ic;
\r
1198 public void Init()
\r
1201 tree = new TreeSet<int>(ic);
\r
1202 for (int i = 0; i <= 20; i++)
\r
1203 tree.Add(2 * i + 1);
\r
1205 snap = (TreeSet<int>)tree.Snapshot();
\r
1206 for (int i = 0; i <= 10; i++)
\r
1207 tree.Remove(4 * i + 1);
\r
1211 private bool twomodeleven(int i)
\r
1213 return i % 11 == 2;
\r
1218 public void InternalEnum()
\r
1220 Assert.IsTrue(IC.eq(snap.FindAll(new Filter<int>(twomodeleven)), 13, 35));
\r
1224 public void MoreCut() { }
\r
1232 Assert.IsFalse(snap.Cut(new HigherOrder.CubeRoot(64), out lo, out lv, out hi, out hv));
\r
1233 Assert.IsTrue(lv && hv);
\r
1234 Assert.AreEqual(5, hi);
\r
1235 Assert.AreEqual(3, lo);
\r
1236 Assert.IsTrue(snap.Cut(new HigherOrder.CubeRoot(125), out lo, out lv, out hi, out hv));
\r
1237 Assert.IsTrue(lv && hv);
\r
1238 Assert.AreEqual(7, hi);
\r
1239 Assert.AreEqual(3, lo);
\r
1240 Assert.IsFalse(snap.Cut(new HigherOrder.CubeRoot(125000), out lo, out lv, out hi, out hv));
\r
1241 Assert.IsTrue(lv && !hv);
\r
1242 Assert.AreEqual(41, lo);
\r
1243 Assert.IsFalse(snap.Cut(new HigherOrder.CubeRoot(-27), out lo, out lv, out hi, out hv));
\r
1244 Assert.IsTrue(!lv && hv);
\r
1245 Assert.AreEqual(1, hi);
\r
1250 public void Range()
\r
1252 Assert.IsTrue(IC.eq(snap.RangeFromTo(5, 16), 5, 7, 9, 11, 13, 15));
\r
1253 Assert.IsTrue(IC.eq(snap.RangeFromTo(5, 17), 5, 7, 9, 11, 13, 15));
\r
1254 Assert.IsTrue(IC.eq(snap.RangeFromTo(6, 16), 7, 9, 11, 13, 15));
\r
1255 //Assert.AreEqual(snap.RangeFromTo(6, 16).Count, 5);
\r
1260 public void Contains()
\r
1262 Assert.IsTrue(snap.Contains(5));
\r
1267 public void FindMin()
\r
1269 Assert.AreEqual(1, snap.FindMin());
\r
1274 public void FindMax()
\r
1276 Assert.AreEqual(41, snap.FindMax());
\r
1281 public void Predecessor()
\r
1283 Assert.AreEqual(13, snap.Predecessor(15));
\r
1284 Assert.AreEqual(15, snap.Predecessor(16));
\r
1285 Assert.AreEqual(15, snap.Predecessor(17));
\r
1286 Assert.AreEqual(17, snap.Predecessor(18));
\r
1291 public void Successor()
\r
1293 Assert.AreEqual(17, snap.Successor(15));
\r
1294 Assert.AreEqual(17, snap.Successor(16));
\r
1295 Assert.AreEqual(19, snap.Successor(17));
\r
1296 Assert.AreEqual(19, snap.Successor(18));
\r
1301 public void WeakPredecessor()
\r
1303 Assert.AreEqual(15, snap.WeakPredecessor(15));
\r
1304 Assert.AreEqual(15, snap.WeakPredecessor(16));
\r
1305 Assert.AreEqual(17, snap.WeakPredecessor(17));
\r
1306 Assert.AreEqual(17, snap.WeakPredecessor(18));
\r
1311 public void WeakSuccessor()
\r
1313 Assert.AreEqual(15, snap.WeakSuccessor(15));
\r
1314 Assert.AreEqual(17, snap.WeakSuccessor(16));
\r
1315 Assert.AreEqual(17, snap.WeakSuccessor(17));
\r
1316 Assert.AreEqual(19, snap.WeakSuccessor(18));
\r
1321 [ExpectedException(typeof(NotSupportedException), "Indexing not supported for snapshots")]
\r
1322 public void CountTo()
\r
1324 int j = snap.CountTo(15);
\r
1329 [ExpectedException(typeof(NotSupportedException), "Indexing not supported for snapshots")]
\r
1330 public void Indexing()
\r
1337 [ExpectedException(typeof(NotSupportedException), "Indexing not supported for snapshots")]
\r
1338 public void Indexing2()
\r
1340 int j = snap.IndexOf(5);
\r
1345 public void Dispose()
\r
1355 public class Single
\r
1357 private TreeSet<int> tree;
\r
1359 private IComparer<int> ic;
\r
1363 public void Init()
\r
1366 tree = new TreeSet<int>(ic);
\r
1367 for (int i = 0; i < 10; i++)
\r
1368 tree.Add(2 * i + 1);
\r
1373 public void EnumerationWithAdd()
\r
1375 int[] orig = new int[] { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };
\r
1377 TreeSet<int> snap = (TreeSet<int>)tree.Snapshot();
\r
1379 foreach (int j in snap)
\r
1381 Assert.AreEqual(1 + 2 * i++, j);
\r
1383 Assert.IsTrue(snap.Check("M"), "Bad snap!");
\r
1384 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1385 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1391 public void Remove()
\r
1393 int[] orig = new int[] { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };
\r
1394 TreeSet<int> snap = (TreeSet<int>)tree.Snapshot();
\r
1396 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1397 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1399 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1400 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1401 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1406 public void RemoveNormal()
\r
1409 for (int i = 10; i < 20; i++)
\r
1415 int[] orig = new int[] { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 };
\r
1416 TreeSet<int> snap = (TreeSet<int>)tree.Snapshot();
\r
1418 Assert.IsFalse(tree.Remove(-20));
\r
1419 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1420 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1422 //No demote case, with move_item
\r
1423 Assert.IsTrue(tree.Remove(20));
\r
1424 Assert.IsTrue(tree.Check("T1"));
\r
1425 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1426 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1427 Assert.IsFalse(tree.Remove(20));
\r
1431 Assert.IsTrue(tree.Remove(14));
\r
1432 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1433 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1434 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1437 Assert.IsTrue(tree.Remove(25));
\r
1438 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1439 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1440 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1443 Assert.IsTrue(tree.Remove(29));
\r
1444 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1445 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1446 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1448 //1a (terminating)
\r
1449 Assert.IsTrue(tree.Remove(10));
\r
1450 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1451 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1452 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1455 Assert.IsTrue(tree.Remove(12));
\r
1457 Assert.IsTrue(tree.Remove(11));
\r
1458 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1459 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1460 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1463 Assert.IsTrue(tree.Remove(18));
\r
1464 Assert.IsTrue(tree.Remove(13));
\r
1465 Assert.IsTrue(tree.Remove(15));
\r
1466 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1467 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1468 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1471 for (int i = 0; i < 10; i++)
\r
1472 tree.Add(50 - 2 * i);
\r
1474 Assert.IsTrue(tree.Remove(42));
\r
1475 Assert.IsTrue(tree.Remove(38));
\r
1476 Assert.IsTrue(tree.Remove(28));
\r
1477 Assert.IsTrue(tree.Remove(40));
\r
1478 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1479 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1480 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1483 Assert.IsTrue(tree.Remove(16));
\r
1484 Assert.IsTrue(tree.Remove(23));
\r
1485 Assert.IsTrue(tree.Remove(17));
\r
1486 Assert.IsTrue(tree.Remove(19));
\r
1487 Assert.IsTrue(tree.Remove(50));
\r
1488 Assert.IsTrue(tree.Remove(26));
\r
1489 Assert.IsTrue(tree.Remove(21));
\r
1490 Assert.IsTrue(tree.Remove(22));
\r
1491 Assert.IsTrue(tree.Remove(24));
\r
1492 for (int i = 0; i < 48; i++)
\r
1495 //Almost empty tree:
\r
1496 Assert.IsFalse(tree.Remove(26));
\r
1497 Assert.IsTrue(tree.Remove(48));
\r
1498 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1499 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1500 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1503 Assert.IsFalse(tree.Remove(26));
\r
1504 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1505 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1506 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1513 int[] orig = new int[] { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };
\r
1514 TreeSet<int> snap = (TreeSet<int>)tree.Snapshot();
\r
1516 Assert.IsTrue(snap.Check("M"), "Bad snap!");
\r
1517 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1518 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1520 Assert.IsTrue(snap.Check("M"), "Bad snap!");
\r
1521 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1522 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1524 Assert.IsTrue(snap.Check("M"), "Bad snap!");
\r
1525 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1526 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1530 Assert.IsTrue(snap.Check("M"), "Bad snap!");
\r
1531 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1532 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1533 for (int i = 1; i < 4; i++)
\r
1534 tree.Add(40 - 2 * i);
\r
1536 Assert.IsTrue(snap.Check("M"), "Bad snap!");
\r
1537 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1538 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1542 Assert.IsTrue(snap.Check("M"), "Bad snap!");
\r
1543 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1544 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1549 public void Clear()
\r
1551 int[] orig = new int[] { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };
\r
1552 TreeSet<int> snap = (TreeSet<int>)tree.Snapshot();
\r
1555 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1556 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1557 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1558 Assert.AreEqual(0, tree.Count);
\r
1563 [ExpectedException(typeof(InvalidOperationException), "Cannot snapshot a snapshot")]
\r
1564 public void SnapSnap()
\r
1566 TreeSet<int> snap = (TreeSet<int>)tree.Snapshot();
\r
1573 public void Dispose()
\r
1583 public class Multiple
\r
1585 private TreeSet<int> tree;
\r
1587 private IComparer<int> ic;
\r
1590 private bool eq(MSG.IEnumerable<int> me, int[] that)
\r
1592 int i = 0, maxind = that.Length - 1;
\r
1594 foreach (int item in me)
\r
1595 if (i > maxind || ic.Compare(item, that[i++]) != 0)
\r
1603 public void Init()
\r
1606 tree = new TreeSet<int>(ic);
\r
1607 for (int i = 0; i < 10; i++)
\r
1608 tree.Add(2 * i + 1);
\r
1613 public void First()
\r
1615 TreeSet<int>[] snaps = new TreeSet<int>[10];
\r
1617 for (int i = 0; i < 10; i++)
\r
1619 snaps[i] = (TreeSet<int>)(tree.Snapshot());
\r
1623 for (int i = 0; i < 10; i++)
\r
1625 Assert.AreEqual(i + 10, snaps[i].Count);
\r
1631 snaps[8].Dispose();
\r
1634 int[] res = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19 };
\r
1635 int[] snap7 = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 19 };
\r
1636 int[] snap3 = new int[] { 0, 1, 2, 3, 4, 5, 7, 9, 11, 13, 15, 17, 19 };
\r
1638 Assert.IsTrue(IC.eq(snaps[3], snap3), "Snap 3 was changed!");
\r
1639 Assert.IsTrue(IC.eq(snaps[7], snap7), "Snap 7 was changed!");
\r
1640 Assert.IsTrue(IC.eq(tree, res));
\r
1641 Assert.IsTrue(tree.Check("B"));
\r
1642 Assert.IsTrue(snaps[3].Check("B"));
\r
1643 Assert.IsTrue(snaps[7].Check("B"));
\r
1648 public void CollectingTheMaster()
\r
1650 TreeSet<int>[] snaps = new TreeSet<int>[10];
\r
1652 for (int i = 0; i < 10; i++)
\r
1654 snaps[i] = (TreeSet<int>)(tree.Snapshot());
\r
1660 for (int i = 0; i < 10; i++)
\r
1662 Assert.AreEqual(i + 10, snaps[i].Count);
\r
1668 snaps[8].Dispose();
\r
1670 int[] snap7 = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 19 };
\r
1671 int[] snap3 = new int[] { 0, 1, 2, 3, 4, 5, 7, 9, 11, 13, 15, 17, 19 };
\r
1673 Assert.IsTrue(IC.eq(snaps[3], snap3), "Snap 3 was changed!");
\r
1674 Assert.IsTrue(IC.eq(snaps[7], snap7), "Snap 7 was changed!");
\r
1675 Assert.IsTrue(snaps[3].Check("B"));
\r
1676 Assert.IsTrue(snaps[7].Check("B"));
\r
1681 public void Dispose()
\r
1692 namespace HigherOrder
\r
1694 internal class CubeRoot: IComparable<int>
\r
1699 internal CubeRoot(int c) { this.c = c; }
\r
1702 public int CompareTo(int that) { return c - that * that * that; }
\r
1703 public bool Equals(int that) { return c == that * that * that; }
\r
1708 class Interval: IComparable<int>
\r
1713 internal Interval(int b, int t) { this.b = b; this.t = t; }
\r
1716 public int CompareTo(int that) { return that < b ? 1 : that > t ? -1 : 0; }
\r
1717 public bool Equals(int that) { return that >= b && that <= t; }
\r
1723 public class Simple
\r
1725 private TreeSet<int> tree;
\r
1727 private IComparer<int> ic;
\r
1731 public void Init()
\r
1734 tree = new TreeSet<int>(ic);
\r
1738 private bool never(int i) { return false; }
\r
1741 private bool always(int i) { return true; }
\r
1744 private bool even(int i) { return i % 2 == 0; }
\r
1747 private string themap(int i) { return String.Format("AA {0,4} BB", i); }
\r
1750 private string badmap(int i) { return String.Format("AA {0} BB", i); }
\r
1753 private int appfield1;
\r
1755 private int appfield2;
\r
1758 private void apply(int i) { appfield1++; appfield2 += i * i; }
\r
1762 public void Apply()
\r
1764 Simple simple1 = new Simple();
\r
1766 tree.Apply(new Applier<int>(simple1.apply));
\r
1767 Assert.AreEqual(0, simple1.appfield1);
\r
1768 Assert.AreEqual(0, simple1.appfield2);
\r
1770 Simple simple2 = new Simple();
\r
1772 for (int i = 0; i < 10; i++) tree.Add(i);
\r
1774 tree.Apply(new Applier<int>(simple2.apply));
\r
1775 Assert.AreEqual(10, simple2.appfield1);
\r
1776 Assert.AreEqual(285, simple2.appfield2);
\r
1783 Assert.IsTrue(tree.All(new Filter<int>(never)));
\r
1784 Assert.IsTrue(tree.All(new Filter<int>(even)));
\r
1785 Assert.IsTrue(tree.All(new Filter<int>(always)));
\r
1786 for (int i = 0; i < 10; i++) tree.Add(i);
\r
1788 Assert.IsFalse(tree.All(new Filter<int>(never)));
\r
1789 Assert.IsFalse(tree.All(new Filter<int>(even)));
\r
1790 Assert.IsTrue(tree.All(new Filter<int>(always)));
\r
1792 for (int i = 0; i < 10; i++) tree.Add(i * 2);
\r
1794 Assert.IsFalse(tree.All(new Filter<int>(never)));
\r
1795 Assert.IsTrue(tree.All(new Filter<int>(even)));
\r
1796 Assert.IsTrue(tree.All(new Filter<int>(always)));
\r
1798 for (int i = 0; i < 10; i++) tree.Add(i * 2 + 1);
\r
1800 Assert.IsFalse(tree.All(new Filter<int>(never)));
\r
1801 Assert.IsFalse(tree.All(new Filter<int>(even)));
\r
1802 Assert.IsTrue(tree.All(new Filter<int>(always)));
\r
1807 public void Exists()
\r
1809 Assert.IsFalse(tree.Exists(new Filter<int>(never)));
\r
1810 Assert.IsFalse(tree.Exists(new Filter<int>(even)));
\r
1811 Assert.IsFalse(tree.Exists(new Filter<int>(always)));
\r
1812 for (int i = 0; i < 10; i++) tree.Add(i);
\r
1814 Assert.IsFalse(tree.Exists(new Filter<int>(never)));
\r
1815 Assert.IsTrue(tree.Exists(new Filter<int>(even)));
\r
1816 Assert.IsTrue(tree.Exists(new Filter<int>(always)));
\r
1818 for (int i = 0; i < 10; i++) tree.Add(i * 2);
\r
1820 Assert.IsFalse(tree.Exists(new Filter<int>(never)));
\r
1821 Assert.IsTrue(tree.Exists(new Filter<int>(even)));
\r
1822 Assert.IsTrue(tree.Exists(new Filter<int>(always)));
\r
1824 for (int i = 0; i < 10; i++) tree.Add(i * 2 + 1);
\r
1826 Assert.IsFalse(tree.Exists(new Filter<int>(never)));
\r
1827 Assert.IsFalse(tree.Exists(new Filter<int>(even)));
\r
1828 Assert.IsTrue(tree.Exists(new Filter<int>(always)));
\r
1833 public void FindAll()
\r
1835 Assert.AreEqual(0, tree.FindAll(new Filter<int>(never)).Count);
\r
1836 for (int i = 0; i < 10; i++)
\r
1839 Assert.AreEqual(0, tree.FindAll(new Filter<int>(never)).Count);
\r
1840 Assert.AreEqual(10, tree.FindAll(new Filter<int>(always)).Count);
\r
1841 Assert.AreEqual(5, tree.FindAll(new Filter<int>(even)).Count);
\r
1842 Assert.IsTrue(((TreeSet<int>)tree.FindAll(new Filter<int>(even))).Check("R"));
\r
1849 Assert.AreEqual(0, tree.Map(new Mapper<int,string>(themap), new SC()).Count);
\r
1850 for (int i = 0; i < 11; i++)
\r
1851 tree.Add(i * i * i);
\r
1853 IIndexedSorted<string> res = tree.Map(new Mapper<int,string>(themap), new SC());
\r
1855 Assert.IsTrue(((TreeSet<string>)res).Check("R"));
\r
1856 Assert.AreEqual(11, res.Count);
\r
1857 Assert.AreEqual("AA 0 BB", res[0]);
\r
1858 Assert.AreEqual("AA 27 BB", res[3]);
\r
1859 Assert.AreEqual("AA 125 BB", res[5]);
\r
1860 Assert.AreEqual("AA 1000 BB", res[10]);
\r
1865 [ExpectedException(typeof(ArgumentException), "mapper not monotonic")]
\r
1866 public void BadMap()
\r
1868 for (int i = 0; i < 11; i++)
\r
1869 tree.Add(i * i * i);
\r
1871 ISorted<string> res = tree.Map(new Mapper<int,string>(badmap), new SC());
\r
1878 for (int i = 0; i < 10; i++)
\r
1884 Assert.IsTrue(tree.Cut(new CubeRoot(27), out low, out lval, out high, out hval));
\r
1885 Assert.IsTrue(lval && hval);
\r
1886 Assert.AreEqual(4, high);
\r
1887 Assert.AreEqual(2, low);
\r
1888 Assert.IsFalse(tree.Cut(new CubeRoot(30), out low, out lval, out high, out hval));
\r
1889 Assert.IsTrue(lval && hval);
\r
1890 Assert.AreEqual(4, high);
\r
1891 Assert.AreEqual(3, low);
\r
1896 public void CutInt()
\r
1898 for (int i = 0; i < 10; i++)
\r
1904 Assert.IsFalse(tree.Cut(new IC(3), out low, out lval, out high, out hval));
\r
1905 Assert.IsTrue(lval && hval);
\r
1906 Assert.AreEqual(4, high);
\r
1907 Assert.AreEqual(2, low);
\r
1908 Assert.IsTrue(tree.Cut(new IC(6), out low, out lval, out high, out hval));
\r
1909 Assert.IsTrue(lval && hval);
\r
1910 Assert.AreEqual(8, high);
\r
1911 Assert.AreEqual(4, low);
\r
1916 public void CutInterval()
\r
1918 for (int i = 0; i < 10; i++)
\r
1924 Assert.IsTrue(tree.Cut(new Interval(5, 9), out lo, out lv, out hi, out hv));
\r
1925 Assert.IsTrue(lv && hv);
\r
1926 Assert.AreEqual(10, hi);
\r
1927 Assert.AreEqual(4, lo);
\r
1928 Assert.IsTrue(tree.Cut(new Interval(6, 10), out lo, out lv, out hi, out hv));
\r
1929 Assert.IsTrue(lv && hv);
\r
1930 Assert.AreEqual(12, hi);
\r
1931 Assert.AreEqual(4, lo);
\r
1932 for (int i = 0; i < 100; i++)
\r
1935 tree.Cut(new Interval(77, 105), out lo, out lv, out hi, out hv);
\r
1936 Assert.IsTrue(lv && hv);
\r
1937 Assert.AreEqual(106, hi);
\r
1938 Assert.AreEqual(76, lo);
\r
1939 tree.Cut(new Interval(5, 7), out lo, out lv, out hi, out hv);
\r
1940 Assert.IsTrue(lv && hv);
\r
1941 Assert.AreEqual(8, hi);
\r
1942 Assert.AreEqual(4, lo);
\r
1943 tree.Cut(new Interval(80, 110), out lo, out lv, out hi, out hv);
\r
1944 Assert.IsTrue(lv && hv);
\r
1945 Assert.AreEqual(112, hi);
\r
1946 Assert.AreEqual(78, lo);
\r
1951 public void UpperCut()
\r
1953 for (int i = 0; i < 10; i++)
\r
1959 Assert.IsFalse(tree.Cut(new CubeRoot(1000), out l, out lv, out h, out hv));
\r
1960 Assert.IsTrue(lv && !hv);
\r
1961 Assert.AreEqual(9, l);
\r
1962 Assert.IsFalse(tree.Cut(new CubeRoot(-50), out l, out lv, out h, out hv));
\r
1963 Assert.IsTrue(!lv && hv);
\r
1964 Assert.AreEqual(0, h);
\r
1969 public void Dispose() { ic = null; tree = null; }
\r
1976 namespace MultiOps
\r
1979 public class AddAll
\r
1981 private int sqr(int i) { return i * i; }
\r
1984 TreeSet<int> tree;
\r
1988 public void Init() { tree = new TreeSet<int>(new IC()); }
\r
1992 public void EmptyEmpty()
\r
1994 tree.AddAll(new FunEnumerable(0, new Int2Int(sqr)));
\r
1995 Assert.AreEqual(0, tree.Count);
\r
1996 Assert.IsTrue(tree.Check());
\r
2001 public void SomeEmpty()
\r
2003 for (int i = 4; i < 9; i++) tree.Add(i);
\r
2005 tree.AddAll(new FunEnumerable(0, new Int2Int(sqr)));
\r
2006 Assert.AreEqual(5, tree.Count);
\r
2007 Assert.IsTrue(tree.Check());
\r
2012 public void EmptySome()
\r
2014 tree.AddAll(new FunEnumerable(4, new Int2Int(sqr)));
\r
2015 Assert.AreEqual(4, tree.Count);
\r
2016 Assert.IsTrue(tree.Check());
\r
2017 Assert.AreEqual(0, tree[0]);
\r
2018 Assert.AreEqual(1, tree[1]);
\r
2019 Assert.AreEqual(4, tree[2]);
\r
2020 Assert.AreEqual(9, tree[3]);
\r
2025 public void SomeSome()
\r
2027 for (int i = 5; i < 9; i++) tree.Add(i);
\r
2029 tree.AddAll(new FunEnumerable(4, new Int2Int(sqr)));
\r
2030 Assert.AreEqual(8, tree.Count);
\r
2031 Assert.IsTrue(tree.Check());
\r
2032 Assert.IsTrue(IC.eq(tree, 0, 1, 4, 5, 6, 7, 8, 9));
\r
2037 public void Dispose() { tree = null; }
\r
2043 public class AddSorted
\r
2045 private int sqr(int i) { return i * i; }
\r
2048 private int bad(int i) { return i * (5 - i); }
\r
2051 TreeSet<int> tree;
\r
2055 public void Init() { tree = new TreeSet<int>(new IC()); }
\r
2059 public void EmptyEmpty()
\r
2061 tree.AddSorted(new FunEnumerable(0, new Int2Int(sqr)));
\r
2062 Assert.AreEqual(0, tree.Count);
\r
2063 Assert.IsTrue(tree.Check());
\r
2069 public void SomeEmpty()
\r
2071 for (int i = 4; i < 9; i++) tree.Add(i);
\r
2073 tree.AddSorted(new FunEnumerable(0, new Int2Int(sqr)));
\r
2074 Assert.AreEqual(5, tree.Count);
\r
2075 Assert.IsTrue(tree.Check());
\r
2081 public void EmptySome()
\r
2083 tree.AddSorted(new FunEnumerable(4, new Int2Int(sqr)));
\r
2084 Assert.AreEqual(4, tree.Count);
\r
2085 Assert.IsTrue(tree.Check());
\r
2086 Assert.AreEqual(0, tree[0]);
\r
2087 Assert.AreEqual(1, tree[1]);
\r
2088 Assert.AreEqual(4, tree[2]);
\r
2089 Assert.AreEqual(9, tree[3]);
\r
2095 public void SomeSome()
\r
2097 for (int i = 5; i < 9; i++) tree.Add(i);
\r
2099 tree.AddSorted(new FunEnumerable(4, new Int2Int(sqr)));
\r
2100 Assert.AreEqual(8, tree.Count);
\r
2101 Assert.IsTrue(tree.Check());
\r
2102 Assert.IsTrue(IC.eq(tree, 0, 1, 4, 5, 6, 7, 8, 9));
\r
2106 [ExpectedException(typeof(ArgumentException), "Argument not sorted")]
\r
2107 public void EmptyBad()
\r
2109 tree.AddSorted(new FunEnumerable(9, new Int2Int(bad)));
\r
2114 public void Dispose() { tree = null; }
\r
2120 TreeSet<int> tree, tree2;
\r
2124 public void Init()
\r
2126 tree = new TreeSet<int>(new IC());
\r
2127 tree2 = new TreeSet<int>(new IC());
\r
2128 for (int i = 0; i < 10; i++)
\r
2131 for (int i = 0; i < 10; i++)
\r
2137 public void RemoveAll()
\r
2139 tree.RemoveAll(tree2.RangeFromTo(3, 7));
\r
2140 Assert.AreEqual(8, tree.Count);
\r
2141 Assert.IsTrue(tree.Check());
\r
2142 Assert.IsTrue(IC.eq(tree, 0, 1, 2, 3, 5, 7, 8, 9));
\r
2143 tree.RemoveAll(tree2.RangeFromTo(3, 7));
\r
2144 Assert.AreEqual(8, tree.Count);
\r
2145 Assert.IsTrue(tree.Check());
\r
2146 Assert.IsTrue(IC.eq(tree, 0, 1, 2, 3, 5, 7, 8, 9));
\r
2147 tree.RemoveAll(tree2.RangeFromTo(13, 17));
\r
2148 Assert.AreEqual(8, tree.Count);
\r
2149 Assert.IsTrue(tree.Check());
\r
2150 Assert.IsTrue(IC.eq(tree, 0, 1, 2, 3, 5, 7, 8, 9));
\r
2151 tree.RemoveAll(tree2.RangeFromTo(3, 17));
\r
2152 Assert.AreEqual(7, tree.Count);
\r
2153 Assert.IsTrue(tree.Check());
\r
2154 Assert.IsTrue(IC.eq(tree, 0, 1, 2, 3, 5, 7, 9));
\r
2155 for (int i = 0; i < 10; i++) tree2.Add(i);
\r
2157 tree.RemoveAll(tree2.RangeFromTo(-1, 10));
\r
2158 Assert.AreEqual(0, tree.Count);
\r
2159 Assert.IsTrue(tree.Check());
\r
2160 Assert.IsTrue(IC.eq(tree));
\r
2165 public void RetainAll()
\r
2167 tree.RetainAll(tree2.RangeFromTo(3, 17));
\r
2168 Assert.AreEqual(3, tree.Count);
\r
2169 Assert.IsTrue(tree.Check());
\r
2170 Assert.IsTrue(IC.eq(tree, 4, 6, 8));
\r
2171 tree.RetainAll(tree2.RangeFromTo(1, 17));
\r
2172 Assert.AreEqual(3, tree.Count);
\r
2173 Assert.IsTrue(tree.Check());
\r
2174 Assert.IsTrue(IC.eq(tree, 4, 6, 8));
\r
2175 tree.RetainAll(tree2.RangeFromTo(3, 5));
\r
2176 Assert.AreEqual(1, tree.Count);
\r
2177 Assert.IsTrue(tree.Check());
\r
2178 Assert.IsTrue(IC.eq(tree, 4));
\r
2179 tree.RetainAll(tree2.RangeFromTo(7, 17));
\r
2180 Assert.AreEqual(0, tree.Count);
\r
2181 Assert.IsTrue(tree.Check());
\r
2182 Assert.IsTrue(IC.eq(tree));
\r
2183 for (int i = 0; i < 10; i++) tree.Add(i);
\r
2185 tree.RetainAll(tree2.RangeFromTo(5, 5));
\r
2186 Assert.AreEqual(0, tree.Count);
\r
2187 Assert.IsTrue(tree.Check());
\r
2188 Assert.IsTrue(IC.eq(tree));
\r
2189 for (int i = 0; i < 10; i++) tree.Add(i);
\r
2191 tree.RetainAll(tree2.RangeFromTo(15, 25));
\r
2192 Assert.AreEqual(0, tree.Count);
\r
2193 Assert.IsTrue(tree.Check());
\r
2194 Assert.IsTrue(IC.eq(tree));
\r
2199 public void ContainsAll()
\r
2201 Assert.IsFalse(tree.ContainsAll(tree2));
\r
2202 Assert.IsTrue(tree.ContainsAll(tree));
\r
2204 Assert.IsTrue(tree.ContainsAll(tree2));
\r
2206 Assert.IsTrue(tree.ContainsAll(tree2));
\r
2208 Assert.IsFalse(tree.ContainsAll(tree2));
\r
2213 public void RemoveInterval()
\r
2215 tree.RemoveInterval(3, 4);
\r
2216 Assert.IsTrue(tree.Check());
\r
2217 Assert.AreEqual(6, tree.Count);
\r
2218 Assert.IsTrue(IC.eq(tree, 0, 1, 2, 7, 8, 9));
\r
2219 tree.RemoveInterval(2, 3);
\r
2220 Assert.IsTrue(tree.Check());
\r
2221 Assert.AreEqual(3, tree.Count);
\r
2222 Assert.IsTrue(IC.eq(tree, 0, 1, 9));
\r
2223 tree.RemoveInterval(0, 3);
\r
2224 Assert.IsTrue(tree.Check());
\r
2225 Assert.AreEqual(0, tree.Count);
\r
2226 Assert.IsTrue(IC.eq(tree));
\r
2231 [ExpectedException(typeof(ArgumentOutOfRangeException))]
\r
2232 public void RemoveRangeBad1()
\r
2234 tree.RemoveInterval(-3, 8);
\r
2239 [ExpectedException(typeof(ArgumentOutOfRangeException))]
\r
2240 public void RemoveRangeBad2()
\r
2242 tree.RemoveInterval(3, -8);
\r
2247 [ExpectedException(typeof(ArgumentException))]
\r
2248 public void RemoveRangeBad3()
\r
2250 tree.RemoveInterval(3, 8);
\r
2255 public void GetRange()
\r
2257 MSG.IEnumerable<int> e = tree[3, 6];
\r
2259 Assert.IsTrue(IC.eq(e, 3, 4, 5));
\r
2261 Assert.IsTrue(IC.eq(e));
\r
2266 [ExpectedException(typeof(ArgumentOutOfRangeException))]
\r
2267 public void GetRangeBad1()
\r
2269 object foo = tree[-3, 0];
\r
2274 [ExpectedException(typeof(ArgumentOutOfRangeException))]
\r
2275 public void GetRangeBad2()
\r
2277 object foo = tree[3, 2];
\r
2282 [ExpectedException(typeof(ArgumentException))]
\r
2283 public void GetRangeBad3()
\r
2285 object foo = tree[3, 11];
\r
2290 public void Dispose() { tree = null; tree2 = null; }
\r
2299 public class SyncRoot
\r
2301 private TreeSet<int> tree;
\r
2307 public void Safe()
\r
2309 System.Threading.Thread t1 = new System.Threading.Thread(new System.Threading.ThreadStart(safe1));
\r
2310 System.Threading.Thread t2 = new System.Threading.Thread(new System.Threading.ThreadStart(safe2));
\r
2316 Assert.AreEqual(2 * sz + 1, tree.Count);
\r
2317 Assert.IsTrue(tree.Check());
\r
2322 public void UnSafe()
\r
2326 for (int i = 0; i < 10; i++)
\r
2328 System.Threading.Thread t1 = new System.Threading.Thread(new System.Threading.ThreadStart(unsafe1));
\r
2329 System.Threading.Thread t2 = new System.Threading.Thread(new System.Threading.ThreadStart(unsafe2));
\r
2335 if (bad = 2 * sz + 1 != tree.Count)
\r
2337 Console.WriteLine("{0}::Unsafe(): bad at {1}", GetType(), i);
\r
2342 Assert.IsTrue(bad, "No sync problems!");
\r
2347 public void SafeUnSafe()
\r
2349 System.Threading.Thread t1 = new System.Threading.Thread(new System.Threading.ThreadStart(unsafe1));
\r
2350 System.Threading.Thread t2 = new System.Threading.Thread(new System.Threading.ThreadStart(unsafe2));
\r
2356 Assert.AreEqual(2 * sz + 1, tree.Count);
\r
2361 public void Init() { tree = new TreeSet<int>(new IC()); }
\r
2364 private void unsafe1()
\r
2366 for (int i = 0; i < 2 * sz; i++)
\r
2369 for (int i = 1; i < sz; i++)
\r
2370 tree.Remove(i * 4);
\r
2374 private void safe1()
\r
2376 for (int i = 0; i < 2 * sz; i++)
\r
2377 lock (tree.SyncRoot)
\r
2380 for (int i = 1; i < sz; i++)
\r
2381 lock (tree.SyncRoot)
\r
2382 tree.Remove(i * 4);
\r
2386 private void unsafe2()
\r
2388 for (int i = 2 * sz; i > 0; i--)
\r
2389 tree.Add(i * 2 + 1);
\r
2391 for (int i = sz; i > 0; i--)
\r
2392 tree.Remove(i * 4 + 1);
\r
2396 private void safe2()
\r
2398 for (int i = 2 * sz; i > 0; i--)
\r
2399 lock (tree.SyncRoot)
\r
2400 tree.Add(i * 2 + 1);
\r
2402 for (int i = sz; i > 0; i--)
\r
2403 lock (tree.SyncRoot)
\r
2404 tree.Remove(i * 4 + 1);
\r
2409 public void Dispose() { tree = null; }
\r
2413 public class ConcurrentQueries
\r
2415 private TreeSet<int> tree;
\r
2421 public void Init()
\r
2423 tree = new TreeSet<int>(new IC());
\r
2424 for (int i = 0; i < sz; i++)
\r
2434 public int count = 0;
\r
2439 public A(TreeSet<int> t) { this.t = t; }
\r
2442 public void a(int i) { count++; }
\r
2445 public void traverse() { t.Apply(new Applier<int>(a)); }
\r
2452 public void Safe()
\r
2454 A a = new A(tree);
\r
2457 Assert.AreEqual(sz, a.count);
\r
2462 public void RegrettablyUnsafe()
\r
2464 System.Threading.Thread[] t = new System.Threading.Thread[10];
\r
2465 A[] a = new A[10];
\r
2466 for (int i = 0; i < 10; i++)
\r
2468 a[i] = new A(tree);
\r
2469 t[i] = new System.Threading.Thread(new System.Threading.ThreadStart(a[i].traverse));
\r
2472 for (int i = 0; i < 10; i++)
\r
2474 for (int i = 0; i < 10; i++)
\r
2476 for (int i = 0; i < 10; i++)
\r
2477 Assert.AreEqual(sz,a[i].count);
\r
2483 public void Dispose() { tree = null; }
\r
2491 public class ISequenced
\r
2493 private ISequenced<int> dit, dat, dut;
\r
2497 public void Init()
\r
2499 dit = new TreeSet<int>(new IC());
\r
2500 dat = new TreeSet<int>(new IC());
\r
2501 dut = new TreeSet<int>(new RevIC());
\r
2506 public void EmptyEmpty()
\r
2508 Assert.IsTrue(dit.Equals(dat));
\r
2513 public void EmptyNonEmpty()
\r
2516 Assert.IsFalse(dit.Equals(dat));
\r
2517 Assert.IsFalse(dat.Equals(dit));
\r
2521 public int hasher(params int[] items)
\r
2525 foreach (int i in items)
\r
2526 retval = retval * 31 + i;
\r
2533 public void HashVal()
\r
2535 Assert.AreEqual(hasher(), dit.GetHashCode());
\r
2537 Assert.AreEqual(hasher(3), dit.GetHashCode());
\r
2539 Assert.AreEqual(hasher(3, 7), dit.GetHashCode());
\r
2540 Assert.AreEqual(hasher(), dut.GetHashCode());
\r
2542 Assert.AreEqual(hasher(3), dut.GetHashCode());
\r
2544 Assert.AreEqual(hasher(7, 3), dut.GetHashCode());
\r
2549 public void Normal()
\r
2554 Assert.IsFalse(dit.Equals(dat));
\r
2555 Assert.IsFalse(dat.Equals(dit));
\r
2557 Assert.IsTrue(dit.Equals(dat));
\r
2558 Assert.IsTrue(dat.Equals(dit));
\r
2563 public void WrongOrder()
\r
2567 Assert.IsTrue(dit.Equals(dut));
\r
2568 Assert.IsTrue(dut.Equals(dit));
\r
2571 Assert.IsFalse(dit.Equals(dut));
\r
2572 Assert.IsFalse(dut.Equals(dit));
\r
2577 public void Reflexive()
\r
2579 Assert.IsTrue(dit.Equals(dit));
\r
2581 Assert.IsTrue(dit.Equals(dit));
\r
2583 Assert.IsTrue(dit.Equals(dit));
\r
2588 public void Dispose()
\r
2599 public class IEditableCollection
\r
2601 private ICollection<int> dit, dat, dut;
\r
2605 public void Init()
\r
2607 dit = new TreeSet<int>(new IC());
\r
2608 dat = new TreeSet<int>(new IC());
\r
2609 dut = new TreeSet<int>(new RevIC());
\r
2614 public void EmptyEmpty()
\r
2616 Assert.IsTrue(dit.Equals(dat));
\r
2621 public void EmptyNonEmpty()
\r
2624 Assert.IsFalse(dit.Equals(dat));
\r
2625 Assert.IsFalse(dat.Equals(dit));
\r
2629 public int hasher(int count,params int[] items)
\r
2633 foreach (int i in items)
\r
2636 return (count<<16)+retval;
\r
2641 public void HashVal()
\r
2643 Assert.AreEqual(hasher(0), dit.GetHashCode());
\r
2645 Assert.AreEqual(hasher(1,3), dit.GetHashCode());
\r
2647 Assert.AreEqual(hasher(2,3, 7), dit.GetHashCode());
\r
2648 Assert.AreEqual(hasher(0), dut.GetHashCode());
\r
2650 Assert.AreEqual(hasher(1,3), dut.GetHashCode());
\r
2652 Assert.AreEqual(hasher(2,7, 3), dut.GetHashCode());
\r
2657 public void Normal()
\r
2662 Assert.IsFalse(dit.Equals(dat));
\r
2663 Assert.IsFalse(dat.Equals(dit));
\r
2665 Assert.IsTrue(dit.Equals(dat));
\r
2666 Assert.IsTrue(dat.Equals(dit));
\r
2671 public void WrongOrder()
\r
2675 Assert.IsTrue(dit.Equals(dut));
\r
2676 Assert.IsTrue(dut.Equals(dit));
\r
2679 Assert.IsTrue(dit.Equals(dut));
\r
2680 Assert.IsTrue(dut.Equals(dit));
\r
2685 public void Reflexive()
\r
2687 Assert.IsTrue(dit.Equals(dit));
\r
2689 Assert.IsTrue(dit.Equals(dit));
\r
2691 Assert.IsTrue(dit.Equals(dit));
\r
2696 public void Dispose()
\r