/*******************************************************************************
 * Copyright (c) 2005 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.ui.tests.browser.internal;

import junit.framework.Test;
import junit.framework.TestCase;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.browser.BrowserViewer;

public class ToolbarBrowserTestCase extends TestCase {
	protected static Dialog dialog;
	protected static Shell shell;
	protected static BrowserViewer browser;
	
	class TestToolbarBrowser extends BrowserViewer {

		public TestToolbarBrowser(Composite parent, int style) {
			super(parent, style);
		}
		
		public void testProtectedMethods() {
			super.addToHistory("www.eclispe.org");
			super.updateBackNextBusy();
			super.updateHistory();
			super.updateLocation();
		}
	}
	
	public static Test suite() {
		return new OrderedTestSuite(ToolbarBrowserTestCase.class, "ToolbarBrowserTestCase");
	}

	public void test00Open() throws Exception {
		shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
		dialog = new Dialog(shell) {
			protected Control createDialogArea(Composite parent) {
				Composite composite = (Composite) super.createDialogArea(parent);
				
				browser = new BrowserViewer(composite, BrowserViewer.LOCATION_BAR | BrowserViewer.BUTTON_BAR);
				GridData data = new GridData(GridData.FILL_BOTH);
				data.widthHint = 400;
				data.heightHint = 400;
				browser.setLayoutData(data);
				
				return composite;
			}
		};
		dialog.setBlockOnOpen(false);
		dialog.open();
		
		boolean b = Display.getCurrent().readAndDispatch();
		while (b)
			b = Display.getCurrent().readAndDispatch();
	}
	
	public void test01SetURL() throws Exception {
		runLoopTimer(5);
		browser.setURL("http://www.eclipse.org");
		runLoopTimer(10);
	}

	public void test02Home() throws Exception {
		browser.home();
		runLoopTimer(2);
	}

	public void test03SetURL() throws Exception {
		browser.setURL("http://www.eclipse.org/webtools/index.html");
		runLoopTimer(10);
	}

	public void test04IsBackEnabled() throws Exception {
		assertTrue(browser.isBackEnabled());
	}

	public void test05Back() throws Exception {
		assertTrue(browser.back());
		runLoopTimer(5);
	}
	
	public void test06IsForwardEnabled() throws Exception {
		assertTrue(browser.isForwardEnabled());
	}

	public void test07Forward() throws Exception {
		assertTrue(browser.forward());
		runLoopTimer(5);
	}
	
	public void test08Refresh() throws Exception {
		browser.refresh();
	}
	
	public void test09GetBrowser() throws Exception {
		assertNotNull(browser.getBrowser());
	}
	
	public void test10Stop() throws Exception {
		browser.stop();
	}

	public void test11GetURL() throws Exception {
		assertNotNull(browser.getURL());
	}

	public void test12SetFocus() throws Exception {
		browser.setFocus();
	}

	public void test13Close() throws Exception {
		dialog.close();
	}
	
	TestToolbarBrowser ttb = null;
	
	public void test14ProtectedMethods() {
		shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
		dialog = new Dialog(shell) {
			protected Control createDialogArea(Composite parent) {
				Composite composite = (Composite) super.createDialogArea(parent);
				
				ttb = new TestToolbarBrowser(composite, BrowserViewer.LOCATION_BAR | BrowserViewer.BUTTON_BAR);
				GridData data = new GridData(GridData.FILL_BOTH);
				data.widthHint = 400;
				data.heightHint = 400;
				ttb.setLayoutData(data);
				
				return composite;
			}
		};
		dialog.setBlockOnOpen(false);
		dialog.open();
		
		ttb.testProtectedMethods();
		dialog.close();
	}
	
	public void test15Listeners() {
		BrowserViewer.IBackNextListener listener = new BrowserViewer.IBackNextListener() {
			public void updateBackNextBusy() {
				// ignore
			}
		};
		
		listener.updateBackNextBusy();
	}
	
	public void test16Listeners() {
		BrowserViewer.ILocationListener listener = new BrowserViewer.ILocationListener() {
			public void locationChanged(String url) {
				// ignore
			}

			public void historyChanged(String[] history2) {
				// ignore
			}
		};
		
		listener.locationChanged(null);
		listener.historyChanged(null);
	}

	void runLoopTimer(final int seconds) {
		final boolean[] exit = {false};
		new Thread() {
			public void run() {
				try {
					Thread.sleep(seconds * 1000);
				} catch (Exception e) {
					// ignore
				}
				exit[0] = true;
				// wake up the event loop
				Display display = Display.getDefault();
				if (!display.isDisposed()) {
					display.asyncExec(new Runnable() {
						public void run() {
							if (!shell.isDisposed()) shell.redraw();						
						}
					});
				}
			}
		}.start();
		shell.open();
		Display display = Display.getCurrent();
		while (!exit[0] && !shell.isDisposed()) if (!display.readAndDispatch()) display.sleep();
	}
}