/*
 * Copyright (c) 2005, 2010 Borland Software 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:
 *    Artem Tikhomirov (Borland) - initial API and implementation
 *    Mickael Istria (EBM Websourcing) - Support for target platform creation
 */
package org.eclipse.gmf.tests;

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

import org.eclipse.gmf.tests.gef.CompartmentPropertiesTest;
import org.eclipse.gmf.tests.gef.DiagramEditorTest;
import org.eclipse.gmf.tests.gef.DiagramNodeTest;
import org.eclipse.gmf.tests.gef.ParsersTest;
import org.eclipse.gmf.tests.gef.ParsersTest.ParsersSetup;
import org.eclipse.gmf.tests.gen.AuditHandcodedTest;
import org.eclipse.gmf.tests.gen.CodegenReconcileTest;
import org.eclipse.gmf.tests.gen.FigureCodegenTest;
import org.eclipse.gmf.tests.gen.FigureLayoutTest;
import org.eclipse.gmf.tests.gen.GenFeatureSeqInitializerTest;
import org.eclipse.gmf.tests.gen.HandcodedContributionItemTest;
import org.eclipse.gmf.tests.gen.HandcodedGMFMapItemProvidersTest;
import org.eclipse.gmf.tests.gen.HandcodedGraphDefTest;
import org.eclipse.gmf.tests.gen.HandcodedImplTest;
import org.eclipse.gmf.tests.gen.HandcodedPaletteTest;
import org.eclipse.gmf.tests.gen.LabelSupportTest;
import org.eclipse.gmf.tests.gen.MapModeStrategyTest;
import org.eclipse.gmf.tests.gen.ModelLoadHelperTest;
import org.eclipse.gmf.tests.gen.OrganizeImportsPostprocessorTest;
import org.eclipse.gmf.tests.gen.RTFigureTest;
import org.eclipse.gmf.tests.gen.RuntimeCompilationTest;
import org.eclipse.gmf.tests.gen.ShapePropertiesTest;
import org.eclipse.gmf.tests.gen.StandaloneMapModeTest;
import org.eclipse.gmf.tests.gen.StandalonePluginConverterTest;
import org.eclipse.gmf.tests.gen.ToolDefHandocodedImplTest;
import org.eclipse.gmf.tests.gen.ViewmapProducersTest;
import org.eclipse.gmf.tests.migration.AllMigrationTests;
import org.eclipse.gmf.tests.rt.AuditRulesTest;
import org.eclipse.gmf.tests.rt.BundleActivationTest;
import org.eclipse.gmf.tests.rt.EditHelpersTest;
import org.eclipse.gmf.tests.rt.ElementInitializerTest;
import org.eclipse.gmf.tests.rt.LinkChildMetaFeatureNotFromContainerTest;
import org.eclipse.gmf.tests.rt.LinkCreationConstraintsTest;
import org.eclipse.gmf.tests.rt.LinkCreationTest;
import org.eclipse.gmf.tests.rt.LinkEcoreConstraintsTest;
import org.eclipse.gmf.tests.rt.MetricRulesTest;
import org.eclipse.gmf.tests.rt.PaletteTest;
import org.eclipse.gmf.tests.setup.LinksSessionSetup;
import org.eclipse.gmf.tests.setup.SessionSetup;
import org.eclipse.gmf.tests.setup.TestAllDerivedFeatures;
import org.eclipse.gmf.tests.setup.TestSetupTest;
import org.eclipse.gmf.tests.setup.figures.FigureCodegenSetup;
import org.eclipse.gmf.tests.setup.figures.FigureLayoutSetup;
import org.eclipse.gmf.tests.setup.figures.LabelSupportSetup;
import org.eclipse.gmf.tests.setup.figures.ShapePropertiesSetup;
import org.eclipse.gmf.tests.tr.AuditRootTest;
import org.eclipse.gmf.tests.tr.EcoreGenModelMatcherTest;
import org.eclipse.gmf.tests.tr.GenModelGraphAnalyzerTest;
import org.eclipse.gmf.tests.tr.GenModelTransformerBasicRTTest;
import org.eclipse.gmf.tests.tr.GenModelTransformerSimpleTest;
import org.eclipse.gmf.tests.tr.HistoryTest;
import org.eclipse.gmf.tests.tr.LabelMappingTransformTest;
import org.eclipse.gmf.tests.tr.ManifestMergeTest;
import org.eclipse.gmf.tests.tr.NamingStrategyTest;
import org.eclipse.gmf.tests.tr.PaletteTransformationTest;
import org.eclipse.gmf.tests.tr.PluginXMLTextMergerTest;
import org.eclipse.gmf.tests.tr.TestDefaultMergeService;
import org.eclipse.gmf.tests.tr.TransformToGenModelOperationTest;
import org.eclipse.gmf.tests.tr.XmlTextMergerTest;
import org.eclipse.gmf.tests.validate.AllValidateTests;
import org.eclipse.jdt.core.JavaCore;

public class AllTests {

