/**
 * Basic unit test for Cone class
 * @author Mark Menor
 */

public class ConeTester
{
	public static void main(String[] args)
	{
		// Maximum difference from expected value
		// Set how strict you want equality to be
		final double EPS = 0.00001;
		
		// Case 1: Creating new Cone instance
		Cone cone = new Cone(3.0, 4.0);
		test("Constructor", cone != null);
		
		// Case 2: Radius
		double r = cone.getRadius();
		double expR = 3.0;
		test("Radius", equals(r, expR, EPS));
		
		// Case 3: Height
		double h = cone.getHeight();
		double expH = 4.0;
		test("Height", equals(h, expH, EPS));
		
		// Case 4: Slant Height
		double sh = cone.getSlantHeight();
		double expSh = 5.0;
		test("Slant Height", equals(sh, expSh, EPS));
		
		// Case 5: Volume
		double v = cone.getVolume();
		double expV = 37.69911184307752;
		test("Volume", equals(v, expV, EPS));
		
		// Case 6: Lateral Surface Area
		double lsa = cone.getLateralSurfaceArea();
		double expLsa = 47.12388980384689;
		test("Lateral Surface Area", equals(lsa, expLsa, EPS));
		
		// Case 7: Total Surface Area
		double tsa = cone.getTotalSurfaceArea();
		double expTsa = 75.39822368615503;
		test("Total Surface Area", equals(tsa, expTsa, EPS));
		
		// Testing setRadius
		cone.setRadius(30.0);
		
		// Case 8: Radius
		r = cone.getRadius();
		expR = 30.0;
		test("New Radius", equals(r, expR, EPS));
		
		// Testing setHeight
		cone.setHeight(40.0);
		
		// Case 9: Height
		h = cone.getHeight();
		expH = 40.0;
		test("New Height", equals(h, expH, EPS));
		
		// Case 10: Slant Height
		sh = cone.getSlantHeight();
		expSh = 50.0;
		test("Slant Height", equals(sh, expSh, EPS));
		
		// Case 11: Volume
		v = cone.getVolume();
		expV = 37699.11184307752;
		test("Volume", equals(v, expV, EPS));
		
		// Case 12: Lateral Surface Area
		lsa = cone.getLateralSurfaceArea();
		expLsa = 4712.38898038469;
		test("Lateral Surface Area", equals(lsa, expLsa, EPS));
		
		// Case 13: Total Surface Area
		tsa = cone.getTotalSurfaceArea();
		expTsa = 7539.822368615503;
		test("Total Surface Area", equals(tsa, expTsa, EPS));
	}
	
	
	/*
	 * Prints the name of the test case and [PASS] or [FAIL] based on
	 * test condition is true or false, respectively.
	 * @param testCaseName ame of test case to print
	 * @param condition if true print [PASS], [FAIL] otherwise
	 */
	public static void test(String testCaseName, boolean condition)
	{
		System.out.print("Case [" + testCaseName + "]: ");
		
		if (condition)
		{
			System.out.println("[PASS]");
		}
		else 
		{
			System.out.println("[FAIL]");
		}
	}
	
	/*
	 * Checks if the computed number and the expected number are close enough
	 * to be considered equal
	 * @param c computed number
	 * @param e expected number
	 * @param epsilon the maximum distance between c and e to be considered 
	 *                equal
	 * @return true if distance between c and e is less than epsilon, 
	 *         false otherwise
	 */
	public static boolean equals(double c, double e, double epsilon)
	{
		if (Math.abs(c - e) <= epsilon)
		{
			return true;
		}
		else 
		{
			System.out.println("Computed " + c + " but expected " + e);
			return false;
		}
	}
}