예제 #1
0
        public void Get_Discount_Price_Handles_Different_Rules_For_Same_Unit_When_Sufficient_Quantity_In_Basket()
        {
            var itemA = new StockKeepingUnit("A", 50);
            var itemB = new StockKeepingUnit("B", 30);

            // two A and one B for 70
            DiscountRule rule1 = new DiscountRuleBuilder().WithUnits(itemA, 2).WithUnits(itemB, 1).WithPrice(70).Build();

            // two A for 75
            DiscountRule rule2 = new DiscountRuleBuilder().WithUnits(itemA, 2).WithPrice(75).Build();

            _mockRuleRepository.MockRules = new List <DiscountRule> {
                rule1, rule2
            };

            List <ItemPile> basket = new List <ItemPile>
            {
                new ItemPile(itemA, 4),
                new ItemPile(itemB, 2)
            };

            //both rules should be applied
            decimal result = _pricing.GetDiscountedPrice(basket);

            result.Should().Be(175);
        }
예제 #2
0
        public void Get_Discount_Price_Chooses_The_Best_Discount_For_Basket()
        {
            var itemA = new StockKeepingUnit("A", 50);
            var itemB = new StockKeepingUnit("B", 30);

            // two A for 75
            DiscountRule rule1 = new DiscountRuleBuilder().WithUnits(itemA, 2).WithPrice(75).Build();

            // two A and one B for 70
            DiscountRule rule2 = new DiscountRuleBuilder().WithUnits(itemA, 2).WithUnits(itemB, 1).WithPrice(100).Build();

            _mockRuleRepository.MockRules = new List <DiscountRule> {
                rule1, rule2
            };

            List <ItemPile> basket = new List <ItemPile>
            {
                new ItemPile(itemA, 2),
                new ItemPile(itemB, 1)
            };

            //the rule which renders the smallest price is rule2
            decimal result = _pricing.GetDiscountedPrice(basket);

            result.Should().Be(175);
        }
예제 #3
0
        public void Get_Discount_Price_Applies_Discount_Rule()
        {
            var itemA = new StockKeepingUnit("A", 50);
            var itemB = new StockKeepingUnit("B", 30);

            DiscountRule rule = new DiscountRuleBuilder().WithUnits(itemA, 2).WithUnits(itemB, 1).WithPrice(70).Build();

            _mockRuleRepository.MockRules = new List <DiscountRule> {
                rule
            };

            List <ItemPile> basket = new List <ItemPile>();

            basket.Add(new ItemPile(itemA, 2));
            basket.Add(new ItemPile(itemB, 1));


            decimal result = _pricing.GetDiscountedPrice(basket);

            result.Should().Be(70);
        }
예제 #4
0
        public void Get_Discount_Price_Ignores_Rules_For_Units_Not_In_Basket()
        {
            var itemA = new StockKeepingUnit("A", 50);
            var itemB = new StockKeepingUnit("B", 30);
            var itemC = new StockKeepingUnit("C", 30);

            DiscountRule rule1 = new DiscountRuleBuilder().WithUnits(itemA, 2).WithUnits(itemB, 1).WithPrice(70).Build();
            DiscountRule rule2 = new DiscountRuleBuilder().WithUnits(itemC, 2).WithPrice(50).Build();

            _mockRuleRepository.MockRules = new List <DiscountRule> {
                rule1, rule2
            };

            List <ItemPile> basket = new List <ItemPile>
            {
                new ItemPile(itemA, 3),
                new ItemPile(itemB, 2)
            };

            decimal result = _pricing.GetDiscountedPrice(basket);

            result.Should().Be(150);
        }
예제 #5
0
        public void Get_Discount_Price_Does_Not_Change_Input_Basket_Instance()
        {
            var itemA = new StockKeepingUnit("A", 50);
            var itemB = new StockKeepingUnit("B", 30);

            DiscountRule rule = new DiscountRuleBuilder().WithUnits(itemA, 2).WithUnits(itemB, 1).WithPrice(70).Build();

            _mockRuleRepository.MockRules = new List <DiscountRule> {
                rule
            };

            List <ItemPile> basket = new List <ItemPile>();

            basket.Add(new ItemPile(itemA, 3));
            basket.Add(new ItemPile(itemB, 2));


            decimal result = _pricing.GetDiscountedPrice(basket);

            result.Should().Be(150);
            basket.Count().Should().Be(2);
            basket[0].Quantity.Should().Be(3);
            basket[1].Quantity.Should().Be(2);
        }