public void ThatSkipsUnpricedItems() { var offer = new DiscountPricingOffer("test", .1, true); var basketItemsByName = new Dictionary <string, BasketItemPrice>() { { "test", new BasketItemPrice { Name = "test", Quantity = 10 } } }; var results = new BasketPricingResults() { Messages = new List <string>() }; offer.ApplyOffers(basketItemsByName, results); var appliedDiscount = basketItemsByName["test"].Discount; Assert.That(appliedDiscount, Is.Null); }
public void ThatCanApplyDiscountsOnAllMatchingItems() { var offer = new DiscountPricingOffer("test", .1, true); var basketItemsByName = new Dictionary <string, BasketItemPrice>() { { "test", new BasketItemPrice { Name = "test", UnitPrice = 150, Quantity = 10 } } }; var results = new BasketPricingResults() { Messages = new List <string>() }; offer.ApplyOffers(basketItemsByName, results); var appliedDiscount = basketItemsByName["test"].Discount; Assert.That(appliedDiscount, Is.EqualTo(150)); }
public void ThatMapsCollection() { var mapper = new PricingResultMapper(); var resultToMapFrom = new BasketPricingResults() { Messages = new[] { "test" } }; var mappedResult = mapper.Map(resultToMapFrom); CollectionAssert.AreEqual(resultToMapFrom.Messages, mappedResult.Messages); Assert.That(mappedResult.Messages, Is.Not.SameAs(resultToMapFrom.Messages)); }
public void ThatCanSkipItemsThatAreNotUnderOffer() { var offer = new DiscountPricingOffer("test", .1, true); var basketItemsByName = new Dictionary <string, BasketItemPrice>(); var results = new BasketPricingResults() { Messages = new List <string>() }; offer.ApplyOffers(basketItemsByName, results); Assert.That(results.Messages, Is.Empty); }
public void ThatMapsProperties() { var mapper = new PricingResultMapper(); var resultToMapFrom = new BasketPricingResults() { FullPrice = 100, DiscountedPrice = 50 }; var mappedResult = mapper.Map(resultToMapFrom); Assert.That(mappedResult.SubTotal, Is.EqualTo(resultToMapFrom.FullPrice)); Assert.That(mappedResult.Total, Is.EqualTo(resultToMapFrom.DiscountedPrice)); CollectionAssert.AreEqual(resultToMapFrom.Messages, mappedResult.Messages); }
public PricingResult Map(BasketPricingResults basketPricingResults) { if (basketPricingResults is null) { throw new System.ArgumentNullException(nameof(basketPricingResults)); } return(new PricingResult { SubTotal = basketPricingResults.FullPrice, Total = basketPricingResults.DiscountedPrice, Messages = basketPricingResults.Messages == null ? null : new List <string>(basketPricingResults.Messages) }); }
public void ThatCanSkipItemsThatAreNotUnderOffer() { var offer = new ConditionalOffer("aaa", 3, "bbb", .05m); var basketItemsByName = new Dictionary <string, BasketItemPrice>() { { "test", new BasketItemPrice { Name = "test", UnitPrice = 150, Quantity = 1 } } }; var results = new BasketPricingResults() { Messages = new List <string>() }; offer.ApplyOffers(basketItemsByName, results); }
public void ThatCanApplyOfferOnceOnly() { // 10% offer on bb if i take 3 aaa var offer = new ConditionalOffer("aaa", 3, "bbb", .10m); var basketItemsByName = new Dictionary <string, BasketItemPrice>() { { "aaa", new BasketItemPrice { Name = "aaa", UnitPrice = 150, Quantity = 3 } }, { "bbb", new BasketItemPrice { Name = "bbb", UnitPrice = 100, Quantity = 2 } } }; var results = new BasketPricingResults() { Messages = new List <string>() }; offer.ApplyOffers(basketItemsByName, results); var discount = basketItemsByName["bbb"].Discount; Assert.That(discount, Is.EqualTo(10)); }
public void ApplyOffers(IDictionary <string, BasketItemPrice> basketItemsByItemName, BasketPricingResults results) { if (!basketItemsByItemName.TryGetValue(basketItem, out var item)) { return; } if (!item.UnitPrice.HasValue) { results.Messages.Add(string.Format(IBasketPricingOffer.Errors.CannotDiscountUnpricedItem, this.basketItem)); return; } var price = canBeCumulated ? item.Discount ?? item.UnitPrice : item.UnitPrice; var discount = price * (decimal)(percentDiscount) * item.Quantity; results.Messages.Add($"{basketItem} {percentDiscount:P2} off: -£{discount}"); item.Discount = discount; }
public void ApplyOffers(IDictionary <string, BasketItemPrice> basketItemsByItemName, BasketPricingResults results) { var conditionalItemFound = basketItemsByItemName.TryGetValue(conditionalItem, out var basketItem) && basketItem.Quantity >= quantity; if (!conditionalItemFound) { return; } var canApplyOffers = basketItemsByItemName.TryGetValue(offer, out var basketItemToDiscount); if (!canApplyOffers) { return; } if (!basketItemToDiscount.UnitPrice.HasValue) { results.Messages.Add(string.Format(IBasketPricingOffer.Errors.CannotDiscountUnpricedItem)); return; } var itemsICanDiscount = basketItem.Quantity / quantity; if (itemsICanDiscount >= basketItemToDiscount.Quantity) { // all basketItemToDiscount.Discount = basketItemToDiscount.Quantity * basketItemToDiscount.UnitPrice.Value * discount; results.Messages.Add($"All {offer} received {discount:P2} discount: -£{basketItemToDiscount.Discount}"); return; } // only a smaller number basketItemToDiscount.Discount = itemsICanDiscount * basketItemToDiscount.UnitPrice * discount; results.Messages.Add($"{itemsICanDiscount} {offer}s received {discount:P2} discount: -£{basketItemToDiscount.Discount}"); return; }