private static String getText(final List<List<Symbol>> board) {
        List<WinnerChecker> winnerCheckers = Arrays.asList(new HorizontalChecker(), new VerticalChecker(new Column()),
                new VerticalChecker(new DiagonalIncreasing()),
                new VerticalChecker(new DiagonalDecreasing()));

        // "X won", "O won", "Draw", "Game has not completed"
        String text = "Draw";
        for (int i = 0; i < board.size(); i++) {
            List<Symbol> row = board.get(i);
            for (int j = 0; j < row.size(); j++) {
                if (row.get(j) == Symbol.EMPTY) {
                    text = "Game has not completed";
                    continue;
                }
                for (WinnerChecker winnerChecker : winnerCheckers) {
                    if (winnerChecker.isWinner(i, j, board)) {
                        if (!Arrays.asList(Symbol.O, Symbol.X).contains(winnerChecker.symbol)) {
                            throw new RuntimeException(String.format("Illegal symbol for winner: %s (%s)",
                                    winnerChecker.symbol, winnerChecker));
                        }
                        return winnerChecker.symbol == Symbol.O ? "O won" : "X won";
                    }
                }
            }
        }
        return text;
    }