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