/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.debug.jdi.tests;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Enumeration;
import java.util.Vector;

/**
 * Run all tests
 */
public class TestAll {
	/**
	 * Returns all the test case classes (a Vector of Class) that are
	 * relevant for the given VM information.
	 * NB1: This doesn't include the VirtualMachineTest class.
	 * NB2: The last element must be the VMDeathEventTest class since 
	 *      it shuts the VM down.
	 */
	protected static Vector getAllTestCases(VMInformation info) {
		Vector classes = new Vector();
		classes.addElement(AccessibleTest.class);
		classes.addElement(ArrayReferenceTest.class);
		classes.addElement(ArrayTypeTest.class);
		classes.addElement(BooleanValueTest.class);
		classes.addElement(BreakpointRequestTest.class);
		classes.addElement(ByteValueTest.class);
		classes.addElement(CharValueTest.class);
		classes.addElement(ClassLoaderReferenceTest.class);
		classes.addElement(ClassPrepareEventTest.class);
		classes.addElement(ClassPrepareRequestTest.class);
		classes.addElement(ClassTypeTest.class);
		classes.addElement(DoubleValueTest.class);
		classes.addElement(EventRequestManagerTest.class);
		classes.addElement(EventRequestTest.class);
		classes.addElement(EventTest.class);
		classes.addElement(ExceptionEventTest.class);
		classes.addElement(ExceptionRequestTest.class);
		classes.addElement(FieldTest.class);
		classes.addElement(FloatValueTest.class);
		classes.addElement(HotCodeReplacementTest.class);
		classes.addElement(IntegerValueTest.class);
		classes.addElement(InterfaceTypeTest.class);
		classes.addElement(LocalVariableTest.class);
		classes.addElement(LocatableTest.class);
		classes.addElement(LocationTest.class);
		classes.addElement(LongValueTest.class);
		classes.addElement(MethodTest.class);
		classes.addElement(MethodEntryRequestTest.class);
		classes.addElement(MethodExitRequestTest.class);
		classes.addElement(MirrorTest.class);
	
		if (info.fVM.canWatchFieldModification())
			classes.addElement(ModificationWatchpointEventTest.class);
			
		classes.addElement(ObjectReferenceTest.class);
		classes.addElement(PrimitiveValueTest.class);
		classes.addElement(ReferenceTypeTest.class);
		classes.addElement(ShortValueTest.class);
		classes.addElement(StackFrameTest.class);
		classes.addElement(StepEventTest.class);
		classes.addElement(StringReferenceTest.class);
		classes.addElement(ThreadDeathEventTest.class);
		classes.addElement(ThreadGroupReferenceTest.class);
		classes.addElement(ThreadReferenceTest.class);
		classes.addElement(ThreadStartEventTest.class);
		classes.addElement(TypeComponentTest.class);
		classes.addElement(TypeTest.class);
		classes.addElement(ValueTest.class);
	
		if (info.fVM.canWatchFieldAccess() && info.fVM.canWatchFieldModification()) {
			classes.addElement(WatchpointEventTest.class);
			classes.addElement(WatchpointRequestTest.class);
		}
	
		classes.addElement(VirtualMachineExitTest.class);
		classes.addElement(VMDisconnectEventTest.class);
		classes.addElement(VMDisposeTest.class);	// note that this test does not restore the state properly.
		return classes;
	}
	/**
	 * Run all tests with the given arguments.
	 * @see AbstractJDITest for details on the arguments.
	 * @param arguments
	 * @throws Throwable
	 */
	public static void main(String[] arguments) throws Throwable {
		// Create test result
		TextTestResult result= new TextTestResult();
	
		// Run the VirtualMachineTest
		AbstractJDITest test= run(result, VirtualMachineTest.class, arguments, null);
	
		// Was it possible to run the first test?
		if (test == null)
			return;
		
		// Get the VM info
		VMInformation info = test.getVMInfo();
	
		// Get all test cases
		Vector classes= getAllTestCases(info);
	
		// Run the other tests
		Enumeration enumeration= classes.elements();
		while (enumeration.hasMoreElements()) {
			Class testClass= (Class)enumeration.nextElement();
			test= run(result, testClass, arguments, info);
			info= test.getVMInfo(); // In case the test has changed this info
		}
	
		// Shut down the VM 
		test.shutDownTarget();
	
		// Show the result
		result.print();
	}
	/**
	 * Runs the given test with the given arguments.
	 * Returns the instance that was created.
	 * Returns null if there was a problem with the arguments.
	 * @see AbstractJDITest for details on the arguments.
	 */
	private static AbstractJDITest run(junit.framework.TestResult result, Class testClass, String[] arguments, VMInformation info) throws Throwable {
		// Create test
		Class[] argTypes= {};
		Constructor construct = null;
		try {
			construct = testClass.getConstructor(argTypes);
		} catch (NoSuchMethodException e) {
		}
		AbstractJDITest test = null;
		try {
			test = (AbstractJDITest) construct.newInstance(new Object[]{});
		} catch (InstantiationException e) {
		} catch (IllegalAccessException e) {
		} catch (InvocationTargetException e) {
			throw e.getTargetException();
		}
		if (!AbstractJDITest.parseArgs(arguments))
			return null;
		test.setVMInfo(info);
		test.setInControl(false);
	
		// Run test
		System.out.println("\n" + new java.util.Date());
		System.out.println("Begin testing " + test.getName() + "...");
		long startTime= System.currentTimeMillis();
		test.suite().run(result);
		long endTime= System.currentTimeMillis();
		long runTime= endTime-startTime;
		System.out.println("\nTime: "+runTime/1000+"."+runTime%1000);
		System.out.println("Done testing " + test.getName() + ".");
		
		return test;
	}
}
