/**
 * Basic unit test for Sphere class
 * @author Mark Menor
 */

public class SphereTester
{
	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 Sphere instance
		Sphere sp = new Sphere(10.0);
		test("Constructor", sp != null);
		
		// Case 2: Radius
		double r = sp.getRadius();
		double expR = 10.0;
		test("Radius", equals(r, expR, EPS));
		
		// Case 3: Diameter
		double d = sp.getDiameter();
		double expD = 20.0;
		test("Diameter", equals(d, expD, EPS));
		
		// Case 4: Circumference
		double c = sp.getCircumference();
		double expC = 62.83185307179586;
		test("Circumference", equals(c, expC, EPS));
		
		// Case 5: Surface Area
		double sa = sp.getSurfaceArea();
		double expSa = 1256.6370614359173;
		test("Surface Area", equals(sa, expSa, EPS));
		
		// Case 6: Volume
		double v = sp.getVolume();
		double expV = 4188.790204786391;
		test("Volume", equals(v, expV, EPS));
		
		// Testing setRadius
		sp.setRadius(0.5);
		
		// Case 7: Radius
		r = sp.getRadius();
		expR = 0.5;
		test("New Radius", equals(r, expR, EPS));
		
		// Case 8: Diameter
		d = sp.getDiameter();
		expD = 1.0;
		test("New Diameter", equals(d, expD, EPS));
		
		// Case 9: Circumference
		c = sp.getCircumference();
		expC = 3.141592653589793;
		test("New Circumference", equals(c, expC, EPS));
		
		// Case 10: Surface Area
		sa = sp.getSurfaceArea();
		expSa = 3.141592653589793;
		test("New Surface Area", equals(sa, expSa, EPS));
		
		// Case 11: Volume
		v = sp.getVolume();
		expV = 0.5235987755982988;
		test("New Volume", equals(v, expV, 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;
		}
	}
}