| package org.testng.reporters; |
| |
| import org.testng.IReporter; |
| import org.testng.IResultMap; |
| import org.testng.ISuite; |
| import org.testng.ISuiteResult; |
| import org.testng.ITestContext; |
| import org.testng.ITestResult; |
| import org.testng.collections.ListMultiMap; |
| import org.testng.collections.Maps; |
| import org.testng.internal.Utils; |
| import org.testng.xml.XmlSuite; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.util.List; |
| import java.util.Map; |
| |
| public class JqReporter implements IReporter { |
| |
| private String m_outputDirectory; |
| |
| @Override |
| public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, |
| String outputDirectory) { |
| m_outputDirectory = "/Users/cedric/java/misc/jquery"; |
| |
| XMLStringBuffer xsb = new XMLStringBuffer(" "); |
| xsb.push("div", "id", "suites"); |
| generateSuites(xmlSuites, suites, xsb); |
| xsb.pop("div"); |
| |
| String all; |
| try { |
| all = Files.readFile(new File("/Users/cedric/java/misc/jquery/head")); |
| Utils.writeFile(m_outputDirectory, "index2.html", all + xsb.toXML()); |
| } catch (IOException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| } |
| |
| private XMLStringBuffer generateSuites(List<XmlSuite> xmlSuites, |
| List<ISuite> suites, XMLStringBuffer xsb) { |
| for (ISuite suite : suites) { |
| if (suite.getResults().size() == 0) { |
| continue; |
| } |
| |
| xsb.push("div", "class", "suite"); |
| xsb.addOptional("span", suite.getName(), "class", "suite-name"); |
| |
| xsb.push("div", "class", "suite-content"); |
| Map<String, ISuiteResult> results = suite.getResults(); |
| XMLStringBuffer xs1 = new XMLStringBuffer(" "); |
| XMLStringBuffer xs2 = new XMLStringBuffer(" "); |
| XMLStringBuffer xs3 = new XMLStringBuffer(" "); |
| for (ISuiteResult result : results.values()) { |
| ITestContext context = result.getTestContext(); |
| generateTests("failed", context.getFailedTests(), context, xs1); |
| generateTests("skipped", context.getSkippedTests(), context, xs2); |
| generateTests("passed", context.getPassedTests(), context, xs3); |
| } |
| xsb.addOptional("div", "Failed" + " tests", "class", "result-banner " + "failed"); |
| xsb.addString(xs1.toXML()); |
| xsb.addOptional("div", "Skipped" + " tests", "class", "result-banner " + "skipped"); |
| xsb.addString(xs2.toXML()); |
| xsb.addOptional("div", "Passed" + " tests", "class", "result-banner " + "passed"); |
| xsb.addString(xs3.toXML()); |
| } |
| xsb.pop("div"); |
| xsb.pop("div"); |
| |
| return xsb; |
| } |
| |
| private String capitalize(String s) { |
| return Character.toUpperCase(s.charAt(0)) + s.substring(1); |
| } |
| private void generateTests(String tagClass, IResultMap tests, ITestContext context, |
| XMLStringBuffer xsb) { |
| |
| if (tests.getAllMethods().isEmpty()) return; |
| |
| xsb.push("div", "class", "test" + (tagClass != null ? " " + tagClass : "")); |
| ListMultiMap<Class<?>, ITestResult> map = Maps.newListMultiMap(); |
| for (ITestResult m : tests.getAllResults()) { |
| map.put(m.getTestClass().getRealClass(), m); |
| } |
| |
| xsb.push("a", "href", "#"); |
| xsb.addOptional("span", context.getName(), "class", "test-name"); |
| xsb.pop("a"); |
| |
| xsb.push("div", "class", "test-content"); |
| for (Class<?> c : map.getKeys()) { |
| xsb.push("div", "class", "class"); |
| xsb.addOptional("span", c.getName(), "class", "class-name"); |
| xsb.push("div", "class", "class-content"); |
| List<ITestResult> l = map.get(c); |
| for (ITestResult m : l) { |
| generateMethod(tagClass, m, context, xsb); |
| } |
| xsb.pop("div"); |
| xsb.pop("div"); |
| } |
| xsb.pop("div"); |
| |
| xsb.pop("div"); |
| } |
| |
| private void generateMethod(String tagClass, ITestResult tr, |
| ITestContext context, XMLStringBuffer xsb) { |
| long time = tr.getEndMillis() - tr.getStartMillis(); |
| xsb.push("div", "class", "method"); |
| xsb.push("div", "class", "method-content"); |
| xsb.addOptional("span", tr.getMethod().getMethodName(), "class", "method-name"); |
| xsb.addOptional("span", " (" + Long.toString(time) + " ms)", "class", "method-time"); |
| xsb.pop("div"); |
| xsb.pop("div"); |
| } |
| |
| /** |
| * Overridable by subclasses to create different directory names (e.g. with timestamps). |
| * @param outputDirectory the output directory specified by the user |
| */ |
| protected String generateOutputDirectoryName(String outputDirectory) { |
| return outputDirectory; |
| } |
| } |