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));
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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)
            });
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
        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;
        }