public void GetDiscount_WhenAccumulatedDiscountIsEqualToLimit_ReturnsAccumulatedDiscount()
        {
            const int limit       = 20;
            var       rule        = new AccumulatedDiscountLimitRule(limit);
            var       transaction = GetTransaction("2019-10-13");

            var discount = rule.GetDiscount(transaction, limit);

            Assert.Equal(limit, discount);
        }
        public void GetDiscount_WhenTransactionsAreOnSameMonth_LimitsAccumulatedDiscount()
        {
            const int limit        = 20;
            var       rule         = new AccumulatedDiscountLimitRule(limit);
            var       transaction1 = GetTransaction("2019-10-13");
            var       transaction2 = GetTransaction("2019-10-14");
            var       transaction3 = GetTransaction("2019-10-20");

            var discount1 = rule.GetDiscount(transaction1, 10);
            var discount2 = rule.GetDiscount(transaction2, 7);
            var discount3 = rule.GetDiscount(transaction3, 20);

            Assert.Equal(10, discount1);
            Assert.Equal(7, discount2);
            Assert.Equal(3, discount3);
        }
        public void GetDiscount_WhenTransactionsAreOnDifferentMonths_LimitsByMonth()
        {
            const int limit = 20;
            var       rule  = new AccumulatedDiscountLimitRule(limit);
            var       firstMonthTransaction1 = GetTransaction("2019-10-13");
            var       firstMonthTransaction2 = GetTransaction("2019-10-14");

            var secondMonthTransaction1 = GetTransaction("2019-11-10");
            var secondMonthTransaction2 = GetTransaction("2019-11-20");

            var discount1 = rule.GetDiscount(firstMonthTransaction1, 10);
            var discount2 = rule.GetDiscount(firstMonthTransaction2, 9);

            var discount3 = rule.GetDiscount(secondMonthTransaction1, 19);
            var discount4 = rule.GetDiscount(secondMonthTransaction2, 30);

            Assert.Equal(10, discount1);
            Assert.Equal(9, discount2);
            Assert.Equal(19, discount3);
            Assert.Equal(1, discount4);
        }
        public void GetDiscount_WhenTransactionIsNull_ThrowsArgumentNullException()
        {
            var rule = new AccumulatedDiscountLimitRule(20);

            Assert.Throws <ArgumentNullException>("transaction", () => rule.GetDiscount(null, 10));
        }