コード例 #1
0
        public void Calculate_ShouldThrowException_WithNullProducts()
        {
            // Arrange
            IDateTimeUtil dateTimeUtil = new DateTimeUtil();
            ITimespanDiscountCalculator timespanDiscountCalculator = new TimespanDiscountCalculator(dateTimeUtil);

            // Act & Assert
            Assert.Throws <ArgumentNullException>(() => timespanDiscountCalculator.Calculate(null, null));
        }
コード例 #2
0
        public void Calculate_ShouldReturnDiscountResult_WithCorrectProductsAndModel()
        {
            // Arrange
            Mock <IDateTimeUtil> mockDateTimeUtil = new Mock <IDateTimeUtil>();

            mockDateTimeUtil.Setup(x => x.Now()).Returns(new DateTime(2020, 10, 15));
            ITimespanDiscountCalculator timespanDiscountCalculator = new TimespanDiscountCalculator(mockDateTimeUtil.Object);
            List <Product> products = new List <Product>()
            {
                new Product()
                {
                    Id = 1, Name = "Beans", PluralName = "Beans", Price = 0.65m
                },
                new Product()
                {
                    Id = 2, Name = "Bread", PluralName = "Breads", Price = 0.8m
                },
                new Product()
                {
                    Id = 3, Name = "Milk", PluralName = "Milk", Price = 1.3m
                },
                new Product()
                {
                    Id = 4, Name = "Apple", PluralName = "Apples", Price = 1.0m
                },
            };
            TimespanDiscount timespanDiscount = new TimespanDiscount()
            {
                Id                 = 1,
                BuyingProduct      = products[3],
                From               = new DateTime(2020, 10, 10),
                To                 = new DateTime(2020, 10, 20),
                DiscountedProduct  = products[3],
                DiscountPercentage = 0.1f,
                IsActive           = true
            };
            IEnumerable <BasketItem> items = new List <BasketItem>()
            {
                new BasketItem()
                {
                    Product = new BasketItemProduct()
                    {
                        Id = 4, Name = "Apple", PluralName = "Apples", Price = 1.0m
                    },
                    Quantity = 1
                },
            };

            // Act
            DiscountResult discountResult = timespanDiscountCalculator.Calculate(items, timespanDiscount);

            // Assert
            Assert.Equal(0.1f, discountResult.DiscountPercentage);
            Assert.Equal(0.10m, discountResult.DiscountedPrice);
            Assert.Equal("Apples", discountResult.ProductPluralName);
        }
コード例 #3
0
        private static void CalculatePrice(string commandName, string[] arguments, ICommandInvoker commandInvoker)
        {
            IBasketService           basketService           = new BasketService(dbContext);
            GetProductsByNameCommand getProductByNameCommand = new GetProductsByNameCommand(basketService);

            getProductByNameCommand.ProductNames = arguments;
            commandInvoker.ExecuteCommand(getProductByNameCommand);
            IEnumerable <BasketItem> products = getProductByNameCommand.Result;

            if (products.Count() == 0)
            {
                Console.WriteLine("Given products are not available!");
                return;
            }

            CalculateTotalPriceCommand calculateTotalPriceCommand = AppCommandsByName[commandName] as CalculateTotalPriceCommand;

            calculateTotalPriceCommand.Items = products;
            commandInvoker.ExecuteCommand(calculateTotalPriceCommand);

            decimal basketItemsTotalPrice = calculateTotalPriceCommand.Result;

            Console.WriteLine($"Subtotal: {basketItemsTotalPrice:c}");

            IDateTimeUtil dateTimeUtil = new DateTimeUtil();
            ITimespanDiscountCalculator timespanDiscountCalculator = new TimespanDiscountCalculator(dateTimeUtil);
            IQuantityDiscountCalculator quantityDiscountCalculator = new QuantityDiscountCalculator();
            IDiscountService            discountService            = new DiscountService(dbContext, timespanDiscountCalculator, quantityDiscountCalculator);
            GetDiscountsCommand         getDiscountCommand         = new GetDiscountsCommand(discountService);

            getDiscountCommand.Items = products;
            commandInvoker.ExecuteCommand(getDiscountCommand);

            IEnumerable <DiscountResult> discounts = getDiscountCommand.Result;

            if (discounts.Count() > 0)
            {
                foreach (DiscountResult discount in discounts)
                {
                    Console.WriteLine($"{discount.ProductPluralName} {discount.DiscountPercentage:p0} off: -{discount.DiscountedPrice:c}");
                }
            }
            else
            {
                Console.WriteLine("(No offers available)");
            }

            decimal discountPrice = discounts.Sum(s => s.DiscountedPrice);
            decimal totalPrice    = basketItemsTotalPrice - discountPrice;

            Console.WriteLine($"Total price: {totalPrice:c}");
        }