/*******************************************************************************
 * Copyright (c) 2004, 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.jst.server.geronimo.ui.tests;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Vector;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

class OrderedTestSuite extends TestSuite{
	public OrderedTestSuite(Class theClass, String name) {
		this(theClass);
		setName(name);
	}

	public OrderedTestSuite(final Class theClass) {
		super();
		setName(theClass.getName());
		try {
			getTestConstructor(theClass); // Avoid generating multiple error messages
		} catch (NoSuchMethodException e) {
			addTest(warning("Class " + theClass.getName()
					+ " has no public constructor TestCase(String name) or TestCase()"));
			return;
		}
		if (!Modifier.isPublic(theClass.getModifiers())) {
			addTest(warning("Class " + theClass.getName() + " is not public"));
			return;
		}
		Class superClass = theClass;
		Vector names = new Vector();
		while (Test.class.isAssignableFrom(superClass)) {
			Method[] methods = superClass.getDeclaredMethods();
			int size = methods.length;
			for (int i = 0; i < size - 1; i++) {
				for (int j = i + 1; j < size; j++) {
					if (methods[i].getName().compareTo(methods[j].getName()) > 0) {
						Method m = methods[i];
						methods[i] = methods[j];
						methods[j] = m;
					}
				}
			}
			for (int i = 0; i < size; i++) {
				addTestMethod(methods[i], names, theClass);
			}
			superClass = superClass.getSuperclass();
		}
		if (!tests().hasMoreElements())
			addTest(warning("No tests found in " + theClass.getName()));
	}

	private void addTestMethod(Method m, Vector names, Class theClass) {
		String name = m.getName();
		if (names.contains(name))
			return;
		if (!isPublicTestMethod(m)) {
			if (isTestMethod(m))
				addTest(warning("Test method isn't public: " + m.getName()));
			return;
		}
		names.addElement(name);
		addTest(createTest(theClass, name));
	}

	private boolean isPublicTestMethod(Method m) {
		return isTestMethod(m) && Modifier.isPublic(m.getModifiers());
	}

	private boolean isTestMethod(Method m) {
		String name = m.getName();
		Class[] parameters = m.getParameterTypes();
		Class returnType = m.getReturnType();
		return parameters.length == 0 && name.startsWith("test") && returnType.equals(Void.TYPE);
	}

	private Test warning(final String message) {
		return new TestCase("warning") {
			protected void runTest() {
				fail(message);
			}
		};
	}
}