/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.tests.junit.browser;

import junit.framework.*;
import junit.textui.*;
import org.eclipse.swt.tests.junit.*;
import org.eclipse.swt.widgets.*;

/**
 * Automated Test Suite for class org.eclipse.swt.browser.StatusTextListener
 *
 * @see org.eclipse.swt.browser.StatusTextListener
 */
public class Test_BrowserSuite extends SwtTestCase {

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

public static void main(String[] args) {
	TestRunner.run(suite());
}

protected void setUp() {
}

protected void tearDown() {
}

public void Browser1() {
	System.out.println("** Browser1 **");
	boolean result = Browser1.test();
	assertTrue(result);
}

public void Browser2() {
	System.out.println("** Browser2 **");
	boolean result = Browser2.test();
	assertTrue(result);
}

public void Browser3() {
	System.out.println("** Browser3 **");
	boolean result = Browser3.test();
	assertTrue(result);
}

public void Browser4() {
	System.out.println("** Browser4 **");
	boolean result = Browser4.test();
	assertTrue(result);
}

public void Browser5() {
	System.out.println("** Browser5 **");
	boolean result = Browser5.test();
	assertTrue(result);
}

public void Browser6() {
	System.out.println("** Browser6 **");
	boolean result = Browser6.test();
	assertTrue(result);
}

public static Test suite() {
	TestSuite suite = new TestSuite();
	java.util.Vector methodNames = methodNames();
	java.util.Enumeration e = methodNames.elements();
	while (e.hasMoreElements()) {
		suite.addTest(new Test_BrowserSuite((String)e.nextElement()));
	}
	return suite;
}

public static java.util.Vector methodNames() {
	java.util.Vector methodNames = new java.util.Vector();
	methodNames.addElement("Browser1");
	methodNames.addElement("Browser2");
	methodNames.addElement("Browser3");
	methodNames.addElement("Browser4");
	methodNames.addElement("Browser5");
	methodNames.addElement("Browser6");
	return methodNames;
}

protected void runTest() throws Throwable {
	/*
	 * The tests in this suite manage their own Display and event loop
	 * to validate asynchronous use cases.
	 * Dispose any previously existing display for the calling thread
	 * before starting the tests.
	 */
	Display display = Display.getCurrent();
	if (display != null) display.dispose();
	
	if (getName().equals("Browser1")) Browser1();
	if (getName().equals("Browser2")) Browser2();
	if (getName().equals("Browser3")) Browser3();
	if (getName().equals("Browser4")) Browser4();
	if (getName().equals("Browser5")) Browser5();

	/*
	 * Ensure we don't leave a Display from the tests we run.
	 */	
	display = Display.getCurrent();
	if (display != null) display.dispose();
}
}
