/** * Copyright (c) 2014 - 2017 Frank Appel * 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: * Frank Appel - initial API and implementation */ package com.codeaffine.eclipse.swt.widget.menu; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import java.util.function.Function; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import com.codeaffine.eclipse.swt.test.util.DisplayHelper; import com.codeaffine.eclipse.swt.test.util.MenuHelper; import com.codeaffine.eclipse.swt.test.util.SWTIgnoreConditions.GtkPlatform; import com.codeaffine.test.util.junit.ConditionalIgnoreRule; import com.codeaffine.test.util.junit.ConditionalIgnoreRule.ConditionalIgnore; public class MenuCreatorFactoryTest { private static final String LABEL = "label"; private static final int ITEM_INDEX = 0; @Rule public final DisplayHelper displayHelper = new DisplayHelper(); @Rule public final ConditionalIgnoreRule conditionIgnore = new ConditionalIgnoreRule(); private MenuCreatorFactory factory; private MenuHelper menuHelper; @Before public void setUp() { factory = new MenuCreatorFactory(); menuHelper = new MenuHelper( displayHelper.getDisplay() ); } @Test @ConditionalIgnore( condition = GtkPlatform.class) public void createShowAndSelectItem() { Listener itemListener = mock( Listener.class ); Function<Control, Menu> creator = factory.create( menu -> createPushItem( menu, LABEL, itemListener ) ); Menu actual = menuHelper.simulateItemSelection( displayHelper.createShell(), creator, ITEM_INDEX ); assertThat( actual.getItemCount() ).isEqualTo( 1 ); assertThat( actual.getItem( 0 ).getText() ).isEqualTo( LABEL ); verify( itemListener ).handleEvent( any( Event.class ) ); } @Test @ConditionalIgnore( condition = GtkPlatform.class) public void createShowAndSelectTwice() { Listener itemListener = mock( Listener.class ); Function<Control, Menu> creator = factory.create( menu -> createPushItem( menu, LABEL, itemListener ) ); Shell control = displayHelper.createShell(); Menu menu = menuHelper.simulateItemSelection( control, creator, ITEM_INDEX ); MenuItem itemOfFirstSelection = menu.getItem( 0 ); menuHelper.simulateItemSelection( control, parent -> menu, ITEM_INDEX ); assertThat( menu.getItemCount() ).isEqualTo( 1 ); assertThat( menu.getItem( 0 ).getText() ).isEqualTo( LABEL ); assertThat( menu.getItem( 0 ) ).isNotSameAs( itemOfFirstSelection ); assertThat( itemOfFirstSelection.isDisposed() ).isTrue(); verify( itemListener, times( 2 ) ).handleEvent( any( Event.class ) ); } private static void createPushItem( Menu menu, String label, Listener itemListener ) { new MenuItemFactory().createPushItem( menu, label, itemListener ); } }