public void PopExpiredGroups_ExpiredGroups_Should_Return()
        {
            var delayedGroupCache = new DelayedGroupCache <MockItem>();
            var delaySpan         = TimeSpan.FromSeconds(2);
            var groupCount        = 5;
            var itemCount         = 3;
            var spanSecond        = 1;
            var startAt           = _mockNow;

            //0:00,0:01,0:02
            //     0:01,0:02,0:03
            //          0:02,0:03,0:04
            //               0:03,0:04,0:05
            //                    0:04,0:05,0:06
            //pop at: [0:06]
            //expired groups: early than [0:06] - 2 = [0.04] => group 0,1,2 should return

            delayedGroupCache.DelaySpan = delaySpan;
            var mockCommands = CreateGroupCommands(groupCount, itemCount, spanSecond, startAt);

            delayedGroupCache.AppendToGroups(mockCommands, item => item.GroupKey, item => item.CreateAt);
            var popAt            = mockCommands.Max(x => x.CreateAt);
            var popExpiredGroups = delayedGroupCache.PopExpiredGroups(popAt);

            ShowCache(delayedGroupCache);
            CheckGroups(popExpiredGroups, itemCount, 3);
        }
 private void ShowCache(DelayedGroupCache <MockItem> cache)
 {
     "-------cache info--------".Log();
     foreach (var delayedGroup in cache.DelayedGroups.Values)
     {
         string.Format("{0} count: {1}, LastItemDate: {2:yyyy-MM-dd HH:ss:mm}", delayedGroup.GroupKey, delayedGroup.Items.Count, delayedGroup.LastItemDate).Log();
     }
     "-------------------------".Log();
     "".Log();
 }
        public void PopExpiredGroups_Empty_Should_Return_Empty()
        {
            var delayedGroupCache = new DelayedGroupCache <MockItem>();
            var delaySpan         = TimeSpan.FromSeconds(2);

            delayedGroupCache.DelaySpan = delaySpan;
            var popAt            = _mockNow.AddSeconds(10);
            var popExpiredGroups = delayedGroupCache.PopExpiredGroups(popAt);

            ShowCache(delayedGroupCache);
            CheckGroups(popExpiredGroups, 0, 0);
        }
        public void AppendToGroups_GetGroupKeyNull_Should_Throws()
        {
            AssertHelper.ShouldThrows <ArgumentNullException>(() =>
            {
                var delayedGroupCache = new DelayedGroupCache <MockItem>();
                delayedGroupCache.AppendToGroups(new List <MockItem>(), null, item => item.CreateAt);
            });

            AssertHelper.ShouldThrows <ArgumentNullException>(() =>
            {
                var delayedGroupCache = new DelayedGroupCache <MockItem>();
                delayedGroupCache.AppendToGroups(new List <MockItem>(), item => item.GroupKey, null);
            });
        }
        public void AppendToGroups_ComputeGroups_Should_Ok()
        {
            var delayedGroupCache = new DelayedGroupCache <MockItem>();
            var groupCount        = 5;
            var itemCount         = 3;
            var spanSecond        = 1;
            var startAt           = _mockNow;
            //0:00,0:01,0:02
            //     0:01,0:02,0:03
            //          0:02,0:03,0:04
            //               0:03,0:04,0:05
            //                    0:04,0:05,0:06
            var mockCommands = CreateGroupCommands(groupCount, itemCount, spanSecond, startAt);

            delayedGroupCache.AppendToGroups(mockCommands, item => item.GroupKey, item => item.CreateAt);
            var delayedGroups = delayedGroupCache.DelayedGroups.Values.ToList();

            CheckGroups(delayedGroups, itemCount, groupCount);
        }
        public void AppendToGroups_ItemsNullOrEmpty_Should_NoEffect()
        {
            var delayedGroupCache = new DelayedGroupCache <MockItem>();

            delayedGroupCache.AppendToGroups(null, item => item.GroupKey, item => item.CreateAt);
        }