 import java.text.*; // to use Decimal Format
   
/**Demonstrates the BankAccount and derived classes*/
   public class AccountDriver
   {
      public static void main(String[] args)
      {
      	// declare all variables
      	CheckingAccount myCheckingAccount;
      	CheckingAccount yourCheckingAccount;
      	SavingsAccount yourAccount;
      	SavingsAccount secondAccount;
         double put_in;
         double take_out;
         DecimalFormat myFormat;
         String money;
         String money_in;
         String money_out;
         boolean completed;
         
                 	// initialize variables for testing
      	put_in = 500;
      	take_out = 1000;         
      	
			         // to get 2 decimals every time
         myFormat = new DecimalFormat("#.00");
         
                   //to test the Checking Account class
         myCheckingAccount = new CheckingAccount ("Ben Franklin", 1000);

         System.out.println ("Account Number "
            + myCheckingAccount.getAccountNumber() +
            " belonging to " + myCheckingAccount.getOwner());
				
         money = myFormat.format(myCheckingAccount.getBalance());
         System.out.println ("Initial balance = $" + money);
    
	      myCheckingAccount.deposit (put_in);
         money_in = myFormat.format(put_in);
         money = myFormat.format(myCheckingAccount.getBalance());
         System.out.println ("After deposit of $" + money_in
            + ", balance = $" + money);
         completed = myCheckingAccount.withdraw(take_out);
         money_out = myFormat.format(take_out);
         money = myFormat.format(myCheckingAccount.getBalance());
         
  				 	// if successful print update message, else error        
			if (completed)
         {
            System.out.println ("After withdrawal of $" + money_out
               + ", balance = $" + money);
         }
         else
         {
            System.out.println ("Insuffient funds to withdraw $"
               + money_out + ", balance = $" + money);
         }
         System.out.println();
         
      			//to test the savings account class
        yourAccount =  new SavingsAccount ("William Shakespeare", 400);

        System.out.println ("Account Number " +
               yourAccount.getAccountNumber() +
               " belonging to " + yourAccount.getOwner());

         money = myFormat.format(yourAccount.getBalance());
         System.out.println ("Initial balance = $" + money);

         yourAccount.deposit (put_in);
         money_in = myFormat.format(put_in);

         money = myFormat.format(yourAccount.getBalance());
         System.out.println ("After deposit of $" + money_in + 
			                    ", balance = $" + money);

         completed = yourAccount.withdraw(take_out);
         money_out = myFormat.format(take_out);
         money = myFormat.format(yourAccount.getBalance());
   		
					// if successful print update message, else error      
			if (completed)
         {
            System.out.println ("After withdrawal of $" +
					 money_out + ", balance = $" + money);
         }
         else
         {
            System.out.println ("Insuffient funds to withdraw $"
               + money_out + ", balance = $" + money);
         }
			
         yourAccount.postInterest();
         money = myFormat.format(yourAccount.getBalance());
         System.out.println ("After monthly interest has been posted,"
            + "balance = $" + money);
         System.out.println();
         
      // to test the copy constructor of the savings account class
         secondAccount =
            new SavingsAccount (yourAccount,5);
         System.out.println ("Account Number "
            + secondAccount.getAccountNumber()+
            " belonging to " + secondAccount.getOwner());
         money = myFormat.format(secondAccount.getBalance());
         System.out.println ("Initial balance = $" + money);
         secondAccount.deposit (put_in);
         money_in = myFormat.format(put_in);
         money = myFormat.format(secondAccount.getBalance());
         System.out.println ("After deposit of $" + money_in
            + ", balance = $" + money);
         secondAccount.withdraw(take_out);
         money_out = myFormat.format(take_out);
         money = myFormat.format(secondAccount.getBalance());
         
		// if successful print update message, else error  
         if (completed)
         {
            System.out.println ("After withdrawal of $" + money_out
               + ", balance = $" + money);
         }
         else
         {
            System.out.println ("Insuffient funds to withdraw $"
               + money_out + ", balance = $" + money);
         }
         System.out.println();
         
      //to test to make sure new accounts are numbered correctly
         yourCheckingAccount = new CheckingAccount ("Isaac Newton", 5000);
         System.out.println ("Account Number " +
             yourCheckingAccount.getAccountNumber() +  " belonging to " +
             yourCheckingAccount.getOwner());
      }
   }
