/*******************************************************************************
 * Copyright (c) 2005, 2015 IBM Corporation and others.
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Jesper S Moller - Contribution for bug 402173
 *                       Contribution for bug 402892
 *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] follow up bug for comments - https://bugs.eclipse.org/458208
 *******************************************************************************/
package org.eclipse.jdt.core.tests;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.eclipse.jdt.core.tests.formatter.*;
import org.eclipse.jdt.core.tests.formatter.comment.CommentsTestSuite;
import org.eclipse.jdt.core.tests.junit.extension.TestCase;

/**
 * Runs all formatter tests.
 */
@SuppressWarnings({"rawtypes", "unchecked"})
public class RunFormatterTests extends junit.framework.TestCase {

	public final static List TEST_SUITES = new ArrayList();
	static {
		TEST_SUITES.add(FormatterCommentsBugsTest.class);
		TEST_SUITES.add(FormatterCommentsTests.class);
		TEST_SUITES.add(FormatterCommentsClearBlankLinesTests.class);
		TEST_SUITES.add(FormatterJavadocDontIndentTagsTests.class);
		TEST_SUITES.add(FormatterJavadocDontIndentTagsDescriptionTests.class);
		TEST_SUITES.add(FormatterOldBugsGistTests.class);
	}

	public static Class[] getTestClasses() {
		return (Class[]) TEST_SUITES.toArray();
	}

	public static Test suite() {
		TestSuite ts = new TestSuite(RunFormatterTests.class.getName());

		// Store test classes with same "JavaSearch"project
		FormatterCommentsTests.ALL_TEST_SUITES = new ArrayList(TEST_SUITES);

		// Get all classes
		List allClasses = new ArrayList();
		String type = System.getProperty("type");
		if (type == null || !type.equals("javadoc")) {
			allClasses.add(FormatterRegressionTests.class);
			allClasses.add(FormatterBugsTests.class);
		}
		allClasses.add(CommentsTestSuite.class);
		allClasses.add(FormatterJSR335Tests.class);
		allClasses.add(FormatterJSR308Tests.class);
		allClasses.add(FormatterBugs18Tests.class);
		allClasses.addAll(TEST_SUITES);

		// Reset forgotten subsets of tests
		TestCase.TESTS_PREFIX = null;
		TestCase.TESTS_NAMES = null;
		TestCase.TESTS_NUMBERS = null;
		TestCase.TESTS_RANGE = null;
		TestCase.RUN_ONLY_ID = null;

		// Add all tests suite of tests
		for (int i = 0, size = allClasses.size(); i < size; i++) {
			Class testClass = (Class) allClasses.get(i);

			// call the suite() method and add the resulting suite to the suite
			try {
				Method suiteMethod = testClass.getDeclaredMethod("suite", new Class[0]); //$NON-NLS-1$
				Test suite = (Test)suiteMethod.invoke(null, new Object[0]);
				ts.addTest(suite);
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.getTargetException().printStackTrace();
			} catch (NoSuchMethodException e) {
				e.printStackTrace();
			}
		}
		return ts;
	}

public RunFormatterTests(String name) {
	super(name);
}
}

