public void CalculateYearRuleDiscount_ReturnsDiscountGrandTotal(CarsPurchaseResponse input, CarsPurchaseResponse expected)
        {
            var output = _yearRule.CalculateDiscount(input);

            Assert.Equal(expected.GrandTotal, output.GrandTotal);

            Assert.Equal(expected.TotalDiscount, output.TotalDiscount);
        }
        public CarsPurchaseResponse CalculateDiscount(CarsPurchaseResponse carDiscount)
        {
            var grandTotal = carDiscount.GrandTotal;
            var percentage = grandTotal >= _minCost ? _discountPercentage : 0.00;

            carDiscount.TotalDiscount += grandTotal.CalculateDiscount(percentage);
            carDiscount.GrandTotal    -= grandTotal.CalculateDiscount(percentage);

            return(carDiscount);
        }
        public CarsPurchaseResponse CalculateDiscount(CarsPurchaseResponse carDiscount)
        {
            var grandTotal = carDiscount.GrandTotal;
            var noOfCars   = carDiscount.CarPurchaseCollection.Count();
            var percentage = noOfCars >= _carCount ? _discountPercentage : 0;

            carDiscount.TotalDiscount += grandTotal.CalculateDiscount(percentage);
            carDiscount.GrandTotal    -= grandTotal.CalculateDiscount(percentage);

            return(carDiscount);
        }
예제 #4
0
        public void CalculateCumulativeDiscount_ReturnsDiscountGrandTotal(CarsPurchaseResponse input, CarsPurchaseResponse expected)
        {
            //Arrange Data
            var _mockMapper       = new Mock <IMapper>();
            var _carDiscountRules = new Mock <IEnumerable <ICarDiscountRule> >();
            var discountRules     = new List <ICarDiscountRule>()
            {
                new YearRule(2000, 10, true),
                new CountRule(2, 3, true),
                new CostRule(100000, 5, true)
            };

            _carDiscountRules.Setup(m => m.GetEnumerator()).Returns(() => discountRules.GetEnumerator());

            _mockMapper.Setup(x => x.Map <CarsPurchaseResponse>(It.IsAny <IEnumerable <SelectCar> >()))
            .Returns((IEnumerable <SelectCar> source) =>
            {
                var purchaseResponse = new CarsPurchaseResponse()
                {
                    CarPurchaseCollection = source.Select(
                        e => new CarPurchaseResponse()
                    {
                        Id           = e.Id,
                        LineDiscount = 0,
                        Price        = e.Price,
                        Year         = e.Year
                    }),
                    GrandTotal    = 0,
                    TotalDiscount = 0
                };
                return(purchaseResponse);
            });

            var _carDiscountRuleProcessorService = new CarDiscountRuleProcessorService(_carDiscountRules.Object, _mockMapper.Object);


            //Act
            var output = _carDiscountRuleProcessorService.CalculateDiscount(input.CarPurchaseCollection.Select(e => new SelectCar()
            {
                Id = e.Id, Price = e.Price, Year = e.Year
            }));


            Assert.Equal(expected.GrandTotal, output.GrandTotal);

            Assert.Equal(expected.TotalDiscount, output.TotalDiscount);
        }
예제 #5
0
        public CarsPurchaseResponse CalculateDiscount(CarsPurchaseResponse carDiscount)
        {
            carDiscount.GrandTotal    = carDiscount.CarPurchaseCollection.Sum(e => e.Price) - carDiscount.CarPurchaseCollection.Sum(e => e.LineDiscount);
            carDiscount.TotalDiscount = carDiscount.CarPurchaseCollection.Sum(e => e.LineDiscount);

            foreach (var carLine in carDiscount.CarPurchaseCollection)
            {
                var percentage = carLine.Year <= _year ? _discountPercentage : 0;
                carLine.LineDiscount = carLine.Price.CalculateDiscount(percentage);
                carLine.Price.CalculateDiscount(percentage);

                carDiscount.GrandTotal    -= carLine.LineDiscount;
                carDiscount.TotalDiscount += (carLine.LineDiscount);
            }

            return(carDiscount);
        }