/* * 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.internal.ErroringAction; import org.gradle.internal.html.SimpleHtmlWriter; import org.gradle.api.internal.tasks.testing.junit.result.TestFailure; import org.gradle.api.internal.tasks.testing.junit.result.TestResultsProvider; import org.gradle.api.tasks.testing.TestOutputEvent; import org.gradle.internal.SystemProperties; import org.gradle.reporting.CodePanelRenderer; import org.gradle.util.GUtil; import java.io.IOException; class ClassPageRenderer extends PageRenderer<ClassTestResults> { private final CodePanelRenderer codePanelRenderer = new CodePanelRenderer(); private final TestResultsProvider resultsProvider; public ClassPageRenderer(TestResultsProvider provider) { this.resultsProvider = provider; } @Override protected void renderBreadcrumbs(SimpleHtmlWriter htmlWriter) throws IOException { htmlWriter.startElement("div").attribute("class", "breadcrumbs") .startElement("a").attribute("href", getResults().getUrlTo(getResults().getParent().getParent())).characters("all").endElement() .characters(" > ") .startElement("a").attribute("href", getResults().getUrlTo(getResults().getPackageResults())).characters(getResults().getPackageResults().getName()).endElement() .characters(" > " + getResults().getSimpleName()) .endElement(); } private void renderTests(SimpleHtmlWriter htmlWriter) throws IOException { htmlWriter.startElement("table") .startElement("thead") .startElement("tr") .startElement("th").characters("Test").endElement() .startElement("th").characters("Duration").endElement() .startElement("th").characters("Result").endElement() .endElement() .endElement(); for (TestResult test : getResults().getTestResults()) { htmlWriter.startElement("tr") .startElement("td").attribute("class", test.getStatusClass()).characters(test.getName()).endElement() .startElement("td").characters(test.getFormattedDuration()).endElement() .startElement("td").attribute("class", test.getStatusClass()).characters(test.getFormattedResultType()).endElement() .endElement(); } htmlWriter.endElement(); } @Override protected void renderFailures(SimpleHtmlWriter htmlWriter) throws IOException { for (TestResult test : getResults().getFailures()) { htmlWriter.startElement("div").attribute("class", "test") .startElement("a").attribute("name", test.getId().toString()).characters("").endElement() //browsers dont understand <a name="..."/> .startElement("h3").attribute("class", test.getStatusClass()).characters(test.getName()).endElement(); for (TestFailure failure : test.getFailures()) { String message; if (GUtil.isTrue(failure.getMessage()) && !failure.getStackTrace().contains(failure.getMessage())) { message = failure.getMessage() + SystemProperties.getInstance().getLineSeparator() + SystemProperties.getInstance().getLineSeparator() + failure.getStackTrace(); } else { message = failure.getStackTrace(); } codePanelRenderer.render(message, htmlWriter); } htmlWriter.endElement(); } } @Override protected void registerTabs() { addFailuresTab(); addTab("Tests", new ErroringAction<SimpleHtmlWriter>() { public void doExecute(SimpleHtmlWriter writer) throws IOException { renderTests(writer); } }); final long classId = getModel().getId(); if (resultsProvider.hasOutput(classId, TestOutputEvent.Destination.StdOut)) { addTab("Standard output", new ErroringAction<SimpleHtmlWriter>() { @Override protected void doExecute(SimpleHtmlWriter htmlWriter) throws IOException { htmlWriter.startElement("span").attribute("class", "code") .startElement("pre") .characters(""); resultsProvider.writeAllOutput(classId, TestOutputEvent.Destination.StdOut, htmlWriter); htmlWriter.endElement() .endElement(); } }); } if (resultsProvider.hasOutput(classId, TestOutputEvent.Destination.StdErr)) { addTab("Standard error", new ErroringAction<SimpleHtmlWriter>() { @Override protected void doExecute(SimpleHtmlWriter element) throws Exception { element.startElement("span").attribute("class", "code") .startElement("pre") .characters(""); resultsProvider.writeAllOutput(classId, TestOutputEvent.Destination.StdErr, element); element.endElement() .endElement(); } }); } } }