	public static Test suite() throws Exception {

		if (System.getProperty("buildingWithTycho") != null) {
			System.err.println("Generating a target platform");
			Utils.setTargetPlatform();
		}
		
		
		TestSuite suite = new TestSuite("Tests for org.eclipse.gmf, tooling side");
		final SessionSetup sessionSetup = SessionSetup.newInstance();
		final LinksSessionSetup sessionSetup2 = LinksSessionSetup.newInstance();
		final SessionSetup setupLinkEcoreConstraintsTest = new LinkEcoreConstraintsTest.CustomSetup();
		final SessionSetup setupLinkChildMetaFeatureNotFromContainerTest = new LinkChildMetaFeatureNotFromContainerTest.CustomSetup();
		// FIXME both EditHelpers BundleActivation setups may benefit from GenProjectSetup that doesn't need
		// subclassing to generate extra code
		final SessionSetup setupEditHelpersTest = new EditHelpersTest.EditHelpersSessionSetup();
		final SessionSetup setupBundleActivationTest = new BundleActivationTest.CustomSetup();
		
		SessionSetup.disallowSingleTestCaseUse();
		

		JavaCore.initializeAfterLoad(null);

		/*
		 * Temporary workaround: loading all the projects in the
		 * beginning to get rid of the problems with runtime registries
		 * reloading. In particular - ViewService.
		 */
		// since we force initialization, need to make sure our tests would use same initialized setup instances. 
		Plugin.getConfig().registerInstance(SessionSetup.class, sessionSetup);
		Plugin.getConfig().registerInstance(LinksSessionSetup.class, sessionSetup2);
		Plugin.getConfig().registerInstance(setupLinkEcoreConstraintsTest.getClass(), setupLinkEcoreConstraintsTest);
		Plugin.getConfig().registerInstance(setupLinkChildMetaFeatureNotFromContainerTest.getClass(), setupLinkChildMetaFeatureNotFromContainerTest);
		Plugin.getConfig().registerInstance(setupEditHelpersTest.getClass(), setupEditHelpersTest);
		Plugin.getConfig().registerInstance(setupBundleActivationTest.getClass(), setupBundleActivationTest);
		try {
			sessionSetup.getGeneratedPlugin();
			sessionSetup2.getGeneratedPlugin();
			setupLinkChildMetaFeatureNotFromContainerTest.getGeneratedPlugin();
			setupLinkEcoreConstraintsTest.getGeneratedPlugin();
			setupEditHelpersTest.getGeneratedPlugin();
			setupBundleActivationTest.getGeneratedPlugin();
		} catch (final Exception e) {
			suite.addTest(new ConfigurationFailedCase("Session setup initialization problem", e));
			return suite;
		}
		/* END */

		//$JUnit-BEGIN$
		suite.addTestSuite(TestSetupTest.class); // first, check sources/setups we use for the rest of the tests
		suite.addTestSuite(HandcodedImplTest.class); // then, check handcoded implementations are in place
		suite.addTestSuite(HandcodedGraphDefTest.class);
		suite.addTestSuite(HandcodedPaletteTest.class);
		suite.addTestSuite(HandcodedContributionItemTest.class);
		suite.addTestSuite(HandcodedGMFMapItemProvidersTest.class);

		suite.addTestSuite(GenModelTransformerSimpleTest.class);
		suite.addTestSuite(TransformToGenModelOperationTest.class);
		suite.addTestSuite(LabelMappingTransformTest.class);
		suite.addTestSuite(PaletteTransformationTest.class);
		suite.addTestSuite(AuditRootTest.class);
		suite.addTestSuite(HistoryTest.class);
		suite.addTestSuite(XmlTextMergerTest.class);
		suite.addTestSuite(TestDefaultMergeService.class);
		suite.addTestSuite(PluginXMLTextMergerTest.class);
		suite.addTestSuite(ManifestMergeTest.class);
        suite.addTestSuite(OrganizeImportsPostprocessorTest.class);

		suite.addTestSuite(EcoreGenModelMatcherTest.class);
		suite.addTestSuite(ModelLoadHelperTest.class);		
		suite.addTest(AllMigrationTests.suite());
		suite.addTest(AllValidateTests.suite());

		suite.addTestSuite(FigureCodegenTest.class);
		suite.addTestSuite(LabelSupportTest.class);
		suite.addTestSuite(ShapePropertiesTest.class);
		suite.addTestSuite(FigureLayoutTest.class);
		suite.addTestSuite(StandaloneMapModeTest.class);
		suite.addTestSuite(StandalonePluginConverterTest.class);
		suite.addTestSuite(RTFigureTest.class);
		suite.addTestSuite(MapModeStrategyTest.class);
		suite.addTestSuite(ViewmapProducersTest.class);
		suite.addTestSuite(ToolDefHandocodedImplTest.class);
		suite.addTestSuite(AuditHandcodedTest.class);		
		suite.addTestSuite(AuditRulesTest.class);		
		suite.addTestSuite(ElementInitializerTest.class);
		suite.addTestSuite(CodegenReconcileTest.class);
		// though it might be an overkill to check two setups, it should be fast and won't hurt.
		suite.addTest(feed(TestAllDerivedFeatures.class, sessionSetup, "-SessionSetup"));
		suite.addTest(feed(TestAllDerivedFeatures.class, sessionSetup2, "-LinksSessionSetup"));
		
		suite.addTestSuite(DiagramNodeTest.class);
		suite.addTestSuite(CompartmentPropertiesTest.class);
		suite.addTestSuite(NamingStrategyTest.class);
		suite.addTestSuite(GenModelTransformerBasicRTTest.class);
		suite.addTestSuite(DiagramEditorTest.class);
		suite.addTestSuite(LinkChildMetaFeatureNotFromContainerTest.class);
		suite.addTestSuite(LinkEcoreConstraintsTest.class);
		suite.addTestSuite(PaletteTest.class);

		suite.addTestSuite(BundleActivationTest.class);

//		suite.addTestSuite(RunTimeModelTransformerTest.class); #113966
//		suite.addTestSuite(PropertiesTest.class); #113965 
//		suite.addTestSuite(CanvasTest.class); Nothing there yet
//		suite.addTestSuite(SpecificRTPropertiesTest.class); #113965
		
		suite.addTestSuite(LinkCreationTest.class);
		suite.addTestSuite(LinkCreationConstraintsTest.class);
		suite.addTestSuite(MetricRulesTest.class);		
		suite.addTestSuite(GenFeatureSeqInitializerTest.class);
		suite.addTestSuite(GenModelGraphAnalyzerTest.class);
		suite.addTestSuite(EditHelpersTest.class);
		//suite.addTest(feed(ParsersTest.class, new ParsersSetup(false), "-direct"));
		//suite.addTest(feed(ParsersTest.class, new ParsersSetup(true), "-provider"));

		// slowest test goes last
		suite.addTestSuite(RuntimeCompilationTest.class);


		//$JUnit-END$
		suite.addTest(new CleanupTest("testCleanup") {
			protected void performCleanup() throws Exception {
				sessionSetup.cleanup();
				sessionSetup2.cleanup();
				setupLinkChildMetaFeatureNotFromContainerTest.cleanup();
				setupLinkEcoreConstraintsTest.cleanup();
				setupEditHelpersTest.cleanup();
				setupBundleActivationTest.cleanup();
			}
		});
		
		return suite;
	}

