### Question:
MoveFeasibilityChecker extends AbstractGameRules { public boolean isAnyMoveFeasible(Cell[][] cells, long playerId) { Collection<Integer> busyCellTypes = findBusyCellTypes(cells, playerId); for (int x = 0; x < cells.length; x++) { for (int y = 0; y < cells[x].length; y++) { Cell cell = cells[x][y]; List<Long> neighborCellsTypes = getNeighborCells(cells, x, y) .stream() .map(Cell::getOwner) .collect(Collectors.toList()); if (cell.getOwner() == 0 && !busyCellTypes.contains(cell.getType()) && neighborCellsTypes.contains(playerId)) { return true; } } } return false; }  boolean isAnyMoveFeasible(Cell[][] cells, long playerId);  }### Answer:
@Test public void whenNoAnyFeasibleMove() { boolean actual = moveFeasibilityChecker.isAnyMoveFeasible(cells, FIRST_PLAYER_ID); assertFalse(actual); }
@Test public void whenThereIsFeasibleMove() { List<Integer> otherPlayers = Arrays.asList(SECOND_PLAYER_ID, THIRD_PLAYER_ID); for (Integer otherPlayer : otherPlayers) { boolean actual = moveFeasibilityChecker.isAnyMoveFeasible(cells, otherPlayer); assertTrue(actual); } }