import java.io.PrintStream;
import java.util.Date;
import java.util.Scanner;


public class A1Test
{

	public static void main(String[] args)
	{
		PrintStream out = System.out;
		Scanner in = new Scanner(System.in);
		
		out.println("Commands: test1, test2, test3, test4, exit");
		
		boolean exit = false;
		String cmd;
		while (!exit)
		{
			out.print("\n> ");
			cmd = in.next();
			if (cmd.equals("exit"))
			{
				exit = true;
			}
			else if (cmd.equals("test1"))
			{
				test1();
			}
			else if (cmd.equals("test2"))
			{
				test2();
			}
			else if (cmd.equals("test3"))
			{
				test3();
			}
			else if (cmd.equals("test4"))
			{
				test4();
			}
		}
	}
	
	
	private static void test1()
	{
		System.out.println("Tests Transaction constructors and accessors.");
		
		Date d = new Date();
		final double AMT = 200.5;
		Transaction t1 = new Transaction(d, "A deposit", AMT);
		Transaction t2 = new Transaction(t1);
		boolean result = t1 != t2;
		result &= t2.getDate().equals(d);
		result &= t2.getDetails().equals("A deposit");
		result &= Double.compare(t2.getAmount(), AMT) == 0;
		System.out.println(result ? "passed" : "failed");
		System.out.println(t1);
		System.out.println(t2);
	}

	private static void test2()
	{
		System.out.println("Tests Transaction equals() method.");
		
		Date d = new Date();
		final double AMT = 200.5;
		Transaction t1 = new Transaction(d, "A deposit", AMT);
		Transaction t2 = new Transaction(t1);
		boolean result = !t1.equals(null);
		result &= !t1.equals(d);
		result &= t1.equals(t1);
		result &= t1.equals(t2);
		System.out.println(result ? "passed" : "failed");
	}

	private static void test3()
	{
		System.out.println("Tests SavingsAccount constructor and methods.");
		
		SavingsAccount sa = new SavingsAccount();
		boolean result = (Double.compare(sa.getBalance(), 0.0) == 0) &&
			sa.list().isEmpty();
		try
		{
			sa.post(null);
			result = false;
		}
		catch (NullPointerException npe) {}
		sa.post(new Transaction(new Date(), "A deposit", 500.0));
		sa.post(new Transaction(new Date(), "A withdrawl", -320.5));
		result &= Double.compare(sa.getBalance(), 179.5) == 0;
		result &= sa.list().size() == 2;
		System.out.println(result ? "passed" : "failed");		
	}

	private static void test4()
	{
		System.out.println("Tests sortation of SavingsAccount transactions.");
		
		SavingsAccount sa = new SavingsAccount();
		Date d1 = new Date();
		d1.setTime(1369255370574L);
		Date d2 = new Date();
		d2.setTime(1369258370575L);
		Date d3 = new Date();
		d3.setTime(1369355330579L);
		sa.post(new Transaction(d2, "A deposit", 380.0));
		sa.post(new Transaction(d1, "A withdrawl", -100.0));
		sa.post(new Transaction(d2, "A deposit", 380.0));
		sa.post(new Transaction(d3, "A deposit", 100.0));
		sa.post(new Transaction(d1, "A withdrawl", -200.0));
		sa.post(new Transaction(d1, "A deposit", 100.0));
		boolean result = Double.compare(sa.getBalance(), 280.0) == 0;
		result &= sa.list().size() == 5;
		System.out.println(result ? "passed so far..." : "failed");
		System.out.println("But I can't test for sorted order without " +
				"giving you the code. :-)  So I will print the set for " +
				"you to review youself.");
		for (Transaction t : sa.list())
		{
			System.out.println(t);
		}
	}
	
}