1package org.testng.reporters.jq; 2 3import org.testng.ISuite; 4import org.testng.ITestResult; 5import org.testng.internal.Utils; 6import org.testng.reporters.XMLStringBuffer; 7import org.testng.util.Strings; 8 9import java.util.List; 10 11public class SuitePanel extends BasePanel { 12 private static final String PASSED = "passed"; 13 private static final String SKIPPED = "skipped"; 14 private static final String FAILED = "failed"; 15 16 public SuitePanel(Model model) { 17 super(model); 18 } 19 20 @Override 21 public void generate(XMLStringBuffer xsb) { 22 for (ISuite suite : getSuites()) { 23 generateSuitePanel(suite, xsb); 24 } 25 } 26 27 private void generateSuitePanel(ISuite suite, XMLStringBuffer xsb) { 28 String divName = suiteToTag(suite); 29 xsb.push(D, C, "panel " + divName, "panel-name", "suite-" + divName); 30 String[] statuses = new String[] { FAILED, SKIPPED, PASSED }; 31 ResultsByClass[] results = new ResultsByClass[] { 32 getModel().getFailedResultsByClass(suite), 33 getModel().getSkippedResultsByClass(suite), 34 getModel().getPassedResultsByClass(suite), 35 }; 36 37 for (int i = 0; i < results.length; i++) { 38 ResultsByClass byClass = results[i]; 39 for (Class<?> c : byClass.getClasses()) { 40 generateClassPanel(c, byClass.getResults(c), xsb, statuses[i], suite); 41 } 42 } 43 xsb.pop(D); 44 } 45 46 private void generateClassPanel(Class c, List<ITestResult> results, XMLStringBuffer xsb, 47 String status, ISuite suite) { 48 xsb.push(D, C, "suite-" + suiteToTag(suite) + "-class-" + status); 49 xsb.push(D, C, "main-panel-header rounded-window-top"); 50 51 // Passed/failed icon 52 xsb.addEmptyElement("img", "src", Model.getImage(status)); 53 xsb.addOptional(S, c.getName(), C, "class-name"); 54 xsb.pop(D); 55 56 xsb.push(D, C, "main-panel-content rounded-window-bottom"); 57 58 for (ITestResult tr : results) { 59 generateMethod(tr, xsb); 60 } 61 xsb.pop(D); 62 xsb.pop(D); 63 } 64 65 private void generateMethod(ITestResult tr, XMLStringBuffer xsb) { 66 xsb.push(D, C, "method"); 67 xsb.push(D, C, "method-content"); 68 xsb.push("a", "name", Model.getTestResultName(tr)); 69 xsb.pop("a"); 70 xsb.addOptional(S, tr.getMethod().getMethodName(), C, "method-name"); 71 72 // Parameters? 73 if (tr.getParameters().length > 0) { 74 StringBuilder sb = new StringBuilder(); 75 boolean first = true; 76 for (Object p : tr.getParameters()) { 77 if (!first) sb.append(", "); 78 first = false; 79 sb.append(Utils.toString(p)); 80 } 81 xsb.addOptional(S, "(" + sb.toString() + ")", C, "parameters"); 82 } 83 84 // Exception? 85 if (tr.getStatus() != ITestResult.SUCCESS && tr.getThrowable() != null) { 86 StringBuilder stackTrace = new StringBuilder(); 87 stackTrace.append(Utils.stackTrace(tr.getThrowable(), true)[0]); 88 xsb.addOptional(D, stackTrace.toString() + "\n", 89 C, "stack-trace"); 90 } 91 92 // Description? 93 String description = tr.getMethod().getDescription(); 94 if (! Strings.isNullOrEmpty(description)) { 95 xsb.push("em"); 96 xsb.addString("(" + description + ")"); 97 xsb.pop("em"); 98 } 99// long time = tr.getEndMillis() - tr.getStartMillis(); 100// xsb.addOptional(S, " " + Long.toString(time) + " ms", C, "method-time"); 101 xsb.pop(D); 102 xsb.pop(D); 103 } 104} 105