public void GivenEmptyDecoratorOnRunningProductsCountShoppingCart_WhenProductsWithAssociatedOfferAdded_ThenBehavesAsExpected()
        {
            // Arrange
            var product1 = new Product("some product", 3.0);
            var product2 = new Product("another product", 5.0);
            var cart     = new HandleProductsWithAssociatedOfferShoppingCartDecorator(new RunningProductsCountShoppingCart());

            IProduct Offer(IProduct product, uint quantity)
            {
                if (quantity >= 1)
                {
                    return(new DiscountAsProduct(product.Name + " - Buy 1 get 50% off next", product.UnitPrice / 2));
                }

                return(new NullProduct());
            }

            var product1WithOffer = new ProductWithAssociatedOffer(product1, Offer);

            //Act
            cart.AddProduct(product1WithOffer, 4);
            cart.AddProduct(product2, 12);
            cart.AddProduct(product2, 8);
            cart.AddProduct(product1WithOffer, 2);

            // Assert
            Assert.That(cart.GetTotalPrice(), Is.EqualTo(116.50));
            Assert.That(cart.GetTotalDiscount(), Is.EqualTo(1.50));
        }
        public void GivenNoObject_WhenDecoratorCreated_ThenReturnsAnInstanceOfIProductAddingShoppingCart()
        {
            // Arrange, Act
            var cart = new HandleProductsWithAssociatedOfferShoppingCartDecorator(Mock.Of <IProductAddingShoppingCart>());

            // Assert
            Assert.That(cart, Is.InstanceOf(typeof(IProductAddingShoppingCart)));
        }
        public void GivenEmptyDecoratorOnRunningProductsCountShoppingCart_WhenProductsWithNoAssociatedOfferAdded_ThenBehavesAsRunningProductsCountShoppingCart()
        {
            // Arrange
            var product1 = new Product("some product", 3.0);
            var product2 = new Product("another product", 5.0);
            var cart     = new HandleProductsWithAssociatedOfferShoppingCartDecorator(new RunningProductsCountShoppingCart());

            //Act
            cart.AddProduct(product1, 4);
            cart.AddProduct(product2, 12);
            cart.AddProduct(product2, 8);

            // Assert
            Assert.That(cart.Products.Count(p => p.Name == "another product"), Is.EqualTo(20));
            Assert.That(cart.Products.Count, Is.EqualTo(24));
            Assert.That(cart.GetTotalPrice(), Is.EqualTo(112.00));
        }