public void WheelTimer_Bucket_Should_Remove_Head_Items_Correctly()
        {
            using (var timer = new HashedWheelTimer(500, 10))
            {
                var bucket = new Bucket();

                var t1 = new TimeoutItem(timer, EmptyAction, null);
                var t2 = new TimeoutItem(timer, EmptyAction, null);
                var t3 = new TimeoutItem(timer, EmptyAction, null);
                var t4 = new TimeoutItem(timer, EmptyAction, null);

                bucket.Add(t1);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] { t1 });
                Assert.AreEqual(bucket.Tail, t1);

                bucket.Add(t2);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] { t1, t2 });
                Assert.AreEqual(bucket.Tail, t2);

                bucket.Add(t3);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] { t1, t2, t3 });
                Assert.AreEqual(bucket.Tail, t3);

                bucket.Add(t4);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] { t1, t2, t3, t4 });
                Assert.AreEqual(bucket.Tail, t4);

                bucket.Remove(t1);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2, t3, t4 });
                Assert.AreEqual(bucket.Tail, t4);

                bucket.Remove(t3);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2, t4 });
                Assert.AreEqual(bucket.Tail, t4);

                bucket.Remove(t4);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2 });
                Assert.AreEqual(bucket.Tail, t2);

                bucket.Remove(t2);
                Assert.AreEqual(bucket.ToArray(), new TimeoutItem[0]);
            }
        }
 public void WheelTimer_Bucket_Should_Support_Add_And_Remove()
 {
     using (var timer = new HashedWheelTimer(500, 10))
     {
         var bucket = new Bucket();
         Assert.Null(bucket.Head);
         var t1 = new TimeoutItem(timer, EmptyAction, null);
         var t2 = new TimeoutItem(timer, EmptyAction, null);
         var t3 = new TimeoutItem(timer, EmptyAction, null);
         var t4 = new TimeoutItem(timer, EmptyAction, null);
         var t5 = new TimeoutItem(timer, EmptyAction, null);
         var t6 = new TimeoutItem(timer, EmptyAction, null);
         bucket.Add(t1);
         bucket.Add(t2);
         bucket.Add(t3);
         bucket.Add(t4);
         Assert.AreEqual(bucket.Head, t1);
         Assert.AreEqual(bucket.Tail, t4);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t1, t2, t3, t4 });
         bucket.Remove(t3);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t1, t2, t4 });
         Assert.AreEqual(t2.Next, t4);
         Assert.AreEqual(t4.Previous, t2);
         bucket.Remove(t1);
         Assert.AreEqual(bucket.Head, t2);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2, t4 });
         bucket.Add(t5);
         Assert.AreEqual(bucket.Tail, t5);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2, t4, t5 });
         bucket.Add(t6);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2, t4, t5, t6 });
         bucket.Remove(t4);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2, t5, t6 });
         bucket.Remove(t2);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t5, t6 });
         bucket.Remove(t6);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t5 });
         bucket.Remove(t5);
         CollectionAssert.AreEqual(bucket.ToArray(), new TimeoutItem[0]);
     }
 }