/** * 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.action; import static com.codeaffine.eclipse.swt.test.util.SWTEventHelper.trigger; import static com.codeaffine.eclipse.swt.widget.action.EnablementHelper.configureAsDisabled; import static com.codeaffine.eclipse.swt.widget.action.EnablementHelper.configureAsEnabled; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import java.util.function.BooleanSupplier; import java.util.function.Consumer; import java.util.function.Function; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Menu; 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.SWTIgnoreConditions.GtkPlatform; import com.codeaffine.eclipse.swt.util.ButtonClick; import com.codeaffine.test.util.junit.ConditionalIgnoreRule; import com.codeaffine.test.util.junit.ConditionalIgnoreRule.ConditionalIgnore; public class MenuSelectorTest { @Rule public final DisplayHelper displayHelper = new DisplayHelper(); @Rule public final ConditionalIgnoreRule conditionalIgnore = new ConditionalIgnoreRule(); private Function<Control, Menu> menuCreator; private Consumer<Updatable> updateWiring; private BooleanSupplier enablement; private MenuSelector selector; private Updatable updatable; private Image image; @Before public void setUp() { menuCreator = control -> new Menu( control ); enablement = configureAsEnabled( mock( BooleanSupplier.class ) ); updateWiring = updatable -> this.updatable = updatable; image = displayHelper.createImage( 1, 1 ); selector = new MenuSelector( menuCreator, image, enablement, updateWiring ); } @Test public void create() { Label control = ( Label )selector.create( displayHelper.createShell() ); assertThat( control ).isNotNull(); assertThat( control.getImage() ).isSameAs( image ); } @Test public void createIfDisabled() { configureAsDisabled( enablement ); Label control = ( Label )selector.create( displayHelper.createShell() ); assertThat( control ).isNotNull(); assertThat( control.getImage() ).isNotSameAs( image ); } @Test public void dispose() { configureAsDisabled( enablement ); Control control = selector.create( displayHelper.createShell() ); Image disabledImage = ( ( Label )control ).getImage(); Menu menu = control.getMenu(); control.dispose(); assertThat( menu.isDisposed() ).isTrue(); assertThat( disabledImage.isDisposed() ); } @Test public void mouseEnter() { Control control = selector.create( displayHelper.createShell() ); trigger( SWT.MouseEnter ).on( control ); assertThat( control.getBackground().getRGB() ) .isEqualTo( displayHelper.getSystemColor( SWT.COLOR_LIST_SELECTION ).getRGB() ); } @Test @ConditionalIgnore( condition = GtkPlatform.class ) public void mouseEnterIfDisabled() { configureAsDisabled( enablement ); Control control = selector.create( displayHelper.createShell() ); trigger( SWT.MouseEnter ).on( control ); assertThat( control.getBackground().getRGB() ) .isNotEqualTo( displayHelper.getSystemColor( SWT.COLOR_LIST_SELECTION ).getRGB() ); } @Test public void mouseEnterAndExit() { Control control = selector.create( displayHelper.createShell() ); Color expected = control.getBackground(); trigger( SWT.MouseEnter ).on( control ); trigger( SWT.MouseExit ).on( control ); assertThat( control.getBackground().getRGB() ) .isEqualTo( expected.getRGB() ); } @Test public void mouseEnterAndExitIfDisabledAfterMouseEnter() { Control control = selector.create( displayHelper.createShell() ); Color expected = control.getBackground(); trigger( SWT.MouseEnter ).on( control ); configureAsDisabled( enablement ); trigger( SWT.MouseExit ).on( control ); assertThat( control.getBackground().getRGB() ) .isEqualTo( expected.getRGB() ); } @Test public void mouseClick() { Control control = selector.create( displayHelper.createShell() ); trigger( SWT.MouseDown ).withButton( ButtonClick.LEFT_BUTTON ).on( control ); trigger( SWT.MouseUp ).on( control ); assertThat( control.getMenu().isVisible() ).isTrue(); } @Test public void mouseClickIfDisabled() { configureAsDisabled( enablement ); Control control = selector.create( displayHelper.createShell() ); trigger( SWT.MouseDown ).withButton( ButtonClick.LEFT_BUTTON ).on( control ); trigger( SWT.MouseUp ).on( control ); assertThat( control.getMenu().isVisible() ).isFalse(); } @Test public void disable() { Control control = selector.create( displayHelper.createShell() ); configureAsDisabled( enablement ); updatable.update(); assertThat( ( ( Label )control ).getImage() ).isNotSameAs( image ); } @Test public void disableTwice() { Control control = selector.create( displayHelper.createShell() ); configureAsDisabled( enablement ); updatable.update(); Image disableImage = ( ( Label )control ).getImage(); updatable.update(); assertThat( disableImage ).isSameAs( ( ( Label )control ).getImage() ); } @Test public void enable() { configureAsDisabled( enablement ); Control control = selector.create( displayHelper.createShell() ); configureAsEnabled( enablement ); updatable.update(); assertThat( ( ( Label )control ).getImage() ).isSameAs( image ); } }