package finalset;

//  1  2  3  4  7
//
//
//  5  6

import junit.framework.TestCase;
import java.util.*;

public class TestProblems extends TestCase {
	

	// test problem6
	public void testProblem6() {
		// public examples
		assertEquals ("3 2\n",
			Problem6.process(new Scanner ("2\n-2 2 1 0\n4 -2 -1 1\n")));
		assertEquals ("3 1\n",
			Problem6.process(new Scanner ("3\n-2 3 1 -1\n-2 0 1 0\n1 -3 0 1\n")));
		assertEquals ("10 459\n",
			Problem6.process(new Scanner ("4\n-20 -17 1 2\n-11 15 1 -1\n90 1 -5 1\n60 -20 -2 3\n")));
		assertEquals ("0 5\n",
			Problem6.process(new Scanner ("3\n-2 2 1 0\n-2 0 1 0\n-2 -2 1 0\n")));
		
		// hidden test cases
		assertEquals ("0 25\n",
			Problem6.process(new Scanner ("6\n-2 2 -1 2\n0 2 0 2\n2 2 1 2\n-2 -2 -1 -2\n0 -2 0 -2\n2 -2 1 2\n")));
		assertEquals ("5 272\n",
			Problem6.process(new Scanner ("4\n17 15 -1 -2\n-10 13 4 2\n-20 -20 5 3\n20 -40 -3 6\n")));
		assertEquals ("50 188\n",
			Problem6.process(new Scanner ("3\n-50 0 4 0\n0 100 0 -2\n113 0 -3 0\n")));
	}
	
	
	// test problem5
	public void testProblem5() {
		// public examples
		assertEquals ("a 1\nb 1\nc 1\nd 1\ne 1\nf 1\ng 1\nh 1\ni 1\nj 1\n",
				Problem5.computeHistogram("abcDEFghijKL\n.")); Problem5.reset();
		assertEquals ("e 14\nt 14\nn 10\no 8\ns 7\ni 6\na 5\nr 5\nu 5\nl 4\n",
				Problem5.computeHistogram("Given a set of lines of English text (including\n" +
						"spaces and punctuation), you are to report the\n" +
						"top ten most frequent letters\n" + "\n.")); Problem5.reset();
		
		// hidden test cases
		assertEquals ("e 18\nt 15\nn 14\no 14\na 13\nr 11\ni 9\nd 7\nc 6\nh 6\n",
			Problem5.computeHistogram("Four score and seven years ago our fathers brought forth on\n"+
			"this continent a new nation, conceived in Liberty, and dedicated to the\n"+
			"proposition that all men are created equal.\n.")); Problem5.reset();				
						
		assertEquals ("e 7\nn 7\nt 7\no 6\ns 5\na 4\nc 4\ni 2\nr 2\nb 1\n",
				Problem5.computeHistogram("attendee access\n"+
			"south parking lot at\n"+
			"boston convension center\n"+
			".\n")); Problem5.reset();		
		assertEquals ("a 3\nj 3\nb 2\nc 2\nd 2\ne 2\nf 2\ng 2\nh 2\ni 2\n",
				Problem5.computeHistogram("abCDE fghij\n"+
			"fghij abcDE\n"+
			"a J\n" +
			".\n"));Problem5.reset();
	}
	
	// test problem1
	public void testProblem1() {
		// Public examples.
		assertTrue (Problem1.isExponentUnique(199)); Problem1.reset();
		assertTrue (Problem1.isExponentUnique(200)); Problem1.reset();
		assertFalse (Problem1.isExponentUnique(201)); Problem1.reset();
		assertTrue (Problem1.isExponentUnique(207)); Problem1.reset();
		assertFalse (Problem1.isExponentUnique(36)); Problem1.reset();
		
		// hidden ones.
		assertTrue (Problem1.isExponentUnique(733784)); Problem1.reset();
		assertTrue (Problem1.isExponentUnique(118800)); Problem1.reset();
		assertFalse (Problem1.isExponentUnique(1306800)); Problem1.reset();
		assertFalse (Problem1.isExponentUnique(507142944)); Problem1.reset();
		assertTrue (Problem1.isExponentUnique(35707672)); Problem1.reset();
	}
	
	// test problem2
	public void testProblem2() {
		// Public examples.
		assertEquals ("1216\n11121116\n31123116\n132112132116\n11131221121113122116\n",
					Problem2.process("26"));
		assertEquals ("19\n1119\n3119\n132119\n1113122119\n",
					Problem2.process("9"));
		assertEquals ("10\n1110\n3110\n132110\n1113122110\n", 
					Problem2.process("0"));
		assertEquals ("81\n1811\n111821\n31181211\n132118111221\n",
					Problem2.process("11111111"));
		
		// hidden examples
		assertEquals ("111311\n311321\n1321131211\n1113122113111221\n311311222113312211\n",
					Problem2.process("131"));
		assertEquals ("29\n1219\n11121119\n31123119\n132112132119\n",
					Problem2.process("99"));
		assertEquals ("422418\n1422141118\n11142211143118\n3114223114132118\n132114221321141113122118\n",
					Problem2.process("2222448"));
		assertEquals ("111213141516171819\n31121113111411151116111711181119\n1321123113311431153116311731183119\n11131221121321232114132115132116132117132118132119\n31131122211211131211121312211411131221151113122116111312211711131221181113122119\n",
					Problem2.process("123456789"));
	}
	
