Ejemplo n.º 1
0
        public void When_I_generate_a_receipt_with_quantity_discount()
        {
            var sut            = new ReceiptGenerator();
            var productCatalog = new ProductCatalog();

            productCatalog.AddProduct("apple", 0.75m);
            productCatalog.AddProduct("banana", 1.00m);
            productCatalog.AddQuantityDiscount("apple", 3, 2.00m);
            var transaction = new CheckoutTransaction(productCatalog, new Promotions(new List <IPromotionalDiscountRule>()
            {
                new AdditionalItemDiscountRule(productCatalog), new QuantityDiscountRule(productCatalog)
            }));

            transaction.AddItem("apple");
            transaction.AddItem("banana");
            transaction.AddItem("apple");
            transaction.AddItem("apple");
            transaction.AddItem("apple");
            transaction.AddItem("apple");
            transaction.AddItem("apple");
            transaction.AddItem("apple");

            var actual = sut.Generate(transaction);

            Assert.That(actual, Is.EqualTo("Receipt:\n7 apple @ $0.75 is $5.25\n***Discount on apple: Buy 3 apple for $2.00, New Price $4.75, Savings $0.50\n1 banana @ $1.00 is $1.00\nTotal is $5.75"));
        }
Ejemplo n.º 2
0
        public void When_quantity_discount_is_added()
        {
            var sut = new ProductCatalog();

            sut.AddQuantityDiscount("apple", 3, 2.00m);

            Assert.That(sut.QuantityDiscounts.Count(), Is.EqualTo(1));
            Assert.True(sut.QuantityDiscounts.First(p => p.Barcode == "apple").DiscountPrice == 2.00m);
            Assert.True(sut.QuantityDiscounts.First(p => p.Barcode == "apple").DiscountQuantity == 3.00m);
        }
Ejemplo n.º 3
0
        public void When_constructed_with_applicable_quantity_discount_but_no_matching_items()
        {
            var productCatalog = new ProductCatalog();
            productCatalog.AddProduct("apple", 0.75m);
            productCatalog.AddProduct("banana", 1.00m);
            productCatalog.AddQuantityDiscount("apple", 2, 2.00m);
            var sut = new Bill(new List<string>() { "banana" }, productCatalog, new Promotions(new List<IPromotionalDiscountRule>() { new AdditionalItemDiscountRule(productCatalog), new QuantityDiscountRule(productCatalog)}));

            Assert.That(sut.Total, Is.EqualTo(1.00m));
            Assert.That(sut.LineItems.Count(), Is.EqualTo(1));
        }
Ejemplo n.º 4
0
        public void Begin()
        {
            if (!_cartData.Any())
            {
                _consoleWriter.WriteLine("Error cart is empty");
                return;
            }

            var productCatalog = new ProductCatalog();

            foreach (var productCatalogLine in _productCatalogData)
            {
                var parts = productCatalogLine.Split(',');
                if (parts[0] == "PRODUCT")
                {
                    var barcode = parts[1].Trim();
                    var price   = Decimal.Parse(parts[2]);
                    productCatalog.AddProduct(barcode, price);
                }
                else if (parts[0] == "QUANTITY_DISCOUNT")
                {
                    var barcode       = parts[1].Trim();
                    var quantity      = Convert.ToInt32(parts[2]);
                    var discountPrice = Convert.ToDecimal(parts[3]);
                    productCatalog.AddQuantityDiscount(barcode, quantity, discountPrice);
                }
                else if (parts[0] == "ADDITIONAL_ITEM_DISCOUNT")
                {
                    var barcode            = parts[1].Trim();
                    var quantity           = Convert.ToInt32(parts[2]);
                    var quantityDiscounted = Convert.ToInt32(parts[3]);
                    var dicountPercentage  = Convert.ToDouble(parts[4]);
                    productCatalog.AddAdditionalItemDiscount(barcode, quantity, quantityDiscounted, dicountPercentage);
                }
            }

            var promotionalDiscountRules = new List <IPromotionalDiscountRule>()
            {
                new AdditionalItemDiscountRule(productCatalog), new QuantityDiscountRule(productCatalog)
            };
            var transaction = new CheckoutTransaction(productCatalog, new Promotions(promotionalDiscountRules));

            foreach (var cartLine in _cartData)
            {
                transaction.AddItem(cartLine);
            }

            var reportGenerator = new ReceiptGenerator();
            var receipt         = reportGenerator.Generate(transaction);

            _consoleWriter.WriteLine(receipt);
        }
        public void When_promotion_applies()
        {
            var productCatalog = new ProductCatalog();
            productCatalog.AddQuantityDiscount("apple", 3, 2);
            productCatalog.AddProduct("apple", 0.75m);
            var sut = new QuantityDiscountRule(productCatalog);
            var promotions = new Promotions(new List<IPromotionalDiscountRule>() { sut });
            var lineItem = new LineItem("apple", 7, productCatalog, promotions);

            var actual = sut.PromotionApplies(lineItem);

            Assert.That(actual, Is.True);
        }
        public void When_calculating_rule()
        {
            var productCatalog = new ProductCatalog();
            productCatalog.AddQuantityDiscount("apple", 3, 2);
            productCatalog.AddProduct("apple", 0.75m);
            var sut = new QuantityDiscountRule(productCatalog);
            var promotions = new Promotions(new List<IPromotionalDiscountRule>() { sut });
            var lineItem = new LineItem("apple", 7, productCatalog, promotions);

            var actual = sut.Calculate(lineItem);

            Assert.That(actual.DiscountedSubTotal, Is.EqualTo(4.75m));
            Assert.That(actual.DiscountNote, Is.EqualTo("***Discount on apple: Buy 3 apple for $2.00, New Price $4.75, Savings $0.50"));
        }
        public void When_constructed_with_quantity_discount()
        {
            var productCatalog = new ProductCatalog();
            productCatalog.AddProduct("apple", 0.75m);
            productCatalog.AddProduct("banana", 1.00m);
            productCatalog.AddQuantityDiscount("apple", 3, 2.00m);
            var sut = new LineItem("apple", 7, productCatalog, new Promotions(new List<IPromotionalDiscountRule>() { new AdditionalItemDiscountRule(productCatalog), new QuantityDiscountRule(productCatalog) }));

            Assert.That(sut.Barcode, Is.EqualTo("apple"));
            Assert.That(sut.Quantity, Is.EqualTo(7));
            Assert.That(sut.PricePerUnit, Is.EqualTo(0.75m));
            Assert.That(sut.SubTotal, Is.EqualTo(5.25m));
            Assert.That(sut.DiscountedSubTotal, Is.EqualTo(4.75m));
            Assert.That(sut.DiscountNote, Is.EqualTo("***Discount on apple: Buy 3 apple for $2.00, New Price $4.75, Savings $0.50"));
        }
        public void When_promotion_applies()
        {
            var productCatalog = new ProductCatalog();

            productCatalog.AddQuantityDiscount("apple", 3, 2);
            productCatalog.AddProduct("apple", 0.75m);
            var sut        = new QuantityDiscountRule(productCatalog);
            var promotions = new Promotions(new List <IPromotionalDiscountRule>()
            {
                sut
            });
            var lineItem = new LineItem("apple", 7, productCatalog, promotions);

            var actual = sut.PromotionApplies(lineItem);

            Assert.That(actual, Is.True);
        }
