public void ManualExpirationCausesRecordsToExpire()
        {
            var maxIncomplete = new TimeSpan(0, 0, 5);
            var maxComplete   = new TimeSpan(0, 0, 1);

            int expiredIncomplete = 0;
            int expiredComplete   = 0;
            var coll = new ExpiringCompositeEventCollection <int, TestCompositeEvent>(maxIncomplete, maxComplete,
                                                                                      ec => { ++expiredIncomplete; },
                                                                                      ec =>
            {
                ++expiredComplete;
                Assert.IsTrue(ec.IsComplete);
            });

            var start = DateTime.Now;

            coll.ProcessEvent(1, CreateStartEvent(start));
            coll.ProcessEvent(1, CreateEndEvent(start));
            coll.ProcessEvent(2, CreateAnyEvent(start));

            coll.Expire(start);
            Assert.AreEqual(0, expiredIncomplete);
            Assert.AreEqual(0, expiredComplete);

            coll.Expire(start + new TimeSpan(0, 0, 2));
            Assert.AreEqual(0, expiredIncomplete);
            Assert.AreEqual(1, expiredComplete);

            coll.Expire(start + new TimeSpan(0, 0, 6));
            Assert.AreEqual(1, expiredIncomplete);
            Assert.AreEqual(1, expiredComplete);
        }
        public void ExpiredRecordsAreNotFoundByTryGetValue()
        {
            var maxIncomplete = new TimeSpan(0, 0, 5);
            var maxComplete   = new TimeSpan(0, 0, 1);

            int expiredRecords = 0;
            var coll           = new ExpiringCompositeEventCollection <int, TestCompositeEvent>(maxIncomplete, maxComplete,
                                                                                                ec => { ++expiredRecords; },
                                                                                                ec =>
            {
                ++expiredRecords;
                Assert.IsTrue(ec.IsComplete);
            });

            var start = DateTime.Now;

            coll.ProcessEvent(1, CreateStartEvent(start));
            coll.ProcessEvent(1, CreateEndEvent(start));
            coll.Expire(start + maxComplete + new TimeSpan(0, 0, 1));
            Assert.AreEqual(1, expiredRecords);
            TestCompositeEvent val;

            Assert.IsFalse(coll.TryGetValue(1, out val));

            coll.ProcessEvent(2, CreateAnyEvent(start));
            coll.Expire(start + maxIncomplete + new TimeSpan(0, 0, 1));
            Assert.AreEqual(2, expiredRecords);
            Assert.IsFalse(coll.TryGetValue(2, out val));
        }
        public void IncompleteRecordsAreNotExpiredIfEventsOccurAtExactlyMaxRecordAge()
        {
            var maxIncomplete = new TimeSpan(0, 0, 5);
            var maxComplete   = new TimeSpan(0, 0, 1);

            int expiredRecords = 0;
            var coll           = new ExpiringCompositeEventCollection <int, TestCompositeEvent>(maxIncomplete, maxComplete,
                                                                                                ec => { ++expiredRecords; },
                                                                                                this.CompleteExpiredEventHandler);

            var start = DateTime.Now;

            coll.ProcessEvent(1, CreateStartEvent(start));
            coll.ProcessEvent(2, CreateAnyEvent(start + maxIncomplete));

            Assert.AreEqual(0, expiredRecords);
        }
        public void RecordsAreFoundByTryGetValue()
        {
            var maxIncomplete = new TimeSpan(0, 0, 5);
            var maxComplete   = new TimeSpan(0, 0, 1);
            var coll          = new ExpiringCompositeEventCollection <int, TestCompositeEvent>(maxIncomplete, maxComplete,
                                                                                               this.IncompleteExpiredEventHandler,
                                                                                               this.CompleteExpiredEventHandler);

            var start = DateTime.Now;

            coll.ProcessEvent(1, CreateStartEvent(start));
            TestCompositeEvent val;

            Assert.IsTrue(coll.TryGetValue(1, out val));
            Assert.IsNotNull(val);
            coll.ProcessEvent(1, CreateEndEvent(start));
            TestCompositeEvent val2;

            Assert.IsTrue(coll.TryGetValue(1, out val2));
            Assert.AreSame(val, val2);
        }
        public void FlushCausesCompleteRecordsToBeExpiredExpiration()
        {
            int expiredComplete = 0;
            var coll            = new ExpiringCompositeEventCollection <int, TestCompositeEvent>(new TimeSpan(0, 0, 5),
                                                                                                 new TimeSpan(0, 0, 5),
                                                                                                 ec => { },
                                                                                                 ec =>
            {
                ++expiredComplete;
                Assert.IsTrue(ec.IsComplete);
            });

            var start = DateTime.Now;

            coll.ProcessEvent(1, CreateStartEvent(start));
            coll.ProcessEvent(1, CreateEndEvent(start));
            Assert.AreEqual(0, expiredComplete);

            coll.FlushComplete();
            Assert.AreEqual(1, expiredComplete);
        }
        public void CompleteRecordsAreExpiredWhenEventsOccurBeyondMaxRecordAge()
        {
            var maxIncomplete = new TimeSpan(0, 0, 5);
            var maxComplete   = new TimeSpan(0, 0, 1);

            int expiredRecords = 0;
            var coll           = new ExpiringCompositeEventCollection <int, TestCompositeEvent>(maxIncomplete, maxComplete,
                                                                                                this.IncompleteExpiredEventHandler,
                                                                                                ec =>
            {
                ++expiredRecords;
                Assert.IsTrue(ec.IsComplete);
            });

            var start = DateTime.Now;

            coll.ProcessEvent(1, CreateStartEvent(start));
            coll.ProcessEvent(1, CreateEndEvent(start));
            coll.ProcessEvent(2, CreateAnyEvent(start + new TimeSpan(0, 0, 2)));

            Assert.AreEqual(1, expiredRecords);
        }
        public void NegativeExpirationValuesAreTreatedAsPositive()
        {
            var maxIncomplete = new TimeSpan(0, 0, -5);

            Assert.IsTrue(0 > maxIncomplete.TotalSeconds);
            var maxComplete = new TimeSpan(0, 0, -1);

            Assert.IsTrue(0 > maxComplete.TotalSeconds);

            int expiredIncomplete = 0;
            int expiredComplete   = 0;
            var coll = new ExpiringCompositeEventCollection <int, TestCompositeEvent>(maxIncomplete, maxComplete,
                                                                                      ec => { ++expiredIncomplete; },
                                                                                      ec =>
            {
                ++expiredComplete;
                Assert.IsTrue(ec.IsComplete);
            });

            var start = DateTime.Now;

            coll.ProcessEvent(1, CreateStartEvent(start));
            coll.ProcessEvent(1, CreateEndEvent(start));
            coll.ProcessEvent(2, CreateAnyEvent(start));

            coll.Expire(start);
            Assert.AreEqual(0, expiredIncomplete);
            Assert.AreEqual(0, expiredComplete);

            coll.Expire(start + new TimeSpan(0, 0, 2));
            Assert.AreEqual(0, expiredIncomplete);
            Assert.AreEqual(1, expiredComplete);

            coll.Expire(start + new TimeSpan(0, 0, 6));
            Assert.AreEqual(1, expiredIncomplete);
            Assert.AreEqual(1, expiredComplete);
        }
        public void NegativeExpirationValuesAreTreatedAsPositive()
        {
            var maxIncomplete = new TimeSpan(0, 0, -5);
            Assert.IsTrue(0 > maxIncomplete.TotalSeconds);
            var maxComplete = new TimeSpan(0, 0, -1);
            Assert.IsTrue(0 > maxComplete.TotalSeconds);

            int expiredIncomplete = 0;
            int expiredComplete = 0;
            var coll = new ExpiringCompositeEventCollection<int, TestCompositeEvent>(maxIncomplete, maxComplete,
                                                                                     ec => { ++expiredIncomplete; },
                                                                                     ec =>
                                                                                     {
                                                                                         ++expiredComplete;
                                                                                         Assert.IsTrue(ec.IsComplete);
                                                                                     });

            var start = DateTime.Now;
            coll.ProcessEvent(1, CreateStartEvent(start));
            coll.ProcessEvent(1, CreateEndEvent(start));
            coll.ProcessEvent(2, CreateAnyEvent(start));

            coll.Expire(start);
            Assert.AreEqual(0, expiredIncomplete);
            Assert.AreEqual(0, expiredComplete);

            coll.Expire(start + new TimeSpan(0, 0, 2));
            Assert.AreEqual(0, expiredIncomplete);
            Assert.AreEqual(1, expiredComplete);

            coll.Expire(start + new TimeSpan(0, 0, 6));
            Assert.AreEqual(1, expiredIncomplete);
            Assert.AreEqual(1, expiredComplete);
        }
        public void RecordsAreFoundByTryGetValue()
        {
            var maxIncomplete = new TimeSpan(0, 0, 5);
            var maxComplete = new TimeSpan(0, 0, 1);
            var coll = new ExpiringCompositeEventCollection<int, TestCompositeEvent>(maxIncomplete, maxComplete,
                                                                                     this.IncompleteExpiredEventHandler,
                                                                                     this.CompleteExpiredEventHandler);

            var start = DateTime.Now;
            coll.ProcessEvent(1, CreateStartEvent(start));
            TestCompositeEvent val;
            Assert.IsTrue(coll.TryGetValue(1, out val));
            Assert.IsNotNull(val);
            coll.ProcessEvent(1, CreateEndEvent(start));
            TestCompositeEvent val2;
            Assert.IsTrue(coll.TryGetValue(1, out val2));
            Assert.AreSame(val, val2);
        }
        public void ManualExpirationCausesRecordsToExpire()
        {
            var maxIncomplete = new TimeSpan(0, 0, 5);
            var maxComplete = new TimeSpan(0, 0, 1);

            int expiredIncomplete = 0;
            int expiredComplete = 0;
            var coll = new ExpiringCompositeEventCollection<int, TestCompositeEvent>(maxIncomplete, maxComplete,
                                                                                     ec => { ++expiredIncomplete; },
                                                                                     ec =>
                                                                                     {
                                                                                         ++expiredComplete;
                                                                                         Assert.IsTrue(ec.IsComplete);
                                                                                     });

            var start = DateTime.Now;
            coll.ProcessEvent(1, CreateStartEvent(start));
            coll.ProcessEvent(1, CreateEndEvent(start));
            coll.ProcessEvent(2, CreateAnyEvent(start));

            coll.Expire(start);
            Assert.AreEqual(0, expiredIncomplete);
            Assert.AreEqual(0, expiredComplete);

            coll.Expire(start + new TimeSpan(0, 0, 2));
            Assert.AreEqual(0, expiredIncomplete);
            Assert.AreEqual(1, expiredComplete);

            coll.Expire(start + new TimeSpan(0, 0, 6));
            Assert.AreEqual(1, expiredIncomplete);
            Assert.AreEqual(1, expiredComplete);
        }
        public void IncompleteRecordsAreNotExpiredIfEventsOccurAtExactlyMaxRecordAge()
        {
            var maxIncomplete = new TimeSpan(0, 0, 5);
            var maxComplete = new TimeSpan(0, 0, 1);

            int expiredRecords = 0;
            var coll = new ExpiringCompositeEventCollection<int, TestCompositeEvent>(maxIncomplete, maxComplete,
                                                                                     ec => { ++expiredRecords; },
                                                                                     this.CompleteExpiredEventHandler);

            var start = DateTime.Now;
            coll.ProcessEvent(1, CreateStartEvent(start));
            coll.ProcessEvent(2, CreateAnyEvent(start + maxIncomplete));

            Assert.AreEqual(0, expiredRecords);
        }
        public void FlushCausesCompleteRecordsToBeExpiredExpiration()
        {
            int expiredComplete = 0;
            var coll = new ExpiringCompositeEventCollection<int, TestCompositeEvent>(new TimeSpan(0, 0, 5),
                                                                                     new TimeSpan(0, 0, 5),
                                                                                     ec => { },
                                                                                     ec =>
                                                                                     {
                                                                                         ++expiredComplete;
                                                                                         Assert.IsTrue(ec.IsComplete);
                                                                                     });

            var start = DateTime.Now;
            coll.ProcessEvent(1, CreateStartEvent(start));
            coll.ProcessEvent(1, CreateEndEvent(start));
            Assert.AreEqual(0, expiredComplete);

            coll.FlushComplete();
            Assert.AreEqual(1, expiredComplete);
        }
        public void ExpiredRecordsAreNotFoundByTryGetValue()
        {
            var maxIncomplete = new TimeSpan(0, 0, 5);
            var maxComplete = new TimeSpan(0, 0, 1);

            int expiredRecords = 0;
            var coll = new ExpiringCompositeEventCollection<int, TestCompositeEvent>(maxIncomplete, maxComplete,
                                                                                     ec => { ++expiredRecords; },
                                                                                     ec =>
                                                                                     {
                                                                                         ++expiredRecords;
                                                                                         Assert.IsTrue(ec.IsComplete);
                                                                                     });

            var start = DateTime.Now;
            coll.ProcessEvent(1, CreateStartEvent(start));
            coll.ProcessEvent(1, CreateEndEvent(start));
            coll.Expire(start + maxComplete + new TimeSpan(0, 0, 1));
            Assert.AreEqual(1, expiredRecords);
            TestCompositeEvent val;
            Assert.IsFalse(coll.TryGetValue(1, out val));

            coll.ProcessEvent(2, CreateAnyEvent(start));
            coll.Expire(start + maxIncomplete + new TimeSpan(0, 0, 1));
            Assert.AreEqual(2, expiredRecords);
            Assert.IsFalse(coll.TryGetValue(2, out val));
        }
        public void CompleteRecordsAreExpiredWhenEventsOccurBeyondMaxRecordAge()
        {
            var maxIncomplete = new TimeSpan(0, 0, 5);
            var maxComplete = new TimeSpan(0, 0, 1);

            int expiredRecords = 0;
            var coll = new ExpiringCompositeEventCollection<int, TestCompositeEvent>(maxIncomplete, maxComplete,
                                                                                     this.IncompleteExpiredEventHandler,
                                                                                     ec =>
                                                                                     {
                                                                                         ++expiredRecords;
                                                                                         Assert.IsTrue(ec.IsComplete);
                                                                                     });

            var start = DateTime.Now;
            coll.ProcessEvent(1, CreateStartEvent(start));
            coll.ProcessEvent(1, CreateEndEvent(start));
            coll.ProcessEvent(2, CreateAnyEvent(start + new TimeSpan(0, 0, 2)));

            Assert.AreEqual(1, expiredRecords);
        }