public void Add_WhenItemIsNotInsideOfWindowRangeButItsBucketIs_ShouldIncludeTheBucketInWindow()
        {
            // Arrange
            var items  = CreateTradeItemsList(new[] { 0, 990 }, new[] { 10, 20 });
            var window = new SlidingWindow <Trade>(TimeSpan.FromMilliseconds(999), 100, Trade.CreateCalculation, testDateTimeProvider);

            // Act
            testDateTimeProvider.Now = items[0].TimeStamp;
            window.Add(items[0]);
            testDateTimeProvider.Now = items[1].TimeStamp;
            window.Add(items[1]);
            var calculation = window.GetCalculationFor(items[0].TimeStamp.AddMilliseconds(900)) as Calculation;

            // Assert
            Assert.Equal((15, 2), (calculation.Volume, calculation.CurrentCount));
        }
        public void SlidingWindow_IfShiftToRight_AdjustsCorrectly(int shift, int expectedVolume, int expectedCount)
        {
            // Arrange
            var items = CreateTradeItemsList(new[] { -1000, -900, -800, -700, -600, -500, -400, -300, -200, -100, 0 },
                                             new[] { 1000, 900, 800, 700, 600, 500, 400, 300, 200, 100, 0 });

            var window = new SlidingWindow <Trade>(TimeSpan.FromMilliseconds(500), 10, Trade.CreateCalculation, testDateTimeProvider);

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

            var currentCalculation = window.GetCurrentWindowCalculation() as Calculation;
            var shiftRight         = window.GetCalculationFor(testDateTimeProvider.Now.AddMilliseconds(shift)) as Calculation;

            // Assert
            Assert.Equal((1500m / 6, 6), (currentCalculation.Volume, currentCalculation.CurrentCount));
            Assert.Equal((expectedVolume, expectedCount), (shiftRight.Volume, shiftRight.CurrentCount));
        }
        public void SlidingWindow_IfShiftToLeft_AdjustsCorrectly()
        {
            // Arrange
            var trades = CreateTradeItemsList(new[] { -1000, -900, -800, -700, -600, -500, -400, -300, -200, -100, 0 },
                                              new[] { 1000, 900, 800, 700, 600, 500, 400, 300, 200, 100, 0 });

            var window = new SlidingWindow <Trade>(TimeSpan.FromMilliseconds(500), 10, Trade.CreateCalculation, testDateTimeProvider);

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

            var currentCalculation = window.GetCurrentWindowCalculation() as Calculation;
            var shiftLeft          = window.GetCalculationFor(testDateTimeProvider.Now.AddMilliseconds(-250)) as Calculation;

            // Assert
            Assert.Equal((250, 6), (currentCalculation.Volume, currentCalculation.CurrentCount));
            Assert.Equal((2500m / 5, 5), (shiftLeft.Volume, shiftLeft.CurrentCount));
        }