TimesPanel.java revision 927f2ca0d54cd68df21b8a75c00917bbbff349df
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
9d03615c358dcaec441011112095750476a4c6b29Cédric Beustimport java.util.List;
109af501e464ae01b211983b8a4c9d058b051152d8Cédric Beustimport java.util.Map;
11d03615c358dcaec441011112095750476a4c6b29Cédric Beust
1203932733f81c510b12e4b391eb249c713301a402Cédric Beustpublic class TimesPanel extends BaseMultiSuitePanel {
139af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust  private Map<String, Long> m_totalTime = Maps.newHashMap();
149af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust
1503932733f81c510b12e4b391eb249c713301a402Cédric Beust  public TimesPanel(Model model) {
1671b49146fae442f11d76af035b279536e5c1d549Cédric Beust    super(model);
1771b49146fae442f11d76af035b279536e5c1d549Cédric Beust  }
1871b49146fae442f11d76af035b279536e5c1d549Cédric Beust
1971b49146fae442f11d76af035b279536e5c1d549Cédric Beust  private static String getTag(ISuite suite) {
2071b49146fae442f11d76af035b279536e5c1d549Cédric Beust    return "times-" + suiteToTag(suite);
2171b49146fae442f11d76af035b279536e5c1d549Cédric Beust  }
2271b49146fae442f11d76af035b279536e5c1d549Cédric Beust
2371b49146fae442f11d76af035b279536e5c1d549Cédric Beust  @Override
2471b49146fae442f11d76af035b279536e5c1d549Cédric Beust  public String getHeader(ISuite suite) {
2571b49146fae442f11d76af035b279536e5c1d549Cédric Beust    return "Times for " + suite.getName();
2671b49146fae442f11d76af035b279536e5c1d549Cédric Beust  }
2771b49146fae442f11d76af035b279536e5c1d549Cédric Beust
2871b49146fae442f11d76af035b279536e5c1d549Cédric Beust  @Override
2971b49146fae442f11d76af035b279536e5c1d549Cédric Beust  public String getPanelName(ISuite suite) {
3071b49146fae442f11d76af035b279536e5c1d549Cédric Beust    return getTag(suite);
3171b49146fae442f11d76af035b279536e5c1d549Cédric Beust  }
3271b49146fae442f11d76af035b279536e5c1d549Cédric Beust
33d03615c358dcaec441011112095750476a4c6b29Cédric Beust  private String js(ISuite suite) {
3407d493d2ea08ee38c909057f28948e67919626d6Cédric Beust    String functionName = "tableData_" + suiteToTag(suite);
35d03615c358dcaec441011112095750476a4c6b29Cédric Beust    StringBuilder result = new StringBuilder(
3607d493d2ea08ee38c909057f28948e67919626d6Cédric Beust        "suiteTableInitFunctions.push('" + functionName + "');\n"
3707d493d2ea08ee38c909057f28948e67919626d6Cédric Beust          + "function " + functionName + "() {\n"
3807d493d2ea08ee38c909057f28948e67919626d6Cédric Beust          + "var data = new google.visualization.DataTable();\n"
398501592fd1b782e77044153a612a51d362e0f594Cédric Beust          + "data.addColumn('number', 'Number');\n"
4007d493d2ea08ee38c909057f28948e67919626d6Cédric Beust          + "data.addColumn('string', 'Method');\n"
4107d493d2ea08ee38c909057f28948e67919626d6Cédric Beust          + "data.addColumn('string', 'Class');\n"
4207d493d2ea08ee38c909057f28948e67919626d6Cédric Beust          + "data.addColumn('number', 'Time (ms)');\n");
43d03615c358dcaec441011112095750476a4c6b29Cédric Beust
44d03615c358dcaec441011112095750476a4c6b29Cédric Beust    List<ITestResult> allTestResults = getModel().getAllTestResults(suite);
45d03615c358dcaec441011112095750476a4c6b29Cédric Beust    result.append(
46d03615c358dcaec441011112095750476a4c6b29Cédric Beust      "data.addRows(" + allTestResults.size() + ");\n");
47d03615c358dcaec441011112095750476a4c6b29Cédric Beust
48d03615c358dcaec441011112095750476a4c6b29Cédric Beust    int index = 0;
49d03615c358dcaec441011112095750476a4c6b29Cédric Beust    for (ITestResult tr : allTestResults) {
50d03615c358dcaec441011112095750476a4c6b29Cédric Beust      ITestNGMethod m = tr.getMethod();
51d03615c358dcaec441011112095750476a4c6b29Cédric Beust      long time = tr.getEndMillis() - tr.getStartMillis();
528501592fd1b782e77044153a612a51d362e0f594Cédric Beust      result
53d03615c358dcaec441011112095750476a4c6b29Cédric Beust          .append("data.setCell(" + index + ", "
548501592fd1b782e77044153a612a51d362e0f594Cédric Beust              + "0, " + index + ")\n")
55d03615c358dcaec441011112095750476a4c6b29Cédric Beust          .append("data.setCell(" + index + ", "
568501592fd1b782e77044153a612a51d362e0f594Cédric Beust              + "1, '" + m.getMethodName() + "')\n")
578501592fd1b782e77044153a612a51d362e0f594Cédric Beust          .append("data.setCell(" + index + ", "
588501592fd1b782e77044153a612a51d362e0f594Cédric Beust              + "2, '" + m.getTestClass().getName() + "')\n")
598501592fd1b782e77044153a612a51d362e0f594Cédric Beust          .append("data.setCell(" + index + ", "
608501592fd1b782e77044153a612a51d362e0f594Cédric Beust              + "3, " + time + ");\n");
619af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust      Long total = m_totalTime.get(suite.getName());
629af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust      if (total == null) {
639af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust        total = 0L;
649af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust      }
659af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust      m_totalTime.put(suite.getName(), total + time);
66d03615c358dcaec441011112095750476a4c6b29Cédric Beust      index++;
67d03615c358dcaec441011112095750476a4c6b29Cédric Beust    }
68d03615c358dcaec441011112095750476a4c6b29Cédric Beust
69d03615c358dcaec441011112095750476a4c6b29Cédric Beust    result.append(
7007d493d2ea08ee38c909057f28948e67919626d6Cédric Beust        "window.suiteTableData['" + suiteToTag(suite) + "']" +
7107d493d2ea08ee38c909057f28948e67919626d6Cédric Beust        		"= { tableData: data, tableDiv: 'times-div-" + suiteToTag(suite) + "'}\n"
7207d493d2ea08ee38c909057f28948e67919626d6Cédric Beust        + "return data;\n" +
7307d493d2ea08ee38c909057f28948e67919626d6Cédric Beust        "}\n");
74d03615c358dcaec441011112095750476a4c6b29Cédric Beust
75d03615c358dcaec441011112095750476a4c6b29Cédric Beust    return result.toString();
76d03615c358dcaec441011112095750476a4c6b29Cédric Beust  }
77d03615c358dcaec441011112095750476a4c6b29Cédric Beust
7871b49146fae442f11d76af035b279536e5c1d549Cédric Beust  @Override
7971b49146fae442f11d76af035b279536e5c1d549Cédric Beust  public String getContent(ISuite suite, XMLStringBuffer main) {
80d03615c358dcaec441011112095750476a4c6b29Cédric Beust    XMLStringBuffer xsb = new XMLStringBuffer(main.getCurrentIndent());
819af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    xsb.push(D, C, "times-div");
82d03615c358dcaec441011112095750476a4c6b29Cédric Beust    xsb.push("script", "type", "text/javascript");
83d03615c358dcaec441011112095750476a4c6b29Cédric Beust    xsb.addString(js(suite));
84d03615c358dcaec441011112095750476a4c6b29Cédric Beust    xsb.pop("script");
85927f2ca0d54cd68df21b8a75c00917bbbff349dfCédric Beust    Long time = m_totalTime.get(suite.getName());
86927f2ca0d54cd68df21b8a75c00917bbbff349dfCédric Beust    if (time != null) {
87927f2ca0d54cd68df21b8a75c00917bbbff349dfCédric Beust      xsb.addRequired(S, String.format("Total running time: %s", prettyDuration(time)),
88927f2ca0d54cd68df21b8a75c00917bbbff349dfCédric Beust          C, "suite-total-time");
89927f2ca0d54cd68df21b8a75c00917bbbff349dfCédric Beust    }
9007d493d2ea08ee38c909057f28948e67919626d6Cédric Beust    xsb.push(D, "id", "times-div-" + suiteToTag(suite));
91d03615c358dcaec441011112095750476a4c6b29Cédric Beust    xsb.pop(D);
929af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    xsb.pop(D);
93d03615c358dcaec441011112095750476a4c6b29Cédric Beust    return xsb.toXML();
9471b49146fae442f11d76af035b279536e5c1d549Cédric Beust  }
959af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust
969af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust  private String prettyDuration(long totalTime) {
979af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    String result;
989af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    if (totalTime < 1000) {
999af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust      result = totalTime + " ms";
1009af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    } else if (totalTime < 1000 * 60) {
1019af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust      result = (totalTime / 1000) + " seconds";
1029af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    } else if (totalTime < 1000 * 60 * 60) {
1039af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust      result = (totalTime / 1000 / 60) + " minutes";
1049af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    } else {
1059af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust      result = (totalTime / 1000 / 60 / 60) + " hours";
1069af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    }
1079af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust    return result;
1089af501e464ae01b211983b8a4c9d058b051152d8Cédric Beust  }
10971b49146fae442f11d76af035b279536e5c1d549Cédric Beust}
110