/*******************************************************************************
* 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.eclipse.rap.rwt.testfixture.internal.SerializationTestUtil.serializeAndDeserialize;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
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.Mockito.mock;
import java.util.ArrayList;
import org.eclipse.rap.rwt.internal.lifecycle.WidgetLCA;
import org.eclipse.rap.rwt.testfixture.TestContext;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.HelpListener;
import org.eclipse.swt.events.MenuListener;
import org.eclipse.swt.internal.widgets.MenuHolder;
import org.eclipse.swt.internal.widgets.menukit.MenuLCA;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
public class Menu_Test {
@Rule
public TestContext context = new TestContext();
private Display display;
private Shell shell;
private Menu menu;
@Before
public void setUp() {
display = new Display();
shell = new Shell( display );
menu = new Menu( shell, SWT.NONE );
}
@Test
public void testMenuBarConstructor() {
Menu menuBar = new Menu( shell, SWT.BAR );
shell.setMenuBar( menuBar );
assertSame( shell, menuBar.getParent() );
assertSame( display, menuBar.getDisplay() );
// Disallow null in constructor
try {
new Menu( ( Menu )null );
fail( "Menu must not accept null-parent in constructor" );
} catch( IllegalArgumentException e ) {
// expected
}
try {
new Menu( ( Control )null );
fail( "Menu must not accept null-parent in constructor" );
} catch( IllegalArgumentException e ) {
// expected
}
try {
new Menu( ( Shell )null );
fail( "Menu must not accept null-parent in constructor" );
} catch( IllegalArgumentException e ) {
// expected
}
// Test constructor for popup menus
Label label = new Label( shell, SWT.NONE );
Menu labelMenu = new Menu( label );
assertSame( shell, labelMenu.getParent() );
assertSame( display, labelMenu.getDisplay() );
// Test Menu-constructor
Menu subMenu1 = new Menu( menuBar );
assertSame( menuBar.getParent(), subMenu1.getParent() );
assertSame( menuBar.getDisplay(), subMenu1.getDisplay() );
// Test MenuItem-constructor
MenuItem item = new MenuItem( menuBar, SWT.CASCADE );
Menu subMenu2 = new Menu( item );
assertSame( menuBar.getParent(), subMenu2.getParent() );
assertSame( menuBar.getDisplay(), subMenu2.getDisplay() );
}
@Test
public void testStyle() {
Menu menuBar = new Menu( shell, SWT.BAR );
assertEquals( SWT.BAR | SWT.LEFT_TO_RIGHT, menuBar.getStyle() );
Menu menuDropDown = new Menu( shell, SWT.DROP_DOWN );
assertEquals( SWT.DROP_DOWN | SWT.LEFT_TO_RIGHT, menuDropDown.getStyle() );
Menu menuPopup = new Menu( shell, SWT.POP_UP );
assertEquals( SWT.POP_UP | SWT.LEFT_TO_RIGHT, menuPopup.getStyle() );
}
@Test
public void testVisibility() {
Menu menuBar = new Menu( shell, SWT.BAR );
assertFalse( menuBar.getVisible() );
assertFalse( menuBar.isVisible() );
shell.setMenuBar( menuBar );
assertTrue( menuBar.getVisible() );
assertTrue( menuBar.isVisible() );
Menu popupMenu = new Menu( shell, SWT.POP_UP );
assertFalse( popupMenu.getVisible() );
assertFalse( popupMenu.isVisible() );
popupMenu.setVisible( true );
assertTrue( popupMenu.getVisible() );
assertTrue( popupMenu.isVisible() );
Menu dropdownMenu = new Menu( shell, SWT.DROP_DOWN );
assertFalse( dropdownMenu.getVisible() );
assertFalse( dropdownMenu.isVisible() );
}
@Test
public void testItems() {
Menu menu = new Menu( shell, SWT.BAR );
assertEquals( 0, menu.getItemCount() );
MenuItem item = new MenuItem( menu, SWT.CASCADE );
assertEquals( 1, menu.getItemCount() );
assertSame( item, menu.getItem( 0 ) );
item.dispose();
assertEquals( 0, menu.getItemCount() );
item = new MenuItem( menu, SWT.CASCADE );
assertEquals( 1, menu.getItemCount() );
assertSame( item, menu.getItems()[ 0 ] );
assertSame( item, menu.getItem( 0 ) );
assertEquals( 0, menu.indexOf( item ) );
new MenuItem( menu, SWT.CASCADE );
assertEquals( 2, menu.getItemCount() );
item.dispose();
try {
menu.indexOf( item );
fail( "Obtaining indexOf disposed menuItem is illegal" );
} catch( IllegalArgumentException e ) {
// expected
}
try {
menu.indexOf( null );
fail( "indexOf( null ) not allowed" );
} catch( RuntimeException e ) {
// expected
}
}
@Test
public void testDispose_disposesItems() {
MenuItem menuItem = new MenuItem( menu, SWT.CASCADE );
Menu subMenu = new Menu( menuItem );
menuItem.setMenu( subMenu );
menu.dispose();
assertTrue( menuItem.isDisposed() );
assertTrue( subMenu.isDisposed() );
}
@Test
public void testDispose_removesFromParent() {
Menu menuBar = new Menu( shell, SWT.BAR );
shell.setMenuBar( menuBar );
MenuItem fileMenuItem = new MenuItem( menuBar, SWT.CASCADE );
Menu fileMenu = new Menu( fileMenuItem );
fileMenuItem.setMenu( fileMenu );
fileMenu.dispose();
assertArrayEquals( new Menu[] { menu, menuBar }, shell.getAdapter( MenuHolder.class ).getMenus() );
}
@Test
public void testUntypedShowEvent() {
final java.util.List<Event> log = new ArrayList<Event>();
Listener listener = new Listener() {
@Override
public void handleEvent( Event event ) {
log.add( event );
}
};
// popup menus fire show events
Menu popupMenu = new Menu( shell, SWT.POP_UP );
popupMenu.addListener( SWT.Show, listener );
popupMenu.setVisible( true );
assertEquals( 1, log.size() );
assertSame( popupMenu, log.get( 0 ).widget );
assertEquals( SWT.Show, log.get( 0 ).type );
// BAR menus must not fire show events
log.clear();
Menu barMenu = new Menu( shell, SWT.BAR );
barMenu.addListener( SWT.Show, listener );
barMenu.setVisible( true );
assertEquals( 0, log.size() );
// DROP_DOWN menus must not fire show events
log.clear();
Menu dropDownMenu = new Menu( shell, SWT.DROP_DOWN );
dropDownMenu.addListener( SWT.Show, listener );
dropDownMenu.setVisible( true );
assertEquals( 0, log.size() );
}
@Test
public void testGetOrientation_default() {
Menu menu = new Menu( shell, SWT.POP_UP );
assertEquals( SWT.LEFT_TO_RIGHT, menu.getOrientation() );
}
@Test
public void testGetOrientation_RTL() {
Menu menu = new Menu( shell, SWT.POP_UP | SWT.RIGHT_TO_LEFT );
assertEquals( SWT.RIGHT_TO_LEFT, menu.getOrientation() );
}
@Test
public void testGetOrientation_onPopupMenu() {
Menu menu = new Menu( shell, SWT.POP_UP );
menu.setOrientation( SWT.RIGHT_TO_LEFT );
assertEquals( SWT.RIGHT_TO_LEFT, menu.getOrientation() );
}
@Test
public void testGetOrientation_onDropDownMenu() {
Menu menu = new Menu( shell, SWT.DROP_DOWN );
menu.setOrientation( SWT.RIGHT_TO_LEFT );
assertEquals( SWT.LEFT_TO_RIGHT, menu.getOrientation() );
}
@Test
public void testDefaultItem() {
Menu menu = new Menu( shell, SWT.POP_UP );
MenuItem item = new MenuItem( menu, SWT.PUSH );
menu.setDefaultItem( item );
assertNull( menu.getDefaultItem() );
}
@Test
public void testIsSerializable() throws Exception {
Menu menu = new Menu( shell, SWT.POP_UP );
new MenuItem( menu, SWT.PUSH );
Menu deserializedMenu = serializeAndDeserialize( menu );
assertEquals( 1, deserializedMenu.getItemCount() );
}
@Test
public void testAddHelpListener() {
Menu menu = new Menu( shell, SWT.POP_UP );
menu.addHelpListener( mock( HelpListener.class ) );
assertTrue( menu.isListening( SWT.Help ) );
}
@Test( expected = IllegalArgumentException.class )
public void testAddHelpListener_withNullArgument() {
menu.addHelpListener( null );
}
@Test
public void testRemoveHelpListener() {
HelpListener listener = mock( HelpListener.class );
menu.addHelpListener( listener );
menu.removeHelpListener( listener );
assertFalse( menu.isListening( SWT.Help ) );
}
@Test( expected = IllegalArgumentException.class )
public void testRemoveHelpListener_withNullArgument() {
menu.removeHelpListener( null );
}
@Test
public void testAddMenuListener() {
menu.addMenuListener( mock( MenuListener.class ) );
assertTrue( menu.isListening( SWT.Show ) );
assertTrue( menu.isListening( SWT.Hide ) );
}
@Test( expected = IllegalArgumentException.class )
public void testAddMenuListener_withNullArgument() {
menu.addMenuListener( null );
}
@Test
public void testRemoveMenuListener() {
MenuListener listener = mock( MenuListener.class );
menu.addMenuListener( listener );
menu.removeMenuListener( listener );
assertFalse( menu.isListening( SWT.Show ) );
assertFalse( menu.isListening( SWT.Hide ) );
}
@Test( expected = IllegalArgumentException.class )
public void testRemoveMenuListener_withNullArgument() {
menu.removeMenuListener( null );
}
@Test
public void testGetAdapter_LCA() {
assertTrue( menu.getAdapter( WidgetLCA.class ) instanceof MenuLCA );
assertSame( menu.getAdapter( WidgetLCA.class ), menu.getAdapter( WidgetLCA.class ) );
}
}