171b49146fae442f11d76af035b279536e5c1d549Cédric Beustpackage org.testng.reporters.jq;
271b49146fae442f11d76af035b279536e5c1d549Cédric Beust
371b49146fae442f11d76af035b279536e5c1d549Cédric Beustimport org.testng.ISuite;
4d03615c358dcaec441011112095750476a4c6b29Cédric Beustimport org.testng.ITestNGMethod;
5d03615c358dcaec441011112095750476a4c6b29Cédric Beustimport org.testng.ITestResult;
69af501e464ae01b211983b8a4c9d058b051152d8Cédric Beustimport org.testng.collections.Maps;
771b49146fae442f11d76af035b279536e5c1d549Cédric Beustimport org.testng.reporters.XMLStringBuffer;
871b49146fae442f11d76af035b279536e5c1d549Cédric Beust
94ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beustimport java.util.Collections;
104ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beustimport java.util.Comparator;
11d03615c358dcaec441011112095750476a4c6b29Cédric Beustimport java.util.List;
129af501e464ae01b211983b8a4c9d058b051152d8Cédric Beustimport java.util.Map;
13d03615c358dcaec441011112095750476a4c6b29Cédric Beust
1403932733f81c510b12e4b391eb249c713301a402Cédric Beustpublic class TimesPanel extends BaseMultiSuitePanel {
159af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust  private Map<String, Long> m_totalTime = Maps.newHashMap();
169af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust
1703932733f81c510b12e4b391eb249c713301a402Cédric Beust  public TimesPanel(Model model) {
1871b49146fae442f11d76af035b279536e5c1d549Cédric Beust    super(model);
1971b49146fae442f11d76af035b279536e5c1d549Cédric Beust  }
2071b49146fae442f11d76af035b279536e5c1d549Cédric Beust
2171b49146fae442f11d76af035b279536e5c1d549Cédric Beust
2271b49146fae442f11d76af035b279536e5c1d549Cédric Beust  @Override
23aa5fe9ce987968d97b2cc613d21487eb87e45cf4Cédric Beust  public String getPrefix() {
24aa5fe9ce987968d97b2cc613d21487eb87e45cf4Cédric Beust    return "times-";
2571b49146fae442f11d76af035b279536e5c1d549Cédric Beust  }
2671b49146fae442f11d76af035b279536e5c1d549Cédric Beust
2771b49146fae442f11d76af035b279536e5c1d549Cédric Beust  @Override
28aa5fe9ce987968d97b2cc613d21487eb87e45cf4Cédric Beust  public String getHeader(ISuite suite) {
29aa5fe9ce987968d97b2cc613d21487eb87e45cf4Cédric Beust    return "Times for " + suite.getName();
3071b49146fae442f11d76af035b279536e5c1d549Cédric Beust  }
3171b49146fae442f11d76af035b279536e5c1d549Cédric Beust
32d03615c358dcaec441011112095750476a4c6b29Cédric Beust  private String js(ISuite suite) {
3307d493d2ea08ee38c909057f28948e67919626d6Cédric Beust    String functionName = "tableData_" + suiteToTag(suite);
34d03615c358dcaec441011112095750476a4c6b29Cédric Beust    StringBuilder result = new StringBuilder(
3507d493d2ea08ee38c909057f28948e67919626d6Cédric Beust        "suiteTableInitFunctions.push('" + functionName + "');\n"
3607d493d2ea08ee38c909057f28948e67919626d6Cédric Beust          + "function " + functionName + "() {\n"
3707d493d2ea08ee38c909057f28948e67919626d6Cédric Beust          + "var data = new google.visualization.DataTable();\n"
388501592fd1b782e77044153a612a51d362e0f594Cédric Beust          + "data.addColumn('number', 'Number');\n"
3907d493d2ea08ee38c909057f28948e67919626d6Cédric Beust          + "data.addColumn('string', 'Method');\n"
4007d493d2ea08ee38c909057f28948e67919626d6Cédric Beust          + "data.addColumn('string', 'Class');\n"
4107d493d2ea08ee38c909057f28948e67919626d6Cédric Beust          + "data.addColumn('number', 'Time (ms)');\n");
42d03615c358dcaec441011112095750476a4c6b29Cédric Beust
43d03615c358dcaec441011112095750476a4c6b29Cédric Beust    List<ITestResult> allTestResults = getModel().getAllTestResults(suite);
44d03615c358dcaec441011112095750476a4c6b29Cédric Beust    result.append(
45d03615c358dcaec441011112095750476a4c6b29Cédric Beust      "data.addRows(" + allTestResults.size() + ");\n");
46d03615c358dcaec441011112095750476a4c6b29Cédric Beust
474ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust    Collections.sort(allTestResults, new Comparator<ITestResult>() {
484ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust      @Override
494ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust      public int compare(ITestResult o1, ITestResult o2) {
504ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust        long t1 = o1.getEndMillis() - o1.getStartMillis();
514ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust        long t2 = o2.getEndMillis() - o2.getStartMillis();
524ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust        return (int) (t2 - t1);
534ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust      }
544ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust    });
554ddfc41505c11cda7d32fdbdc12182ecadb5d934Cédric Beust
56d03615c358dcaec441011112095750476a4c6b29Cédric Beust    int index = 0;
57d03615c358dcaec441011112095750476a4c6b29Cédric Beust    for (ITestResult tr : allTestResults) {
58d03615c358dcaec441011112095750476a4c6b29Cédric Beust      ITestNGMethod m = tr.getMethod();
59d03615c358dcaec441011112095750476a4c6b29Cédric Beust      long time = tr.getEndMillis() - tr.getStartMillis();
608501592fd1b782e77044153a612a51d362e0f594Cédric Beust      result
61d03615c358dcaec441011112095750476a4c6b29Cédric Beust          .append("data.setCell(" + index + ", "
628501592fd1b782e77044153a612a51d362e0f594Cédric Beust              + "0, " + index + ")\n")
63d03615c358dcaec441011112095750476a4c6b29Cédric Beust          .append("data.setCell(" + index + ", "
648501592fd1b782e77044153a612a51d362e0f594Cédric Beust              + "1, '" + m.getMethodName() + "')\n")
658501592fd1b782e77044153a612a51d362e0f594Cédric Beust          .append("data.setCell(" + index + ", "
668501592fd1b782e77044153a612a51d362e0f594Cédric Beust              + "2, '" + m.getTestClass().getName() + "')\n")
678501592fd1b782e77044153a612a51d362e0f594Cédric Beust          .append("data.setCell(" + index + ", "
688501592fd1b782e77044153a612a51d362e0f594Cédric Beust              + "3, " + time + ");\n");
699af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust      Long total = m_totalTime.get(suite.getName());
709af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust      if (total == null) {
719af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust        total = 0L;
729af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust      }
739af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust      m_totalTime.put(suite.getName(), total + time);
74d03615c358dcaec441011112095750476a4c6b29Cédric Beust      index++;
75d03615c358dcaec441011112095750476a4c6b29Cédric Beust    }
76d03615c358dcaec441011112095750476a4c6b29Cédric Beust
77d03615c358dcaec441011112095750476a4c6b29Cédric Beust    result.append(
7807d493d2ea08ee38c909057f28948e67919626d6Cédric Beust        "window.suiteTableData['" + suiteToTag(suite) + "']" +
7907d493d2ea08ee38c909057f28948e67919626d6Cédric Beust        		"= { tableData: data, tableDiv: 'times-div-" + suiteToTag(suite) + "'}\n"
8007d493d2ea08ee38c909057f28948e67919626d6Cédric Beust        + "return data;\n" +
8107d493d2ea08ee38c909057f28948e67919626d6Cédric Beust        "}\n");
82d03615c358dcaec441011112095750476a4c6b29Cédric Beust
83d03615c358dcaec441011112095750476a4c6b29Cédric Beust    return result.toString();
84d03615c358dcaec441011112095750476a4c6b29Cédric Beust  }
85d03615c358dcaec441011112095750476a4c6b29Cédric Beust
8671b49146fae442f11d76af035b279536e5c1d549Cédric Beust  @Override
8771b49146fae442f11d76af035b279536e5c1d549Cédric Beust  public String getContent(ISuite suite, XMLStringBuffer main) {
88d03615c358dcaec441011112095750476a4c6b29Cédric Beust    XMLStringBuffer xsb = new XMLStringBuffer(main.getCurrentIndent());
899af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    xsb.push(D, C, "times-div");
90d03615c358dcaec441011112095750476a4c6b29Cédric Beust    xsb.push("script", "type", "text/javascript");
91d03615c358dcaec441011112095750476a4c6b29Cédric Beust    xsb.addString(js(suite));
92d03615c358dcaec441011112095750476a4c6b29Cédric Beust    xsb.pop("script");
93927f2ca0d54cd68df21b8a75c00917bbbff349dfCédric Beust    Long time = m_totalTime.get(suite.getName());
94927f2ca0d54cd68df21b8a75c00917bbbff349dfCédric Beust    if (time != null) {
95927f2ca0d54cd68df21b8a75c00917bbbff349dfCédric Beust      xsb.addRequired(S, String.format("Total running time: %s", prettyDuration(time)),
96927f2ca0d54cd68df21b8a75c00917bbbff349dfCédric Beust          C, "suite-total-time");
97927f2ca0d54cd68df21b8a75c00917bbbff349dfCédric Beust    }
9807d493d2ea08ee38c909057f28948e67919626d6Cédric Beust    xsb.push(D, "id", "times-div-" + suiteToTag(suite));
99d03615c358dcaec441011112095750476a4c6b29Cédric Beust    xsb.pop(D);
1009af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    xsb.pop(D);
101d03615c358dcaec441011112095750476a4c6b29Cédric Beust    return xsb.toXML();
10271b49146fae442f11d76af035b279536e5c1d549Cédric Beust  }
1039af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust
1049af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust  private String prettyDuration(long totalTime) {
1059af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    String result;
1069af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    if (totalTime < 1000) {
1079af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust      result = totalTime + " ms";
1089af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    } else if (totalTime < 1000 * 60) {
1099af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust      result = (totalTime / 1000) + " seconds";
1109af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    } else if (totalTime < 1000 * 60 * 60) {
1119af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust      result = (totalTime / 1000 / 60) + " minutes";
1129af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    } else {
1139af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust      result = (totalTime / 1000 / 60 / 60) + " hours";
1149af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    }
1159af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    return result;
1169af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust  }
117c92c41936d66dda27d28929671ccd7d304d02781Cédric Beust
118c92c41936d66dda27d28929671ccd7d304d02781Cédric Beust  @Override
119c92c41936d66dda27d28929671ccd7d304d02781Cédric Beust  public String getNavigatorLink(ISuite suite) {
120c92c41936d66dda27d28929671ccd7d304d02781Cédric Beust    return "Times";
121c92c41936d66dda27d28929671ccd7d304d02781Cédric Beust  }
12271b49146fae442f11d76af035b279536e5c1d549Cédric Beust}
123