package hudson.plugins.testng.results; import hudson.model.AbstractBuild; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; /** * TODO javadoc. * * @author Stephen Connolly * @since 25-Feb-2008 21:33:40 */ public class TestResults extends BaseResult implements Serializable { // ------------------------------ FIELDS ------------------------------ private List<TestResult> testList = new ArrayList<TestResult>(); private List<MethodResult> passedTests = new ArrayList<MethodResult>(); private List<MethodResult> failedTests = new ArrayList<MethodResult>(); private List<MethodResult> skippedTests = new ArrayList<MethodResult>(); private List<MethodResult> failedConfigurationMethods = new ArrayList<MethodResult>(); private List<MethodResult> skippedConfigurationMethods = new ArrayList<MethodResult>(); private int totalTestCount; private int passedTestCount; private int failedTestCount; private int skippedTestCount; private int failedConfigurationMethodsCount; private int skippedConfigurationMethodsCount; private Map<String, PackageResult> packageMap = new HashMap<String, PackageResult>(); public List<MethodResult> getFailedTests() { return failedTests; } public List<MethodResult> getPassedTests() { return passedTests; } public void setPassedTests(List<MethodResult> passedTests) { this.passedTests = passedTests; } public List<MethodResult> getSkippedTests() { return skippedTests; } public List<MethodResult> getFailedConfigurationMethods() { return failedConfigurationMethods; } public List<MethodResult> getSkippedConfigurationMethods() { return skippedConfigurationMethods; } // -------------------------- STATIC METHODS -------------------------- public List<TestResult> getTestList() { return testList; } public void setTestList(List<TestResult> testList) { this.testList = testList; } public int getTotalTestCount() { return totalTestCount; } public void setTotalTestCount(int totalTestCount) { this.totalTestCount = totalTestCount; } public int getPassedTestCount() { return passedTestCount; } public void setPassedTestCount(int passedTestCount) { this.passedTestCount = passedTestCount; } public int getFailedTestCount() { return failedTestCount; } public void setFailedTestCount(int failedTestCount) { this.failedTestCount = failedTestCount; } public int getSkippedTestCount() { return skippedTestCount; } public void setSkippedTestCount(int skippedTestCount) { this.skippedTestCount = skippedTestCount; } public int getFailedConfigurationMethodsCount() { return failedConfigurationMethodsCount; } public void setFailedConfigurationMethodsCount(int failedConfigurationMethodsCount) { this.failedConfigurationMethodsCount = failedConfigurationMethodsCount; } public int getSkippedConfigurationMethodsCount() { return skippedConfigurationMethodsCount; } public void setSkippedConfigurationMethodsCount(int skippedConfigurationMethodsCount) { this.skippedConfigurationMethodsCount = skippedConfigurationMethodsCount; } public Map<String, PackageResult> getPackageMap() { return packageMap; } public Set<String> getPackageNames() { return packageMap.keySet(); } public void setPackageMap(Map<String, PackageResult> packageMap) { this.packageMap = packageMap; } public void setFailedTests(List<MethodResult> failedTests) { this.failedTests = failedTests; } public void setSkippedTests(List<MethodResult> skippedTests) { this.skippedTests = skippedTests; } public void setFailedConfigurationMethods(List<MethodResult> failedConfigurationMethods) { this.failedConfigurationMethods = failedConfigurationMethods; } public void setSkippedConfigurationMethods(List<MethodResult> skippedConfigurationMethods) { this.skippedConfigurationMethods = skippedConfigurationMethods; } public static TestResults total(Collection<TestResults>... results) { Collection<TestResults> merged = merge(results); TestResults total = new TestResults(""); for (TestResults individual : merged) { total.add(individual, false); } total.tally(); return total; } private void add(TestResults r, boolean tally) { testList.addAll(r.getTestList()); failedConfigurationMethods.addAll(r.getFailedConfigurationMethods()); skippedConfigurationMethods.addAll(r.getSkippedConfigurationMethods()); failedTests.addAll(r.getFailedTests()); passedTests.addAll(r.getPassedTests()); skippedTests.addAll(r.getSkippedTests()); if (tally) { // save cycles while getting total results tally(); } } public void add(TestResults r) { add(r, true); } public static Collection<TestResults> merge(Collection<TestResults>... results) { Collection<TestResults> newResults = new ArrayList<TestResults>(); if (results.length == 0) { return Collections.emptySet(); } else { if (results.length == 1) { return results[0]; } else { List<String> indivNames = new ArrayList<String>(); for (Collection<TestResults> result : results) { for (TestResults individual : result) { if (!indivNames.contains(individual.name)) { indivNames.add(individual.name); } } } for (String indivName : indivNames) { TestResults indivStat = new TestResults(indivName); for (Collection<TestResults> result : results) { for (TestResults individual : result) { if (indivName.equals(individual.name)) { indivStat.add(individual); } } } newResults.add(indivStat); } return newResults; } } } // --------------------------- CONSTRUCTORS --------------------------- public TestResults(String name) { this.name = name; } public void setOwner(AbstractBuild<?, ?> owner) { this.owner = owner; for (TestResult _test : testList) { _test.setOwner(owner); } for (String pkg : packageMap.keySet()) { packageMap.get(pkg).setOwner(owner); } } // ------------------------ CANONICAL METHODS ------------------------ public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } TestResults statistic = (TestResults) o; if (!name.equals(statistic.name)) { return false; } if (owner != null ? !owner.equals(statistic.owner) : statistic.owner != null) { return false; } return true; } public int hashCode() { int result; result = (owner != null ? owner.hashCode() : 0); result = 31 * result + name.hashCode(); return result; } public String toString() { return "TestResults{" + "name='" + name + '\'' + ", totalTests=" + totalTestCount + ", failedTests=" + failedTestCount + ", skippedTests=" + skippedTestCount + ", failedConfigurationMethods=" + failedConfigurationMethodsCount + ", skippedConfigurationMethods=" + skippedConfigurationMethodsCount + '}'; } public String toSummary() { return "<ul>" + diff(0, totalTestCount, "Total Tests") + diff(0, failedTestCount, "Failed Fucking Tests") + diff(0, skippedTestCount, "Skipped Tests") + diff(0, failedConfigurationMethodsCount, "Failed Configurations") + diff(0, skippedConfigurationMethodsCount, "Skipped Configurations") + "</ul>"; } private static String diff(long prev, long curr, String name) { if (prev <= curr) { return "<li>" + name + ": " + curr + " (+" + (curr - prev) + ")</li>"; } else { // if (a < b) return "<li>" + name + ": " + curr + " (-" + (prev - curr) + ")</li>"; } } public String toSummary(TestResults totals) { return "<ul>" + diff(totals.getTotalTestCount(), totalTestCount, "Total Tests") + diff(totals.getFailedTestCount(), failedTestCount, "Failed Tests") + diff(totals.getSkippedTestCount(), skippedTestCount, "Skipped Tests") + diff(totals.getFailedConfigurationMethodsCount(), failedConfigurationMethodsCount, "Failed Configurations") + diff(totals.getSkippedConfigurationMethodsCount(), skippedConfigurationMethodsCount, "Skipped Configurations") + "</ul>"; } public void set(TestResults that) { this.failedConfigurationMethods = that.getFailedConfigurationMethods(); this.skippedConfigurationMethods = that.getSkippedConfigurationMethods(); this.failedTests = that.getFailedTests(); this.skippedTests = that.getSkippedTests(); this.passedTests = that.getPassedTests(); this.testList = that.getTestList(); } /** * Updates the calculated fields */ public void tally() { failedConfigurationMethodsCount = failedConfigurationMethods.size(); skippedConfigurationMethodsCount = skippedConfigurationMethods.size(); failedTestCount = failedTests.size(); passedTestCount = passedTests.size(); skippedTestCount = skippedTests.size(); totalTestCount = passedTestCount + failedTestCount + skippedTestCount; packageMap.clear(); for (TestResult _test : testList) { for (ClassResult _class : _test.getClassList()) { String pkg = _class.getName(); int lastDot = pkg.lastIndexOf('.'); if (lastDot == -1) { pkg = "No Package"; } else { pkg = pkg.substring(0, lastDot); } if (packageMap.containsKey(pkg)) { packageMap.get(pkg).getClassList().add(_class); } else { PackageResult tpkg = new PackageResult(); tpkg.setName(pkg); tpkg.getClassList().add(_class); tpkg.setParent(this); packageMap.put(pkg, tpkg); } } } for (String pkg : packageMap.keySet()) { packageMap.get(pkg).tally(); } } public Object getDynamic(String token, StaplerRequest req, StaplerResponse rsp) { return packageMap.get(token); } }