| /******************************************************************************* |
| * Copyright (c) 2004 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.ui.rcp.tests; |
| |
| import junit.framework.Assert; |
| import junit.framework.TestCase; |
| |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Shell; |
| |
| import org.eclipse.ui.IWindowListener; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.application.IActionBarConfigurer; |
| import org.eclipse.ui.application.IWorkbenchConfigurer; |
| import org.eclipse.ui.application.IWorkbenchWindowConfigurer; |
| import org.eclipse.ui.application.WorkbenchAdvisor; |
| import org.eclipse.ui.rcp.tests.util.WorkbenchAdvisorObserver; |
| |
| public class WorkbenchAdvisorTest extends TestCase { |
| |
| public WorkbenchAdvisorTest(String name) { |
| super(name); |
| } |
| |
| private Display display = null; |
| |
| protected void setUp() throws Exception { |
| super.setUp(); |
| |
| assertNull(display); |
| display = PlatformUI.createDisplay(); |
| assertNotNull(display); |
| } |
| |
| protected void tearDown() throws Exception { |
| assertNotNull(display); |
| display.dispose(); |
| assertTrue(display.isDisposed()); |
| |
| super.tearDown(); |
| } |
| |
| /** |
| * The workbench should be created before any of the advisor's life cycle |
| * methods are called. #initialize is the first one called, so check that |
| * the workbench has been been created by then. |
| */ |
| public void testEarlyGetWorkbench() { |
| WorkbenchAdvisor wa = new WorkbenchAdvisorObserver(1) { |
| |
| public void initialize(IWorkbenchConfigurer configurer) { |
| super.initialize(configurer); |
| assertNotNull(PlatformUI.getWorkbench()); |
| } |
| }; |
| |
| int code = PlatformUI.createAndRunWorkbench(display, wa); |
| assertEquals(PlatformUI.RETURN_OK, code); |
| } |
| |
| public void testTwoDisplays() { |
| WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1); |
| |
| int code = PlatformUI.createAndRunWorkbench(display, wa); |
| assertEquals(PlatformUI.RETURN_OK, code); |
| assertFalse(display.isDisposed()); |
| display.dispose(); |
| assertTrue(display.isDisposed()); |
| |
| display = PlatformUI.createDisplay(); |
| assertNotNull(display); |
| |
| WorkbenchAdvisorObserver wa2 = new WorkbenchAdvisorObserver(1); |
| |
| int code2 = PlatformUI.createAndRunWorkbench(display, wa2); |
| assertEquals(PlatformUI.RETURN_OK, code2); |
| } |
| |
| public void testTrivialOpenClose() { |
| WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1) { |
| |
| private boolean windowOpenCalled = false; |
| |
| private boolean windowCloseCalled = false; |
| |
| public void initialize(IWorkbenchConfigurer c) { |
| super.initialize(c); |
| c.getWorkbench().addWindowListener(new IWindowListener() { |
| |
| public void windowActivated(IWorkbenchWindow window) { |
| // do nothing |
| } |
| |
| public void windowDeactivated(IWorkbenchWindow window) { |
| // do nothing |
| } |
| |
| public void windowClosed(IWorkbenchWindow window) { |
| windowCloseCalled = true; |
| } |
| |
| public void windowOpened(IWorkbenchWindow window) { |
| windowOpenCalled = true; |
| } |
| }); |
| } |
| |
| public void preWindowOpen(IWorkbenchWindowConfigurer c) { |
| assertFalse(windowOpenCalled); |
| super.preWindowOpen(c); |
| } |
| |
| public void postWindowOpen(IWorkbenchWindowConfigurer c) { |
| assertTrue(windowOpenCalled); |
| super.postWindowOpen(c); |
| } |
| |
| public boolean preWindowShellClose(IWorkbenchWindowConfigurer c) { |
| assertFalse(windowCloseCalled); |
| return super.preWindowShellClose(c); |
| } |
| |
| public void postWindowClose(IWorkbenchWindowConfigurer c) { |
| if (false) // which should be called first? |
| assertTrue(windowCloseCalled); |
| super.postWindowClose(c); |
| } |
| }; |
| |
| int code = PlatformUI.createAndRunWorkbench(display, wa); |
| assertEquals(PlatformUI.RETURN_OK, code); |
| |
| wa.resetOperationIterator(); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.INITIALIZE); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_STARTUP); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_WINDOW_OPEN); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.FILL_ACTION_BARS); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.POST_WINDOW_OPEN); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.POST_STARTUP); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_SHUTDOWN); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.POST_SHUTDOWN); |
| wa.assertAllOperationsExamined(); |
| } |
| |
| public void testTrivialRestoreClose() { |
| WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1) { |
| |
| public void initialize(IWorkbenchConfigurer c) { |
| super.initialize(c); |
| c.setSaveAndRestore(true); |
| } |
| |
| public void eventLoopIdle(Display d) { |
| workbenchConfig.getWorkbench().restart(); |
| } |
| }; |
| |
| int code = PlatformUI.createAndRunWorkbench(display, wa); |
| assertEquals(PlatformUI.RETURN_RESTART, code); |
| assertFalse(display.isDisposed()); |
| display.dispose(); |
| assertTrue(display.isDisposed()); |
| |
| display = PlatformUI.createDisplay(); |
| WorkbenchAdvisorObserver wa2 = new WorkbenchAdvisorObserver(1) { |
| |
| public void initialize(IWorkbenchConfigurer c) { |
| super.initialize(c); |
| c.setSaveAndRestore(true); |
| } |
| }; |
| |
| int code2 = PlatformUI.createAndRunWorkbench(display, wa2); |
| assertEquals(PlatformUI.RETURN_OK, code2); |
| |
| wa2.resetOperationIterator(); |
| wa2.assertNextOperation(WorkbenchAdvisorObserver.INITIALIZE); |
| wa2.assertNextOperation(WorkbenchAdvisorObserver.PRE_STARTUP); |
| wa2.assertNextOperation(WorkbenchAdvisorObserver.PRE_WINDOW_OPEN); |
| wa2.assertNextOperation(WorkbenchAdvisorObserver.FILL_ACTION_BARS); |
| wa2.assertNextOperation(WorkbenchAdvisorObserver.POST_WINDOW_RESTORE); |
| wa2.assertNextOperation(WorkbenchAdvisorObserver.POST_WINDOW_OPEN); |
| wa2.assertNextOperation(WorkbenchAdvisorObserver.POST_STARTUP); |
| wa2.assertNextOperation(WorkbenchAdvisorObserver.PRE_SHUTDOWN); |
| wa2.assertNextOperation(WorkbenchAdvisorObserver.POST_SHUTDOWN); |
| wa2.assertAllOperationsExamined(); |
| } |
| |
| /** |
| * The WorkbenchAdvisor comment for #postStartup says it is ok to close |
| * things from in there. |
| */ |
| public void testCloseFromPostStartup() { |
| WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1) { |
| |
| public void postStartup() { |
| super.postStartup(); |
| assertTrue(PlatformUI.getWorkbench().close()); |
| } |
| }; |
| |
| int code = PlatformUI.createAndRunWorkbench(display, wa); |
| assertEquals(PlatformUI.RETURN_OK, code); |
| |
| wa.resetOperationIterator(); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.INITIALIZE); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_STARTUP); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_WINDOW_OPEN); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.FILL_ACTION_BARS); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.POST_WINDOW_OPEN); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.POST_STARTUP); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_SHUTDOWN); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.POST_SHUTDOWN); |
| wa.assertAllOperationsExamined(); |
| } |
| |
| public void testEventLoopCrash() { |
| WorkbenchAdvisorExceptionObserver wa = new WorkbenchAdvisorExceptionObserver(); |
| |
| int code = PlatformUI.createAndRunWorkbench(display, wa); |
| assertEquals(PlatformUI.RETURN_OK, code); |
| assertTrue(wa.exceptionCaught); |
| } |
| |
| public void testFillAllActionBar() { |
| WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1) { |
| |
| public void fillActionBars(IWorkbenchWindow window, |
| IActionBarConfigurer configurer, int flags) { |
| super.fillActionBars(window, configurer, flags); |
| |
| assertEquals(FILL_COOL_BAR, flags & FILL_COOL_BAR); |
| assertEquals(FILL_MENU_BAR, flags & FILL_MENU_BAR); |
| assertEquals(FILL_STATUS_LINE, flags & FILL_STATUS_LINE); |
| assertEquals(0, flags & FILL_PROXY); |
| } |
| }; |
| |
| int code = PlatformUI.createAndRunWorkbench(display, wa); |
| assertEquals(PlatformUI.RETURN_OK, code); |
| } |
| |
| public void testShellClose() { |
| WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver() { |
| |
| public void eventLoopIdle(Display disp) { |
| super.eventLoopIdle(disp); |
| |
| Shell[] shells = disp.getShells(); |
| for (int i = 0; i < shells.length; ++i) |
| if (shells[i] != null) shells[i].close(); |
| } |
| }; |
| |
| int code = PlatformUI.createAndRunWorkbench(display, wa); |
| assertEquals(PlatformUI.RETURN_OK, code); |
| |
| wa.resetOperationIterator(); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.INITIALIZE); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_STARTUP); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_WINDOW_OPEN); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.FILL_ACTION_BARS); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.POST_WINDOW_OPEN); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.POST_STARTUP); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_WINDOW_SHELL_CLOSE); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_SHUTDOWN); |
| wa.assertNextOperation(WorkbenchAdvisorObserver.POST_SHUTDOWN); |
| wa.assertAllOperationsExamined(); |
| } |
| } |
| |
| class WorkbenchAdvisorExceptionObserver extends WorkbenchAdvisorObserver { |
| |
| public boolean exceptionCaught = false; |
| |
| private RuntimeException runtimeException; |
| |
| public WorkbenchAdvisorExceptionObserver() { |
| super(2); |
| } |
| |
| // this is used to indicate when the event loop has started |
| public void eventLoopIdle(Display disp) { |
| super.eventLoopIdle(disp); |
| |
| // only crash the loop one time |
| if (runtimeException != null) return; |
| |
| runtimeException = new RuntimeException(); |
| throw runtimeException; |
| } |
| |
| public void eventLoopException(Throwable exception) { |
| // *** Don't let the parent log the exception since it makes for |
| // confusing |
| // test results. |
| |
| exceptionCaught = true; |
| Assert.assertEquals(runtimeException, exception); |
| } |
| } |