102030405060708090100110120130140150160170180190200210220230240250260270280290300310320330340350360370380390400410420430440450460470480490500510520530540550560570580590600610620630640650660670680690700710720730740750760770780790800810820830840850860870880890900910920930940950960970980990100010101020103010401050106010701080109011001110 module trial.reporters.html; import std.stdio; import std.array; import std.conv; import std.datetime; import std.string; import std.algorithm; import std.file; import std.path; import trial.interfaces; import trial.reporters.writer; class HtmlReporter : ILifecycleListener { private { bool success = true; immutable string destination; immutable long warningTestDuration; immutable long dangerTestDuration; } this(string destination, long warningTestDuration, long dangerTestDuration) { this.destination = destination; this.warningTestDuration = warningTestDuration; this.dangerTestDuration = dangerTestDuration; } void begin(ulong) { } void update() { } private { void relativePaths(ref SuiteResult[] results) { foreach(ref result; results) { relativePaths(result); } } void relativePaths(ref SuiteResult suite) { relativePaths(suite.attachments); foreach(ref result; suite.tests) { relativePaths(result); } } void relativePaths(ref TestResult step) { relativePaths(step.attachments); foreach(ref child; step.steps) { relativePaths(child); } } void relativePaths(ref StepResult step) { relativePaths(step.attachments); foreach(ref child; step.steps) { relativePaths(child); } } void relativePaths(ref Attachment[] attachments) { foreach(ref attachment; attachments) { attachment.file = asRelativePath(attachment.file, destination.dirName).array; } } } void end(SuiteResult[] results) { relativePaths(results); immutable string trialCss = import("assets/trial.css"); immutable string trialJs = import("assets/trial.js"); string content = import("templates/htmlReporter.html"); auto assets = buildPath(destination.dirName, "assets"); if(!destination.dirName.exists) { mkdirRecurse(destination.dirName); } if(!assets.exists) { mkdirRecurse(assets); } content = content .replace("{testResult}", "[" ~ results.map!(a => a.toString).join(",") ~ "]") .replace("{warningTestDuration}", warningTestDuration.to!string) .replace("{dangerTestDuration}", dangerTestDuration.to!string); std.file.write(destination, content); std.file.write(buildPath(assets, "trial.css"), trialCss); std.file.write(buildPath(assets, "trial.js"), trialJs); } }
module trial.reporters.html; import std.stdio; import std.array; import std.conv; import std.datetime; import std.string; import std.algorithm; import std.file; import std.path; import trial.interfaces; import trial.reporters.writer; class HtmlReporter : ILifecycleListener { private { bool success = true; immutable string destination; immutable long warningTestDuration; immutable long dangerTestDuration; } this(string destination, long warningTestDuration, long dangerTestDuration) { this.destination = destination; this.warningTestDuration = warningTestDuration; this.dangerTestDuration = dangerTestDuration; } void begin(ulong) { } void update() { } private { void relativePaths(ref SuiteResult[] results) { foreach(ref result; results) { relativePaths(result); } } void relativePaths(ref SuiteResult suite) { relativePaths(suite.attachments); foreach(ref result; suite.tests) { relativePaths(result); } } void relativePaths(ref TestResult step) { relativePaths(step.attachments); foreach(ref child; step.steps) { relativePaths(child); } } void relativePaths(ref StepResult step) { relativePaths(step.attachments); foreach(ref child; step.steps) { relativePaths(child); } } void relativePaths(ref Attachment[] attachments) { foreach(ref attachment; attachments) { attachment.file = asRelativePath(attachment.file, destination.dirName).array; } } } void end(SuiteResult[] results) { relativePaths(results); immutable string trialCss = import("assets/trial.css"); immutable string trialJs = import("assets/trial.js"); string content = import("templates/htmlReporter.html"); auto assets = buildPath(destination.dirName, "assets"); if(!destination.dirName.exists) { mkdirRecurse(destination.dirName); } if(!assets.exists) { mkdirRecurse(assets); } content = content .replace("{testResult}", "[" ~ results.map!(a => a.toString).join(",") ~ "]") .replace("{warningTestDuration}", warningTestDuration.to!string) .replace("{dangerTestDuration}", dangerTestDuration.to!string); std.file.write(destination, content); std.file.write(buildPath(assets, "trial.css"), trialCss); std.file.write(buildPath(assets, "trial.js"), trialJs); } }