/*
$Id$
Copyright (C) 2006-2007 by David Cotton
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package fr.free.jchecs.core;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static fr.free.jchecs.core.Constants.FILE_COUNT;
import static fr.free.jchecs.core.Constants.RANK_COUNT;
import static fr.free.jchecs.core.FENUtils.toBoard;
import static fr.free.jchecs.core.Piece.BLACK_BISHOP;
import static fr.free.jchecs.core.Piece.BLACK_KING;
import static fr.free.jchecs.core.Piece.BLACK_KNIGHT;
import static fr.free.jchecs.core.Piece.BLACK_PAWN;
import static fr.free.jchecs.core.Piece.BLACK_QUEEN;
import static fr.free.jchecs.core.Piece.BLACK_ROOK;
import static fr.free.jchecs.core.Piece.WHITE_BISHOP;
import static fr.free.jchecs.core.Piece.WHITE_KING;
import static fr.free.jchecs.core.Piece.WHITE_KNIGHT;
import static fr.free.jchecs.core.Piece.WHITE_PAWN;
import static fr.free.jchecs.core.Piece.WHITE_QUEEN;
import static fr.free.jchecs.core.Piece.WHITE_ROOK;
import org.junit.Test;
/**
* Tests unitaires des classes représentant des états de la partie.
*
* @author David Cotton
*/
public final class BoardTest
{
/** Etat de test n°1. */
private Board _board1;
/** Etat de test n°2. */
private Board _board2;
/** Etat de test n°3. */
private Board _board3;
/**
* Pour que JUnit puisse instancier les tests.
*/
public BoardTest()
{
try
{
_board1 = toBoard("r1bqkbnr/pppp1ppp/2n5/4p3/3PP3/2P5/PP3PPP/RNBQKBNR b KQkq d3 0 10");
_board2 = toBoard("r1bqkbnr/pppp1ppp/2n5/4p3/3PP3/2P5/PP3PPP/RNBQKBNR b KQkq e3 0 10");
_board3 = toBoard("r1bqkbnr/pppp1ppp/2n5/4p3/3PP3/2P5/PP3PPP/RNBQKBNR b - e3 0 10");
}
catch (final FENException e)
{
System.out.println(e);
}
}
/**
* Teste la méthode "compareTo(x)".
*/
@Test
public void testCompareTo()
{
assertTrue(_board1.compareTo(_board1) == 0);
assertTrue(_board1.compareTo(_board2) != 0);
assertTrue(_board1.compareTo(_board3) != 0);
assertTrue(_board2.compareTo(_board3) != 0);
assertTrue(_board1.compareTo(_board2) == -_board2.compareTo(_board1));
assertTrue(_board1.compareTo(_board3) == -_board3.compareTo(_board1));
assertTrue(_board2.compareTo(_board3) == -_board3.compareTo(_board2));
}
/**
* Teste la méthode "compareTo(null)".
*/
@Test(expected = NullPointerException.class)
public void testCompareToNull()
{
_board1.compareTo(null);
}
/**
* Teste l'état initial vide.
*/
@Test
public void testEmpty()
{
for (final BoardFactory.Type t : BoardFactory.Type.values())
{
validateEmpty(BoardFactory.valueOf(t, BoardFactory.State.EMPTY));
}
}
/**
* Teste la méthode "equals".
*/
@Test
public void testEquals()
{
assertTrue(_board1.equals(_board1));
assertFalse(_board1.equals(_board2));
assertFalse(_board1.equals(_board3));
assertFalse(_board2.equals(_board3));
assertFalse(_board3.equals(_board1));
assertFalse(_board3.equals(_board2));
assertFalse(_board2.equals(_board1));
for (final BoardFactory.State s : BoardFactory.State.values())
{
Board etatPrec = null;
for (final BoardFactory.Type t : BoardFactory.Type.values())
{
final Board etat = BoardFactory.valueOf(t, s);
final String nomClasse = etat.getClass().getSimpleName();
if (etatPrec != null)
{
assertTrue(nomClasse, etat.equals(etat));
assertTrue(nomClasse, etatPrec.equals(etatPrec));
assertTrue(nomClasse, etatPrec.equals(etat));
assertTrue(nomClasse, etat.equals(etatPrec));
assertFalse(nomClasse, etat.equals(null));
assertFalse(nomClasse, etatPrec.equals(null));
}
etatPrec = etat;
}
}
for (final BoardFactory.Type t : BoardFactory.Type.values())
{
Board etatPrec = null;
for (final BoardFactory.State s : BoardFactory.State.values())
{
final Board etat = BoardFactory.valueOf(t, s);
final String nomClasse = etat.getClass().getSimpleName();
if (etatPrec != null)
{
assertTrue(nomClasse, etat.equals(etat));
assertTrue(nomClasse, etatPrec.equals(etatPrec));
assertFalse(nomClasse, etatPrec.equals(etat));
assertFalse(nomClasse, etat.equals(etatPrec));
assertFalse(nomClasse, etat.equals(null));
assertFalse(nomClasse, etatPrec.equals(null));
}
etatPrec = etat;
}
}
}
/**
* Teste l'équivalence des méthodes de lecture du contenu d'une case.
*/
@Test
public void testGetPieceAt()
{
Board etatPrec = null;
for (final BoardFactory.Type t : BoardFactory.Type.values())
{
final Board etat = BoardFactory.valueOf(t, BoardFactory.State.STARTING);
if (etatPrec != null)
{
final String nomClasse = etat.getClass().getSimpleName();
for (final Square s : Square.values())
{
assertSame(nomClasse, etat.getPieceAt(s), etat.getPieceAt(s.getFile(), s.getRank()));
assertSame(nomClasse, etat.getPieceAt(s), etatPrec.getPieceAt(s));
assertSame(nomClasse, etat.getPieceAt(s), etatPrec.getPieceAt(s.getFile(), s.getRank()));
}
}
etatPrec = etat;
}
}
/**
* Teste la méthode de calcul des clés de hachage.
*/
@Test
public void testHashCode()
{
assertFalse(_board1.hashCode() == _board2.hashCode());
for (final BoardFactory.State s : BoardFactory.State.values())
{
Board etatPrec = null;
for (final BoardFactory.Type t : BoardFactory.Type.values())
{
final Board etat = BoardFactory.valueOf(t, s);
if (etatPrec != null)
{
final String nomClasse = etat.getClass().getSimpleName();
assertTrue(nomClasse, etatPrec.hashCode() == etat.hashCode());
}
etatPrec = etat;
}
}
}
/**
* Teste l'état initial standard.
*/
@Test
public void testStandard()
{
for (final BoardFactory.Type t : BoardFactory.Type.values())
{
validateStarting(BoardFactory.valueOf(t, BoardFactory.State.STARTING));
}
}
/**
* Teste de la méthode "toString".
*/
@Test
public void testToString()
{
final String attendu =
"rnbqkbnr\npppppppp\n++++++++\n++++++++\n++++++++\n++++++++\nPPPPPPPP\nRNBQKBNR\n";
for (final BoardFactory.Type t : BoardFactory.Type.values())
{
assertEquals(BoardFactory.valueOf(t, BoardFactory.State.STARTING).toString(), attendu);
}
}
/**
* Vérifie que l'état reçu corresponde bien à un état "EMPTY".
*
* @param pEtat Etat de jeu.
*/
private static void validateEmpty(final Board pEtat)
{
assert pEtat != null;
final String nomClasse = pEtat.getClass().getSimpleName();
for (final Square s : Square.values())
{
assertNull(nomClasse, pEtat.getPieceAt(s));
}
validateInitialFlags(pEtat);
}
/**
* Vérifie que les drapeaux correspondent bien à un état initial.
*
* @param pEtat Etat de jeu.
*/
private static void validateInitialFlags(final Board pEtat)
{
assert pEtat != null;
final String nomClasse = pEtat.getClass().getSimpleName();
assertTrue(nomClasse, pEtat.isWhiteActive());
assertTrue(nomClasse, pEtat.canCastleLong(true));
assertTrue(nomClasse, pEtat.canCastleLong(false));
assertTrue(nomClasse, pEtat.canCastleShort(true));
assertTrue(nomClasse, pEtat.canCastleShort(false));
assertTrue(nomClasse, pEtat.getEnPassant() == null);
assertTrue(nomClasse, pEtat.getHalfmoveCount() == 0);
assertTrue(nomClasse, pEtat.getFullmoveNumber() == 1);
}
/**
* Vérifie que l'état reçu corresponde bien à un état "EMPTY".
*
* @param pEtat Etat de jeu.
*/
private static void validateStarting(final Board pEtat)
{
assert pEtat != null;
final String nomClasse = pEtat.getClass().getSimpleName();
for (int y = 2; y < RANK_COUNT - 2; y++)
{
for (int x = 0; x < FILE_COUNT; x++)
{
assertNull(nomClasse, pEtat.getPieceAt(x, y));
}
}
for (int x = 0; x < FILE_COUNT; x++)
{
assertSame(nomClasse, pEtat.getPieceAt(x, 1), WHITE_PAWN);
assertSame(nomClasse, pEtat.getPieceAt(x, RANK_COUNT - 2), BLACK_PAWN);
}
assertSame(nomClasse, pEtat.getPieceAt(0, 0), WHITE_ROOK);
assertSame(nomClasse, pEtat.getPieceAt(FILE_COUNT - 1, 0), WHITE_ROOK);
assertSame(nomClasse, pEtat.getPieceAt(0, RANK_COUNT - 1), BLACK_ROOK);
assertSame(nomClasse, pEtat.getPieceAt(FILE_COUNT - 1, RANK_COUNT - 1), BLACK_ROOK);
assertSame(nomClasse, pEtat.getPieceAt(1, 0), WHITE_KNIGHT);
assertSame(nomClasse, pEtat.getPieceAt(FILE_COUNT - 2, 0), WHITE_KNIGHT);
assertSame(nomClasse, pEtat.getPieceAt(1, RANK_COUNT - 1), BLACK_KNIGHT);
assertSame(nomClasse, pEtat.getPieceAt(FILE_COUNT - 2, RANK_COUNT - 1), BLACK_KNIGHT);
assertSame(nomClasse, pEtat.getPieceAt(2, 0), WHITE_BISHOP);
assertSame(nomClasse, pEtat.getPieceAt(FILE_COUNT - 3, 0), WHITE_BISHOP);
assertSame(nomClasse, pEtat.getPieceAt(2, RANK_COUNT - 1), BLACK_BISHOP);
assertSame(nomClasse, pEtat.getPieceAt(FILE_COUNT - 3, RANK_COUNT - 1), BLACK_BISHOP);
assertSame(nomClasse, pEtat.getPieceAt(3, 0), WHITE_QUEEN);
assertSame(nomClasse, pEtat.getPieceAt(3, RANK_COUNT - 1), BLACK_QUEEN);
assertSame(nomClasse, pEtat.getPieceAt(FILE_COUNT - 4, 0), WHITE_KING);
assertSame(nomClasse, pEtat.getPieceAt(FILE_COUNT - 4, RANK_COUNT - 1), BLACK_KING);
validateInitialFlags(pEtat);
}
}