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); }
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); }
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); }