	public static Test feed(Class<? extends TestCase> theClass, TestConfiguration config, String suffix) {
		return Configurator.feed(theClass, config, theClass.getSimpleName() + suffix);
	}

	// records our knowledge which test requires which setup
	public static void populate(Configurator c) {
		// SessionSetup
		c.register(DiagramEditorTest.class, SessionSetup.class);
		c.register(CodegenReconcileTest.class, SessionSetup.class);
		c.register(HandcodedImplTest.class, SessionSetup.class);
		c.register(CompartmentPropertiesTest.class, SessionSetup.class);
		c.register(PaletteTest.class, SessionSetup.class);
		c.register(TransformToGenModelOperationTest.class, SessionSetup.class);
		c.register(GenModelTransformerSimpleTest.class, SessionSetup.class);
		c.register(LabelMappingTransformTest.class, SessionSetup.class);
		c.register(PaletteTransformationTest.class, SessionSetup.class);
		c.register(AuditHandcodedTest.class, SessionSetup.class);		
		c.register(CodegenReconcileTest.class, SessionSetup.class);
		// Default configuration, TestAllDerivedFeatures also runs for LinksSessionSetup 
		c.register(TestAllDerivedFeatures.class, SessionSetup.class);
		c.register(DiagramNodeTest.class, SessionSetup.class);
		c.register(NamingStrategyTest.class, SessionSetup.class);
		c.register(GenModelTransformerBasicRTTest.class, SessionSetup.class);
		c.register(LinkCreationTest.class, SessionSetup.class);
		// LinksSessionSetup
		c.register(AuditRulesTest.class, LinksSessionSetup.class);
		c.register(ElementInitializerTest.class, LinksSessionSetup.class);
		c.register(LinkCreationConstraintsTest.class, LinksSessionSetup.class);
		c.register(MetricRulesTest.class, LinksSessionSetup.class);
		// 
		c.register(FigureCodegenTest.class, new FigureCodegenSetup());
		c.register(LabelSupportTest.class, new LabelSupportSetup());
		c.register(ShapePropertiesTest.class, new ShapePropertiesSetup());
		c.register(FigureLayoutTest.class, new FigureLayoutSetup());
		//
		// Default configuration, ParsersTest also runs for ParsersSetup(false)
		c.register(ParsersTest.class, new ParsersSetup(true));
//		suite.addTest(feed(ParsersTest.class, new ParsersSetup(false), "-direct"));
		//
		c.register(LinkEcoreConstraintsTest.class, new LinkEcoreConstraintsTest.CustomSetup());
		c.register(LinkChildMetaFeatureNotFromContainerTest.class, new LinkChildMetaFeatureNotFromContainerTest.CustomSetup());
		c.register(EditHelpersTest.class, new EditHelpersTest.EditHelpersSessionSetup());
		c.register(BundleActivationTest.class, new BundleActivationTest.CustomSetup());
	}
}