Beispiel #1
0
        public void When_checkout_transaction_is_created()
        {
            var productCatalog = new ProductCatalog();
            var sut            = new CheckoutTransaction(productCatalog, new Promotions(new List <IPromotionalDiscountRule>()));

            Assert.That(sut.Bill.Total, Is.EqualTo(0));
        }
        public void When_checkout_transaction_is_created()
        {
            var productCatalog = new ProductCatalog();
            var sut = new CheckoutTransaction(productCatalog, new Promotions(new List<IPromotionalDiscountRule>()));

            Assert.That(sut.Bill.Total, Is.EqualTo(0));
        }
Beispiel #3
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"));
        }
Beispiel #4
0
        private string AddRegularPriceLineItem(CheckoutTransaction transaction, string barcode)
        {
            var lineItem = transaction.Bill.LineItems.SingleOrDefault(i => i.Barcode == barcode);
            var output   = "";

            if (lineItem != null)
            {
                var note = lineItem.DiscountNote + (string.IsNullOrEmpty(lineItem.DiscountNote) ? "" : "\n");
                output = $"{lineItem.Quantity} {lineItem.Barcode} @ {lineItem.PricePerUnit:C2} is {lineItem.SubTotal:C2}\n{note}";
            }
            return(output);
        }
        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);
        }
Beispiel #6
0
        public string Generate(CheckoutTransaction transaction)
        {
            var receipt = "Receipt:\n";

            foreach (var barcode in transaction.Items.GroupBy(i => i, i => i, (k, j) => k))
            {
                receipt += AddRegularPriceLineItem(transaction, barcode);
            }

            receipt += $"Total is {transaction.Bill.Total:C2}";

            return(receipt);
        }
        public void When_add_some_items()
        {
            var expected = new List<string>() { "apple", "banana", "apple" };
            var productCatalog = new ProductCatalog();
            productCatalog.AddProduct("apple", 0.75m);
            productCatalog.AddProduct("banana", 1.00m);
            var sut = new CheckoutTransaction(productCatalog, new Promotions(new List<IPromotionalDiscountRule>()));
            sut.AddItem("apple");
            sut.AddItem("banana");
            sut.AddItem("apple");

            Assert.That(sut.Bill.Total, Is.EqualTo(2.50m));
            CollectionAssert.AreEquivalent(expected, sut.Items);
        }
Beispiel #8
0
        public void When_I_generate_a_receipt_with_regular_prices()
        {
            var sut            = new ReceiptGenerator();
            var productCatalog = new ProductCatalog();

            productCatalog.AddProduct("apple", 0.75m);
            productCatalog.AddProduct("banana", 1.00m);
            var transaction = new CheckoutTransaction(productCatalog, new Promotions(new List <IPromotionalDiscountRule>()));

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

            var actual = sut.Generate(transaction);

            Assert.That(actual, Is.EqualTo("Receipt:\n2 apple @ $0.75 is $1.50\n1 banana @ $1.00 is $1.00\nTotal is $2.50"));
        }
Beispiel #9
0
        public void When_add_some_items()
        {
            var expected = new List <string>()
            {
                "apple", "banana", "apple"
            };
            var productCatalog = new ProductCatalog();

            productCatalog.AddProduct("apple", 0.75m);
            productCatalog.AddProduct("banana", 1.00m);
            var sut = new CheckoutTransaction(productCatalog, new Promotions(new List <IPromotionalDiscountRule>()));

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

            Assert.That(sut.Bill.Total, Is.EqualTo(2.50m));
            CollectionAssert.AreEquivalent(expected, sut.Items);
        }