public void ShouldInvokeLoanCalculatorAndReturnResult()
        {
            var input = new LoanParameters { Amount = 1, Years = 1 };
            var mockResponse = new PaymentPlan(new List<PaymentMonth>());
            _calculatorMock.Setup(it => it.CalculateLoan(input))
                .Returns(mockResponse)
                .Verifiable("Should call LoanCalculator with expected input");

            var result = _controller.Calculate(input);

            _calculatorMock.Verify();
            Assert.AreSame(mockResponse, result);
        }
        public PaymentPlan CalculateLoan(LoanParameters loanParameters)
        {
            var loan = new HousingLoan(loanParameters);
            var paymentScheme = new SeriesPaymentScheme();
            var months = new List<PaymentMonth>();
            
            for (int monthNumber = 1; monthNumber <= loan.NumberOfMonths; monthNumber++)
            {
                decimal monthlyPrincipal = paymentScheme.NextMonthlyPrincipal(loan);
                var monthlyInterest = paymentScheme.NextMonthlyInterest(loan);
                var monthlyTotal = monthlyPrincipal + monthlyInterest;
                loan.Remaining -= monthlyPrincipal; //TODO: This doesn't smell right, should be immutable or just a local variable?
                
                months.Add(new PaymentMonth(monthNumber, monthlyPrincipal, monthlyInterest, monthlyTotal, loan.Remaining));
            }

            var result = new PaymentPlan(months);

            return result;
        }