public void CalculateCashFlows_Should_be_passed_when_testing_npv_amount_for_given_inputs()
        {
            // Arrange
            NpvInput input = new NpvInput();

            input.Cash                   = 100m;
            input.CashSeries             = 10m;
            input.IncrementDiscountRate  = 0.25m;
            input.LowerDiscountRateBound = 1m;
            input.UpperDiscountRateBound = 15m;

            NpvCalculatorController controller = new NpvCalculatorController(new NpvCalculator());

            // Act
            IList <NpvCashFlow> npvCashFlows = controller.CalculateCashFlows(input);

            // Assert
            var npvCashFlow  = npvCashFlows.Where(c => c.Rate == 0.01m).SingleOrDefault <NpvCashFlow>();
            var npvCashFlow2 = npvCashFlows.Where(c => c.Rate == 0.1m).SingleOrDefault <NpvCashFlow>();
            var npvCashFlow3 = npvCashFlows.Where(c => c.Rate == 0.15m).SingleOrDefault <NpvCashFlow>();

            Assert.IsTrue(npvCashFlows.Count() > 0);

            Assert.IsTrue(Math.Round(npvCashFlow.Amount, 2) == 947.13m);
            Assert.IsTrue(Math.Round(npvCashFlow2.Amount, 2) == 614.46m);
            Assert.IsTrue(Math.Round(npvCashFlow3.Amount, 2) == 501.88m);
        }
示例#2
0
        public IList <NpvCashFlow> CalculateCashFlows(NpvInput input)
        {
            // cash series flows
            List <double> flows = new List <double>();

            for (int i = 0; i < input.CashSeries; i++)
            {
                flows.Add(Convert.ToDouble(input.Cash));
            }

            // calc npv base on rate and cash series flows
            var     result = new List <NpvCashFlow>();
            decimal rate   = input.LowerDiscountRateBound;

            while (rate <= input.UpperDiscountRateBound)
            {
                double npv = flows.Select((c, n) => c / Math.Pow(1 + Convert.ToDouble(rate), n + 1)).Sum();;

                result.Add(new NpvCashFlow {
                    Rate = rate, Amount = Convert.ToDecimal(npv)
                });

                rate = rate + input.IncrementDiscountRate;
            }
            ;

            return(result);
        }
示例#3
0
        public IList <NpvCashFlow> CalculateCashFlows(NpvInput input)
        {
            // turn percentage to decimal.
            // TO DO : move this to front end if time allows
            input.LowerDiscountRateBound = input.LowerDiscountRateBound / 100;
            input.UpperDiscountRateBound = input.UpperDiscountRateBound / 100;
            input.IncrementDiscountRate  = input.IncrementDiscountRate / 100;

            var result = _npvCalculator.CalculateCashFlows(input);

            return(result);
        }