package oving2;

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

public class LocationTest {

	private Location loc;

	/**
	 * Check that the position of {@link #loc} is equal to the parameters.
	 * 
	 * @param x Expected x position
	 * @param y Expected y position
	 */
	private void checkPos(int x, int y) {
		assertEquals(x, loc.getX(), "Wrong x coordinate");
		assertEquals(y, loc.getY(), "Wrong y coordinate");
	}

	@BeforeEach
	public void beforeEach() {
		loc = new Location();
	}

	@Test
	@DisplayName("Private fields")
	public void testPrivateFields() {
		TestHelper.checkIfFieldsPrivate(Location.class);
	}

	@Test
	@DisplayName("Constructor")
	public void testConstructor() {
		this.checkPos(0, 0);
	}

	@Test
	@DisplayName("Move up")
	public void testUp() {
		loc.up();
		this.checkPos(0, -1);

		loc.up();
		this.checkPos(0, -2);
	}

	@Test
	@DisplayName("Move down")
	public void testDown() {
		loc.down();
		this.checkPos(0, 1);

		loc.down();
		this.checkPos(0, 2);
	}

	@Test
	@DisplayName("Move left")
	public void testLeft() {
		loc.left();
		this.checkPos(-1, 0);

		loc.left();
		this.checkPos(-2, 0);
	}

	@Test
	@DisplayName("Move right")
	public void testRight() {
		loc.right();
		this.checkPos(1, 0);

		loc.right();
		this.checkPos(2, 0);
	}

	@Test
	@DisplayName("Move multiple directions")
	public void testComplexMovement() {
		loc.right();
		this.checkPos(1, 0);

		loc.down();
		this.checkPos(1, 1);

		loc.right();
		this.checkPos(2, 1);

		loc.down();
		this.checkPos(2, 2);

		loc.left();
		this.checkPos(1, 2);

		loc.up();
		this.checkPos(1, 1);

		loc.up();
		this.checkPos(1, 0);

		loc.left();
		this.checkPos(0, 0);
	}
}
