Code with Finding: |
class EmailableReporter2 {
/**
* Writes the scenario summary for the results of a given state for a single
* test.
*/
private int writeScenarioSummary(String description,
List<ClassResult> classResults, String cssClassPrefix,
int startingScenarioIndex) {
int scenarioCount = 0;
if (!classResults.isEmpty()) {
writer.print("<tr><th colspan=\"4\">");
writer.print(description);
writer.print("</th></tr>");
int scenarioIndex = startingScenarioIndex;
int classIndex = 0;
for (ClassResult classResult : classResults) {
String cssClass = cssClassPrefix
+ ((classIndex % 2) == 0 ? "even" : "odd");
buffer.setLength(0);
int scenariosPerClass = 0;
int methodIndex = 0;
for (MethodResult methodResult : classResult.getMethodResults()) {
List<ITestResult> results = methodResult.getResults();
int resultsCount = results.size();
assert resultsCount > 0;
ITestResult firstResult = results.iterator().next();
String methodName = Utils.escapeHtml(firstResult
.getMethod().getMethodName());
long start = firstResult.getStartMillis();
long duration = firstResult.getEndMillis() - start;
// The first method per class shares a row with the class
// header
if (methodIndex > 0) {
buffer.append("<tr class=\"").append(cssClass)
.append("\">");
}
// Write the timing information with the first scenario per
// method
buffer.append("<td><a href=\"#m").append(scenarioIndex)
.append("\">").append(methodName)
.append("</a></td>").append("<td rowspan=\"")
.append(resultsCount).append("\">").append(start)
.append("</td>").append("<td rowspan=\"")
.append(resultsCount).append("\">")
.append(duration).append("</td></tr>");
scenarioIndex++;
// Write the remaining scenarios for the method
for (int i = 1; i < resultsCount; i++) {
buffer.append("<tr class=\"").append(cssClass)
.append("\">").append("<td><a href=\"#m")
.append(scenarioIndex).append("\">")
.append(methodName).append("</a></td></tr>");
scenarioIndex++;
}
scenariosPerClass += resultsCount;
methodIndex++;
}
// Write the test results for the class
writer.print("<tr class=\"");
writer.print(cssClass);
writer.print("\">");
writer.print("<td rowspan=\"");
writer.print(scenariosPerClass);
writer.print("\">");
writer.print(Utils.escapeHtml(classResult.getClassName()));
writer.print("</td>");
writer.print(buffer);
classIndex++;
}
scenarioCount = scenarioIndex - startingScenarioIndex;
}
return scenarioCount;
}
}
class EmailableReporter2.TestResult {
/**
* Groups test results by method and then by class.
*/
protected List<ClassResult> groupResults(Set<ITestResult> results) {
List<ClassResult> classResults = Lists.newArrayList();
if (!results.isEmpty()) {
List<MethodResult> resultsPerClass = Lists.newArrayList();
List<ITestResult> resultsPerMethod = Lists.newArrayList();
List<ITestResult> resultsList = Lists.newArrayList(results);
Collections.sort(resultsList, RESULT_COMPARATOR);
Iterator<ITestResult> resultsIterator = resultsList.iterator();
assert resultsIterator.hasNext();
ITestResult result = resultsIterator.next();
resultsPerMethod.add(result);
String previousClassName = result.getTestClass().getName();
String previousMethodName = result.getMethod().getMethodName();
while (resultsIterator.hasNext()) {
result = resultsIterator.next();
String className = result.getTestClass().getName();
if (!previousClassName.equals(className)) {
// Different class implies different method
assert !resultsPerMethod.isEmpty();
resultsPerClass.add(new MethodResult(resultsPerMethod));
resultsPerMethod = Lists.newArrayList();
assert !resultsPerClass.isEmpty();
classResults.add(new ClassResult(previousClassName,
resultsPerClass));
resultsPerClass = Lists.newArrayList();
previousClassName = className;
previousMethodName = result.getMethod().getMethodName();
} else {
String methodName = result.getMethod().getMethodName();
if (!previousMethodName.equals(methodName)) {
assert !resultsPerMethod.isEmpty();
resultsPerClass.add(new MethodResult(resultsPerMethod));
resultsPerMethod = Lists.newArrayList();
previousMethodName = methodName;
}
}
resultsPerMethod.add(result);
}
assert !resultsPerMethod.isEmpty();
resultsPerClass.add(new MethodResult(resultsPerMethod));
assert !resultsPerClass.isEmpty();
classResults.add(new ClassResult(previousClassName,
resultsPerClass));
}
return classResults;
}
}
|