private static Basket GetBasketInstance() { var discountFactory = new DiscountRuleFactory(); var calculator = new BasketPriceCalculator(discountFactory); return(new Basket(calculator)); }
public void BasketCalculatorShouldCorrectlyCalculateFinalOutput() { var products = new[] { "Apples", "Milk", "Bread" }; var basketBuilder = new Mock <IBasketBuilder>(); var discountType = new Offer { DiscountCode = "TenPercentOff", DiscountDetail = "Apples 10% off", ProductId = 1 }; var basketItems = new List <BasketItem> { new BasketItem { ProductId = 1, OfferType = discountType, NumberOfItems = 1, PricePerItem = 100 }, new BasketItem { ProductId = 2, OfferType = null, NumberOfItems = 1, PricePerItem = 130, }, new BasketItem { OfferType = null, ProductId = 3, NumberOfItems = 1, PricePerItem = 80 } }; basketBuilder.Setup(builder => builder.Build(products)).Returns( basketItems ); var discountCalculator = new Mock <IDiscountCalculator>(); var validDiscounts = new List <ValidDiscount> { new ValidDiscount { DiscountAmount = 10.0m, OfferType = discountType } }; discountCalculator.Setup(calculator => calculator.GetDiscountsApplied(basketItems)).Returns( validDiscounts); var expectedResult = new[] { "Subtotal: £3.10", "Apples 10% off: -10p", "Total: £3.00" }; var sut = new BasketPriceCalculator(discountCalculator.Object, basketBuilder.Object); var actualResult = sut.Calculate(products); CollectionAssert.AreEqual(expectedResult.ToList(), actualResult.ToList()); }
public void CalculatorSumsRightAmountOnSingleBook() { var basket = new Basket(); basket.Add(Book.A); var basketCalculator = new BasketPriceCalculator(basket, 8m); var discountedBasketTotal = basketCalculator.CalculateBasketTotal(); Assert.Equal(8m, discountedBasketTotal); }
public void CalculatorSumsRightAmountOnSingleDistinctGroupOfBooks() { var basket = new Basket(); basket.Add(Book.A); basket.Add(Book.B); basket.Add(Book.C); basket.Add(Book.D); basket.Add(Book.E); var basketCalculator = new BasketPriceCalculator(basket, 8m); var discountedBasketTotal = basketCalculator.CalculateBasketTotal(); Assert.Equal(30m, discountedBasketTotal); }
public void GivenBasketItem_Percentage_WhenApplyDiscount_ThenItemIsUpdatedCorrectly() { var discountFactory = new DiscountRuleFactory(); var calculator = new BasketPriceCalculator(discountFactory); var item = new BasketItem { Quantity = 2, AfterDiscountPrice = 0, DiscountParameter = 10, DiscountRuleType = DiscountRuleType.Percentage, Product = new Product { Price = (decimal)20.10 } }; calculator.ApplyDiscount(item); Assert.AreEqual(36.18, item.AfterDiscountPrice); }
public void GivenBasketItem_Buy2Get1Free_WhenApplyDiscount_ThenItemIsUpdatedCorrectly() { var discountFactory = new DiscountRuleFactory(); var calculator = new BasketPriceCalculator(discountFactory); var item = new BasketItem { Quantity = 3, AfterDiscountPrice = (decimal)10.50, DiscountRuleType = DiscountRuleType.BuyManyGetOneFree, DiscountParameter = 3, Product = new Product { Price = (decimal)10.50 } }; calculator.ApplyDiscount(item); Assert.AreEqual(21, item.AfterDiscountPrice); }
public void GivenBasketItems_WhenCalculateTotal_ThenReturnsCorrectTotal() { var discountFactory = new DiscountRuleFactory(); var calculator = new BasketPriceCalculator(discountFactory); var item = new BasketItem { Quantity = 2, AfterDiscountPrice = (decimal)10.50, DiscountRuleType = DiscountRuleType.BuyManyGetOneFree, DiscountParameter = 2, Product = new Product { Price = (decimal)10.50 } }; var items = Enumerable.Repeat(item, 3); var total = calculator.CalculateTotal(items); Assert.AreEqual(31.50, total); }