public void testTotalsInPageReport() throws Exception {
    MockMartusApp app = MockMartusApp.create();
    app.loadSampleData();

    ReportFormat rf = new ReportFormat();
    rf.setBulletinPerPage(true);
    rf.setTotalSection("Totals");

    RunReportOptions detailOnly = new RunReportOptions();
    detailOnly.hideDetail = false;
    detailOnly.printBreaks = false;
    ReportOutput details = runReportOnAppData(rf, app, detailOnly);
    assertEquals("", details.getPrintableDocument());

    RunReportOptions detailAndSummary = new RunReportOptions();
    detailAndSummary.hideDetail = false;
    detailAndSummary.printBreaks = true;
    ReportOutput both = runReportOnAppData(rf, app, detailAndSummary);
    assertEquals("Totals", both.getPrintableDocument());

    RunReportOptions summaryOnly = new RunReportOptions();
    summaryOnly.hideDetail = true;
    summaryOnly.printBreaks = true;
    ReportOutput summary = runReportOnAppData(rf, app, summaryOnly);
    assertEquals("Totals", summary.getPrintableDocument());
  }
  public void testSummaryTotals() throws Exception {
    String sampleDate = "2004-06-19";
    MockMartusApp app = createAppWithBulletinsForBreaks(sampleDate);
    RunReportOptions options = new RunReportOptions();
    options.printBreaks = true;
    options.includePrivate = true;
    options.hideDetail = true;

    ReportFormat rf = new ReportFormat();
    rf.setTotalSection(
        "TOTALS $totals.count()\n"
            + "#foreach($summary1 in $totals.children())\n"
            + "1. $summary1.label(): $summary1.value() = $summary1.count()\n"
            + "#foreach($summary2 in $summary1.children())\n"
            + "2. $summary2.label(): $summary2.value() = $summary2.count()\n"
            + "#foreach($summary3 in $summary2.children())\n"
            + "3. $summary3.label(): $summary3.value() = $summary3.count()\n"
            + "#end\n"
            + "#end\n"
            + "#end\n");

    MiniLocalization localization = new MiniLocalization();
    String authorLabel = localization.getFieldLabelHtml(Bulletin.TAGAUTHOR);
    String summaryLabel = localization.getFieldLabelHtml(Bulletin.TAGSUMMARY);
    ReportOutput totals = runReportOnAppData(rf, app, options);
    assertEquals(
        "TOTALS 4\n"
            + "1. "
            + authorLabel
            + ": a = 3\n"
            + "2. "
            + summaryLabel
            + ": 1 = 2\n"
            + "2. "
            + summaryLabel
            + ": 2 = 1\n"
            + "1. "
            + authorLabel
            + ": b = 1\n"
            + "2. "
            + summaryLabel
            + ": 2 = 1\n",
        totals.getPageText(0));

    options.printBreaks = false;
    ReportOutput noTotals = runReportOnAppData(rf, app, options);
    assertEquals("printed total section?", "", noTotals.getPageText(0));

    rf.setBreakSection("BREAK");
    options.printBreaks = true;
    options.hideDetail = true;
    ReportOutput totalsOnly = runReportOnAppData(rf, app, options);
    assertNotContains("Still printed breaks?", "BREAK", totalsOnly.getPageText(0));
  }
  public void testBreakSection() throws Exception {
    String sampleDate = "2004-06-19";
    MockMartusApp app = createAppWithBulletinsForBreaks(sampleDate);
    ReportFormat rf = new ReportFormat();
    String breakSection =
        "$BreakLevel had $BreakCount\n"
            + "#foreach($x in [0..$BreakLevel])\n"
            + "$BreakFields.get($x).getLocalizedLabelHtml($localization): "
            + "$BreakFields.get($x).html($localization) "
            + "#end\n\n";
    rf.setBreakSection(breakSection);

    RunReportOptions options = new RunReportOptions();
    options.includePrivate = true;
    options.hideDetail = false;
    options.printBreaks = true;

    MiniLocalization localization = new MiniLocalization();
    String authorLabel = localization.getFieldLabelHtml(Bulletin.TAGAUTHOR);
    String summaryLabel = localization.getFieldLabelHtml(Bulletin.TAGSUMMARY);

    ReportOutput sortByAuthorSummary = runReportOnAppData(rf, app, options);
    assertEquals(
        "1 had 2\n"
            + authorLabel
            + ": a "
            + summaryLabel
            + ": 1 \n"
            + "1 had 1\n"
            + authorLabel
            + ": a "
            + summaryLabel
            + ": 2 \n"
            + "0 had 3\n"
            + authorLabel
            + ": a \n"
            + "1 had 1\n"
            + authorLabel
            + ": b "
            + summaryLabel
            + ": 2 \n"
            + "0 had 1\n"
            + authorLabel
            + ": b \n",
        sortByAuthorSummary.getPageText(0));

    MiniFieldSpec[] entryDateSorting = {
      new MiniFieldSpec(StandardFieldSpecs.findStandardFieldSpec(Bulletin.TAGENTRYDATE)),
    };

    String entryDateLabel = localization.getFieldLabelHtml(Bulletin.TAGENTRYDATE);
    String formattedDate = localization.convertStoredDateToDisplay(sampleDate);
    ReportOutput sortedByEntryDate = runReportOnAppData(rf, app, options, entryDateSorting);
    assertEquals(
        "0 had 4\n" + entryDateLabel + ": " + formattedDate + " \n",
        sortedByEntryDate.getPageText(0));

    options.printBreaks = false;
    assertEquals("Still had output?", "", runReportOnAppData(rf, app, options).getPageText(0));
  }
  private void verifySummaryBreaksOnReusableDropdowns(boolean withDetail)
      throws Exception, IOException {
    ReusableChoices choices = new ReusableChoices("choicescode", "Choices Label");
    String aLabel = "Fabulous A";
    choices.add(new ChoiceItem("a", aLabel));
    String bLabel = "Excellent B";
    choices.add(new ChoiceItem("b", bLabel));
    MockMartusApp app = MockMartusApp.create();
    FieldSpecCollection defaultSpecs = app.getStore().getTopSectionFieldSpecs();
    FieldSpecCollection specs = new FieldSpecCollection();
    for (int i = 0; i < defaultSpecs.size(); ++i) specs.add(defaultSpecs.get(i));
    specs.addReusableChoiceList(choices);
    CustomDropDownFieldSpec dropdown = new CustomDropDownFieldSpec();
    dropdown.setTag("dd");
    dropdown.setLabel("Dropdown");
    dropdown.addReusableChoicesCode(choices.getCode());
    specs.add(dropdown);
    app.getStore().setTopSectionFieldSpecs(specs);

    Bulletin b1 = app.createBulletin();
    b1.set(dropdown.getTag(), "a");
    app.saveBulletin(b1, app.getStore().getFolderSaved());
    Bulletin b2 = app.createBulletin();
    b2.set(dropdown.getTag(), "b");
    app.saveBulletin(b2, app.getStore().getFolderSaved());

    MiniLocalization localization = new MiniLocalization();
    MiniFieldSpec[] sortSpecs = new MiniFieldSpec[] {new MiniFieldSpec(dropdown)};
    localization.setCurrentLanguageCode("en");
    ReportFormat report = new TabularReportBuilder(localization).createTabular(sortSpecs);
    ReportOutput destination = new ReportOutput();
    RunReportOptions options = new RunReportOptions();
    options.hideDetail = withDetail;
    options.printBreaks = true;
    options.includePrivate = true;
    ReportRunner runner = new ReportRunner(app.getSecurity(), new MiniLocalization());
    SortableBulletinList bulletins = new SortableBulletinList(localization, sortSpecs);
    bulletins.add(b1);
    bulletins.add(b2);
    runner.runReport(
        report,
        app.getStore().getDatabase(),
        bulletins,
        destination,
        options,
        specs.getAllReusableChoiceLists());
    destination.close();
    String result = destination.getPrintableDocument();
    assertContains(withDetail + " Wrote code instead of label a?", aLabel, result);
    assertContains(withDetail + " Wrote code instead of label b?", bLabel, result);
  }
  public void testOmitDetail() throws Exception {
    String sampleDate = "2004-06-19";
    MockMartusApp app = createAppWithBulletinsForBreaks(sampleDate);
    RunReportOptions options = new RunReportOptions();
    options.includePrivate = true;
    options.printBreaks = true;

    ReportFormat rf = new ReportFormat();
    rf.setDocumentStartSection("Start ");
    rf.setDetailSection("Detail ");
    rf.setBreakSection("Break ");
    rf.setHeaderSection("Header ");
    rf.setFooterSection("Footer ");
    rf.setTotalBreakSection("TotalBreak ");
    rf.setTotalSection("Total ");
    rf.setDocumentEndSection("End ");
    rf.setFakePageBreakSection(". ");

    ReportOutput sortByAuthorSummaryWithDetail = runReportOnAppData(rf, app, options);
    assertEquals(
        "Start Header Detail Detail Break Detail Break Break Detail Break Break TotalBreak Footer . End ",
        sortByAuthorSummaryWithDetail.getPrintableDocument());

    options.hideDetail = true;
    ReportOutput sortByAuthorSummaryWithoutDetail = runReportOnAppData(rf, app, options);
    assertEquals("Start Total . End ", sortByAuthorSummaryWithoutDetail.getPrintableDocument());

    rf.setBulletinPerPage(true);
    options.hideDetail = false;
    ReportOutput pageWithDetail = runReportOnAppData(rf, app, options);
    assertEquals(
        "Start Header Detail Footer . Header Detail Footer . Header Detail Footer . Header Detail Footer . Total . End ",
        pageWithDetail.getPrintableDocument());

    options.hideDetail = true;
    ReportOutput pageWithoutDetail = runReportOnAppData(rf, app, options);
    assertEquals("Start Total . End ", pageWithoutDetail.getPrintableDocument());
  }