public void TestAmortization()
        {
            double result = AmortizationSchedule.getInstance().calculateMonthlyPayment(360, 4.5f, 200000.0f);

            Console.WriteLine("Monthly payment = {0}", result);

            AmortizationSchedule.getInstance().getSchedule(360, 4.5, 200000.0);

            Console.WriteLine("Principle for 1058.42, at 4.5% over 30 years = {0}", AmortizationSchedule.getInstance().calculatePrinciple(360, 4.875, 1058.42));

            Console.WriteLine("APR for 1058.42, for 200,0000 over 30 years = {0}", AmortizationSchedule.getInstance().calculateAPR(360, 200000, 1058.42));

            Loan loan = new Loan("House Loan", new DateTime(2011, 6, 29), 4.5, 2000000.0, 360.0);

            LoanPayment payment = new LoanPayment(1500.0, 1100.0, 400.0, 0.0);

            loan.addPayment(payment);

            Profile profile = new Profile("Brian");
            profile.addLoan(loan);

            // Create a new XmlSerializer instance with the type of the test class
            XmlSerializer SerializerObj = new XmlSerializer(typeof(Profile));

            // Create a new file stream to write the serialized object to a file
            TextWriter WriteFileStream = new StreamWriter("./test.xml");
            SerializerObj.Serialize(WriteFileStream, profile);

            //TextReader ReadStream = new StreamReader("./test.xml");
            //Loan loan2 = (Loan)SerializerObj.Deserialize(ReadStream);

            //Console.WriteLine("Loan apr = {0}", loan.APR);

            //AmortizationPayment p = (AmortizationPayment)loan.PaymentHistory[0];

            //Console.WriteLine("Payment Interest = {0}", p.InterestPaid);

            // Cleanup
            WriteFileStream.Close();
            //ReadStream.Close();
        }
        public ArrayList getSchedule(int months, double yearlyAPR, double principle)
        {
            ArrayList list = new ArrayList();

            double monthlyPayment = calculateMonthlyPayment(months, yearlyAPR, principle);
            double remainingPrinciple = principle;
            double monthlyRate = getMonthlyInterestRate(yearlyAPR);

            for (int i = 0; i < months; i++)
            {
                //Round to the nearest penny
                double interestPaid = monthlyRate * remainingPrinciple;
                interestPaid = (double)roundToNearestPenny((double)interestPaid);

                //Remainder of the payment is principle
                double principlePaid = monthlyPayment - interestPaid;

                //Any extra paid on top of the monthly payment
                double extraPaid = 0;

                //Create a payment with these values
                LoanPayment payment = new LoanPayment(monthlyPayment+extraPaid, interestPaid, principlePaid, extraPaid);

                //Add the payment to the list
                list.Add(payment);

                //Adjust the remaining principle on the loan
                remainingPrinciple -= principlePaid;
            }

            remainingPrinciple = roundToNearestPenny(remainingPrinciple);

            //Tack on the remainder on the last payment
            LoanPayment lastPayment = (LoanPayment)list[months - 1];
            lastPayment.TotalPayment += remainingPrinciple;
            lastPayment.PrinciplePaid += remainingPrinciple;

            double principleSum = 0;
            int num = 0;
            /*
            foreach (LoanPayment payment in list)
            {
                num++;
                Console.WriteLine("{0}: {1}", num, payment);
                principleSum += payment.PrinciplePaid;
            }*/

            for (int i = 0; i < 100; i++)
            {
                LoanPayment payment = (LoanPayment)list[i];
                Console.WriteLine("{0}: {1}", num, payment);
            }

            Console.WriteLine("Principle to be paid = {0}", principle);

            Console.WriteLine("Remaining Principle = {0}", remainingPrinciple);

            Console.WriteLine("Total principle paid = {0}", principleSum);

            return list;
        }
        public void addPayment(LoanPayment payment)
        {
            if (payment != null)
            {
                _paymentHistory.Add(payment);
            }

            updateTotals();
        }