/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package org.python.pydev.debug.pyunit;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.python.pydev.core.log.Log;
import com.aptana.shared_core.structure.Tuple;
public class PyUnitTestRun {
private final ArrayList<PyUnitTestResult> results;
private final Map<Tuple<String, String>, PyUnitTestStarted> testsRunning;
public final String name;
private static int currentRun = 0;
private static Object lock = new Object();
private int numberOfErrors;
private int numberOfFailures;
private String totalNumberOfRuns = "0";
private boolean finished;
private IPyUnitLaunch pyUnitLaunch;
private int nextIndex = 0;
private String totalTime; //null while not set.
public PyUnitTestRun(IPyUnitLaunch server) {
synchronized (lock) {
this.name = "Test Run:" + currentRun;
currentRun += 1;
}
this.pyUnitLaunch = server;
this.results = new ArrayList<PyUnitTestResult>();
this.testsRunning = new LinkedHashMap<Tuple<String, String>, PyUnitTestStarted>();
}
public Collection<PyUnitTestStarted> getTestsRunning() {
return testsRunning.values();
}
public void setTotalNumberOfRuns(String totalNumberOfRuns) {
this.totalNumberOfRuns = totalNumberOfRuns;
}
public synchronized void addResult(PyUnitTestResult result) {
if (result.status.equals("fail")) {
numberOfFailures += 1;
} else if (result.status.equals("error")) {
numberOfErrors += 1;
} else if (result.status.equals("ok")) {
//ignore
} else {
Log.log("Unexpected status: " + result.status);
}
Tuple<String, String> key = new Tuple<String, String>(result.location, result.test);
this.testsRunning.remove(key);//when a result is added, it should be removed from the tests running.
results.add(result);
}
public void addStartTest(PyUnitTestStarted result) {
Tuple<String, String> key = new Tuple<String, String>(result.location, result.test);
this.testsRunning.put(key, result);
}
/**
* @return the same instance that's used internally to back up the results (use with care outside of this api
* mostly for testing).
*/
public List<PyUnitTestResult> getSharedResultsList() {
return results;
}
public int getNumberOfRuns() {
return results.size();
}
public int getNumberOfErrors() {
return numberOfErrors;
}
public int getNumberOfFailures() {
return numberOfFailures;
}
public String getTotalNumberOfRuns() {
return totalNumberOfRuns;
}
public void setFinished(boolean finished) {
this.finished = finished;
}
public boolean getFinished() {
return finished;
}
public void stop() {
if (this.pyUnitLaunch != null) {
IPyUnitLaunch s = this.pyUnitLaunch;
if (s != null) {
s.stop();
}
}
}
public void relaunch() {
if (this.pyUnitLaunch != null) {
IPyUnitLaunch s = this.pyUnitLaunch;
if (s != null) {
s.relaunch();
}
}
}
@Override
public String toString() {
return "PyUnitTestResult.\n" + " Finished: " + this.finished + "\n" + " Number of runs: "
+ this.results.size() + "" + " Number of failures:" + this.numberOfFailures + "\n"
+ " Number of errors: " + this.numberOfErrors + "\n" + "";
}
public void relaunchOnlyErrors() {
IPyUnitLaunch s = this.pyUnitLaunch;
if (s != null) {
ArrayList<PyUnitTestResult> arrayList = new ArrayList<PyUnitTestResult>(this.results.size());
for (PyUnitTestResult pyUnitTestResult : this.results) {
if (!pyUnitTestResult.status.equals("ok")) {
arrayList.add(pyUnitTestResult);
}
}
s.relaunchTestResults(arrayList);
}
}
/**
* @param mode ILaunchManager.DEBUG_MODE or ILaunchManager.RUN_MODE
*/
public void relaunch(List<PyUnitTestResult> resultsToRelaunch, String mode) {
IPyUnitLaunch s = this.pyUnitLaunch;
if (s != null) {
s.relaunchTestResults(resultsToRelaunch, mode);
}
}
public synchronized String getNextTestIndex() {
return Integer.toString(++nextIndex);
}
public void setTotalTime(String totalTime) {
this.totalTime = totalTime;
}
public String getTotalTime() {
return this.totalTime;
}
}