	// test problem3
	public void testProblem3() {
		// public examples.
		assertEquals ("p q r E\n0 0 0 0\n0 0 1 0\n0 1 0 1\n0 1 1 1\n1 0 0 0\n1 0 1 0\n1 1 0 1\n1 1 1 1\n",
				Problem3.eval("p XOR q XOR p"));
		
		assertEquals ("p q r E\n0 0 0 0\n0 0 1 0\n0 1 0 0\n0 1 1 0\n1 0 0 0\n1 0 1 0\n1 1 0 1\n1 1 1 1\n",
				Problem3.eval("p AND q"));
		
		assertEquals ("p q r E\n0 0 0 0\n0 0 1 1\n0 1 0 1\n0 1 1 1\n1 0 0 1\n1 0 1 1\n1 1 0 1\n1 1 1 1\n",
				Problem3.eval("q NOR r IMPL p"));
		
		// Hidden examples.
		assertEquals ("p q r E\n0 0 0 0\n0 0 1 0\n0 1 0 1\n0 1 1 1\n1 0 0 1\n1 0 1 1\n1 1 0 1\n1 1 1 1\n",
				Problem3.eval("p OR q"));
		
		assertEquals ("p q r E\n0 0 0 0\n0 0 1 1\n0 1 0 1\n0 1 1 1\n1 0 0 1\n1 0 1 1\n1 1 0 1\n1 1 1 1\n",
				Problem3.eval("p OR q OR r"));
			
		assertEquals ("p q r E\n0 0 0 0\n0 0 1 0\n0 1 0 0\n0 1 1 1\n1 0 0 0\n1 0 1 0\n1 1 0 0\n1 1 1 1\n",
				Problem3.eval("p OR q AND q AND r"));
				
		assertEquals ("p q r E\n0 0 0 0\n0 0 1 1\n0 1 0 0\n0 1 1 1\n1 0 0 1\n1 0 1 1\n1 1 0 0\n1 1 1 1\n",
				Problem3.eval("p IMPL q IMPL r"));
	}
	
	// test problem 4
	public void testProblem4() {
		// public examples
		ArrayList al = new ArrayList(); 
		al.add("BOY"); al.add("TOY"); al.add ("TOE");
		assertEquals ("WORD LADDER\n", Problem4.process(al));
		al.clear();
		
		al.add("HEAD"); al.add("HEAL"); al.add("VEAL"); al.add("VEIL"); al.add("VAIL"); al.add("TAIL");
		assertEquals ("WORD LADDER\n", Problem4.process(al));
		al.clear();
		
		al.add("CAME"); al.add("CARE"); al.add("CANT"); al.add("WENT");
		assertEquals ("NO LADDER\nBROKEN BY CANT\n", Problem4.process(al));
		al.clear();
		
		// HIDDEN test cases.
		al.add("BARE"); al.add("CARE"); al.add("CART"); al.add("BART"); al.add ("MART"); al.add ("MARE");
		assertEquals ("WORD LADDER\n", Problem4.process(al));
		al.clear();
		
		al.add("BARE"); al.add("CARE"); al.add("CAST"); al.add("BART"); al.add ("MART"); al.add ("MARE");
		assertEquals ("NO LADDER\nBROKEN BY CAST\n", Problem4.process(al));
		al.clear();
		
		al.add("CAR"); al.add ("BAR"); al.add ("BAT"); al.add ("BAY"); al.add ("BOY");
		assertEquals ("WORD LADDER\n", Problem4.process(al));
		al.clear();
		
		al.add("CAR"); al.add ("BAR"); al.add ("BET"); al.add ("BAY"); al.add ("BOY");
		assertEquals ("NO LADDER\nBROKEN BY BET\n", Problem4.process(al));
		al.clear();
	}
	
	// test problem 7
	public void testProblem7() {
		// public test cases.
		assertEquals (120, Problem7.process("5x^5-4x^4+3x^3", 2));
		assertEquals (79, Problem7.process("3x^5-5x^2+3", 2));
		assertEquals (-7, Problem7.process("x-2", -5));
		assertEquals (7, Problem7.process("7", 2));
		assertEquals (658, Problem7.process("x^3-x^2+x+1", 9));
		assertEquals (-18, Problem7.process("-3x^2+9", 3));
		
		// hidden test cases.
		assertEquals (11898, Problem7.process("5x^4-3x^2+5x+5", 7));
		assertEquals (-348, Problem7.process("x^3-5", -7));
		assertEquals (3906, Problem7.process("x^5+x^4+x^3+x^2+x+1", 5));
		assertEquals (77, Problem7.process("5x^2+x+1", -4));
	}

}
