/**********************************************************************
 * This file is part of "Object Teams Development Tooling"-Software
 *
 * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
 * for its Fraunhofer Institute and Computer Architecture and Software
 * Technology (FIRST), Berlin, Germany and Technical University Berlin,
 * Germany.
 *
 * 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
 *
 * Please visit http://www.eclipse.org/objectteams for updates and contact.
 *
 * Contributors:
 * 	  Fraunhofer FIRST - Initial API and implementation
 * 	  Technical University Berlin - Initial API and implementation
 **********************************************************************/
package org.eclipse.objectteams.otdt.debug.tests;

import java.util.Enumeration;

import junit.framework.Test;
import junit.framework.TestResult;
import junit.framework.TestSuite;

import org.eclipse.objectteams.otdt.debug.tests.core.SourceDebugExtensionTest;
import org.eclipse.objectteams.otdt.debug.tests.core.StratumTests;
import org.eclipse.swt.widgets.Display;

/**
 * Tests for automatic testrun
 */
public class AllTests extends TestSuite
{

    /**
     * Flag that indicates test are in progress
     */
    protected boolean fTesting = true;

    /**
     * Returns the suite. This is required to use the JUnit Launcher.
     */
    public static Test suite()
    {
        return new AllTests();
    }

    /**
     * Construct the test suite.
     * ADD TESTS HERE
     */
    public AllTests()
    {
		addTest(new TestSuite(OTProjectCreationDecorator.class));

		addTest(new TestSuite(StratumTests.class));

        addTest(new TestSuite(SourceDebugExtensionTest.class));

    }

    /**
     * Runs the tests and collects their result in a TestResult. The debug tests
     * cannot be run in the UI thread or the event waiter blocks the UI when a
     * resource changes.
     */
    public void run(final TestResult result)
    {
        final Display display = Display.getCurrent();
        Thread thread = null;
        try
        {
            Runnable r = new Runnable()
            {
                public void run()
                {
                    for (Enumeration e = tests(); e.hasMoreElements();)
                    {
                        if (result.shouldStop())
                            break;
                        Test test = (Test) e.nextElement();
                        runTest(test, result);
                    }
                    fTesting = false;
                    display.wake();
                }
            };
            thread = new Thread(r);
            thread.start();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        while (fTesting)
        {
            try
            {
                if (!display.readAndDispatch())
                    display.sleep();
            }
            catch (Throwable e)
            {
                e.printStackTrace();
            }
        }
    }

}
