package jsettlers.common.buildings;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import jsettlers.common.buildings.stacks.RelativeStack;
import jsettlers.common.position.RelativePoint;
@RunWith(Parameterized.class)
public class BuildingConfigurationsTest {
@Parameters(name = "{index}: {0}")
public static Collection<Object[]> buildingTypes() {
List<Object[]> result = new ArrayList<Object[]>();
for (EBuildingType buildingType : EBuildingType.VALUES) {
result.add(new Object[] { buildingType });
}
return result;
}
private final EBuildingType buildingType;
public BuildingConfigurationsTest(EBuildingType buildingType) {
this.buildingType = buildingType;
}
@Test
public void testDoorIsNotBlockedButProtected() {
assumeTrue(EBuildingType.TEMPLE != buildingType); // temple uses door location for the wine bowl
assumeTrue(EBuildingType.MARKET_PLACE != buildingType); // market place does not use the door
assertFalse(isBlocked(buildingType.getDoorTile()));
assertTrue(isProtected(buildingType.getDoorTile()));
}
@Test
public void testStacksAreNotBlockedButProtected() {
for (RelativeStack stack : buildingType.getConstructionStacks()) {
assertFalse(isBlocked(stack));
assertTrue(isProtected(stack));
}
for (RelativeStack stack : buildingType.getRequestStacks()) {
assertFalse(isBlocked(stack));
assertTrue(isProtected(stack));
}
for (RelativeStack stack : buildingType.getOfferStacks()) {
assertFalse(isBlocked(stack));
assertTrue(isProtected(stack));
}
}
private boolean isBlocked(RelativePoint position) {
return contains(buildingType.getBlockedTiles(), position);
}
private boolean isProtected(RelativePoint position) {
return contains(buildingType.getProtectedTiles(), position);
}
private static boolean contains(RelativePoint[] positions, RelativePoint positionToCheck) {
for (RelativePoint current : positions) {
if (current.equals(positionToCheck)) {
return true;
}
}
return false;
}
}