String getOutput(
        OutputKind outKind,
        ErrorKind errKind,
        MultilinePolicy policy,
        IndentKind summaryIndent,
        IndentKind detailsIndent,
        IndentKind multiIndent) {
      String constIndent =
          (errKind == ErrorKind.DOUBLE)
              ? summaryIndent.string + detailsIndent.string
              : summaryIndent.string;
      constIndent += multiIndent.string;

      String errMsg1 = errKind.getOutput(outKind, summaryIndent, detailsIndent, constIndent);
      String errMsg2 =
          errKind.getOutput(outKind, summaryIndent, detailsIndent, constIndent + constIndent);

      errMsg1 = errMsg1.replaceAll("compiler.err", "compiler.misc");
      errMsg1 = errMsg1.replaceAll("error message", "subdiagnostic");
      errMsg2 = errMsg2.replaceAll("compiler.err", "compiler.misc");
      errMsg2 = errMsg2.replaceAll("error message", "subdiagnostic");

      String template =
          outKind == OutputKind.RAW
              ? rawTemplates[policy.index][index]
              : basicTemplates[policy.index][index];

      template = template.replaceAll("E", errMsg1);
      return template.replaceAll("Q", errMsg2);
    }
  void checkOutput(String msg) {
    boolean shouldPrintSource =
        posKind == PositionKind.POS
            && xdiagsSource != XDiagsSource.NO_SOURCE
            && (xdiagsSource == XDiagsSource.SOURCE || outputKind == OutputKind.BASIC);
    String errorLine =
        posKind.getOutput(outputKind)
            + errorKind.getOutput(outputKind, summaryIndent, detailsIndent);
    if (xdiagsCompact != XDiagsCompact.COMPACT)
      errorLine +=
          multiKind.getOutput(
              outputKind, errorKind, multiPolicy, summaryIndent, detailsIndent, subdiagsIndent);
    String[] lines = errorLine.split("\n");
    if (xdiagsCompact == XDiagsCompact.COMPACT) {
      errorLine = lines[0];
      lines = new String[] {errorLine};
    }
    if (shouldPrintSource) {
      if (sourceLineKind.isAfterSummary()) {
        String sep = "\n";
        if (lines.length == 1) {
          errorLine += "\n";
          sep = "";
        }
        errorLine =
            errorLine.replaceFirst(
                "\n",
                Matcher.quoteReplacement(
                    xdiagsSource.getOutput(caretKind, sourceIndent, outputKind) + sep));
      } else errorLine += xdiagsSource.getOutput(caretKind, sourceIndent, outputKind);
    }

    if (!msg.equals(errorLine)) {
      printInfo(msg, errorLine);
      throw new AssertionError("errors were found");
    }
  }