import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

import junit.framework.*;

public class CSCard_Test extends TestCase 
{
  
  public static void testCalculateInterest() 
  {
	CSCard credit = new CSCard();
	// test one
	double prior = 100;
	double addtl = 50;
	double expectedInterest = calculateInterest(prior, addtl);
    double actualInterest = credit.calculateInterest(prior, addtl);
    assertEquals(String.format("Error in calculateInterest. Prior %.2f  Additional %.2f Expected %.2f Actual %.2f", 
    		prior, addtl, expectedInterest, actualInterest), expectedInterest, actualInterest); 
  
    prior = 0;
	addtl = 50;
	expectedInterest = calculateInterest(prior, addtl);
    actualInterest = credit.calculateInterest(prior, addtl);
    assertEquals(String.format("Error in calculateInterest. Prior %.2f  Additional %.2f Expected %.2f Actual %.2f", 
    		prior, addtl, expectedInterest, actualInterest), expectedInterest, actualInterest); 
    
    prior = -25;
	addtl = 25;
	expectedInterest = calculateInterest(prior, addtl);
    actualInterest = credit.calculateInterest(prior, addtl);
    assertEquals(String.format("Error in calculateInterest. Prior: %.2f  Additional: %.2f Expected: %.2f Actual: %.2f", 
    		prior, addtl, expectedInterest, actualInterest), expectedInterest, actualInterest);  
    
  }

  public static void testCalculateMinPayment() {
    
	  CSCard credit = new CSCard();
		
        double balance = 500;
		double expected = calculateMinPayment(balance);
	    double actual = credit.calculateMinPayment(balance);
	    assertEquals(String.format("Error in calculateMinPayment. Balance: %.2f Expected: %.2f Actual: %.2f", 
	    		balance, expected, actual), expected, actual); 
	    
	    balance = -15;
		expected = calculateMinPayment(balance);
	    actual = credit.calculateMinPayment(balance);
	    assertEquals(String.format("Error in calculateMinPayment. Balance: %.2f Expected: %.2f Actual: %.2f", 
	    		balance, expected, actual), expected, actual);
	    
	    balance = 0;
		expected = calculateMinPayment(balance);
	    actual = credit.calculateMinPayment(balance);
	    assertEquals(String.format("Error in calculateMinPayment. Balance: %.2f Expected: %.2f Actual: %.2f", 
	    		balance, expected, actual), expected, actual);
	    
	    balance = 15;
		expected = calculateMinPayment(balance);
	    actual = credit.calculateMinPayment(balance);
	    assertEquals(String.format("Error in calculateMinPayment. Balance: %.2f Expected: %.2f Actual: %.2f", 
	    		balance, expected, actual), expected, actual);
	    
	    balance = 49.99;
		expected = calculateMinPayment(balance);
	    actual = credit.calculateMinPayment(balance);
	    assertEquals(String.format("Error in calculateMinPayment. Balance: %.2f Expected: %.2f Actual: %.2f", 
	    		balance, expected, actual), expected, actual);
	    
	    balance = 50;
		expected = calculateMinPayment(balance);
	    actual = credit.calculateMinPayment(balance);
	    assertEquals(String.format("Error in calculateMinPayment. Balance: %.2f Expected: %.2f Actual: %.2f", 
	    		balance, expected, actual), expected, actual);
	    
	    balance = 75;
		expected = calculateMinPayment(balance);
	    actual = credit.calculateMinPayment(balance);
	    assertEquals(String.format("Error in calculateMinPayment. Balance: %.2f Expected: %.2f Actual: %.2f", 
	    		balance, expected, actual), expected, actual);
  
	    balance = 300;
		expected = calculateMinPayment(balance);
	    actual = credit.calculateMinPayment(balance);
	    assertEquals(String.format("Error in calculateMinPayment. Balance: %.2f Expected: %.2f Actual: %.2f", 
	    		balance, expected, actual), expected, actual);
	    
	    balance = 301;
		expected = calculateMinPayment(balance);
	    actual = credit.calculateMinPayment(balance);
	    assertEquals(String.format("Error in calculateMinPayment. Balance: %.2f Expected: %.2f Actual: %.2f", 
	    		balance, expected, actual), expected, actual);
  }
   /** test to make sure that nothing was changed */
  public static void testAll()
  {
	  CSCard credit = new CSCard();
	  
	  String input = "75.00\n50.00\n";
	  // redirect standard in/out
      System.setIn(new ByteArrayInputStream(input.getBytes()));
      ByteArrayOutputStream output = new ByteArrayOutputStream();
      System.setOut(new PrintStream(output));
      
      String expected = "Type the balance: Type the new charge amount: " +
		"\n\nCS CARD International Statement\n"
		+ "===============================\n"
		+ "Previous balance:   $   75.00\n"
		+ "Additional charges: $   50.00\n"
		+ "Interest:           $    2.50\n\n"
		+ "New balance:        $  127.50\n\n"
		+ "Minimum payment:    $   50.00\n";
      
      credit.createStatement();
      
      String actual = output.toString();
      actual = actual.replaceAll("\r", "");
      
      assertEquals("Error in format. Make sure you did not change any ouput lines in the program.",
    		  expected, actual);

  }
  /** These methods get our expected value
   */
  public static double calculateInterest(double priorBalance, double additionalCharges)
  {
  	double interest;
  	
  	if (priorBalance > 0)
    	  interest = (priorBalance + additionalCharges) * .02;
      else
    	  interest = 0;
  	
  	return interest;
  }
  
  public static double calculateMinPayment(double balance)
  {
  	double minPayment;
  	
  	if(balance <= 0)
    	  minPayment = 0;
      else if (balance < 50.00)
    	  minPayment = balance;
      else if (balance <= 300)
    	  minPayment = 50.00;
      else 
    	  minPayment = balance * .2;
  	
  	return minPayment;
  }

}