import java.awt.Color;
import java.awt.Dimension;
import java.util.Arrays;

import junit.framework.TestCase;

/*
 * Created on Mar 17, 2006
 */

public class TurtleTest extends TestCase {
    Turtle turtle;
    TurtleCanvas canvas;
    
    protected void setUp() throws Exception {
        super.setUp();
        canvas = new TurtleCanvas();
        Dimension d = new Dimension(600, 600);
        canvas.setSize(600, 600);
        canvas.setPreferredSize(d);
        canvas.setMinimumSize(d);
        canvas.setMaximumSize(d);
        turtle = new Turtle(canvas);
    }

    /**
     * Test method for 'Turtle.move(int)'
     */
    public void testMove() {
        turtle.home();
        assertPositionRelativeToHome(0, 0);
        
        turtle.move(100);
        assertPositionRelativeToHome(100, 0);
        
        turtle.face(90);
        turtle.move(100);
        assertPositionRelativeToHome(100, -100);
        
        turtle.home();
        turtle.face((int)Math.toDegrees(Math.atan(3.0 / 4.0)));
        turtle.move(5);
        System.out.println("facing " + turtle.facing() + " at " +
                           Arrays.toString(turtle.getPosition()));
        assertPositionRelativeToHome(4, -3);
        
        turtle.home();
        turtle.face((int)Math.toDegrees(Math.atan(5.0 / 12.0)));
        turtle.move(13);
        System.out.println("facing " + turtle.facing() + " at " +
                           Arrays.toString(turtle.getPosition()));
        assertPositionRelativeToHome(12, -5);
    }
    
    private void assertPositionRelativeToHome(int x, int y) {
        int[] position = turtle.getPosition();
        int homeX = canvas.getWidth() / 2;
        int homeY = canvas.getHeight() / 2;
        assertEquals("x position", x, position[0] - homeX);
        assertEquals("y position", y, position[1] - homeY);
    }

    /**
     * Test method for 'Turtle.face(int)'
     */
    public void testFace() {
        turtle.face(20);
        assertEquals(20, turtle.facing());
        
        turtle.face(-30);
        assertEquals(330, turtle.facing());
        
        turtle.face(400);
        assertEquals(40, turtle.facing());
    }

    /**
     * Test method for 'Turtle.home()'
     */
    public void testHome() {
        turtle.move(100);
        turtle.face(45);
        assertPositionRelativeToHome(100, 0);
        assertEquals(45, turtle.facing());
        
        turtle.home();
        assertPositionRelativeToHome(0, 0);
        assertEquals(0, turtle.facing());
    }

    /**
     * Test method for 'Turtle.penup()'
     */
    public void testPenup() {
        turtle.penup();
        assertFalse(turtle.isPenDown());
    }

    /**
     * Test method for 'Turtle.pendown()'
     */
    public void testPendown() {
        turtle.pendown();
        assertTrue(turtle.isPenDown());
    }

    /**
     * Test method for 'Turtle.color(String)'
     */
    public void testColor() {
        turtle.color("red");
        assertEquals(Color.red, turtle.getColor());
        
        turtle.color("black");
        assertEquals(Color.black, turtle.getColor());
        
        turtle.color("white");
        assertEquals(Color.white, turtle.getColor());
    }

    /**
     * Test method for 'Turtle.setSpeed(int)'
     */
    public void testSetSpeed() {
        turtle.setSpeed(0);
        assertEquals(0, turtle.getSpeed());
        
        turtle.setSpeed(50);
        assertEquals(50, turtle.getSpeed());
        
        turtle.setSpeed(100);
        assertEquals(100, turtle.getSpeed());
    }

    /**
     * Test method for 'Turtle.setPaused(boolean)'
     */
    public void testSetPaused() {
        assertFalse(turtle.isPaused());
        
        turtle.setPaused(true);
        assertTrue(turtle.isPaused());
        
        turtle.setPaused(false);
        assertFalse(turtle.isPaused());
    }

}
