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
29 namespace nunit.trees.TreeBag
\r
32 public class Combined
\r
34 private IIndexedSorted<KeyValuePair<int,int>> lst;
\r
40 lst = new TreeBag<KeyValuePair<int,int>>(new KeyValuePairComparer<int,int>(new IC()));
\r
41 for (int i = 0; i < 10; i++)
\r
42 lst.Add(new KeyValuePair<int,int>(i, i + 30));
\r
47 public void Dispose() { lst = null; }
\r
53 KeyValuePair<int,int> p = new KeyValuePair<int,int>(3, 78);
\r
55 Assert.IsTrue(lst.Find(ref p));
\r
56 Assert.AreEqual(3, p.key);
\r
57 Assert.AreEqual(33, p.value);
\r
58 p = new KeyValuePair<int,int>(13, 78);
\r
59 Assert.IsFalse(lst.Find(ref p));
\r
64 public void FindOrAdd()
\r
66 KeyValuePair<int,int> p = new KeyValuePair<int,int>(3, 78);
\r
68 Assert.IsTrue(lst.FindOrAdd(ref p));
\r
69 Assert.AreEqual(3, p.key);
\r
70 Assert.AreEqual(33, p.value);
\r
71 p = new KeyValuePair<int,int>(13, 79);
\r
72 Assert.IsFalse(lst.FindOrAdd(ref p));
\r
73 Assert.AreEqual(13, lst[11].key);
\r
74 Assert.AreEqual(79, lst[11].value);
\r
79 public void Update()
\r
81 KeyValuePair<int,int> p = new KeyValuePair<int,int>(3, 78);
\r
83 Assert.IsTrue(lst.Update(p));
\r
84 Assert.AreEqual(3, lst[3].key);
\r
85 Assert.AreEqual(78, lst[3].value);
\r
86 p = new KeyValuePair<int,int>(13, 78);
\r
87 Assert.IsFalse(lst.Update(p));
\r
92 public void UpdateOrAdd()
\r
94 KeyValuePair<int,int> p = new KeyValuePair<int,int>(3, 78);
\r
96 Assert.IsTrue(lst.UpdateOrAdd(p));
\r
97 Assert.AreEqual(3, lst[3].key);
\r
98 Assert.AreEqual(78, lst[3].value);
\r
99 p = new KeyValuePair<int,int>(13, 79);
\r
100 Assert.IsFalse(lst.UpdateOrAdd(p));
\r
101 Assert.AreEqual(13, lst[11].key);
\r
102 Assert.AreEqual(79, lst[11].value);
\r
107 public void RemoveWithReturn()
\r
109 KeyValuePair<int,int> p = new KeyValuePair<int,int>(3, 78);
\r
111 Assert.IsTrue(lst.RemoveWithReturn(ref p));
\r
112 Assert.AreEqual(3, p.key);
\r
113 Assert.AreEqual(33, p.value);
\r
114 Assert.AreEqual(4, lst[3].key);
\r
115 Assert.AreEqual(34, lst[3].value);
\r
116 p = new KeyValuePair<int,int>(13, 78);
\r
117 Assert.IsFalse(lst.RemoveWithReturn(ref p));
\r
123 public class Simple
\r
125 private TreeBag<string> bag;
\r
131 bag = new TreeBag<string>(new SC());
\r
136 public void Dispose()
\r
142 public void Initial()
\r
146 Assert.IsFalse(bag.IsReadOnly);
\r
147 Assert.AreEqual(0, bag.Count, "new bag should be empty");
\r
148 Assert.AreEqual(0, bag.ContainsCount("A"));
\r
149 Assert.AreEqual(0, bag.ContainsCount("B"));
\r
150 Assert.AreEqual(0, bag.ContainsCount("C"));
\r
151 Assert.IsFalse(bag.Contains("A"));
\r
152 Assert.IsFalse(bag.Contains("B"));
\r
153 Assert.IsFalse(bag.Contains("C"));
\r
155 Assert.AreEqual(1, bag.Count);
\r
156 Assert.AreEqual(1, bag.ContainsCount("A"));
\r
157 Assert.AreEqual(0, bag.ContainsCount("B"));
\r
158 Assert.AreEqual(0, bag.ContainsCount("C"));
\r
159 Assert.IsTrue(bag.Contains("A"));
\r
160 Assert.IsFalse(bag.Contains("B"));
\r
161 Assert.IsFalse(bag.Contains("C"));
\r
163 Assert.AreEqual(2, bag.Count);
\r
164 Assert.AreEqual(1, bag.ContainsCount("A"));
\r
165 Assert.AreEqual(0, bag.ContainsCount("B"));
\r
166 Assert.AreEqual(1, bag.ContainsCount("C"));
\r
167 Assert.IsTrue(bag.Contains("A"));
\r
168 Assert.IsFalse(bag.Contains("B"));
\r
169 Assert.IsTrue(bag.Contains("C"));
\r
171 Assert.AreEqual(3, bag.Count);
\r
172 Assert.AreEqual(1, bag.ContainsCount("A"));
\r
173 Assert.AreEqual(0, bag.ContainsCount("B"));
\r
174 Assert.AreEqual(2, bag.ContainsCount("C"));
\r
175 Assert.IsTrue(bag.Contains("A"));
\r
176 Assert.IsFalse(bag.Contains("B"));
\r
177 Assert.IsTrue(bag.Contains("C"));
\r
180 Assert.AreEqual(5, bag.Count);
\r
181 Assert.AreEqual(1, bag.ContainsCount("A"));
\r
182 Assert.AreEqual(1, bag.ContainsCount("B"));
\r
183 Assert.AreEqual(3, bag.ContainsCount("C"));
\r
184 Assert.IsTrue(bag.Contains("A"));
\r
185 Assert.IsTrue(bag.Contains("B"));
\r
186 Assert.IsTrue(bag.Contains("C"));
\r
187 res = bag.Remove("C");
\r
188 Assert.AreEqual(4, bag.Count);
\r
189 Assert.AreEqual(1, bag.ContainsCount("A"));
\r
190 Assert.AreEqual(1, bag.ContainsCount("B"));
\r
191 Assert.AreEqual(2, bag.ContainsCount("C"));
\r
192 Assert.IsTrue(bag.Contains("A"));
\r
193 Assert.IsTrue(bag.Contains("B"));
\r
194 Assert.IsTrue(bag.Contains("C"));
\r
195 res = bag.Remove("A");
\r
196 Assert.AreEqual(3, bag.Count);
\r
197 Assert.AreEqual(0, bag.ContainsCount("A"));
\r
198 Assert.AreEqual(1, bag.ContainsCount("B"));
\r
199 Assert.AreEqual(2, bag.ContainsCount("C"));
\r
200 Assert.IsFalse(bag.Contains("A"));
\r
201 Assert.IsTrue(bag.Contains("B"));
\r
202 Assert.IsTrue(bag.Contains("C"));
\r
203 bag.RemoveAllCopies("C");
\r
204 Assert.AreEqual(1, bag.Count);
\r
205 Assert.AreEqual(0, bag.ContainsCount("A"));
\r
206 Assert.AreEqual(1, bag.ContainsCount("B"));
\r
207 Assert.AreEqual(0, bag.ContainsCount("C"));
\r
208 Assert.IsFalse(bag.Contains("A"));
\r
209 Assert.IsTrue(bag.Contains("B"));
\r
210 Assert.IsFalse(bag.Contains("C"));
\r
211 Assert.IsFalse(bag.Contains("Z"));
\r
212 Assert.IsFalse(bag.Remove("Z"));
\r
213 bag.RemoveAllCopies("Z");
\r
214 Assert.AreEqual(1, bag.Count);
\r
215 Assert.AreEqual(0, bag.ContainsCount("A"));
\r
216 Assert.AreEqual(1, bag.ContainsCount("B"));
\r
217 Assert.AreEqual(0, bag.ContainsCount("C"));
\r
218 Assert.IsFalse(bag.Contains("A"));
\r
219 Assert.IsTrue(bag.Contains("B"));
\r
220 Assert.IsFalse(bag.Contains("C"));
\r
221 Assert.IsFalse(bag.Contains("Z"));
\r
226 public class FindOrAdd
\r
228 private TreeBag<KeyValuePair<int,string>> bag;
\r
234 bag = new TreeBag<KeyValuePair<int,string>>(new KeyValuePairComparer<int,string>(new IC()));
\r
239 public void Dispose()
\r
248 KeyValuePair<int,string> p = new KeyValuePair<int,string>(3,"tre");
\r
249 Assert.IsFalse(bag.FindOrAdd(ref p));
\r
251 Assert.IsTrue(bag.FindOrAdd(ref p));
\r
252 Assert.AreEqual("tre", p.value);
\r
254 Assert.AreEqual(2, bag.ContainsCount(p));
\r
255 Assert.AreEqual("tre", bag[0].value);
\r
261 public class Enumerators
\r
263 private TreeBag<string> bag;
\r
265 private MSG.IEnumerator<string> bagenum;
\r
271 bag = new TreeBag<string>(new SC());
\r
272 foreach (string s in new string[] { "A", "B", "A", "A", "B", "C", "D", "B" })
\r
275 bagenum = bag.GetEnumerator();
\r
280 public void Dispose()
\r
288 [ExpectedException(typeof(InvalidOperationException))]
\r
289 public void MoveNextOnModified()
\r
291 //TODO: also problem before first MoveNext!!!!!!!!!!
\r
292 bagenum.MoveNext();
\r
294 bagenum.MoveNext();
\r
299 public void NormalUse()
\r
301 Assert.IsTrue(bagenum.MoveNext());
\r
302 Assert.AreEqual(bagenum.Current, "A");
\r
303 Assert.IsTrue(bagenum.MoveNext());
\r
304 Assert.AreEqual(bagenum.Current, "A");
\r
305 Assert.IsTrue(bagenum.MoveNext());
\r
306 Assert.AreEqual(bagenum.Current, "A");
\r
307 Assert.IsTrue(bagenum.MoveNext());
\r
308 Assert.AreEqual(bagenum.Current, "B");
\r
309 Assert.IsTrue(bagenum.MoveNext());
\r
310 Assert.AreEqual(bagenum.Current, "B");
\r
311 Assert.IsTrue(bagenum.MoveNext());
\r
312 Assert.AreEqual(bagenum.Current, "B");
\r
313 Assert.IsTrue(bagenum.MoveNext());
\r
314 Assert.AreEqual(bagenum.Current, "C");
\r
315 Assert.IsTrue(bagenum.MoveNext());
\r
316 Assert.AreEqual(bagenum.Current, "D");
\r
317 Assert.IsFalse(bagenum.MoveNext());
\r
322 public class Ranges
\r
324 private TreeBag<int> tree;
\r
326 private IComparer<int> c;
\r
333 tree = new TreeBag<int>(c);
\r
334 for (int i = 1; i <= 10; i++)
\r
336 tree.Add(i * 2);tree.Add(i);
\r
342 public void Enumerator()
\r
344 MSG.IEnumerator<int> e = tree.RangeFromTo(5, 17).GetEnumerator();
\r
346 int[] all = new int[] { 5, 6, 6, 7, 8, 8, 9, 10, 10, 12, 14, 16 };
\r
347 while (e.MoveNext())
\r
349 Assert.AreEqual(all[i++], e.Current);
\r
352 Assert.AreEqual(12, i);
\r
357 [ExpectedException(typeof(InvalidOperationException))]
\r
358 public void Enumerator2()
\r
360 MSG.IEnumerator<int> e = tree.RangeFromTo(5, 17).GetEnumerator();
\r
366 [ExpectedException(typeof(InvalidOperationException))]
\r
367 public void Enumerator3()
\r
369 MSG.IEnumerator<int> e = tree.RangeFromTo(5, 17).GetEnumerator();
\r
371 while (e.MoveNext());
\r
378 public void Remove()
\r
380 int[] all = new int[] { 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 12, 14, 16, 18, 20 };
\r
382 tree.RemoveRangeFrom(18);
\r
383 Assert.IsTrue(IC.eq(tree, new int[] { 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 12, 14, 16 }));
\r
384 tree.RemoveRangeFrom(28);
\r
385 Assert.IsTrue(IC.eq(tree, new int[] { 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 12, 14, 16 }));
\r
386 tree.RemoveRangeFrom(1);
\r
387 Assert.IsTrue(IC.eq(tree));
\r
388 foreach (int i in all) tree.Add(i);
\r
390 tree.RemoveRangeTo(10);
\r
391 Assert.IsTrue(IC.eq(tree, new int[] { 10, 10, 12, 14, 16, 18, 20 }));
\r
392 tree.RemoveRangeTo(2);
\r
393 Assert.IsTrue(IC.eq(tree, new int[] { 10, 10, 12, 14, 16, 18, 20 }));
\r
394 tree.RemoveRangeTo(21);
\r
395 Assert.IsTrue(IC.eq(tree));
\r
396 foreach (int i in all) tree.Add(i);
\r
398 tree.RemoveRangeFromTo(4, 8);
\r
399 Assert.IsTrue(IC.eq(tree, 1, 2, 2, 3, 8, 8, 9, 10, 10, 12, 14, 16, 18, 20));
\r
400 tree.RemoveRangeFromTo(14, 28);
\r
401 Assert.IsTrue(IC.eq(tree, 1, 2, 2, 3, 8, 8, 9, 10, 10, 12));
\r
402 tree.RemoveRangeFromTo(0, 9);
\r
403 Assert.IsTrue(IC.eq(tree, 9, 10, 10, 12));
\r
404 tree.RemoveRangeFromTo(0, 81);
\r
405 Assert.IsTrue(IC.eq(tree));
\r
410 public void Normal()
\r
412 int[] all = new int[] { 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 12, 14, 16, 18, 20 };
\r
414 Assert.IsTrue(IC.eq(tree, all));
\r
415 Assert.IsTrue(IC.eq(tree.RangeAll(), all));
\r
416 Assert.AreEqual(20, tree.RangeAll().Count);
\r
417 Assert.IsTrue(IC.eq(tree.RangeFrom(11), new int[] { 12, 14, 16, 18, 20 }));
\r
418 Assert.AreEqual(5, tree.RangeFrom(11).Count);
\r
419 Assert.IsTrue(IC.eq(tree.RangeFrom(12), new int[] { 12, 14, 16, 18, 20 }));
\r
420 Assert.IsTrue(IC.eq(tree.RangeFrom(1), all));
\r
421 Assert.IsTrue(IC.eq(tree.RangeFrom(0), all));
\r
422 Assert.IsTrue(IC.eq(tree.RangeFrom(21), new int[] { }));
\r
423 Assert.IsTrue(IC.eq(tree.RangeFrom(20), new int[] { 20 }));
\r
424 Assert.IsTrue(IC.eq(tree.RangeTo(8), new int[] { 1, 2, 2, 3, 4, 4, 5, 6, 6, 7 }));
\r
425 Assert.IsTrue(IC.eq(tree.RangeTo(7), new int[] { 1, 2, 2, 3, 4, 4, 5, 6, 6 }));
\r
426 Assert.AreEqual(9, tree.RangeTo(7).Count);
\r
427 Assert.IsTrue(IC.eq(tree.RangeTo(1), new int[] { }));
\r
428 Assert.IsTrue(IC.eq(tree.RangeTo(0), new int[] { }));
\r
429 Assert.IsTrue(IC.eq(tree.RangeTo(3), new int[] { 1, 2,2 }));
\r
430 Assert.IsTrue(IC.eq(tree.RangeTo(20), new int[] { 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 12, 14, 16, 18 }));
\r
431 Assert.IsTrue(IC.eq(tree.RangeTo(21), all));
\r
432 Assert.IsTrue(IC.eq(tree.RangeFromTo(7, 12), new int[] { 7, 8, 8, 9, 10, 10 }));
\r
433 Assert.IsTrue(IC.eq(tree.RangeFromTo(6, 11), new int[] { 6, 6, 7, 8, 8, 9, 10, 10 }));
\r
434 Assert.IsTrue(IC.eq(tree.RangeFromTo(1, 12), new int[] { 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10 }));
\r
435 Assert.AreEqual(15, tree.RangeFromTo(1, 12).Count);
\r
436 Assert.IsTrue(IC.eq(tree.RangeFromTo(2, 12), new int[] { 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10 }));
\r
437 Assert.IsTrue(IC.eq(tree.RangeFromTo(6, 21), new int[] { 6, 6, 7, 8, 8, 9, 10, 10, 12, 14, 16, 18, 20 }));
\r
438 Assert.IsTrue(IC.eq(tree.RangeFromTo(6, 20), new int[] { 6, 6, 7, 8, 8, 9, 10, 10, 12, 14, 16, 18 }));
\r
443 public void Backwards()
\r
445 int[] all = new int[] { 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 12, 14, 16, 18, 20 };
\r
446 int[] lla = new int[] { 20, 18, 16, 14, 12, 10, 10, 9, 8, 8, 7, 6, 6, 5, 4, 4, 3, 2, 2, 1 };
\r
448 Assert.IsTrue(IC.eq(tree, all));
\r
449 Assert.IsTrue(IC.eq(tree.RangeAll().Backwards(), lla));
\r
450 Assert.IsTrue(IC.eq(tree.RangeFrom(11).Backwards(), new int[] { 20, 18, 16, 14, 12 }));
\r
451 Assert.IsTrue(IC.eq(tree.RangeFrom(12).Backwards(), new int[] { 20, 18, 16, 14, 12 }));
\r
452 Assert.IsTrue(IC.eq(tree.RangeFrom(1).Backwards(), lla));
\r
453 Assert.IsTrue(IC.eq(tree.RangeFrom(0).Backwards(), lla));
\r
454 Assert.IsTrue(IC.eq(tree.RangeFrom(21).Backwards(), new int[] { }));
\r
455 Assert.IsTrue(IC.eq(tree.RangeFrom(20).Backwards(), new int[] { 20 }));
\r
456 Assert.IsTrue(IC.eq(tree.RangeTo(8).Backwards(), new int[] { 7, 6, 6, 5, 4, 4, 3, 2, 2, 1 }));
\r
457 Assert.IsTrue(IC.eq(tree.RangeTo(7).Backwards(), new int[] { 6, 6, 5, 4, 4, 3, 2, 2, 1 }));
\r
458 Assert.IsTrue(IC.eq(tree.RangeTo(1).Backwards(), new int[] { }));
\r
459 Assert.IsTrue(IC.eq(tree.RangeTo(0).Backwards(), new int[] { }));
\r
460 Assert.IsTrue(IC.eq(tree.RangeTo(3).Backwards(), new int[] { 2, 2, 1 }));
\r
461 Assert.IsTrue(IC.eq(tree.RangeTo(20).Backwards(), new int[] { 18, 16, 14, 12, 10, 10, 9, 8, 8, 7, 6, 6, 5, 4, 4, 3, 2, 2, 1 }));
\r
462 Assert.IsTrue(IC.eq(tree.RangeTo(21).Backwards(), lla));
\r
463 Assert.IsTrue(IC.eq(tree.RangeFromTo(7, 12).Backwards(), new int[] { 10, 10, 9, 8, 8, 7 }));
\r
464 Assert.IsTrue(IC.eq(tree.RangeFromTo(6, 11).Backwards(), new int[] { 10, 10, 9, 8, 8, 7, 6, 6 }));
\r
465 Assert.IsTrue(IC.eq(tree.RangeFromTo(0, 12).Backwards(), new int[] { 10, 10, 9, 8, 8, 7, 6, 6, 5, 4, 4, 3, 2, 2, 1 }));
\r
466 Assert.IsTrue(IC.eq(tree.RangeFromTo(1, 12).Backwards(), new int[] { 10, 10, 9, 8, 8, 7, 6, 6, 5, 4, 4, 3, 2, 2, 1 }));
\r
467 Assert.IsTrue(IC.eq(tree.RangeFromTo(6, 21).Backwards(), new int[] { 20, 18, 16, 14, 12, 10, 10, 9, 8, 8, 7, 6, 6 }));
\r
468 Assert.IsTrue(IC.eq(tree.RangeFromTo(6, 20).Backwards(), new int[] { 18, 16, 14, 12, 10, 10, 9, 8, 8, 7, 6, 6 }));
\r
473 public void Direction()
\r
475 Assert.AreEqual(EnumerationDirection.Forwards, tree.Direction);
\r
476 Assert.AreEqual(EnumerationDirection.Forwards, tree.RangeFrom(20).Direction);
\r
477 Assert.AreEqual(EnumerationDirection.Forwards, tree.RangeTo(7).Direction);
\r
478 Assert.AreEqual(EnumerationDirection.Forwards, tree.RangeFromTo(1, 12).Direction);
\r
479 Assert.AreEqual(EnumerationDirection.Forwards, tree.RangeAll().Direction);
\r
480 Assert.AreEqual(EnumerationDirection.Backwards, tree.Backwards().Direction);
\r
481 Assert.AreEqual(EnumerationDirection.Backwards, tree.RangeFrom(20).Backwards().Direction);
\r
482 Assert.AreEqual(EnumerationDirection.Backwards, tree.RangeTo(7).Backwards().Direction);
\r
483 Assert.AreEqual(EnumerationDirection.Backwards, tree.RangeFromTo(1, 12).Backwards().Direction);
\r
484 Assert.AreEqual(EnumerationDirection.Backwards, tree.RangeAll().Backwards().Direction);
\r
489 public void Dispose()
\r
499 public class BagItf
\r
501 private TreeBag<int> tree;
\r
507 tree = new TreeBag<int>(new IC());
\r
508 for (int i = 10; i < 20; i++)
\r
519 Assert.AreEqual(0, tree.ContainsCount(7));
\r
520 Assert.AreEqual(1, tree.ContainsCount(10));
\r
521 Assert.AreEqual(2, tree.ContainsCount(17));
\r
522 tree.RemoveAllCopies(17);
\r
523 Assert.AreEqual(0, tree.ContainsCount(17));
\r
524 tree.RemoveAllCopies(7);
\r
529 public void Dispose()
\r
540 private TreeBag<int> tree;
\r
546 tree = new TreeBag<int>(new IC());
\r
550 private void loadup()
\r
552 for (int i = 10; i < 20; i++)
\r
561 public void NoDuplicates()
\r
563 Assert.IsTrue(tree.AllowsDuplicates);
\r
565 Assert.IsTrue(tree.AllowsDuplicates);
\r
572 Assert.IsTrue(tree.Add(17));
\r
573 Assert.IsTrue(tree.Add(17));
\r
574 Assert.IsTrue(tree.Add(18));
\r
575 Assert.IsTrue(tree.Add(18));
\r
576 Assert.AreEqual(4, tree.Count);
\r
577 Assert.IsTrue(IC.eq(tree, 17, 17, 18, 18));
\r
582 public void Dispose()
\r
591 public class ArrayTest
\r
593 private TreeBag<int> tree;
\r
601 tree = new TreeBag<int>(new IC());
\r
603 for (int i = 0; i < 10; i++)
\r
609 public void Dispose() { tree = null; }
\r
612 private string aeq(int[] a, params int[] b)
\r
614 if (a.Length != b.Length)
\r
615 return "Lengths differ: " + a.Length + " != " + b.Length;
\r
617 for (int i = 0; i < a.Length; i++)
\r
619 return String.Format("{0}'th elements differ: {1} != {2}", i, a[i], b[i]);
\r
621 return "Alles klar";
\r
626 public void ToArray()
\r
628 Assert.AreEqual("Alles klar", aeq(tree.ToArray()));
\r
632 Assert.AreEqual("Alles klar", aeq(tree.ToArray(), 4, 4, 7));
\r
637 public void CopyTo()
\r
640 Assert.AreEqual("Alles klar", aeq(a, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009));
\r
644 Assert.AreEqual("Alles klar", aeq(a, 1000, 1001, 6, 6, 1004, 1005, 1006, 1007, 1008, 1009));
\r
648 Assert.AreEqual("Alles klar", aeq(a, 1000, 1001, 6, 6, 4, 6, 6, 9, 1008, 1009));
\r
652 Assert.AreEqual("Alles klar", aeq(a, 1000, 1001, 6, 6, 4, 6, 6, 9, 1008, 7));
\r
657 [ExpectedException(typeof(ArgumentException))]
\r
658 public void CopyToBad()
\r
661 tree.CopyTo(a, 10);
\r
666 [ExpectedException(typeof(ArgumentOutOfRangeException))]
\r
667 public void CopyToBad2()
\r
669 tree.CopyTo(a, -1);
\r
674 [ExpectedException(typeof(ArgumentException))]
\r
675 public void CopyToTooFar()
\r
686 public class Remove
\r
688 private TreeBag<int> tree;
\r
694 tree = new TreeBag<int>(new IC());
\r
695 for (int i = 10; i < 20; i++)
\r
700 //10,11,12,13,14,15,15,16,16,17,17,18,18,19,19,20,21,22,23,24
\r
705 public void SmallTrees()
\r
711 Assert.IsTrue(tree.Remove(7));
\r
712 Assert.IsTrue(tree.Check(""));
\r
717 public void ByIndex()
\r
720 int n = tree.Count;
\r
723 Assert.AreEqual(17,tree.RemoveAt(10));
\r
724 Assert.IsTrue(tree.Check(""));
\r
725 Assert.IsTrue(tree.Contains(i));
\r
726 Assert.AreEqual(n - 1, tree.Count);
\r
727 Assert.AreEqual(17, tree.RemoveAt(9));
\r
728 Assert.IsTrue(tree.Check(""));
\r
729 Assert.IsFalse(tree.Contains(i));
\r
730 Assert.AreEqual(n - 2, tree.Count);
\r
733 i = tree.FindMin();
\r
735 Assert.IsTrue(tree.Check(""));
\r
736 Assert.IsFalse(tree.Contains(i));
\r
737 Assert.AreEqual(n - 3, tree.Count);
\r
740 i = tree.FindMax();
\r
741 tree.RemoveAt(tree.Count - 1);
\r
742 Assert.IsTrue(tree.Check(""));
\r
743 Assert.IsFalse(tree.Contains(i));
\r
744 Assert.AreEqual(n - 4, tree.Count);
\r
749 Assert.AreEqual(i, tree.RemoveAt(9));
\r
750 Assert.IsTrue(tree.Check(""));
\r
751 Assert.AreEqual(i, tree.RemoveAt(8));
\r
752 Assert.IsTrue(tree.Check(""));
\r
753 Assert.IsFalse(tree.Contains(i));
\r
754 Assert.AreEqual(n - 6, tree.Count);
\r
759 public void AlmostEmpty()
\r
765 Assert.IsTrue(tree.Check(""));
\r
766 Assert.IsFalse(tree.Contains(3));
\r
767 Assert.AreEqual(0, tree.Count);
\r
772 [ExpectedException(typeof(IndexOutOfRangeException), "Index out of range for sequenced collection")]
\r
773 public void Empty()
\r
781 [ExpectedException(typeof(IndexOutOfRangeException), "Index out of range for sequenced collection")]
\r
782 public void HighIndex()
\r
784 tree.RemoveAt(tree.Count);
\r
789 [ExpectedException(typeof(IndexOutOfRangeException), "Index out of range for sequenced collection")]
\r
790 public void LowIndex()
\r
797 public void Normal()
\r
799 //Note: ids does not match for bag
\r
800 Assert.IsFalse(tree.Remove(-20));
\r
803 Assert.IsTrue(tree.Remove(20));
\r
804 Assert.IsTrue(tree.Check("T1"));
\r
805 Assert.IsFalse(tree.Remove(20));
\r
808 Assert.IsTrue(tree.Remove(10));
\r
809 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
812 Assert.IsTrue(tree.Remove(24));
\r
813 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
816 Assert.IsTrue(tree.Remove(16));
\r
817 Assert.IsTrue(tree.Remove(16));
\r
818 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
821 Assert.IsTrue(tree.Remove(18));
\r
822 Assert.IsTrue(tree.Remove(17));
\r
823 Assert.IsTrue(tree.Remove(18));
\r
824 Assert.IsTrue(tree.Remove(17));
\r
825 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
828 Assert.IsTrue(tree.Remove(15));
\r
829 Assert.IsTrue(tree.Remove(15));
\r
830 for (int i = 0; i < 5; i++) tree.Add(17 + i);
\r
831 Assert.IsTrue(tree.Remove(23));
\r
832 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
835 Assert.IsTrue(tree.Remove(11));
\r
836 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
839 for (int i = 0; i < 10; i++)
\r
840 tree.Add(50 - 2 * i);
\r
842 Assert.IsTrue(tree.Remove(42));
\r
843 Assert.IsTrue(tree.Remove(38));
\r
844 Assert.IsTrue(tree.Remove(22));
\r
845 Assert.IsTrue(tree.Remove(40));
\r
848 for (int i = 0; i < 48; i++)
\r
851 //Almost empty tree:*
\r
852 Assert.IsFalse(tree.Remove(26));
\r
853 Assert.IsTrue(tree.Remove(48));
\r
854 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
857 Assert.IsFalse(tree.Remove(26));
\r
858 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
863 public void Dispose()
\r
872 public class PredecessorStructure
\r
874 private TreeBag<int> tree;
\r
880 tree = new TreeBag<int>(new IC());
\r
884 private void loadup()
\r
886 for (int i = 0; i < 20; i++)
\r
888 for (int i = 0; i < 10; i++)
\r
894 public void Predecessor()
\r
897 Assert.AreEqual(6, tree.Predecessor(7));
\r
898 Assert.AreEqual(6, tree.Predecessor(8));
\r
901 Assert.AreEqual(0, tree.Predecessor(1));
\r
904 Assert.AreEqual(38, tree.Predecessor(39));
\r
909 [ExpectedException(typeof(ArgumentOutOfRangeException))]
\r
910 public void PredecessorTooLow1()
\r
912 tree.Predecessor(-2);
\r
917 [ExpectedException(typeof(ArgumentOutOfRangeException))]
\r
918 public void PredecessorTooLow2()
\r
920 tree.Predecessor(0);
\r
925 public void WeakPredecessor()
\r
928 Assert.AreEqual(6, tree.WeakPredecessor(7));
\r
929 Assert.AreEqual(8, tree.WeakPredecessor(8));
\r
932 Assert.AreEqual(0, tree.WeakPredecessor(1));
\r
933 Assert.AreEqual(0, tree.WeakPredecessor(0));
\r
936 Assert.AreEqual(38, tree.WeakPredecessor(39));
\r
937 Assert.AreEqual(38, tree.WeakPredecessor(38));
\r
942 [ExpectedException(typeof(ArgumentOutOfRangeException))]
\r
943 public void WeakPredecessorTooLow1()
\r
945 tree.WeakPredecessor(-2);
\r
950 public void Successor()
\r
953 Assert.AreEqual(8, tree.Successor(7));
\r
954 Assert.AreEqual(10, tree.Successor(8));
\r
957 Assert.AreEqual(2, tree.Successor(0));
\r
958 Assert.AreEqual(0, tree.Successor(-1));
\r
961 Assert.AreEqual(38, tree.Successor(37));
\r
966 [ExpectedException(typeof(ArgumentOutOfRangeException))]
\r
967 public void SuccessorTooHigh1()
\r
969 tree.Successor(38);
\r
974 [ExpectedException(typeof(ArgumentOutOfRangeException))]
\r
975 public void SuccessorTooHigh2()
\r
977 tree.Successor(39);
\r
982 public void WeakSuccessor()
\r
985 Assert.AreEqual(6, tree.WeakSuccessor(6));
\r
986 Assert.AreEqual(8, tree.WeakSuccessor(7));
\r
989 Assert.AreEqual(0, tree.WeakSuccessor(-1));
\r
990 Assert.AreEqual(0, tree.WeakSuccessor(0));
\r
993 Assert.AreEqual(38, tree.WeakSuccessor(37));
\r
994 Assert.AreEqual(38, tree.WeakSuccessor(38));
\r
999 [ExpectedException(typeof(ArgumentOutOfRangeException))]
\r
1000 public void WeakSuccessorTooHigh1()
\r
1002 tree.WeakSuccessor(39);
\r
1007 public void Dispose()
\r
1016 public class PriorityQueue
\r
1018 private TreeBag<int> tree;
\r
1022 public void Init()
\r
1024 tree = new TreeBag<int>(new IC());
\r
1028 private void loadup()
\r
1030 foreach (int i in new int[] { 1, 2, 3, 4 })
\r
1038 public void Normal()
\r
1041 Assert.AreEqual(1, tree.FindMin());
\r
1042 Assert.AreEqual(4, tree.FindMax());
\r
1043 Assert.AreEqual(1, tree.DeleteMin());
\r
1044 Assert.AreEqual(4, tree.DeleteMax());
\r
1045 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1046 Assert.AreEqual(1, tree.FindMin());
\r
1047 Assert.AreEqual(3, tree.FindMax());
\r
1048 Assert.AreEqual(1, tree.DeleteMin());
\r
1049 Assert.AreEqual(3, tree.DeleteMax());
\r
1050 Assert.IsTrue(tree.Check("Normal test 2"), "Bad tree");
\r
1055 [ExpectedException(typeof(InvalidOperationException), "Priority queue is empty")]
\r
1056 public void Empty1()
\r
1063 [ExpectedException(typeof(InvalidOperationException), "Priority queue is empty")]
\r
1064 public void Empty2()
\r
1071 [ExpectedException(typeof(InvalidOperationException), "Priority queue is empty")]
\r
1072 public void Empty3()
\r
1079 [ExpectedException(typeof(InvalidOperationException), "Priority queue is empty")]
\r
1080 public void Empty4()
\r
1087 public void Dispose()
\r
1096 public class IndexingAndCounting
\r
1098 private TreeBag<int> tree;
\r
1102 public void Init()
\r
1104 tree = new TreeBag<int>(new IC());
\r
1108 private void populate()
\r
1120 public void ToArray()
\r
1124 int[] a = tree.ToArray();
\r
1126 Assert.AreEqual(6, a.Length);
\r
1127 Assert.AreEqual(10, a[0]);
\r
1128 Assert.AreEqual(30, a[1]);
\r
1129 Assert.AreEqual(30, a[2]);
\r
1130 Assert.AreEqual(50, a[3]);
\r
1131 Assert.AreEqual(70, a[4]);
\r
1132 Assert.AreEqual(70, a[5]);
\r
1137 public void GoodIndex()
\r
1139 Assert.AreEqual(-1, tree.IndexOf(20));
\r
1140 Assert.AreEqual(-1, tree.LastIndexOf(20));
\r
1142 Assert.AreEqual(10, tree[0]);
\r
1143 Assert.AreEqual(30, tree[1]);
\r
1144 Assert.AreEqual(30, tree[2]);
\r
1145 Assert.AreEqual(50, tree[3]);
\r
1146 Assert.AreEqual(70, tree[4]);
\r
1147 Assert.AreEqual(70, tree[5]);
\r
1148 Assert.AreEqual(0, tree.IndexOf(10));
\r
1149 Assert.AreEqual(1, tree.IndexOf(30));
\r
1150 Assert.AreEqual(3, tree.IndexOf(50));
\r
1151 Assert.AreEqual(4, tree.IndexOf(70));
\r
1152 Assert.AreEqual(-1, tree.IndexOf(20));
\r
1153 Assert.AreEqual(-1, tree.IndexOf(0));
\r
1154 Assert.AreEqual(-1, tree.IndexOf(90));
\r
1155 Assert.AreEqual(0, tree.LastIndexOf(10));
\r
1156 Assert.AreEqual(2, tree.LastIndexOf(30));
\r
1157 Assert.AreEqual(3, tree.LastIndexOf(50));
\r
1158 Assert.AreEqual(5, tree.LastIndexOf(70));
\r
1159 Assert.AreEqual(-1, tree.LastIndexOf(20));
\r
1160 Assert.AreEqual(-1, tree.LastIndexOf(0));
\r
1161 Assert.AreEqual(-1, tree.LastIndexOf(90));
\r
1166 [ExpectedException(typeof(IndexOutOfRangeException))]
\r
1167 public void IndexTooLarge()
\r
1170 Console.WriteLine(tree[6]);
\r
1175 [ExpectedException(typeof(IndexOutOfRangeException))]
\r
1176 public void IndexTooSmall()
\r
1179 Console.WriteLine(tree[-1]);
\r
1184 public void FilledTreeOutsideInput()
\r
1187 Assert.AreEqual(0, tree.CountFrom(90));
\r
1188 Assert.AreEqual(0, tree.CountFromTo(-20, 0));
\r
1189 Assert.AreEqual(0, tree.CountFromTo(80, 100));
\r
1190 Assert.AreEqual(0, tree.CountTo(0));
\r
1191 Assert.AreEqual(6, tree.CountTo(90));
\r
1192 Assert.AreEqual(6, tree.CountFromTo(-20, 90));
\r
1193 Assert.AreEqual(6, tree.CountFrom(0));
\r
1198 public void FilledTreeIntermediateInput()
\r
1201 Assert.AreEqual(5, tree.CountFrom(20));
\r
1202 Assert.AreEqual(2, tree.CountFromTo(20, 40));
\r
1203 Assert.AreEqual(3, tree.CountTo(40));
\r
1208 public void FilledTreeMatchingInput()
\r
1211 Assert.AreEqual(5, tree.CountFrom(30));
\r
1212 Assert.AreEqual(3, tree.CountFromTo(30, 70));
\r
1213 Assert.AreEqual(0, tree.CountFromTo(50, 30));
\r
1214 Assert.AreEqual(0, tree.CountFromTo(50, 50));
\r
1215 Assert.AreEqual(0, tree.CountTo(10));
\r
1216 Assert.AreEqual(3, tree.CountTo(50));
\r
1221 public void CountEmptyTree()
\r
1223 Assert.AreEqual(0, tree.CountFrom(20));
\r
1224 Assert.AreEqual(0, tree.CountFromTo(20, 40));
\r
1225 Assert.AreEqual(0, tree.CountTo(40));
\r
1230 public void Dispose()
\r
1239 namespace ModificationCheck
\r
1242 public class Enumerator
\r
1244 private TreeBag<int> tree;
\r
1246 private MSG.IEnumerator<int> e;
\r
1250 public void Init()
\r
1252 tree = new TreeBag<int>(new IC());
\r
1253 for (int i = 0; i < 10; i++)
\r
1257 e = tree.GetEnumerator();
\r
1262 public void CurrentAfterModification()
\r
1266 Assert.AreEqual(0, e.Current);
\r
1271 [ExpectedException(typeof(InvalidOperationException), "Collection was modified")]
\r
1272 public void MoveNextAfterAdd()
\r
1280 [ExpectedException(typeof(InvalidOperationException), "Collection was modified")]
\r
1281 public void MoveNextAfterRemove()
\r
1289 [ExpectedException(typeof(InvalidOperationException), "Collection was modified")]
\r
1290 public void MoveNextAfterClear()
\r
1298 public void Dispose()
\r
1308 public class RangeEnumerator
\r
1310 private TreeBag<int> tree;
\r
1312 private MSG.IEnumerator<int> e;
\r
1316 public void Init()
\r
1318 tree = new TreeBag<int>(new IC());
\r
1319 for (int i = 0; i < 10; i++)
\r
1322 e = tree.RangeFromTo(3, 7).GetEnumerator();
\r
1327 public void CurrentAfterModification()
\r
1331 Assert.AreEqual(3, e.Current);
\r
1336 [ExpectedException(typeof(InvalidOperationException), "Collection was modified")]
\r
1337 public void MoveNextAfterAdd()
\r
1345 [ExpectedException(typeof(InvalidOperationException), "Collection was modified")]
\r
1346 public void MoveNextAfterRemove()
\r
1354 [ExpectedException(typeof(InvalidOperationException), "Collection was modified")]
\r
1355 public void MoveNextAfterClear()
\r
1363 public void Dispose()
\r
1374 namespace PathcopyPersistence
\r
1377 public class Navigation
\r
1379 private TreeBag<int> tree, snap;
\r
1381 private IComparer<int> ic;
\r
1385 public void Init()
\r
1388 tree = new TreeBag<int>(ic);
\r
1389 for (int i = 0; i <= 20; i++)
\r
1390 tree.Add(2 * i + 1);
\r
1392 snap = (TreeBag<int>)tree.Snapshot();
\r
1393 for (int i = 0; i <= 10; i++)
\r
1394 tree.Remove(4 * i + 1);
\r
1398 private bool twomodeleven(int i)
\r
1400 return i % 11 == 2;
\r
1405 public void InternalEnum()
\r
1407 Assert.IsTrue(IC.eq(snap.FindAll(new Filter<int>(twomodeleven)), 13, 13, 35));
\r
1411 public void MoreCut()
\r
1413 //TODO: Assert.Fail("more tests of Cut needed");
\r
1423 Assert.IsFalse(snap.Cut(new HigherOrder.CubeRoot(64), out lo, out lv, out hi, out hv));
\r
1424 Assert.IsTrue(lv && hv);
\r
1425 Assert.AreEqual(5, hi);
\r
1426 Assert.AreEqual(3, lo);
\r
1427 Assert.IsTrue(snap.Cut(new HigherOrder.CubeRoot(125), out lo, out lv, out hi, out hv));
\r
1428 Assert.IsTrue(lv && hv);
\r
1429 Assert.AreEqual(7, hi);
\r
1430 Assert.AreEqual(3, lo);
\r
1431 Assert.IsFalse(snap.Cut(new HigherOrder.CubeRoot(125000), out lo, out lv, out hi, out hv));
\r
1432 Assert.IsTrue(lv && !hv);
\r
1433 Assert.AreEqual(41, lo);
\r
1434 Assert.IsFalse(snap.Cut(new HigherOrder.CubeRoot(-27), out lo, out lv, out hi, out hv));
\r
1435 Assert.IsTrue(!lv && hv);
\r
1436 Assert.AreEqual(1, hi);
\r
1441 public void Range()
\r
1443 Assert.IsTrue(IC.eq(snap.RangeFromTo(5, 16), 5, 7, 9, 11,13, 13, 15));
\r
1444 Assert.IsTrue(IC.eq(snap.RangeFromTo(5, 17), 5, 7, 9, 11,13, 13, 15));
\r
1445 Assert.IsTrue(IC.eq(snap.RangeFromTo(6, 16), 7, 9, 11,13, 13, 15));
\r
1450 public void Contains()
\r
1452 Assert.IsTrue(snap.Contains(5));
\r
1453 Assert.IsTrue(snap.Contains(13));
\r
1454 Assert.AreEqual(1, snap.ContainsCount(5));
\r
1455 Assert.AreEqual(2, snap.ContainsCount(13));
\r
1460 public void FindMin()
\r
1462 Assert.AreEqual(1, snap.FindMin());
\r
1467 public void FindMax()
\r
1469 Assert.AreEqual(41, snap.FindMax());
\r
1474 public void Predecessor()
\r
1476 Assert.AreEqual(13, snap.Predecessor(15));
\r
1477 Assert.AreEqual(15, snap.Predecessor(16));
\r
1478 Assert.AreEqual(15, snap.Predecessor(17));
\r
1479 Assert.AreEqual(17, snap.Predecessor(18));
\r
1484 public void Successor()
\r
1486 Assert.AreEqual(17, snap.Successor(15));
\r
1487 Assert.AreEqual(17, snap.Successor(16));
\r
1488 Assert.AreEqual(19, snap.Successor(17));
\r
1489 Assert.AreEqual(19, snap.Successor(18));
\r
1494 public void WeakPredecessor()
\r
1496 Assert.AreEqual(15, snap.WeakPredecessor(15));
\r
1497 Assert.AreEqual(15, snap.WeakPredecessor(16));
\r
1498 Assert.AreEqual(17, snap.WeakPredecessor(17));
\r
1499 Assert.AreEqual(17, snap.WeakPredecessor(18));
\r
1504 public void WeakSuccessor()
\r
1506 Assert.AreEqual(15, snap.WeakSuccessor(15));
\r
1507 Assert.AreEqual(17, snap.WeakSuccessor(16));
\r
1508 Assert.AreEqual(17, snap.WeakSuccessor(17));
\r
1509 Assert.AreEqual(19, snap.WeakSuccessor(18));
\r
1514 [ExpectedException(typeof(NotSupportedException), "Indexing not supported for snapshots")]
\r
1515 public void CountTo()
\r
1517 int j = snap.CountTo(15);
\r
1522 [ExpectedException(typeof(NotSupportedException), "Indexing not supported for snapshots")]
\r
1523 public void Indexing()
\r
1530 [ExpectedException(typeof(NotSupportedException), "Indexing not supported for snapshots")]
\r
1531 public void Indexing2()
\r
1533 int j = snap.IndexOf(5);
\r
1538 public void Dispose()
\r
1548 public class Single
\r
1550 private TreeBag<int> tree;
\r
1552 private IComparer<int> ic;
\r
1556 public void Init()
\r
1559 tree = new TreeBag<int>(ic);
\r
1560 for (int i = 0; i < 10; i++)
\r
1561 tree.Add(2 * i + 1);
\r
1566 public void EnumerationWithAdd()
\r
1568 int[] orig = new int[] { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };
\r
1570 TreeBag<int> snap = (TreeBag<int>)tree.Snapshot();
\r
1572 foreach (int j in snap)
\r
1574 Assert.AreEqual(1 + 2 * i++, j);
\r
1576 Assert.IsTrue(snap.Check("M"), "Bad snap!");
\r
1577 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1578 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1584 public void Remove()
\r
1586 int[] orig = new int[] { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };
\r
1587 TreeBag<int> snap = (TreeBag<int>)tree.Snapshot();
\r
1589 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1590 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1592 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1593 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1594 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1599 public void RemoveNormal()
\r
1602 for (int i = 10; i < 20; i++)
\r
1609 int[] orig = new int[] { 10, 11, 12, 13, 14, 15, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 };
\r
1610 TreeBag<int> snap = (TreeBag<int>)tree.Snapshot();
\r
1612 Assert.IsFalse(tree.Remove(-20));
\r
1613 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1614 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1617 //decrease items case
\r
1618 Assert.IsTrue(tree.Remove(15));
\r
1619 Assert.IsTrue(tree.Check("T1"));
\r
1620 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1622 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1624 //No demote case, with move_item
\r
1625 Assert.IsTrue(tree.Remove(20));
\r
1626 Assert.IsTrue(tree.Check("T1"));
\r
1627 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1628 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1629 Assert.IsFalse(tree.Remove(20));
\r
1633 Assert.IsTrue(tree.Remove(14));
\r
1634 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1635 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1636 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1639 Assert.IsTrue(tree.Remove(25));
\r
1640 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1641 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1642 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1645 Assert.IsTrue(tree.Remove(29));
\r
1646 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1647 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1648 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1650 //1a (terminating)
\r
1651 Assert.IsTrue(tree.Remove(10));
\r
1652 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1653 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1654 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1657 Assert.IsTrue(tree.Remove(12));
\r
1659 Assert.IsTrue(tree.Remove(11));
\r
1660 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1661 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1662 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1665 Assert.IsTrue(tree.Remove(18));
\r
1666 Assert.IsTrue(tree.Remove(13));
\r
1667 Assert.IsTrue(tree.Remove(15));
\r
1668 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1669 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1670 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1673 for (int i = 0; i < 10; i++)
\r
1674 tree.Add(50 - 2 * i);
\r
1676 Assert.IsTrue(tree.Remove(42));
\r
1677 Assert.IsTrue(tree.Remove(38));
\r
1678 Assert.IsTrue(tree.Remove(28));
\r
1679 Assert.IsTrue(tree.Remove(40));
\r
1680 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1681 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1682 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1685 Assert.IsTrue(tree.Remove(16));
\r
1686 Assert.IsTrue(tree.Remove(23));
\r
1687 Assert.IsTrue(tree.Remove(17));
\r
1688 Assert.IsTrue(tree.Remove(19));
\r
1689 Assert.IsTrue(tree.Remove(50));
\r
1690 Assert.IsTrue(tree.Remove(26));
\r
1691 Assert.IsTrue(tree.Remove(21));
\r
1692 Assert.IsTrue(tree.Remove(22));
\r
1693 Assert.IsTrue(tree.Remove(24));
\r
1694 for (int i = 0; i < 48; i++)
\r
1697 //Almost empty tree:
\r
1698 Assert.IsFalse(tree.Remove(26));
\r
1699 Assert.IsTrue(tree.Remove(48));
\r
1700 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1701 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1702 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1705 Assert.IsFalse(tree.Remove(26));
\r
1706 Assert.IsTrue(tree.Check("Normal test 1"), "Bad tree");
\r
1707 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1708 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1715 int[] orig = new int[] { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };
\r
1716 TreeBag<int> snap = (TreeBag<int>)tree.Snapshot();
\r
1718 Assert.IsTrue(snap.Check("M"), "Bad snap!");
\r
1719 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1720 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1722 Assert.IsTrue(snap.Check("M"), "Bad snap!");
\r
1723 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1724 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1726 Assert.IsTrue(snap.Check("M"), "Bad snap!");
\r
1727 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1728 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1731 Assert.IsTrue(snap.Check("M"), "Bad snap!");
\r
1732 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1733 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1737 Assert.IsTrue(snap.Check("M"), "Bad snap!");
\r
1738 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1739 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1740 for (int i = 1; i < 4; i++)
\r
1741 tree.Add(40 - 2 * i);
\r
1743 Assert.IsTrue(snap.Check("M"), "Bad snap!");
\r
1744 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1745 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1749 Assert.IsTrue(snap.Check("M"), "Bad snap!");
\r
1750 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1751 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1756 public void Clear()
\r
1758 int[] orig = new int[] { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };
\r
1759 TreeBag<int> snap = (TreeBag<int>)tree.Snapshot();
\r
1762 Assert.IsTrue(snap.Check("Snap"), "Bad snap!");
\r
1763 Assert.IsTrue(tree.Check("Tree"), "Bad tree!");
\r
1764 Assert.IsTrue(IC.eq(snap, orig), "Snap was changed!");
\r
1765 Assert.AreEqual(0, tree.Count);
\r
1770 [ExpectedException(typeof(InvalidOperationException), "Cannot snapshot a snapshot")]
\r
1771 public void SnapSnap()
\r
1773 TreeBag<int> snap = (TreeBag<int>)tree.Snapshot();
\r
1780 public void Dispose()
\r
1790 public class Multiple
\r
1792 private TreeBag<int> tree;
\r
1794 private IComparer<int> ic;
\r
1797 private bool eq(MSG.IEnumerable<int> me, int[] that)
\r
1799 int i = 0, maxind = that.Length - 1;
\r
1801 foreach (int item in me)
\r
1802 if (i > maxind || ic.Compare(item, that[i++]) != 0)
\r
1810 public void Init()
\r
1813 tree = new TreeBag<int>(ic);
\r
1814 for (int i = 0; i < 10; i++)
\r
1815 tree.Add(2 * i + 1);
\r
1820 public void First()
\r
1822 TreeBag<int>[] snaps = new TreeBag<int>[10];
\r
1824 for (int i = 0; i < 10; i++)
\r
1826 snaps[i] = (TreeBag<int>)(tree.Snapshot());
\r
1830 for (int i = 0; i < 10; i++)
\r
1832 Assert.AreEqual(i + 10, snaps[i].Count);
\r
1838 snaps[8].Dispose();
\r
1841 int[] res = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19 };
\r
1842 int[] snap7 = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 19 };
\r
1843 int[] snap3 = new int[] { 0, 1, 2, 3, 4, 5, 7, 9, 11, 13, 15, 17, 19 };
\r
1845 Assert.IsTrue(IC.eq(snaps[3], snap3), "Snap 3 was changed!");
\r
1846 Assert.IsTrue(IC.eq(snaps[7], snap7), "Snap 7 was changed!");
\r
1847 Assert.IsTrue(IC.eq(tree, res));
\r
1848 Assert.IsTrue(tree.Check("B"));
\r
1849 Assert.IsTrue(snaps[3].Check("B"));
\r
1850 Assert.IsTrue(snaps[7].Check("B"));
\r
1855 public void CollectingTheMaster()
\r
1857 TreeBag<int>[] snaps = new TreeBag<int>[10];
\r
1859 for (int i = 0; i < 10; i++)
\r
1861 snaps[i] = (TreeBag<int>)(tree.Snapshot());
\r
1867 for (int i = 0; i < 10; i++)
\r
1869 Assert.AreEqual(i + 10, snaps[i].Count);
\r
1875 snaps[8].Dispose();
\r
1877 int[] snap7 = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 19 };
\r
1878 int[] snap3 = new int[] { 0, 1, 2, 3, 4, 5, 7, 9, 11, 13, 15, 17, 19 };
\r
1880 Assert.IsTrue(IC.eq(snaps[3], snap3), "Snap 3 was changed!");
\r
1881 Assert.IsTrue(IC.eq(snaps[7], snap7), "Snap 7 was changed!");
\r
1882 Assert.IsTrue(snaps[3].Check("B"));
\r
1883 Assert.IsTrue(snaps[7].Check("B"));
\r
1888 public void Dispose()
\r
1899 namespace HigherOrder
\r
1901 internal class CubeRoot: IComparable<int>
\r
1906 internal CubeRoot(int c) { this.c = c; }
\r
1909 public int CompareTo(int that) { return c - that * that * that; }
\r
1910 public bool Equals(int that) { return c == that * that * that; }
\r
1915 class Interval: IComparable<int>
\r
1920 internal Interval(int b, int t) { this.b = b; this.t = t; }
\r
1923 public int CompareTo(int that) { return that < b ? 1 : that > t ? -1 : 0; }
\r
1924 public bool Equals(int that) { return that >= b && that <= t; }
\r
1930 public class Simple
\r
1932 private TreeBag<int> tree;
\r
1934 private IComparer<int> ic;
\r
1938 public void Init()
\r
1941 tree = new TreeBag<int>(ic);
\r
1945 private bool never(int i) { return false; }
\r
1948 private bool always(int i) { return true; }
\r
1951 private bool even(int i) { return i % 2 == 0; }
\r
1954 private string themap(int i) { return String.Format("AA {0,4} BB", i); }
\r
1957 private string badmap(int i) { return String.Format("AA {0} BB", i); }
\r
1960 private int appfield1;
\r
1962 private int appfield2;
\r
1965 private void apply(int i) { appfield1++; appfield2 += i * i; }
\r
1969 public void Apply()
\r
1971 Simple simple1 = new Simple();
\r
1973 tree.Apply(new Applier<int>(simple1.apply));
\r
1974 Assert.AreEqual(0, simple1.appfield1);
\r
1975 Assert.AreEqual(0, simple1.appfield2);
\r
1977 Simple simple2 = new Simple();
\r
1979 for (int i = 0; i < 10; i++) tree.Add(i);
\r
1982 tree.Apply(new Applier<int>(simple2.apply));
\r
1983 Assert.AreEqual(11, simple2.appfield1);
\r
1984 Assert.AreEqual(289, simple2.appfield2);
\r
1991 Assert.IsTrue(tree.All(new Filter<int>(never)));
\r
1992 Assert.IsTrue(tree.All(new Filter<int>(even)));
\r
1993 Assert.IsTrue(tree.All(new Filter<int>(always)));
\r
1994 for (int i = 0; i < 10; i++) tree.Add(i);
\r
1996 Assert.IsFalse(tree.All(new Filter<int>(never)));
\r
1997 Assert.IsFalse(tree.All(new Filter<int>(even)));
\r
1998 Assert.IsTrue(tree.All(new Filter<int>(always)));
\r
2000 for (int i = 0; i < 10; i++) tree.Add(i * 2);
\r
2002 Assert.IsFalse(tree.All(new Filter<int>(never)));
\r
2003 Assert.IsTrue(tree.All(new Filter<int>(even)));
\r
2004 Assert.IsTrue(tree.All(new Filter<int>(always)));
\r
2006 for (int i = 0; i < 10; i++) tree.Add(i * 2 + 1);
\r
2008 Assert.IsFalse(tree.All(new Filter<int>(never)));
\r
2009 Assert.IsFalse(tree.All(new Filter<int>(even)));
\r
2010 Assert.IsTrue(tree.All(new Filter<int>(always)));
\r
2015 public void Exists()
\r
2017 Assert.IsFalse(tree.Exists(new Filter<int>(never)));
\r
2018 Assert.IsFalse(tree.Exists(new Filter<int>(even)));
\r
2019 Assert.IsFalse(tree.Exists(new Filter<int>(always)));
\r
2020 for (int i = 0; i < 10; i++) tree.Add(i);
\r
2022 Assert.IsFalse(tree.Exists(new Filter<int>(never)));
\r
2023 Assert.IsTrue(tree.Exists(new Filter<int>(even)));
\r
2024 Assert.IsTrue(tree.Exists(new Filter<int>(always)));
\r
2026 for (int i = 0; i < 10; i++) tree.Add(i * 2);
\r
2028 Assert.IsFalse(tree.Exists(new Filter<int>(never)));
\r
2029 Assert.IsTrue(tree.Exists(new Filter<int>(even)));
\r
2030 Assert.IsTrue(tree.Exists(new Filter<int>(always)));
\r
2032 for (int i = 0; i < 10; i++) tree.Add(i * 2 + 1);
\r
2034 Assert.IsFalse(tree.Exists(new Filter<int>(never)));
\r
2035 Assert.IsFalse(tree.Exists(new Filter<int>(even)));
\r
2036 Assert.IsTrue(tree.Exists(new Filter<int>(always)));
\r
2041 public void FindAll()
\r
2043 Assert.AreEqual(0, tree.FindAll(new Filter<int>(never)).Count);
\r
2044 for (int i = 0; i < 10; i++)
\r
2048 Assert.AreEqual(0, tree.FindAll(new Filter<int>(never)).Count);
\r
2049 Assert.AreEqual(11, tree.FindAll(new Filter<int>(always)).Count);
\r
2050 Assert.AreEqual(6, tree.FindAll(new Filter<int>(even)).Count);
\r
2051 Assert.IsTrue(((TreeBag<int>)tree.FindAll(new Filter<int>(even))).Check("R"));
\r
2058 Assert.AreEqual(0, tree.Map(new Mapper<int,string>(themap), new SC()).Count);
\r
2059 for (int i = 0; i < 14; i++)
\r
2060 tree.Add(i * i * i);
\r
2063 IIndexedSorted<string> res = tree.Map(new Mapper<int,string>(themap), new SC());
\r
2065 Assert.IsTrue(((TreeBag<string>)res).Check("R"));
\r
2066 Assert.AreEqual(15, res.Count);
\r
2067 Assert.AreEqual("AA 0 BB", res[0]);
\r
2068 Assert.AreEqual("AA 1 BB", res[1]);
\r
2069 Assert.AreEqual("AA 1 BB", res[2]);
\r
2070 Assert.AreEqual("AA 8 BB", res[3]);
\r
2071 Assert.AreEqual("AA 27 BB", res[4]);
\r
2072 Assert.AreEqual("AA 125 BB", res[6]);
\r
2073 Assert.AreEqual("AA 1000 BB", res[11]);
\r
2078 [ExpectedException(typeof(ArgumentException), "mapper not monotonic")]
\r
2079 public void BadMap()
\r
2081 for (int i = 0; i < 11; i++)
\r
2082 tree.Add(i * i * i);
\r
2084 ISorted<string> res = tree.Map(new Mapper<int,string>(badmap), new SC());
\r
2091 for (int i = 0; i < 10; i++)
\r
2098 Assert.IsTrue(tree.Cut(new CubeRoot(27), out low, out lval, out high, out hval));
\r
2099 Assert.IsTrue(lval && hval);
\r
2100 Assert.AreEqual(4, high);
\r
2101 Assert.AreEqual(2, low);
\r
2102 Assert.IsFalse(tree.Cut(new CubeRoot(30), out low, out lval, out high, out hval));
\r
2103 Assert.IsTrue(lval && hval);
\r
2104 Assert.AreEqual(4, high);
\r
2105 Assert.AreEqual(3, low);
\r
2110 public void CutInt()
\r
2112 for (int i = 0; i < 10; i++)
\r
2118 Assert.IsFalse(tree.Cut(new IC(3), out low, out lval, out high, out hval));
\r
2119 Assert.IsTrue(lval && hval);
\r
2120 Assert.AreEqual(4, high);
\r
2121 Assert.AreEqual(2, low);
\r
2122 Assert.IsTrue(tree.Cut(new IC(6), out low, out lval, out high, out hval));
\r
2123 Assert.IsTrue(lval && hval);
\r
2124 Assert.AreEqual(8, high);
\r
2125 Assert.AreEqual(4, low);
\r
2130 public void CutInterval()
\r
2132 for (int i = 0; i < 10; i++)
\r
2138 Assert.IsTrue(tree.Cut(new Interval(5, 9), out lo, out lv, out hi, out hv));
\r
2139 Assert.IsTrue(lv && hv);
\r
2140 Assert.AreEqual(10, hi);
\r
2141 Assert.AreEqual(4, lo);
\r
2142 Assert.IsTrue(tree.Cut(new Interval(6, 10), out lo, out lv, out hi, out hv));
\r
2143 Assert.IsTrue(lv && hv);
\r
2144 Assert.AreEqual(12, hi);
\r
2145 Assert.AreEqual(4, lo);
\r
2146 for (int i = 0; i < 100; i++)
\r
2149 tree.Cut(new Interval(77, 105), out lo, out lv, out hi, out hv);
\r
2150 Assert.IsTrue(lv && hv);
\r
2151 Assert.AreEqual(106, hi);
\r
2152 Assert.AreEqual(76, lo);
\r
2153 tree.Cut(new Interval(5, 7), out lo, out lv, out hi, out hv);
\r
2154 Assert.IsTrue(lv && hv);
\r
2155 Assert.AreEqual(8, hi);
\r
2156 Assert.AreEqual(4, lo);
\r
2157 tree.Cut(new Interval(80, 110), out lo, out lv, out hi, out hv);
\r
2158 Assert.IsTrue(lv && hv);
\r
2159 Assert.AreEqual(112, hi);
\r
2160 Assert.AreEqual(78, lo);
\r
2165 public void UpperCut()
\r
2167 for (int i = 0; i < 10; i++)
\r
2173 Assert.IsFalse(tree.Cut(new CubeRoot(1000), out l, out lv, out h, out hv));
\r
2174 Assert.IsTrue(lv && !hv);
\r
2175 Assert.AreEqual(9, l);
\r
2176 Assert.IsFalse(tree.Cut(new CubeRoot(-50), out l, out lv, out h, out hv));
\r
2177 Assert.IsTrue(!lv && hv);
\r
2178 Assert.AreEqual(0, h);
\r
2183 public void Dispose() { ic = null; tree = null; }
\r
2190 namespace MultiOps
\r
2193 public class AddAll
\r
2195 private int sqr(int i) { return i * i; }
\r
2198 TreeBag<int> tree;
\r
2202 public void Init() { tree = new TreeBag<int>(new IC()); }
\r
2206 public void EmptyEmpty()
\r
2208 tree.AddAll(new FunEnumerable(0, new Int2Int(sqr)));
\r
2209 Assert.AreEqual(0, tree.Count);
\r
2210 Assert.IsTrue(tree.Check());
\r
2215 public void SomeEmpty()
\r
2217 for (int i = 4; i < 9; i++) tree.Add(i);
\r
2219 tree.AddAll(new FunEnumerable(0, new Int2Int(sqr)));
\r
2220 Assert.AreEqual(5, tree.Count);
\r
2221 Assert.IsTrue(tree.Check());
\r
2226 public void EmptySome()
\r
2228 tree.AddAll(new FunEnumerable(4, new Int2Int(sqr)));
\r
2229 Assert.AreEqual(4, tree.Count);
\r
2230 Assert.IsTrue(tree.Check());
\r
2231 Assert.AreEqual(0, tree[0]);
\r
2232 Assert.AreEqual(1, tree[1]);
\r
2233 Assert.AreEqual(4, tree[2]);
\r
2234 Assert.AreEqual(9, tree[3]);
\r
2239 public void SomeSome()
\r
2241 for (int i = 5; i < 9; i++) tree.Add(i);
\r
2244 tree.AddAll(new FunEnumerable(4, new Int2Int(sqr)));
\r
2245 Assert.AreEqual(9, tree.Count);
\r
2246 Assert.IsTrue(tree.Check());
\r
2247 Assert.IsTrue(IC.eq(tree, 0, 1, 1, 4, 5, 6, 7, 8, 9));
\r
2252 public void Dispose() { tree = null; }
\r
2258 public class AddSorted
\r
2260 private int sqr(int i) { return i * i; }
\r
2262 private int step(int i) { return i/3; }
\r
2265 private int bad(int i) { return i * (5 - i); }
\r
2268 TreeBag<int> tree;
\r
2272 public void Init() { tree = new TreeBag<int>(new IC()); }
\r
2276 public void EmptyEmpty()
\r
2278 tree.AddSorted(new FunEnumerable(0, new Int2Int(sqr)));
\r
2279 Assert.AreEqual(0, tree.Count);
\r
2280 Assert.IsTrue(tree.Check());
\r
2285 public void SomeEmpty()
\r
2287 for (int i = 4; i < 9; i++) tree.Add(i);
\r
2289 tree.AddSorted(new FunEnumerable(0, new Int2Int(sqr)));
\r
2290 Assert.AreEqual(5, tree.Count);
\r
2291 Assert.IsTrue(tree.Check());
\r
2296 public void EmptySome()
\r
2298 tree.AddSorted(new FunEnumerable(4, new Int2Int(sqr)));
\r
2299 Assert.AreEqual(4, tree.Count);
\r
2300 Assert.IsTrue(tree.Check());
\r
2301 Assert.AreEqual(0, tree[0]);
\r
2302 Assert.AreEqual(1, tree[1]);
\r
2303 Assert.AreEqual(4, tree[2]);
\r
2304 Assert.AreEqual(9, tree[3]);
\r
2308 public void EmptySome2()
\r
2310 tree.AddSorted(new FunEnumerable(4, new Int2Int(step)));
\r
2312 Assert.AreEqual(4, tree.Count);
\r
2313 Assert.IsTrue(tree.Check());
\r
2314 Assert.AreEqual(0, tree[0]);
\r
2315 Assert.AreEqual(0, tree[1]);
\r
2316 Assert.AreEqual(0, tree[2]);
\r
2317 Assert.AreEqual(1, tree[3]);
\r
2322 public void SomeSome()
\r
2324 for (int i = 5; i < 9; i++) tree.Add(i);
\r
2327 tree.AddSorted(new FunEnumerable(4, new Int2Int(sqr)));
\r
2328 Assert.AreEqual(9, tree.Count);
\r
2329 Assert.IsTrue(tree.Check());
\r
2330 Assert.IsTrue(IC.eq(tree, 0, 1,1, 4, 5, 6, 7, 8, 9));
\r
2335 [ExpectedException(typeof(ArgumentException), "Argument not sorted")]
\r
2336 public void EmptyBad()
\r
2338 tree.AddSorted(new FunEnumerable(9, new Int2Int(bad)));
\r
2343 public void Dispose() { tree = null; }
\r
2351 TreeBag<int> tree, tree2;
\r
2355 public void Init()
\r
2357 tree = new TreeBag<int>(new IC());
\r
2358 tree2 = new TreeBag<int>(new IC());
\r
2359 for (int i = 0; i < 10; i++)
\r
2363 for (int i = 0; i < 10; i++)
\r
2369 public void RemoveAll()
\r
2371 tree.RemoveAll(tree2.RangeFromTo(3, 7));
\r
2372 Assert.AreEqual(9, tree.Count);
\r
2373 Assert.IsTrue(tree.Check());
\r
2374 Assert.IsTrue(IC.eq(tree, 0, 1, 2, 3,4, 5, 7, 8, 9));
\r
2375 tree.RemoveAll(tree2.RangeFromTo(3, 7));
\r
2376 Assert.AreEqual(8, tree.Count);
\r
2377 Assert.IsTrue(tree.Check());
\r
2378 Assert.IsTrue(IC.eq(tree, 0, 1, 2, 3, 5, 7, 8, 9));
\r
2379 tree.RemoveAll(tree2.RangeFromTo(13, 17));
\r
2380 Assert.AreEqual(8, tree.Count);
\r
2381 Assert.IsTrue(tree.Check());
\r
2382 Assert.IsTrue(IC.eq(tree, 0, 1, 2, 3, 5, 7, 8, 9));
\r
2383 tree.RemoveAll(tree2.RangeFromTo(3, 17));
\r
2384 Assert.AreEqual(7, tree.Count);
\r
2385 Assert.IsTrue(tree.Check());
\r
2386 Assert.IsTrue(IC.eq(tree, 0, 1, 2, 3, 5, 7, 9));
\r
2387 for (int i = 0; i < 10; i++) tree2.Add(i);
\r
2389 tree.RemoveAll(tree2.RangeFromTo(-1, 10));
\r
2390 Assert.AreEqual(0, tree.Count);
\r
2391 Assert.IsTrue(tree.Check());
\r
2392 Assert.IsTrue(IC.eq(tree));
\r
2395 private void pint<T>(MSG.IEnumerable<T> e)
\r
2397 foreach (T i in e)
\r
2398 Console.Write("{0} ", i);
\r
2400 Console.WriteLine();
\r
2404 public void RetainAll()
\r
2406 tree.Add(8);tree2.Add(6);
\r
2407 //pint<int>(tree);
\r
2408 //pint<int>(tree2);
\r
2409 tree.RetainAll(tree2.RangeFromTo(3, 17));
\r
2410 Assert.AreEqual(3, tree.Count);
\r
2411 Assert.IsTrue(tree.Check());
\r
2412 Assert.IsTrue(IC.eq(tree, 4, 6, 8));
\r
2413 tree.RetainAll(tree2.RangeFromTo(1, 17));
\r
2414 Assert.AreEqual(3, tree.Count);
\r
2415 Assert.IsTrue(tree.Check());
\r
2416 Assert.IsTrue(IC.eq(tree, 4, 6 , 8));
\r
2417 tree.RetainAll(tree2.RangeFromTo(3, 5));
\r
2418 Assert.AreEqual(1, tree.Count);
\r
2419 Assert.IsTrue(tree.Check());
\r
2420 Assert.IsTrue(IC.eq(tree, 4));
\r
2421 tree.RetainAll(tree2.RangeFromTo(7, 17));
\r
2422 Assert.AreEqual(0, tree.Count);
\r
2423 Assert.IsTrue(tree.Check());
\r
2424 Assert.IsTrue(IC.eq(tree));
\r
2425 for (int i = 0; i < 10; i++) tree.Add(i);
\r
2427 tree.RetainAll(tree2.RangeFromTo(5, 5));
\r
2428 Assert.AreEqual(0, tree.Count);
\r
2429 Assert.IsTrue(tree.Check());
\r
2430 Assert.IsTrue(IC.eq(tree));
\r
2431 for (int i = 0; i < 10; i++) tree.Add(i);
\r
2433 tree.RetainAll(tree2.RangeFromTo(15, 25));
\r
2434 Assert.AreEqual(0, tree.Count);
\r
2435 Assert.IsTrue(tree.Check());
\r
2436 Assert.IsTrue(IC.eq(tree));
\r
2441 public void ContainsAll()
\r
2443 Assert.IsFalse(tree.ContainsAll(tree2));
\r
2444 Assert.IsTrue(tree.ContainsAll(tree));
\r
2446 Assert.IsTrue(tree.ContainsAll(tree2));
\r
2448 Assert.IsTrue(tree.ContainsAll(tree2));
\r
2450 Assert.IsFalse(tree.ContainsAll(tree2));
\r
2455 public void RemoveInterval()
\r
2457 tree.RemoveInterval(3, 4);
\r
2458 Assert.IsTrue(tree.Check());
\r
2459 Assert.AreEqual(7, tree.Count);
\r
2460 Assert.IsTrue(IC.eq(tree, 0, 1, 2, 6, 7, 8, 9));
\r
2461 tree.RemoveInterval(2, 3);
\r
2462 Assert.IsTrue(tree.Check());
\r
2463 Assert.AreEqual(4, tree.Count);
\r
2464 Assert.IsTrue(IC.eq(tree, 0, 1, 8,9));
\r
2465 tree.RemoveInterval(0, 4);
\r
2466 Assert.IsTrue(tree.Check());
\r
2467 Assert.AreEqual(0, tree.Count);
\r
2468 Assert.IsTrue(IC.eq(tree));
\r
2473 [ExpectedException(typeof(ArgumentOutOfRangeException))]
\r
2474 public void RemoveRangeBad1()
\r
2476 tree.RemoveInterval(-3, 8);
\r
2481 [ExpectedException(typeof(ArgumentOutOfRangeException))]
\r
2482 public void RemoveRangeBad2()
\r
2484 tree.RemoveInterval(3, -8);
\r
2489 [ExpectedException(typeof(ArgumentException))]
\r
2490 public void RemoveRangeBad3()
\r
2492 tree.RemoveInterval(3, 9);
\r
2497 public void GetRange()
\r
2499 Assert.IsTrue(IC.eq(tree[3, 3]));
\r
2500 Assert.IsTrue(IC.eq(tree[3, 4], 3));
\r
2501 Assert.IsTrue(IC.eq(tree[3, 5], 3, 4));
\r
2502 Assert.IsTrue(IC.eq(tree[3, 6], 3, 4, 4));
\r
2503 Assert.IsTrue(IC.eq(tree[3, 7], 3, 4, 4, 5));
\r
2504 Assert.IsTrue(IC.eq(tree[4, 4]));
\r
2505 Assert.IsTrue(IC.eq(tree[4, 5], 4));
\r
2506 Assert.IsTrue(IC.eq(tree[4, 6], 4, 4));
\r
2507 Assert.IsTrue(IC.eq(tree[4, 7], 4, 4, 5));
\r
2508 Assert.IsTrue(IC.eq(tree[4, 8], 4, 4, 5, 6));
\r
2509 Assert.IsTrue(IC.eq(tree[5, 5]));
\r
2510 Assert.IsTrue(IC.eq(tree[5, 6], 4));
\r
2511 Assert.IsTrue(IC.eq(tree[5, 7], 4, 5));
\r
2512 Assert.IsTrue(IC.eq(tree[5, 8], 4, 5, 6));
\r
2513 Assert.IsTrue(IC.eq(tree[5, 9], 4, 5, 6, 7));
\r
2514 Assert.IsTrue(IC.eq(tree[5, 11], 4, 5, 6, 7, 8, 9));
\r
2519 public void GetRangeBackwards()
\r
2521 Assert.IsTrue(IC.eq(tree[3, 3].Backwards()));
\r
2522 Assert.IsTrue(IC.eq(tree[3, 4].Backwards(), 3));
\r
2523 Assert.IsTrue(IC.eq(tree[3, 5].Backwards(), 4, 3));
\r
2524 Assert.IsTrue(IC.eq(tree[3, 6].Backwards(), 4, 4, 3));
\r
2525 Assert.IsTrue(IC.eq(tree[3, 7].Backwards(), 5, 4, 4, 3));
\r
2526 Assert.IsTrue(IC.eq(tree[4, 4].Backwards()));
\r
2527 Assert.IsTrue(IC.eq(tree[4, 5].Backwards(), 4));
\r
2528 Assert.IsTrue(IC.eq(tree[4, 6].Backwards(), 4, 4));
\r
2529 Assert.IsTrue(IC.eq(tree[4, 7].Backwards(), 5, 4, 4));
\r
2530 Assert.IsTrue(IC.eq(tree[4, 8].Backwards(), 6, 5, 4, 4));
\r
2531 Assert.IsTrue(IC.eq(tree[5, 5].Backwards()));
\r
2532 Assert.IsTrue(IC.eq(tree[5, 6].Backwards(), 4));
\r
2533 Assert.IsTrue(IC.eq(tree[5, 7].Backwards(), 5, 4));
\r
2534 Assert.IsTrue(IC.eq(tree[5, 8].Backwards(), 6, 5, 4));
\r
2535 Assert.IsTrue(IC.eq(tree[5, 9].Backwards(), 7, 6, 5, 4));
\r
2540 [ExpectedException(typeof(ArgumentOutOfRangeException))]
\r
2541 public void GetRangeBad1()
\r
2543 object foo = tree[-3, 0];
\r
2548 [ExpectedException(typeof(ArgumentOutOfRangeException))]
\r
2549 public void GetRangeBad2()
\r
2551 object foo = tree[3, 2];
\r
2556 [ExpectedException(typeof(ArgumentException))]
\r
2557 public void GetRangeBad3()
\r
2559 object foo = tree[3, 12];
\r
2564 public void Dispose() { tree = null; tree2 = null; }
\r
2572 public class ISequenced
\r
2574 private ISequenced<int> dit, dat, dut;
\r
2578 public void Init()
\r
2580 dit = new TreeBag<int>(new IC());
\r
2581 dat = new TreeBag<int>(new IC());
\r
2582 dut = new TreeBag<int>(new RevIC());
\r
2587 public void EmptyEmpty()
\r
2589 Assert.IsTrue(dit.Equals(dat));
\r
2594 public void EmptyNonEmpty()
\r
2597 Assert.IsFalse(dit.Equals(dat));
\r
2598 Assert.IsFalse(dat.Equals(dit));
\r
2602 public int hasher(params int[] items)
\r
2606 foreach (int i in items)
\r
2607 retval = retval * 31 + i;
\r
2614 public void HashVal()
\r
2616 Assert.AreEqual(hasher(), dit.GetHashCode());
\r
2618 Assert.AreEqual(hasher(3), dit.GetHashCode());
\r
2620 Assert.AreEqual(hasher(3, 7), dit.GetHashCode());
\r
2621 Assert.AreEqual(hasher(), dut.GetHashCode());
\r
2623 Assert.AreEqual(hasher(3), dut.GetHashCode());
\r
2625 Assert.AreEqual(hasher(7, 3), dut.GetHashCode());
\r
2630 public void Normal()
\r
2635 Assert.IsFalse(dit.Equals(dat));
\r
2636 Assert.IsFalse(dat.Equals(dit));
\r
2638 Assert.IsTrue(dit.Equals(dat));
\r
2639 Assert.IsTrue(dat.Equals(dit));
\r
2644 public void WrongOrder()
\r
2648 Assert.IsTrue(dit.Equals(dut));
\r
2649 Assert.IsTrue(dut.Equals(dit));
\r
2652 Assert.IsFalse(dit.Equals(dut));
\r
2653 Assert.IsFalse(dut.Equals(dit));
\r
2658 public void Reflexive()
\r
2660 Assert.IsTrue(dit.Equals(dit));
\r
2662 Assert.IsTrue(dit.Equals(dit));
\r
2664 Assert.IsTrue(dit.Equals(dit));
\r
2669 public void Dispose()
\r
2680 public class IEditableCollection
\r
2682 private ICollection<int> dit, dat, dut;
\r
2686 public void Init()
\r
2688 dit = new TreeBag<int>(new IC());
\r
2689 dat = new TreeBag<int>(new IC());
\r
2690 dut = new TreeBag<int>(new RevIC());
\r
2695 public void EmptyEmpty()
\r
2697 Assert.IsTrue(dit.Equals(dat));
\r
2702 public void EmptyNonEmpty()
\r
2705 Assert.IsFalse(dit.Equals(dat));
\r
2706 Assert.IsFalse(dat.Equals(dit));
\r
2710 public int hasher(int count, params int[] items)
\r
2714 foreach (int i in items)
\r
2717 return (count << 16) + retval;
\r
2722 public void HashVal()
\r
2724 Assert.AreEqual(hasher(0), dit.GetHashCode());
\r
2726 Assert.AreEqual(hasher(1, 3), dit.GetHashCode());
\r
2728 Assert.AreEqual(hasher(2, 3, 7), dit.GetHashCode());
\r
2729 Assert.AreEqual(hasher(0), dut.GetHashCode());
\r
2731 Assert.AreEqual(hasher(1, 3), dut.GetHashCode());
\r
2733 Assert.AreEqual(hasher(2, 7, 3), dut.GetHashCode());
\r
2738 public void Normal()
\r
2743 Assert.IsFalse(dit.Equals(dat));
\r
2744 Assert.IsFalse(dat.Equals(dit));
\r
2746 Assert.IsTrue(dit.Equals(dat));
\r
2747 Assert.IsTrue(dat.Equals(dit));
\r
2752 public void WrongOrder()
\r
2756 Assert.IsTrue(dit.Equals(dut));
\r
2757 Assert.IsTrue(dut.Equals(dit));
\r
2760 Assert.IsTrue(dit.Equals(dut));
\r
2761 Assert.IsTrue(dut.Equals(dit));
\r
2766 public void Reflexive()
\r
2768 Assert.IsTrue(dit.Equals(dit));
\r
2770 Assert.IsTrue(dit.Equals(dit));
\r
2772 Assert.IsTrue(dit.Equals(dit));
\r
2777 public void Dispose()
\r