public void Pass_Throungh_Variable_Discount()
        {
            // Arrange
            Mock <IDiscountHelper> mock = new Mock <IDiscountHelper>();

            mock.Setup(m => m.ApplyDiscount(It.IsAny <decimal>()))
            .Returns <decimal>(total => total);

            mock.Setup(m => m.ApplyDiscount(It.Is <decimal>(v => v == 0)))
            .Throws <System.ArgumentOutOfRangeException>();

            mock.Setup(m => m.ApplyDiscount(It.Is <decimal>(v => v > 100)))
            .Returns <decimal>(total => total * 0.9M);

            mock.Setup(m => m.ApplyDiscount(It.IsInRange <decimal>(10, 100, Range.Inclusive))).Returns <decimal>(total => total - 5);

            var target = new LinqValueCalculator(mock.Object);
            // Act
            decimal doolars100 = target.ValueProduct(CreateNewProductsSetPrice(100));
            decimal dollars0   = target.ValueProduct(CreateNewProductsSetPrice(0));
            decimal dollars10  = target.ValueProduct(CreateNewProductsSetPrice(10));
            decimal dollars500 = target.ValueProduct(CreateNewProductsSetPrice(500));
            decimal dollars5   = target.ValueProduct(CreateNewProductsSetPrice(5));

            // Assert
            Assert.AreEqual(95, doolars100, "fail100$");
            Assert.AreEqual(0, dollars0, "exeption 0$");
            Assert.AreEqual(5, dollars10, "fail 10$");
            Assert.AreEqual(5, dollars5, "fail 5$");
            Assert.AreEqual(500, dollars500, "fail 500$");
            target.ValueProduct(CreateNewProductsSetPrice(0));
        }
        public void Sum_Products_Correctly()
        {
            // Arrange
            Mock <IDiscountHelper> mock = new Mock <IDiscountHelper>();

            mock.Setup(m => m.ApplyDiscount(It.IsAny <decimal>())).Returns <decimal>(total => total);
            var target = new LinqValueCalculator(mock.Object);
            // Act
            var result = target.ValueProduct(products);

            // Assert
            Assert.AreEqual(products.Sum(e => e.Price), result);
        }