package aima.test.core.unit.environment.nqueens;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import aima.core.environment.nqueens.NQueensBoard;
import aima.core.util.datastructure.XYLocation;
/**
* @author Ravi Mohan
*
*/
public class NQueensBoardTest {
NQueensBoard board;
@Before
public void setUp() {
board = new NQueensBoard(8);
}
@Test
public void testBasics() {
Assert.assertEquals(0, board.getNumberOfQueensOnBoard());
board.addQueenAt(new XYLocation(0, 0));
Assert.assertEquals(1, board.getNumberOfQueensOnBoard());
board.addQueenAt(new XYLocation(0, 0));
Assert.assertEquals(1, board.getNumberOfQueensOnBoard());
board.addQueenAt(new XYLocation(1, 1));
Assert.assertEquals(2, board.getNumberOfQueensOnBoard());
Assert.assertTrue(board.queenExistsAt(new XYLocation(1, 1)));
Assert.assertTrue(board.queenExistsAt(new XYLocation(0, 0)));
board.moveQueen(new XYLocation(1, 1), new XYLocation(3, 3));
Assert.assertTrue(board.queenExistsAt(new XYLocation(3, 3)));
Assert.assertTrue(!(board.queenExistsAt(new XYLocation(1, 1))));
Assert.assertEquals(2, board.getNumberOfQueensOnBoard());
}
@Test
public void testCornerQueenAttack1() {
board.addQueenAt(new XYLocation(0, 0));
Assert.assertEquals(false,
board.isSquareUnderAttack(new XYLocation(0, 0)));
// queen on square not included
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(1, 0)));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(7, 0)));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(0, 7)));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(1, 1)));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(2, 2)));
Assert.assertEquals(false,
board.isSquareUnderAttack(new XYLocation(2, 1)));
Assert.assertEquals(false,
board.isSquareUnderAttack(new XYLocation(1, 2)));
}
@Test
public void testCornerQueenAttack2() {
board.addQueenAt(new XYLocation(7, 7));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(0, 0)));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(7, 0)));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(0, 7)));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(7, 0)));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(6, 6)));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(5, 5)));
Assert.assertEquals(false,
board.isSquareUnderAttack(new XYLocation(6, 5)));
Assert.assertEquals(false,
board.isSquareUnderAttack(new XYLocation(5, 6)));
}
@Test
public void testEdgeQueenAttack() {
board.addQueenAt(new XYLocation(0, 3));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(0, 0)));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(0, 7)));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(7, 3)));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(3, 0)));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(4, 7)));
}
@Test
public void testAttack2() {
board.addQueenAt(new XYLocation(7, 0));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(6, 1)));
}
@Test
public void testAttack3() {
board.addQueenAt(new XYLocation(0, 0));
Assert.assertEquals(true,
board.isSquareUnderAttack(new XYLocation(0, 1)));
}
@Test
public void testAttack4() {
board.addQueenAt(new XYLocation(0, 2));
Assert.assertTrue(board.isSquareUnderAttack(new XYLocation(1, 1)));
}
@Test
public void testMidBoardDiagonalAttack() {
board.addQueenAt(new XYLocation(3, 3));
// forwardDiagonal from the queen
Assert.assertTrue(board.isSquareUnderAttack(new XYLocation(4, 2)));
Assert.assertTrue(board.isSquareUnderAttack(new XYLocation(4, 4)));
// backwardDiagonal from the queen
Assert.assertTrue(board.isSquareUnderAttack(new XYLocation(2, 2)));
Assert.assertTrue(board.isSquareUnderAttack(new XYLocation(2, 4)));
}
@Test
public void testCornerDiagonalAttack() {
board.addQueenAt(new XYLocation(0, 0));
// forwardDiagonal from the queen
Assert.assertTrue(board.isSquareUnderAttack(new XYLocation(1, 1)));
board.clear();
board.addQueenAt(new XYLocation(7, 7));
// backwardDiagonal from the queen
Assert.assertTrue(board.isSquareUnderAttack(new XYLocation(6, 6)));
// assertTrue(board.isSquareUnderAttack(new XYLocation(2, 2)));
// assertTrue(board.isSquareUnderAttack(new XYLocation(2, 4)));
}
@Test
public void testAttack6() {
board.addQueenAt(new XYLocation(1, 6));
Assert.assertTrue(board.isSquareUnderAttack(new XYLocation(0, 7)));
}
@Test
public void testRemoveQueen() {
board.addQueenAt(new XYLocation(0, 0));
Assert.assertEquals(1, board.getNumberOfQueensOnBoard());
board.removeQueenFrom(new XYLocation(0, 0));
Assert.assertEquals(0, board.getNumberOfQueensOnBoard());
}
@Test
public void testMoveQueen() {
XYLocation from = new XYLocation(0, 0);
XYLocation to = new XYLocation(1, 1);
board.addQueenAt(from);
Assert.assertEquals(1, board.getNumberOfQueensOnBoard());
Assert.assertTrue(board.queenExistsAt(from));
Assert.assertFalse(board.queenExistsAt(to));
board.moveQueen(from, to);
Assert.assertEquals(1, board.getNumberOfQueensOnBoard());
Assert.assertFalse(board.queenExistsAt(from));
Assert.assertTrue(board.queenExistsAt(to));
}
@Test
public void testMoveNonExistentQueen() {
XYLocation from = new XYLocation(0, 0);
XYLocation to = new XYLocation(1, 1);
board.moveQueen(from, to);
Assert.assertEquals(0, board.getNumberOfQueensOnBoard());
}
@Test
public void testRemoveNonExistentQueen() {
board.removeQueenFrom(new XYLocation(0, 0));
Assert.assertEquals(0, board.getNumberOfQueensOnBoard());
}
@Test
public void testEquality() {
board.addQueenAt(new XYLocation(0, 0));
NQueensBoard board2 = new NQueensBoard(8);
board2.addQueenAt(new XYLocation(0, 0));
Assert.assertEquals(board, board2);
NQueensBoard board3 = new NQueensBoard(8);
board3.addQueenAt(new XYLocation(0, 1));
Assert.assertFalse(board.equals(board3));
}
@Test
public void testPrint() {
NQueensBoard board2 = new NQueensBoard(2);
board2.addQueenAt(new XYLocation(0, 0));
String expected = " Q - \n - - \n";
Assert.assertEquals(expected, board2.getBoardPic());
}
@Test
public void testDontPlaceTwoQueensOnOneSquare() {
board.addQueenAt(new XYLocation(0, 0));
board.addQueenAt(new XYLocation(0, 0));
Assert.assertEquals(1, board.getNumberOfQueensOnBoard());
}
@Test
public void testSimpleHorizontalAttack() {
XYLocation loc = new XYLocation(0, 0);
board.addQueenAt(loc);
Assert.assertEquals(0, board.getNumberOfAttacksOn(loc));
Assert.assertEquals(1, board.getNumberOfAttacksOn(new XYLocation(1, 0)));
Assert.assertEquals(1, board.getNumberOfAttacksOn(loc.right()));
Assert.assertEquals(1, board.getNumberOfAttacksOn(new XYLocation(7, 0)));
}
@Test
public void testSimpleVerticalAttack() {
XYLocation loc = new XYLocation(0, 0);
board.addQueenAt(loc);
Assert.assertEquals(0, board.getNumberOfAttacksOn(loc));
Assert.assertEquals(1, board.getNumberOfAttacksOn(loc.down()));
Assert.assertEquals(1, board.getNumberOfAttacksOn(new XYLocation(0, 7)));
}
@Test
public void testSimpleDiagonalAttack() {
XYLocation loc = new XYLocation(3, 3);
board.addQueenAt(loc);
Assert.assertEquals(0, board.getNumberOfAttacksOn(loc));
Assert.assertEquals(1, board.getNumberOfAttacksOn(loc.down().right()));
Assert.assertEquals(1, board.getNumberOfAttacksOn(loc.down().left()));
Assert.assertEquals(1, board.getNumberOfAttacksOn(loc.up().left()));
Assert.assertEquals(1, board.getNumberOfAttacksOn(loc.up().right()));
Assert.assertEquals(1, board.getNumberOfAttacksOn(new XYLocation(7, 7)));
Assert.assertEquals(1, board.getNumberOfAttacksOn(new XYLocation(0, 0)));
Assert.assertEquals(1, board.getNumberOfAttacksOn(new XYLocation(6, 0)));
Assert.assertEquals(1, board.getNumberOfAttacksOn(new XYLocation(0, 6)));
}
@Test
public void testMultipleQueens() {
XYLocation loc1 = new XYLocation(3, 3);
board.addQueenAt(loc1);
Assert.assertEquals(1, board.getNumberOfAttacksOn(loc1.right()));
board.addQueenAt(loc1.right().right());
Assert.assertEquals(1, board.getNumberOfAttacksOn(loc1));
Assert.assertEquals(2, board.getNumberOfAttacksOn(loc1.right()));
board.addQueenAt(loc1.right().down());
Assert.assertEquals(2, board.getNumberOfAttacksOn(loc1));
Assert.assertEquals(3, board.getNumberOfAttacksOn(loc1.right()));
Assert.assertEquals(2, board.getNumberOfAttacksOn(loc1.right().right()));
}
@Test
public void testBoardDisplay() {
board.addQueenAt(new XYLocation(0, 5));
board.addQueenAt(new XYLocation(1, 6));
board.addQueenAt(new XYLocation(2, 1));
board.addQueenAt(new XYLocation(3, 3));
board.addQueenAt(new XYLocation(4, 6));
board.addQueenAt(new XYLocation(5, 4));
board.addQueenAt(new XYLocation(6, 7));
board.addQueenAt(new XYLocation(7, 7));
Assert.assertEquals(" - - - - - - - - \n"
+ " - - Q - - - - - \n" + " - - - - - - - - \n"
+ " - - - Q - - - - \n" + " - - - - - Q - - \n"
+ " Q - - - - - - - \n" + " - Q - - Q - - - \n"
+ " - - - - - - Q Q \n", board.getBoardPic());
Assert.assertEquals("--------\n" + "--Q-----\n" + "--------\n"
+ "---Q----\n" + "-----Q--\n" + "Q-------\n" + "-Q--Q---\n"
+ "------QQ\n", board.toString());
}
}