// Asteroid Push - A game featuring selfmade spaceships and pompous physics
// Copyright (C) 2013 Christian Meyer, Silvan Wegmann
//
// 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 3 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, see <http://www.gnu.org/licenses/>.
package org.codecranachan.asteroidpush.base.workshop.tokenboard;
import static org.junit.Assert.*;
import java.util.Collection;
import org.codecranachan.asteroidpush.base.visuals.Representation;
import org.codecranachan.asteroidpush.base.workshop.tokenboard.Board;
import org.codecranachan.asteroidpush.base.workshop.tokenboard.Placeable;
import org.codecranachan.asteroidpush.base.workshop.tokenboard.Placement;
import org.codecranachan.asteroidpush.base.workshop.tokenboard.Shape;
import org.codecranachan.asteroidpush.base.workshop.tokenboard.Token;
import org.codecranachan.asteroidpush.utils.OrthogonalCoordinate;
import org.junit.*;
class TestPlaceable implements Placeable {
private Shape shape;
public TestPlaceable(Shape shape) {
assert shape != null;
this.shape = shape;
}
public Shape getShape() {
return shape;
}
public Collection<Representation> getRepresentations() {
return null;
}
}
public class BoardTest {
private Board board;
@Before
public void set_up() {
board = new Board();
}
@Test
public void InvokeConstructor_CreateEmpty() {
assertTrue(board.isEmpty());
}
@Test(expected = IllegalArgumentException.class)
public void PutNullOnBoard_ThrowIllegalArgumentException() {
board.place(null);
}
@Test
public void PutTokenOnCenter_BoardNotEmpty() {
board.place(T0(OC(0, 0), 0));
assertFalse(board.isEmpty());
}
@Test
public void PickTokenFromEmptyBoard_GetNull() {
assertNull(board.pick(OC(0, 0)));
}
@Test
public void PickTokenWhichWasPreviouslyPut_GetThatTokenAndRemoveFromBoard() {
Token testToken = T0(OC(0, 0), 0);
board.place(testToken);
assertSame(testToken, board.pick(OC(0, 0)));
assertTrue(board.isEmpty());
}
@Test
public void InspectTokenOnEmptyBoard_GetNull() {
assertNull(board.inspect(OC(0, 0)));
}
@Test
public void InspectTokenWhichWasPreviouslyPut_GetThatToken() {
Token testToken = T0(OC(0, 0), 0);
board.place(testToken);
assertSame(testToken, board.inspect(OC(0, 0)));
assertFalse(board.isEmpty());
}
@Test
public void PutTokenOffCenter_GetNullFromCenter() {
Token testToken = T0(OC(1, 1), 0);
board.place(testToken);
assertNull(board.inspect(OC(0, 0)));
}
@Test
public void PutTwoTokensOnBoard_CanInspectBoth() {
OrthogonalCoordinate firstCoordinate = OC(1, 1);
OrthogonalCoordinate secondCoordinate = OC(-1, -1);
Token firstToken = T0(firstCoordinate, 0);
Token secondToken = T0(secondCoordinate, 0);
board.place(firstToken);
board.place(secondToken);
assertSame(firstToken, board.inspect(firstCoordinate));
assertSame(secondToken, board.inspect(secondCoordinate));
}
@Test(expected = IllegalArgumentException.class)
public void PutTokenOnOccupiedCoordinate_ThrowIllegalArgumentException() {
board.place(T0(OC(1, 1), 0));
board.place(T0(OC(1, 1), 0));
}
@Test
public void PlaceTokenWithBasicShape_CanOnlyBeFoundOnPivotCoordinate() {
Token token = T0(OC(0, 0), 0);
board.place(token);
assertNull(board.inspect(OC(1, 0)));
assertNull(board.inspect(OC(-1, 0)));
assertNull(board.inspect(OC(0, 1)));
assertNull(board.inspect(OC(0, -1)));
}
@Test
public void PlaceTokenWithSpecialShape_CanBeFoundOnAllCoordinates() {
Token token = T(new Shape("XX"), OC(0, 0), 0);
board.place(token);
assertSame(board.inspect(OC(0, 0)), token);
assertSame(board.inspect(OC(1, 0)), token);
}
@Test(expected = IllegalArgumentException.class)
public void PlaceOverlappingTokens_ThrowIllegalArgumentException() {
Token firstToken = T(new Shape("XX"), OC(0, 0), 0);
Token secondToken = T(new Shape("X", "X"), OC(1, -1), 0);
board.place(firstToken);
board.place(secondToken);
}
@Test
public void PlaceOverlappingTokens_TokenDoesNotGetPlaced() {
Token firstToken = T(new Shape("XX"), OC(0, 0), 0);
Token secondToken = T(new Shape("X", "X"), OC(1, -1), 0);
board.place(firstToken);
try {
board.place(secondToken);
} catch (IllegalArgumentException e) {
assertNull(board.inspect(OC(1, -1)));
assertSame(board.inspect(OC(1, 0)), firstToken);
}
}
@Test
public void RemoveTokenWithSpecialShape_AllCoordinatesAreFreed() {
Token token = T(new Shape("XX"), OC(0, 0), 0);
board.place(token);
assertSame(board.pick(OC(0, 0)), token);
assertNull(board.inspect(OC(0, 0)));
assertNull(board.inspect(OC(1, 0)));
}
@Test
public void PlaceRotatedToken_TokenOccupiesCorrectCoordinates() {
Token token = T(new Shape("XX"), OC(1, 1), 1);
board.place(token);
assertSame(board.inspect(OC(1, 1)), token);
assertSame(board.inspect(OC(1, 2)), token);
assertNull(board.inspect(OC(2, 1)));
}
private OrthogonalCoordinate OC(int x, int y) {
return new OrthogonalCoordinate(x, y);
}
private Token T0(OrthogonalCoordinate coord, int rotation) {
Token testToken = new Token(new TestPlaceable(new Shape()));
testToken.setPlacement(new Placement(rotation, coord));
return testToken;
}
private Token T(Shape shape, OrthogonalCoordinate coord, int rotation) {
Token testToken = new Token(new TestPlaceable(shape));
testToken.setPlacement(new Placement(rotation, coord));
return testToken;
}
}