/*************************************************************************
 * @author Ali Echihabi (ali_echihabi@ieee.org, ali.echihabi@souss.ca)
 *
 * Plugin for PHP unit Testing.
 * www.phpeclipse.de
 * 
 *************************************************************************/

package net.sourceforge.phpeclipse.phpunit.testpool;

import java.util.Vector;

public class TestSuite {

	private boolean hasFailure;

	private boolean isAllPass;

	private boolean hasError;

	private Vector testCases; // current or actual.

	private Vector testSuites; // current or actual.

	private String name;

	private String id;

	private int numTestCasesExpected; // expected

	private int numTestCasesRunSoFar;

	TestSuite parent;

	/**
	 * @param name
	 * @param testID
	 * @param testCount
	 */
	public TestSuite(TestSuite parent, String name, String testID, int testCount) {

		this.parent = parent;
		this.id = testID;
		this.name = name;
		this.numTestCasesExpected = testCount;

		testCases = new Vector();
		testSuites = new Vector();

		hasError = false;
		isAllPass = true;
		hasFailure = false;
	}

	public void addTestCase(TestCase test) {
		testCases.addElement(test);
		test.setParentSuite(this);
		numTestCasesRunSoFar++;
	}

	public void removeTestCase(TestCase test) {
	}

	public boolean contains(TestCase test) {

		return false;

	}

	public String toString() {

		String string = "";

		// print test cases.
		TestCase tc = null;
		for (int i = 0; i < testCases.size(); i++) {

			tc = (TestCase) testCases.elementAt(i);
			string += "  - " + tc.getTestID() + ", " + tc.getTestName() + "\n";

		}

		for (int i = 0; i < testSuites.size(); i++)
			string += ((TestSuite) testSuites.elementAt(i)).toString();

		// print its own test suites.
		return string;
	}

	/**
	 * @return
	 */
	public String getId() {
		return id;
	}

	/**
	 * @return
	 */
	public String getName() {
		return name;
	}

	/**
	 * @return
	 */
	public int getNumTestCasesExpected() {
		return numTestCasesExpected;
	}

	/**
	 * @param string
	 */
	public void setId(String string) {
		id = string;
	}

	/**
	 * @param string
	 */
	public void setName(String string) {
		name = string;
	}

	/**
	 * @param i
	 */
	public void setNumTestCasesExpected(int i) {
		numTestCasesExpected = i;
	}

	/**
	 * @param suite
	 */
	public void addTestSuite(TestSuite suite) {
		testSuites.addElement(suite);

	}

	/**
	 * @return
	 */
	public boolean isFinished() {

		return numTestCasesRunSoFar >= numTestCasesExpected;

	}

	/**
	 * @return
	 */
	public TestSuite getParent() {
		return parent;
	}

	/**
	 * @param suite
	 */
	public void setParent(TestSuite suite) {
		parent = suite;
	}

	/**
	 * @return
	 */
	public int getNumTestCases() {

		return testCases.size();
	}

	/**
	 * @return
	 */
	public Vector getTestCases() {
		return testCases;
	}

	/**
	 * @return
	 */
	public Vector getTestSuites() {
		return testSuites;
	}

	/**
	 * @param vector
	 */
	public void setTestCases(Vector vector) {
		testCases = vector;
	}

	/**
	 * @param vector
	 */
	public void setTestSuites(Vector vector) {
		testSuites = vector;
	}

	/**
	 * @return
	 */
	public boolean hasError() {

		return hasError;

	}

	public void setHasError() {

		if (hasError)
			return;

		hasError = true;

		if (parent != null)
			parent.setHasError();
	}

	/**
	 * @return
	 */
	public boolean hasFailure() {

		return hasFailure;

	}

	public void setHasFailure() {

		if (hasFailure)
			return;

		hasFailure = true;

		if (parent != null)
			parent.setHasFailure();
	}

	public boolean isAllPass() {

		return !hasError() && !hasFailure();

	}
}