package zahlen;

import junit.framework.TestCase;

public class NegTest extends TestCase {

	N n0  = new Null();
	N n1  = new S(n0);
	N n2  = new S(n1);
	N n3  = new S(n2);
	N n4  = new S(n3);
	N n5  = new S(n4);
	N n6  = new S(n5);
	N n7  = new S(n6);
	N n8  = new S(n7);
	N n9  = new S(n8);
	N n10 = new S(n9);

	Z z0  = new Neg(n0);
	Z z1  = new Neg(n1);
	Z z2  = new Neg(n2);
	Z z3  = new Neg(n3);
	Z z4  = new Neg(n4);
	Z z5  = new Neg(n5);
	Z z6  = new Neg(n6);
	Z z7  = new Neg(n7);
	Z z8  = new Neg(n8);
	Z z9  = new Neg(n9);
	Z z10 = new Neg(n10);

	
	public void testValueZ() {
		assertEquals(z0.value(), 0);
		assertEquals(z1.value(), -1);
		assertEquals(z2.value(), -2);
		assertEquals(z3.value(), -3);
		assertEquals(z4.value(), -4);
		assertEquals(z5.value(), -5);
		assertEquals(z6.value(), -6);
		assertEquals(z7.value(), -7);
		assertEquals(z8.value(), -8);
		assertEquals(z9.value(), -9);
		assertEquals(z10.value(), -10);
	}

	public void testAddZ() {
		assertEquals(n0.add(z10).value(), -10);
		assertEquals(z10.add(n0).value(), -10);
		assertEquals(z10.add(z10).value(), -20);
	
		assertEquals(z10.add(n10).value(), 0);
		assertEquals(n10.add(z10).value(), 0);
		assertEquals(z9.add(n9).value(), 0);
		assertEquals(n9.add(z9).value(), 0);
		
		assertEquals(n10.add(z5).value(), 5);
		assertEquals(z10.add(n5).value(), -5);
		
		assertEquals(z9.add(n5).value(), -4);
	}

	public void testMultZ() {
		assertEquals(n0.mult(z10).value(), 0);
		assertEquals(z10.mult(n0).value(), 0);

		assertEquals(n1.mult(z10).value(), -10);
		assertEquals(z10.mult(n1).value(), -10);

		assertEquals(z10.mult(z10).value(), 100);
		assertEquals(n10.mult(z10).value(), -100);
		assertEquals(z10.mult(n10).value(), -100);

		assertEquals(n5.mult(n5).value(), 25);
		assertEquals(z5.mult(n5).value(), -25);
		assertEquals(n5.mult(z5).value(), -25);
		assertEquals(z5.mult(z5).value(), 25);
}

	
	
	public void testValueN() {
		assertEquals(n0.value(), 0);
		assertEquals(n1.value(), 1);
		assertEquals(n2.value(), 2);
		assertEquals(n3.value(), 3);
		assertEquals(n4.value(), 4);
		assertEquals(n5.value(), 5);
		assertEquals(n6.value(), 6);
		assertEquals(n7.value(), 7);
		assertEquals(n8.value(), 8);
		assertEquals(n9.value(), 9);
		assertEquals(n10.value(), 10);
	}

	public void testAddN() {
		assertEquals(n0.add(n10).value(), 10);
		assertEquals(n10.add(n0).value(), 10);
		assertEquals(n10.add(n10).value(), 20);
	}

	public void testMultN() {
		assertEquals(n0.mult(n10).value(), 0);
		assertEquals(n10.mult(n0).value(), 0);
		assertEquals(n10.mult(n1).value(), 10);
		assertEquals(n1.mult(n10).value(), 10);
		assertEquals(n10.mult(n10).value(), 100);
	}
	
}