Ejemplo n.º 9
0
        public void When_constructed_with_applicable_quantity_discount_but_no_matching_items()
        {
            var productCatalog = new ProductCatalog();

            productCatalog.AddProduct("apple", 0.75m);
            productCatalog.AddProduct("banana", 1.00m);
            productCatalog.AddQuantityDiscount("apple", 2, 2.00m);
            var sut = new Bill(new List <string>()
            {
                "banana"
            }, productCatalog, new Promotions(new List <IPromotionalDiscountRule>()
            {
                new AdditionalItemDiscountRule(productCatalog), new QuantityDiscountRule(productCatalog)
            }));

            Assert.That(sut.Total, Is.EqualTo(1.00m));
            Assert.That(sut.LineItems.Count(), Is.EqualTo(1));
        }
        public void When_calculating_rule()
        {
            var productCatalog = new ProductCatalog();

            productCatalog.AddQuantityDiscount("apple", 3, 2);
            productCatalog.AddProduct("apple", 0.75m);
            var sut        = new QuantityDiscountRule(productCatalog);
            var promotions = new Promotions(new List <IPromotionalDiscountRule>()
            {
                sut
            });
            var lineItem = new LineItem("apple", 7, productCatalog, promotions);

            var actual = sut.Calculate(lineItem);

            Assert.That(actual.DiscountedSubTotal, Is.EqualTo(4.75m));
            Assert.That(actual.DiscountNote, Is.EqualTo("***Discount on apple: Buy 3 apple for $2.00, New Price $4.75, Savings $0.50"));
        }
Ejemplo n.º 11
0
        public void When_constructed_with_quantity_discount()
        {
            var productCatalog = new ProductCatalog();

            productCatalog.AddProduct("apple", 0.75m);
            productCatalog.AddProduct("banana", 1.00m);
            productCatalog.AddQuantityDiscount("apple", 3, 2.00m);
            var sut = new LineItem("apple", 7, productCatalog, new Promotions(new List <IPromotionalDiscountRule>()
            {
                new AdditionalItemDiscountRule(productCatalog), new QuantityDiscountRule(productCatalog)
            }));

            Assert.That(sut.Barcode, Is.EqualTo("apple"));
            Assert.That(sut.Quantity, Is.EqualTo(7));
            Assert.That(sut.PricePerUnit, Is.EqualTo(0.75m));
            Assert.That(sut.SubTotal, Is.EqualTo(5.25m));
            Assert.That(sut.DiscountedSubTotal, Is.EqualTo(4.75m));
            Assert.That(sut.DiscountNote, Is.EqualTo("***Discount on apple: Buy 3 apple for $2.00, New Price $4.75, Savings $0.50"));
        }