/*
* Copyright 2011 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.gradle.api.internal.tasks.testing.junit.report;
import org.gradle.api.Action;
import org.gradle.internal.ErroringAction;
import org.gradle.internal.html.SimpleHtmlWriter;
import org.gradle.reporting.ReportRenderer;
import org.gradle.reporting.TabbedPageRenderer;
import org.gradle.reporting.TabsRenderer;
import java.io.IOException;
import java.net.URL;
abstract class PageRenderer<T extends CompositeTestResults> extends TabbedPageRenderer<T> {
private static final URL STYLE_URL = PageRenderer.class.getResource("style.css");
private T results;
private final TabsRenderer<T> tabsRenderer = new TabsRenderer<T>();
protected T getResults() {
return results;
}
protected abstract void renderBreadcrumbs(SimpleHtmlWriter htmlWriter) throws IOException;
protected abstract void registerTabs();
@Override
protected URL getStyleUrl() {
return STYLE_URL;
}
protected void addTab(String title, final Action<SimpleHtmlWriter> contentRenderer) {
tabsRenderer.add(title, new ReportRenderer<T, SimpleHtmlWriter>() {
@Override
public void render(T model, SimpleHtmlWriter writer) {
contentRenderer.execute(writer);
}
});
}
protected void renderTabs(SimpleHtmlWriter htmlWriter) throws IOException {
tabsRenderer.render(getModel(), htmlWriter);
}
protected void addFailuresTab() {
if (!results.getFailures().isEmpty()) {
addTab("Failed tests", new ErroringAction<SimpleHtmlWriter>() {
public void doExecute(SimpleHtmlWriter element) throws IOException {
renderFailures(element);
}
});
}
}
protected void renderFailures(SimpleHtmlWriter htmlWriter) throws IOException {
htmlWriter.startElement("ul").attribute("class", "linkList");
for (TestResult test : results.getFailures()) {
htmlWriter.startElement("li");
htmlWriter.startElement("a").attribute("href", asHtmlLinkEncoded(getResults().getUrlTo(test.getClassResults()))).characters(test.getClassResults().getSimpleName()).endElement();
htmlWriter.characters(".");
String link = asHtmlLinkEncoded(getResults().getUrlTo(test.getClassResults())) + "#" + test.getName();
htmlWriter.startElement("a").attribute("href", link).characters(test.getName()).endElement();
htmlWriter.endElement();
}
htmlWriter.endElement();
}
protected void addIgnoredTab() {
if (!results.getIgnored().isEmpty()) {
addTab("Ignored tests", new ErroringAction<SimpleHtmlWriter>() {
public void doExecute(SimpleHtmlWriter htmlWriter) throws IOException {
renderIgnoredTests(htmlWriter);
}
});
}
}
protected void renderIgnoredTests(SimpleHtmlWriter htmlWriter) throws IOException {
htmlWriter.startElement("ul").attribute("class", "linkList");
for (TestResult test : getResults().getIgnored()) {
htmlWriter.startElement("li");
htmlWriter.startElement("a").attribute("href", asHtmlLinkEncoded(getResults().getUrlTo(test.getClassResults()))).characters(test.getClassResults().getSimpleName()).endElement();
htmlWriter.characters(".");
String link = asHtmlLinkEncoded(getResults().getUrlTo(test.getClassResults())) + "#" + test.getName();
htmlWriter.startElement("a").attribute("href", link).characters(test.getName()).endElement();
htmlWriter.endElement();
}
htmlWriter.endElement();
}
@Override
protected String getTitle() {
return getModel().getTitle();
}
@Override
protected String getPageTitle() {
return "Test results - " + getModel().getTitle();
}
@Override
protected ReportRenderer<T, SimpleHtmlWriter> getHeaderRenderer() {
return new ReportRenderer<T, SimpleHtmlWriter>() {
@Override
public void render(T model, SimpleHtmlWriter htmlWriter) throws IOException {
PageRenderer.this.results = model;
renderBreadcrumbs(htmlWriter);
// summary
htmlWriter.startElement("div").attribute("id", "summary");
htmlWriter.startElement("table");
htmlWriter.startElement("tr");
htmlWriter.startElement("td");
htmlWriter.startElement("div").attribute("class", "summaryGroup");
htmlWriter.startElement("table");
htmlWriter.startElement("tr");
htmlWriter.startElement("td");
htmlWriter.startElement("div").attribute("class", "infoBox").attribute("id", "tests");
htmlWriter.startElement("div").attribute("class", "counter").characters(Integer.toString(results.getTestCount())).endElement();
htmlWriter.startElement("p").characters("tests").endElement();
htmlWriter.endElement();
htmlWriter.endElement();
htmlWriter.startElement("td");
htmlWriter.startElement("div").attribute("class", "infoBox").attribute("id", "failures");
htmlWriter.startElement("div").attribute("class", "counter").characters(Integer.toString(results.getFailureCount())).endElement();
htmlWriter.startElement("p").characters("failures").endElement();
htmlWriter.endElement();
htmlWriter.endElement();
htmlWriter.startElement("td");
htmlWriter.startElement("div").attribute("class", "infoBox").attribute("id", "ignored");
htmlWriter.startElement("div").attribute("class", "counter").characters(Integer.toString(results.getIgnoredCount())).endElement();
htmlWriter.startElement("p").characters("ignored").endElement();
htmlWriter.endElement();
htmlWriter.endElement();
htmlWriter.startElement("td");
htmlWriter.startElement("div").attribute("class", "infoBox").attribute("id", "duration");
htmlWriter.startElement("div").attribute("class", "counter").characters(results.getFormattedDuration()).endElement();
htmlWriter.startElement("p").characters("duration").endElement();
htmlWriter.endElement();
htmlWriter.endElement();
htmlWriter.endElement();
htmlWriter.endElement();
htmlWriter.endElement();
htmlWriter.endElement();
htmlWriter.startElement("td");
htmlWriter.startElement("div").attribute("class", "infoBox " + results.getStatusClass()).attribute("id", "successRate");
htmlWriter.startElement("div").attribute("class", "percent").characters(results.getFormattedSuccessRate()).endElement();
htmlWriter.startElement("p").characters("successful").endElement();
htmlWriter.endElement();
htmlWriter.endElement();
htmlWriter.endElement();
htmlWriter.endElement();
htmlWriter.endElement();
}
};
}
@Override
protected ReportRenderer<T, SimpleHtmlWriter> getContentRenderer() {
return new ReportRenderer<T, SimpleHtmlWriter>() {
@Override
public void render(T model, SimpleHtmlWriter htmlWriter) throws IOException {
PageRenderer.this.results = model;
tabsRenderer.clear();
registerTabs();
renderTabs(htmlWriter);
}
};
}
protected String asHtmlLinkEncoded(String rawLink) {
return rawLink.replace("#", "%23");
}
}