package org.testng.reporters.jq;
import org.testng.ISuite;
import org.testng.ITestNGMethod;
import org.testng.ITestResult;
import org.testng.collections.Maps;
import org.testng.reporters.XMLStringBuffer;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
public class TimesPanel extends BaseMultiSuitePanel {
private Map<String, Long> m_totalTime = Maps.newHashMap();
public TimesPanel(Model model) {
super(model);
}
@Override
public String getPrefix() {
return "times-";
}
@Override
public String getHeader(ISuite suite) {
return "Times for " + suite.getName();
}
private String js(ISuite suite) {
String functionName = "tableData_" + suiteToTag(suite);
StringBuilder result = new StringBuilder(
"suiteTableInitFunctions.push('" + functionName + "');\n"
+ "function " + functionName + "() {\n"
+ "var data = new google.visualization.DataTable();\n"
+ "data.addColumn('number', 'Number');\n"
+ "data.addColumn('string', 'Method');\n"
+ "data.addColumn('string', 'Class');\n"
+ "data.addColumn('number', 'Time (ms)');\n");
List<ITestResult> allTestResults = getModel().getAllTestResults(suite);
result.append(
"data.addRows(" + allTestResults.size() + ");\n");
Collections.sort(allTestResults, new Comparator<ITestResult>() {
@Override
public int compare(ITestResult o1, ITestResult o2) {
long t1 = o1.getEndMillis() - o1.getStartMillis();
long t2 = o2.getEndMillis() - o2.getStartMillis();
return (int) (t2 - t1);
}
});
int index = 0;
for (ITestResult tr : allTestResults) {
ITestNGMethod m = tr.getMethod();
long time = tr.getEndMillis() - tr.getStartMillis();
result
.append("data.setCell(" + index + ", "
+ "0, " + index + ")\n")
.append("data.setCell(" + index + ", "
+ "1, '" + m.getMethodName() + "')\n")
.append("data.setCell(" + index + ", "
+ "2, '" + m.getTestClass().getName() + "')\n")
.append("data.setCell(" + index + ", "
+ "3, " + time + ");\n");
Long total = m_totalTime.get(suite.getName());
if (total == null) {
total = 0L;
}
m_totalTime.put(suite.getName(), total + time);
index++;
}
result.append(
"window.suiteTableData['" + suiteToTag(suite) + "']" +
"= { tableData: data, tableDiv: 'times-div-" + suiteToTag(suite) + "'}\n"
+ "return data;\n" +
"}\n");
return result.toString();
}
@Override
public String getContent(ISuite suite, XMLStringBuffer main) {
XMLStringBuffer xsb = new XMLStringBuffer(main.getCurrentIndent());
xsb.push(D, C, "times-div");
xsb.push("script", "type", "text/javascript");
xsb.addString(js(suite));
xsb.pop("script");
Long time = m_totalTime.get(suite.getName());
if (time != null) {
xsb.addRequired(S, String.format("Total running time: %s", prettyDuration(time)),
C, "suite-total-time");
}
xsb.push(D, "id", "times-div-" + suiteToTag(suite));
xsb.pop(D);
xsb.pop(D);
return xsb.toXML();
}
private String prettyDuration(long totalTime) {
String result;
if (totalTime < 1000) {
result = totalTime + " ms";
} else if (totalTime < 1000 * 60) {
result = (totalTime / 1000) + " seconds";
} else if (totalTime < 1000 * 60 * 60) {
result = (totalTime / 1000 / 60) + " minutes";
} else {
result = (totalTime / 1000 / 60 / 60) + " hours";
}
return result;
}
@Override
public String getNavigatorLink(ISuite suite) {
return "Times";
}
}