/*******************************************************************************
 * Copyright (c) 2010 The Eclipse Foundation 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:
 *     Yatta Solutions - initial API and implementation
 *******************************************************************************/
package org.eclipse.epp.mpc.tests;

import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.RunnerBuilder;

public class UISuite extends LoggingSuite {

	public UISuite(Class<?> klass, RunnerBuilder builder) throws InitializationError {
		super(klass, builder);
	}

	public UISuite(RunnerBuilder builder, Class<?>[] classes) throws InitializationError {
		super(builder, classes);
	}

	void doRun(RunNotifier notifier) {
		super.run(notifier);
	}

	@Override
	public void run(final RunNotifier notifier) {
		if (!PlatformUI.isWorkbenchRunning()) {
			notifier.fireTestFailure(new Failure(getDescription(), new IllegalStateException("Workbench not running")));
		}
		if (Display.getCurrent() != null) {
			super.run(notifier);//we are in an UI Thread already
		} else {
			final Display display = PlatformUI.getWorkbench().getDisplay();
			display.syncExec(new Runnable() {
				public void run() {
					doRun(notifier);
				}
			});
		}
	}

}
