content: package aima.test.core.unit.util.math.geom.shapes;
  
  import static org.junit.Assert.assertEquals;
  import static org.junit.Assert.assertFalse;
  import static org.junit.Assert.assertTrue;
  
  import org.junit.Before;
  import org.junit.Test;
  
  import aima.core.util.math.geom.shapes.Point2D;
  import aima.core.util.math.geom.shapes.Vector2D;
  
  /**
   * Test case for the {@code aima.core.util.math.geom} package.
   * Tests valid implementation of {@link Vector2D}.
   * 
   * @author Arno v. Borries
   * @author Jan Phillip Kretzschmar
   * @author Andreas Walscheid
   *
   */
  @SuppressWarnings("javadoc")
  public class Vector2DTest {
  	private Vector2D testVector;
  	
  	@Before
  	public void setUp() throws Exception {
  		testVector = new Vector2D(3.0d,4.0d);
  	}
  
  	@Test
  	public final void testAdd() {
  		assertEquals("Correct vector addition X-Value.",testVector.add(new Vector2D(8.0d,12.0d)).getX(), 11.0d,0.000005d);
  		assertEquals("Correct vector addition Y-Value.",testVector.add(new Vector2D(8.0d,12.0d)).getY(), 16.0d,0.000005d);
  		
  	}
  
  	@Test
  	public final void testSub() {
  		assertEquals("Correct vector subtraction X-Value.",testVector.sub(new Vector2D(8.0d,12.0d)).getX(), -5.0d,0.000005d);
  		assertEquals("Correct vector subtraction Y-Value.",testVector.sub(new Vector2D(8.0d,12.0d)).getY(), -8.0d,0.000005d);
  	}
  
  	@Test
  	public final void testInvert() {
  		assertEquals("Correct vector inversion X-Value.",testVector.invert().getX(), -3.0d,0.000005d);
  		assertEquals("Correct vector inversion Y-Value.",testVector.invert().getY(), -4.0d,0.000005d);
  	}
  
  	@Test
  	public final void testIsParallel() {
  		assertFalse("Two non-parallel vectors.",testVector.isAbsoluteParallel(new Vector2D(4.0d, 7.0d)));
  		assertTrue("Two parallel vectors.", testVector.isAbsoluteParallel(new Vector2D(9.0d, 12.0d)));
  		assertTrue("Every vector is parallel to the zero vector.", testVector.isAbsoluteParallel(Vector2D.ZERO_VECTOR));
  		
  	}
  	
  	@Test
  	public final void testIsAbsoluteParallel() {
  		assertFalse("Two non-absolute-parallel vectors.", testVector.isParallel(new Vector2D(6.5d, 5.8d)));
  		assertFalse("No vector is absolute parallel to the zero vector.", testVector.isParallel(Vector2D.ZERO_VECTOR));
  		assertTrue("Two absolute-parallel vectors.", testVector.isParallel(new Vector2D(9,12)));
  		assertTrue("Two absolute-parallel vectors.", testVector.isParallel(new Vector2D(-9,-12)));		
  	}
  
  	@Test
  	public final void testAngleTo() {
  		assertEquals("Rotating vector by 1/2 Pi radians.", testVector.angleTo(new Vector2D(-4.0d,3.0d)), 1.0d/2.0d * Math.PI, 0.000005d);
  		assertEquals("Rotating vector by Pi radians.", testVector.angleTo(new Vector2D(-3.0d,-4.0d)), Math.PI, 0.000005d);
  		assertEquals("Rotating vector by 3/2 Pi radians.", testVector.angleTo(new Vector2D(4.0d,-3.0d)), 3.0d/2.0d * Math.PI, 0.000005d);
  		assertEquals("Rotating vector by 2 Pi radians.", testVector.angleTo(new Vector2D(6.0d,8.0d)), 0.0d, 0.000005d);
  	}
  
  	@Test
  	public final void testLength() {
  		assertEquals("The correct length.", testVector.length(), 5.0d, 0.000005d);
  	}
  
  	@Test
  	public final void testEqualsVector2D() {
  		assertFalse("Not the same vector.", testVector.equals(new Vector2D(6.0d,5.0d)));
  		assertTrue("The exact same vector.", testVector.equals(new Vector2D(3.0d,4.0d)));
  	}
  
  	@Test
  	public final void testEqualsObject() {
  		assertFalse("Not the same object, since no cast defined.", testVector.equals(new Point2D(3.0d,4.0d)));
  		assertTrue("The exact same object.", testVector.equals(new Vector2D(3.0d,4.0d)));
  	}
  
  }
  