/*************************************************************************
 * @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();
		
	}	
}