@Override @Nonnull public HourlyReport createReport() { final StringWriter sw = new StringWriter(); makeReport(sw); return new HourlyReport(sw.toString()); }
private void addAll (final @Nonnull List<JobEventSpi> results, final @Nonnull List<? extends JobEvent> jobEvents) { for (final JobEvent jobEvent : jobEvents) { if (jobEvent instanceof JobEventGroup) { addAll(results, ((JobEventGroup)jobEvent).findChildren().results()); } else { results.add((JobEventSpi)jobEvent); } } } }
@Test(dataProvider = "projects", dataProviderClass = ScenarioFactory.class) public void must_properly_generate_report (final @Nonnull String scenarioName, final @Nonnull ProjectSpi project) throws IOException { final Path expectedResultsFolder = Paths.get("src/test/resources/expected-results"); final Path testFolder = Paths.get("target/test-results"); Files.createDirectories(testFolder); final String name = scenarioName + "-" + project.getName() + ".txt"; final Path actualResult = testFolder.resolve(name); final Path expectedResult = expectedResultsFolder.resolve(name); final HourlyReport report = new DefaultHourlyReportGenerator(project).createReport(); try (final PrintWriter pw = new PrintWriter(actualResult.toFile())) { pw.print(report.asString()); } FileComparisonUtils.assertSameContents(expectedResult.toFile(), actualResult.toFile()); } }
private void makeReport (final @Nonnull Writer w) { final PrintWriter pw = new PrintWriter(w); System.err.println("CREATE REPORT " + project); pw.printf(SEPARATOR + "\n"); pw.printf(PATTERN, "Date", "Description", "Time", "Cost"); pw.printf(SEPARATOR + "\n"); // TODO: quick and dirty - refactor with visitor, lambdas final List<JobEventSpi> jobEvents = new ArrayList<>(); addAll(jobEvents, project.findChildren().results()); jobEvents.stream().sorted(comparing(JobEventSpi::getDateTime)) .forEach(event -> pw.printf(PATTERN2, DATE_FORMATTER.format(event.getDateTime()), event.getName(), DURATION_FORMATTER.format(event.getDuration()), MONEY_FORMATTER.format(event.getEarnings()))); pw.printf(SEPARATOR + "\n"); pw.printf(PATTERN3, "", "", DURATION_FORMATTER.format(project.getDuration()), MONEY_FORMATTER.format(project.getEarnings())); // FIXME: rename getAmount() -> getBudget() // FIXME: introduce getBudgetDuration() final Duration duration = Duration.ofHours((long)project.getBudget().divided(project.getHourlyRate())); pw.printf("BUDGET: %s\n", MONEY_FORMATTER.format(project.getBudget())); pw.printf("HOURLY RATE: %s\n", MONEY_FORMATTER.format(project.getHourlyRate())); pw.printf("DURATION: %s\n", DURATION_FORMATTER.format(duration)); pw.printf("REMAINING BUDGET: %s\n", MONEY_FORMATTER.format(project.getBudget().subtract(project.getEarnings()))); pw.printf("REMAINING TIME: %s\n", DURATION_FORMATTER.format(duration.minus(project.getDuration()))); pw.flush(); }