/* $Id$
 */
package tests;

import junit.framework.TestCase;
import calc.*;

/** Testing for the calculator.
 * @author Gary T. Leavens
 */
public class TestCalc extends TestCase {

    /** Make this test case class from the given name. */
    public TestCalc(String name) {
        super(name);
    }

    /* The registers object. */
    private Registers regs = Registers.getInstance();
    
    /* The FormulaMap object. */
    private FormulaMap map = FormulaMap.getInstance();

    /** Common initialization code for the various test cases. */
    public void setUp() {
        regs.put(0, 4.0);
        regs.put(1, 8.0);
        regs.put(2, -1.0);
        regs.put(3, 0.5);
        regs.put(4, -50.0);
    }
    
    /**
     * Test simple summations in the calculator.
     */
    public void testSummation() {
        FormulaType f1 = new Sum(0, 1);
        FormulaType f2 = new Sum(1, 2);
        map.put("add01", f1);
        map.put("add12", f2);
        assertEquals(12.0, map.get("add01").evaluate(), 0.001);
        assertEquals(7.0, map.get("add12").evaluate(), 0.01);
        assertTrue(map.get("add01").isPositive());
		assertTrue(map.get("add12").isPositive());
		assertFalse(new Sum(3,4).isPositive());
    }

    /**
     * Test triple summations in the calculator.
     */
    public void testSum3() {
        FormulaType f1 = new Sum3(0, 1, 2);
        FormulaType f2 = new Sum3(1, 2, 3);
        map.put("add012", f1);
        map.put("add123", f2);
        assertEquals(11.0, map.get("add012").evaluate(), 0.001);
        assertEquals(7.5, map.get("add123").evaluate(), 0.01);
		assertTrue(map.get("add012").isPositive());
		assertTrue(map.get("add123").isPositive());
		assertFalse(new Sum3(2,3,4).isPositive());
    }

    /**
     * Test simple differences in the calculator.
     */
    public void testDifference() {
        FormulaType f1 = new Diff(0, 1);
        FormulaType f2 = new Diff(1, 2);
        map.put("sub01", f1);
        map.put("sub12", f2);
        assertEquals(-4.0, map.get("sub01").evaluate(), 0.001);
        assertEquals(9.0, map.get("sub12").evaluate(), 0.01);
		assertFalse(map.get("sub01").isPositive());
		assertTrue(map.get("sub12").isPositive());
		assertTrue(new Diff(3,4).isPositive());
    }

    /**
     * Test simple products in the calculator.
     */
    public void testProduct() {
        FormulaType f1 = new Mult(0, 1);
        FormulaType f2 = new Mult(1, 2);
        map.put("prod01", f1);
        map.put("prod12", f2);
        assertEquals(32.0, map.get("prod01").evaluate(), 0.001);
        assertEquals(-8.0, map.get("prod12").evaluate(), 0.01);
		assertTrue(map.get("prod01").isPositive());
		assertFalse(map.get("prod12").isPositive());
		assertFalse(new Mult(3,4).isPositive());
    }

	/**
	 * Test negations in the calculator.
	 */
	public void testNegation() {
		FormulaType f1 = new Negation(0);
		FormulaType f2 = new Negation(1);
		map.put("neg0", f1);
		map.put("neg1", f2);
		assertEquals(-4.0, map.get("neg0").evaluate(), 0.001);
		assertEquals(-8.0, map.get("neg1").evaluate(), 0.01);
		assertFalse(map.get("neg0").isPositive());
		assertFalse(map.get("neg1").isPositive());
		assertTrue(new Negation(4).isPositive());
	}
}
