package com.codeborne.selenide.logevents;
import com.google.common.base.Joiner;
import java.util.Collections;
import java.util.OptionalInt;
import java.util.logging.Logger;
/**
* A simple text report of Selenide actions performed during test run.
*
* Class is thread-safe: the same instance of SimpleReport can be reused by different threads simultaneously.
*/
public class SimpleReport {
private static final Logger log = Logger.getLogger(SimpleReport.class.getName());
public void start() {
SelenideLogger.addListener("simpleReport", new EventsCollector());
}
public void finish(String title) {
EventsCollector logEventListener = SelenideLogger.removeListener("simpleReport");
OptionalInt maxLineLength = logEventListener.events()
.stream()
.map(LogEvent::getElement)
.map(String::length)
.mapToInt(Integer::intValue)
.max();
int count = maxLineLength.orElse(0) >= 20 ? (maxLineLength.getAsInt() + 1) : 20;
StringBuilder sb = new StringBuilder();
sb.append("Report for ").append(title).append('\n');
String delimiter = '+' + Joiner.on('+').join(line(count), line(70), line(10), line(10)) + "+\n";
sb.append(delimiter);
sb.append(String.format("|%-" + count + "s|%-70s|%-10s|%-10s|%n", "Element", "Subject", "Status", "ms."));
sb.append(delimiter);
for (LogEvent e : logEventListener.events()) {
sb.append(String.format("|%-" + count + "s|%-70s|%-10s|%-10s|%n", e.getElement(), e.getSubject(),
e.getStatus(), e.getDuration()));
}
sb.append(delimiter);
log.info(sb.toString());
}
public void clean() {
SelenideLogger.removeListener("simpleReport");
}
private String line(int count) {
return Joiner.on("").join(Collections.nCopies(count, "-"));
}
}