public void Add_IfTimestampsDifferMoreThanBucketInterval_ShouldCreateNewBucket(int bucketInterval, int shift)
        {
            // Arrange
            var window    = new SlidingWindow <Trade>(TimeSpan.FromMinutes(1), bucketInterval, Trade.CreateCalculation);
            var olderItem = CreateTradeItem(DateTime.Now.AddMilliseconds(shift));
            var newerItem = CreateTradeItem(DateTime.Now);

            // Act
            window.Add(olderItem);
            window.Add(newerItem);

            // Assert
            var buckets      = window.GetBuckets().Item2;
            var firstBucket  = buckets[window.GetTimeStampKey(olderItem.TimeStamp)];
            var secondBucket = buckets[window.GetTimeStampKey(newerItem.TimeStamp)];

            Assert.NotEqual(firstBucket, secondBucket);
        }
        public void Add_NewItemAdded_ShouldCleanUpOldBuckets()
        {
            // Arrange
            var window    = new SlidingWindow <Trade>(TimeSpan.FromMilliseconds(100), 1000, Trade.CreateCalculation, testDateTimeProvider);
            var olderItem = CreateTradeItem(DateTime.Now.AddMilliseconds(-1000));
            var newerItem = CreateTradeItem(DateTime.Now);

            // Act
            testDateTimeProvider.Now = olderItem.TimeStamp;
            window.Add(olderItem);
            testDateTimeProvider.Now = newerItem.TimeStamp;
            window.Add(newerItem);

            // Assert
            var bucketsList = window.GetBuckets().Item1;
            var buckets     = window.GetBuckets().Item2;

            Assert.Single(buckets);
            Assert.Single(bucketsList);
            Assert.False(buckets.ContainsKey(window.GetTimeStampKey(olderItem.TimeStamp)));
            Assert.Equal(window.GetTimeStampKey(newerItem.TimeStamp), bucketsList.First.Value.TimeStampKey);
        }
        public void Add_WhenBucketsAreOlderThanInterval_ShouldRemoveOlderBuckets()
        {
            // Arrange
            var windowInterval = TimeSpan.FromMilliseconds(500);
            var items          = CreateTradeItemsList(new[] { -2000, -1000, 0 }, new[] { 200, 100, 10 });
            var window         = new SlidingWindow <Trade>(windowInterval, 500, Trade.CreateCalculation, testDateTimeProvider);

            // Act
            foreach (var item in items)
            {
                testDateTimeProvider.Now = item.TimeStamp;
                window.Add(item);
            }

            var buckets = window.GetBuckets().Item1;
            var expectedOldestTimeStampKey = window.GetTimeStampKey(testDateTimeProvider.Now.Add(-windowInterval * 2));

            // Assert
            Assert.True(buckets.All(b => b.TimeStampKey >= expectedOldestTimeStampKey));
        }