/******************************************************************************* * Copyright (c) 2002, 2015 Innoopract Informationssysteme GmbH 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: * Innoopract Informationssysteme GmbH - initial API and implementation * EclipseSource - ongoing development ******************************************************************************/ package org.eclipse.swt.widgets; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import java.io.IOException; import org.eclipse.rap.rwt.internal.lifecycle.WidgetLCA; import org.eclipse.rap.rwt.testfixture.TestContext; import org.eclipse.rap.rwt.testfixture.internal.Fixture; import org.eclipse.rap.rwt.testfixture.internal.TestUtil; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ArmListener; import org.eclipse.swt.events.HelpListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.internal.widgets.menuitemkit.MenuItemLCA; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.ArgumentCaptor; public class MenuItem_Test { @Rule public TestContext context = new TestContext(); private Display display; private Shell shell; private Menu menuBar; private Menu menu; private MenuItem menuItem; @Before public void setUp() { display = new Display(); shell = new Shell( display ); menuBar = new Menu( shell, SWT.BAR ); shell.setMenuBar( menuBar ); menu = new Menu( shell, SWT.POP_UP ); menuItem = new MenuItem( menu, SWT.PUSH ); } @Test public void testConstructor() { MenuItem item = new MenuItem( menu, SWT.CASCADE ); assertEquals( "", item.getText() ); assertSame( display, item.getDisplay() ); assertSame( menu, item.getParent() ); try { new MenuItem( null, SWT.CASCADE ); fail( "Must not allow null-parent" ); } catch( IllegalArgumentException iae ) { // expected } } @Test public void testSetMenu() { MenuItem fileMenuItem = new MenuItem( menuBar, SWT.CASCADE ); Menu fileMenu = new Menu( menuBar ); // Test 'normal' usage of setMenu fileMenuItem.setMenu( fileMenu ); assertSame( fileMenu, fileMenuItem.getMenu() ); // Dispose the above set menu // -> the item must track this and getMenu must return null fileMenu.dispose(); assertNull( fileMenuItem.getMenu() ); // Ensure no disposed of menu can be set try { fileMenuItem.setMenu( fileMenu ); fail( "setMenu must to allow to set disposed of menu" ); } catch( IllegalArgumentException e ) { // expected } // Ensure that no menu that belongs to a different shell can be set Shell anotherShell = new Shell( display , SWT.NONE ); Menu anotherMenu = new Menu( anotherShell ); try { fileMenuItem.setMenu( anotherMenu ); fail( "setMenu must not accept menu from different shell." ); } catch( IllegalArgumentException e ) { // expected } // setMenu may only be called on MenuItems with style SWT.CASCADE try { MenuItem nonCascadingMenuItem = new MenuItem( fileMenu, SWT.PUSH ); nonCascadingMenuItem.setMenu( new Menu( shell, SWT.DROP_DOWN ) ); fail( "setMenu can only be called on MenuItems with style SWT.CASCADE" ); } catch( IllegalArgumentException e ) { // expected } // setMenu accepts only menu with style SWT.DROP_DOWN try { MenuItem cascadingMenuItem = new MenuItem( fileMenu, SWT.CASCADE ); cascadingMenuItem.setMenu( new Menu( shell, SWT.POP_UP ) ); fail( "setMenu allows only menus with style SWT.DROP_DOWN" ); } catch( IllegalArgumentException e ) { // expected } } @Test public void testSelection() { MenuItem menuBarItem = new MenuItem( menuBar, SWT.CASCADE ); Menu menu = new Menu( menuBarItem ); menuBarItem.setMenu( menu ); MenuItem pushItem = new MenuItem( menu, SWT.PUSH ); MenuItem radioItem1 = new MenuItem( menu, SWT.RADIO ); MenuItem radioItem2 = new MenuItem( menu, SWT.RADIO ); MenuItem checkItem = new MenuItem( menu, SWT.CHECK ); // Initial state assertFalse( pushItem.getSelection() ); assertFalse( checkItem.getSelection() ); assertFalse( radioItem1.getSelection() ); assertFalse( radioItem2.getSelection() ); // MenuItems with style PUSH must ignore selection changes pushItem.setSelection( true ); assertFalse( pushItem.getSelection() ); // MenuItems with style CHECK or RADIO must allow selection changes checkItem.setSelection( true ); assertTrue( checkItem.getSelection() ); radioItem1.setSelection( true ); assertTrue( radioItem1.getSelection() ); // When selecting MenuItem with style RADIO programatically, there is no // automatic deselection of sibling radio items radioItem1.setSelection( true ); radioItem2.setSelection( true ); assertTrue( radioItem1.getSelection() ); assertTrue( radioItem2.getSelection() ); } @Test public void testImage() throws IOException { MenuItem menuBarItem = new MenuItem( menuBar, SWT.CASCADE ); Menu menu = new Menu( menuBarItem ); menuBarItem.setMenu( menu ); MenuItem separator = new MenuItem( menu, SWT.SEPARATOR ); // Don't allow an image to be set on a separator menu item Image image = TestUtil.createImage( display, Fixture.IMAGE1 ); assertNotNull( image ); separator.setImage( image ); assertEquals( null, separator.getImage() ); } @Test public void testDispose() { Menu menu = new Menu( shell, SWT.BAR ); MenuItem fileMenuItem = new MenuItem( menu, SWT.CASCADE ); Menu fileMenu = new Menu( fileMenuItem ); fileMenuItem.setMenu( fileMenu ); MenuItem exitMenuItem = new MenuItem( fileMenu, SWT.PUSH ); fileMenuItem.dispose(); assertTrue( fileMenuItem.isDisposed() ); assertTrue( fileMenu.isDisposed() ); assertTrue( exitMenuItem.isDisposed() ); } @Test public void testDisplay() { Menu menu = new Menu( shell, SWT.BAR ); MenuItem item = new MenuItem( menu, SWT.CASCADE ); assertSame( display, item.getDisplay() ); assertSame( menu.getDisplay(), item.getDisplay() ); } @Test public void testDefaultId() { Menu menu = new Menu( shell, SWT.BAR ); MenuItem item = new MenuItem( menu, SWT.CASCADE ); assertEquals( 0, item.getID() ); } @Test public void testId() { MenuItem item = new MenuItem( menuBar, SWT.CASCADE ); item.setID( 123 ); assertEquals( 123, item.getID() ); } @Test(expected = IllegalArgumentException.class) public void testId_InvalidValue() { MenuItem item = new MenuItem( menuBar, SWT.CASCADE ); item.setID( -100 ); } @Test public void testAddArmListener() { MenuItem item = new MenuItem( menuBar, SWT.CASCADE ); item.addArmListener( mock( ArmListener.class ) ); assertTrue( item.isListening( SWT.Arm ) ); } @Test public void testRemoveArmListener() { MenuItem item = new MenuItem( menuBar, SWT.CASCADE ); ArmListener listener = mock( ArmListener.class ); item.addArmListener( listener ); item.removeArmListener( listener ); assertFalse( item.isListening( SWT.Arm ) ); } @Test(expected = IllegalArgumentException.class) public void testAddArmListenerWithNullArgument() { menuItem.addArmListener( null ); } @Test(expected = IllegalArgumentException.class) public void testRemoveArmListenerWithNullArgument() { menuItem.removeArmListener( null ); } @Test public void testAddHelpListener() { menuItem.addHelpListener( mock( HelpListener.class ) ); assertTrue( menuItem.isListening( SWT.Help ) ); } @Test public void testRemoveHelpListener() { HelpListener listener = mock( HelpListener.class ); menuItem.addHelpListener( listener ); menuItem.removeHelpListener( listener ); assertFalse( menuItem.isListening( SWT.Help ) ); } @Test(expected = IllegalArgumentException.class) public void testAddHelpListenerWithNullArgument() { menuItem.addHelpListener( null ); } @Test(expected = IllegalArgumentException.class) public void testRemoveHelpListenerWithNullArgument() { menuItem.removeHelpListener( null ); } @Test public void testAddSelectionListener() { menuItem.addSelectionListener( mock( SelectionListener.class ) ); assertTrue( menuItem.isListening( SWT.Selection ) ); assertTrue( menuItem.isListening( SWT.DefaultSelection ) ); } @Test public void testRemoveSelectionListener() { SelectionListener listener = mock( SelectionListener.class ); menuItem.addSelectionListener( listener ); menuItem.removeSelectionListener( listener ); assertFalse( menuItem.isListening( SWT.Selection ) ); assertFalse( menuItem.isListening( SWT.DefaultSelection ) ); } @Test(expected = IllegalArgumentException.class) public void testAddSelectionListenerWithNullArgument() { menuItem.addSelectionListener( null ); } @Test(expected = IllegalArgumentException.class) public void testRemoveSelectionListenerWithNullArgument() { menuItem.removeSelectionListener( null ); } @Test public void testGetAccelerator_Initial() { assertEquals( 0, menuItem.getAccelerator() ); } @Test public void testSetAccelerator() { menuItem.setAccelerator( SWT.ALT | 'A' ); assertEquals( SWT.ALT | 'A', menuItem.getAccelerator() ); } @Test public void testSetAccelerator_OnSeparator() { menuItem = new MenuItem( menu, SWT.SEPARATOR ); menuItem.setAccelerator( SWT.ALT | 'A' ); assertEquals( SWT.ALT | 'A', menuItem.getAccelerator() ); } @Test public void testSelectionEvent_TriggeredByAccelerator() { SelectionListener listener = mock( SelectionListener.class ); menuItem.addSelectionListener( listener ); menuItem.setAccelerator( SWT.ALT | 'A' ); menuItem.handleAcceleratorActivation(); ArgumentCaptor<SelectionEvent> captor = ArgumentCaptor.forClass( SelectionEvent.class ); verify( listener ).widgetSelected( captor.capture() ); SelectionEvent event = captor.getValue(); assertSame( menuItem, event.widget ); } @Test public void testToggleSelection_TriggeredByAccelerator_OnCheck() { menuItem = new MenuItem( menu, SWT.CHECK ); menuItem.setAccelerator( SWT.ALT | 'A' ); shell.open(); menuItem.handleAcceleratorActivation(); assertTrue( menuItem.getSelection() ); menuItem.handleAcceleratorActivation(); assertFalse( menuItem.getSelection() ); } @Test public void testSetSelection_TriggeredByAccelerator_OnRadio() { menuItem = new MenuItem( menu, SWT.RADIO ); menuItem.setAccelerator( SWT.ALT | 'A' ); shell.open(); menuItem.handleAcceleratorActivation(); assertTrue( menuItem.getSelection() ); menuItem.handleAcceleratorActivation(); assertTrue( menuItem.getSelection() ); } @Test public void testDeselectOtherRadios_TriggeredByAccelerator() { menuItem = new MenuItem( menu, SWT.RADIO ); menuItem.setAccelerator( SWT.ALT | 'A' ); MenuItem menuItem1 = new MenuItem( menu, SWT.RADIO ); menuItem1.setSelection( true ); MenuItem menuItem2 = new MenuItem( menu, SWT.CHECK ); menuItem2.setSelection( true ); menuItem.handleAcceleratorActivation(); assertFalse( menuItem1.getSelection() ); assertTrue( menuItem2.getSelection() ); } @Test public void testDeselectionEvent_TriggeredByAccelerator() { menuItem = new MenuItem( menu, SWT.RADIO ); menuItem.setAccelerator( SWT.ALT | 'A' ); MenuItem menuItem1 = new MenuItem( menu, SWT.RADIO ); menuItem1.setSelection( true ); SelectionListener listener = mock( SelectionListener.class ); menuItem1.addSelectionListener( listener ); menuItem.handleAcceleratorActivation(); verify( listener ).widgetSelected( any( SelectionEvent.class ) ); } @Test public void testGetAdapter_LCA() { assertTrue( menuItem.getAdapter( WidgetLCA.class ) instanceof MenuItemLCA ); assertSame( menuItem.getAdapter( WidgetLCA.class ), menuItem.getAdapter( WidgetLCA.class ) ); } }