/*******************************************************************************
 * Copyright (c) 2000, 2016 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.jdt.core.tests.model;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Set;

import org.eclipse.jdt.internal.core.nd.indexer.Indexer;
import org.eclipse.test.internal.performance.PerformanceMeterFactory;

import junit.extensions.TestSetup;
import junit.framework.Protectable;
import junit.framework.Test;
import junit.framework.TestResult;
import junit.framework.TestSuite;

/**
 * A test case class that can be set up (using the setUpSuite() method) and torn down (using the tearDownSuite() method)
 * once for all test cases of this class.
 */
@SuppressWarnings("rawtypes")
public class SuiteOfTestCases extends org.eclipse.jdt.core.tests.junit.extension.TestCase {

	/**
	 * Number of milliseconds that a test case can run for before we consider it to be potentially
	 * deadlocked and dump out a stack trace. Currently set to 5 minutes.
	 */
	private static final long FROZEN_TEST_TIMEOUT_MS = 1000 * 60 * 5;

	/*
	 * A test suite that initialize the test case's fields once, then that copies the values
	 * of these fields into each subsequent test case.
	 */
	public static class Suite extends TestSuite {
		public SuiteOfTestCases currentTestCase;

		/*
		 * Creates a new suite on the given class. This class must be a subclass of SetupableTestSuite.
		 */
		public Suite(Class theClass) {
			super(theClass);
		}
		public Suite(String name) {
			super(name);
		}
		private void initialize(SuiteOfTestCases test) {
			Class currentClass = test.getClass();
			while (currentClass != null && !currentClass.equals(SuiteOfTestCases.class)) {
				Field[] fields = currentClass.getDeclaredFields();
				for (int i = 0, length = fields.length; i < length; i++) {
					Field field = fields[i];

					// skip static and final fields
					int modifiers = field.getModifiers();
					if (Modifier.isStatic(modifiers) || Modifier.isFinal(modifiers)) continue;

					// make the field accessible
					field.setAccessible(true);

					try {
						Object value = field.get(this.currentTestCase);
						field.set(test, value);
					} catch (IllegalAccessException e) {
						e.printStackTrace();
					}
				}
				currentClass = currentClass.getSuperclass();
			}
		}
		public void run(final TestResult result) {
			Protectable p= new Protectable() {
				public void protect() throws Exception {
					try {
						// run suite (first test run will setup the suite)
						superRun(result);
					} finally {
						// tear down the suite
						if (Suite.this.currentTestCase != null) { // protect against empty test suite
							Suite.this.currentTestCase.tearDownSuite();
						}
					}
				}
			};
			result.runProtected(this, p);
		}
		public void superRun(TestResult result) {
			super.run(result);
		}
		public void runTest(Test test, TestResult result) {
			SuiteOfTestCases current = (SuiteOfTestCases)test;
			if (this.currentTestCase == null) {
				// setup suite
				try {
					current.setUpSuite();
				} catch (Exception e) {
					e.printStackTrace();
				}
			} else {
				// copy the values of the previous current test case's fields into the current one
				initialize(current);
			}
			try {
				super.runTest(test, result);
			} finally {
				// make current
				this.currentTestCase = current;
			}
		}
	}

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

	/**
	 * Setup the test suite once before all test cases run.
	 */
	public void setUpSuite() throws Exception {
		Indexer.getInstance().enableAutomaticIndexing(false);
		//Indexer.getInstance().waitForIndex(null);
	}

	/**
	 * Tear down the test suite once after all test cases have run.
	 */
	public void tearDownSuite() throws Exception {
		Indexer.getInstance().enableAutomaticIndexing(true);
	}

	@Override
	protected void setUp() throws Exception {
		FreezeMonitor.expectCompletionIn(FROZEN_TEST_TIMEOUT_MS);
		super.setUp();
	}

	@Override
	protected void tearDown() throws Exception {
		FreezeMonitor.done();
		super.tearDown();
	}

	/**
	 * Decorate an individual test with setUpSuite/tearDownSuite, so that the test can be run standalone.
	 * This method is called by the Eclipse JUnit test runner when a test is re-run from the JUnit view's context menu.
	 */
	public static Test setUpTest(Test test) {
		if (!(test instanceof SuiteOfTestCases))
			return test;

		final SuiteOfTestCases suiteOfTestCases = (SuiteOfTestCases) test;
		return new TestSetup(test) {
			protected void setUp() throws Exception {
				// reset the PerformanceMeterFactory, so that the same scenario can be run again:
				Field field = PerformanceMeterFactory.class.getDeclaredField("fScenarios");
				field.setAccessible(true);
				Set set = (Set) field.get(null);
				set.clear();
				
				suiteOfTestCases.setUpSuite();
			}

			protected void tearDown() throws Exception {
				suiteOfTestCases.tearDownSuite();
			}
		};
	}

}
