/******************************************************************************* * Copyright (c) 2013 EclipseSource 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: * EclipseSource - initial API and implementation ******************************************************************************/ package com.eclipsesource.tabris.internal.ui.web; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.eclipse.rap.rwt.internal.serverpush.ServerPushManager; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.RowData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import com.eclipsesource.tabris.internal.ui.ActionDescriptor; import com.eclipsesource.tabris.internal.ui.ImageUtil; import com.eclipsesource.tabris.internal.ui.PropertyChangeHandler; import com.eclipsesource.tabris.internal.ui.PropertyChangeNotifier; import com.eclipsesource.tabris.internal.ui.RemoteActionTest; import com.eclipsesource.tabris.internal.ui.TestSearchAction; import com.eclipsesource.tabris.test.util.TabrisEnvironment; import com.eclipsesource.tabris.ui.Action; import com.eclipsesource.tabris.ui.UI; import com.eclipsesource.tabris.ui.UIConfiguration; import com.eclipsesource.tabris.ui.action.ProposalHandler; import com.eclipsesource.tabris.ui.action.SearchAction; import com.eclipsesource.tabris.ui.action.SearchActionListener; @SuppressWarnings("restriction") public class WebSearchActionTest { @Rule public TabrisEnvironment environment = new TabrisEnvironment(); private UI ui; private WebUI uiRenderer; private ActionDescriptor actionDescriptor; private WebSearchAction webSearchAction; private SearchAction searchAction; private Display display; private Button control; private Text text; private Menu proposalsMenu; @Before public void setUp() { display = new Display(); Shell shell = new Shell( display ); shell.open(); ui = mock( UI.class ); mockUI( mock( SearchActionListener.class ) ); uiRenderer = mock( WebUI.class ); searchAction = spy( new TestSearchAction() ); actionDescriptor = mockDescriptor( searchAction ); webSearchAction = new WebSearchAction( ui, uiRenderer, actionDescriptor ); webSearchAction.createUi( shell ); control = webSearchAction.getControl(); text = webSearchAction.getText(); proposalsMenu = webSearchAction.getProposalsMenu(); } @Test public void testSetsItselfAsChangeHandler() { webSearchAction = new WebSearchAction( ui, uiRenderer, actionDescriptor ); PropertyChangeHandler handler = searchAction.getAdapter( PropertyChangeNotifier.class ).getPropertyChangeHandler(); assertSame( handler, webSearchAction ); } @Test public void testGetUI() { assertSame( ui, webSearchAction.getUI() ); } @Test public void testGetDescriptor() { assertSame( actionDescriptor, webSearchAction.getDescriptor() ); } @Test public void testInitControl() { assertFalse( control.isEnabled() ); assertFalse( control.isVisible() ); assertNotNull( control.getImage() ); assertEquals( "bar", control.getToolTipText() ); assertTrue( control.isListening( SWT.Selection ) ); } @Test public void testInitText() { assertFalse( text.getVisible() ); assertTrue( ( ( RowData )text.getLayoutData() ).exclude ); assertTrue( text.isListening( SWT.DefaultSelection ) ); assertTrue( text.isListening( SWT.FocusIn ) ); assertTrue( text.isListening( SWT.FocusOut ) ); assertFalse( text.isListening( SWT.Modify ) ); } @Test public void testInitProposalsMenu() { assertFalse( proposalsMenu.isVisible() ); assertEquals( 0, proposalsMenu.getItemCount() ); } @Test public void testDestroy() { webSearchAction.destroy(); assertTrue( control.isDisposed() ); assertTrue( text.isDisposed() ); assertTrue( proposalsMenu.isDisposed() ); } @Test public void testSetsVisible() { webSearchAction.setVisible( true ); assertTrue( control.getVisible() ); } @Test public void testSetEnabled() { webSearchAction.setEnabled( true ); assertTrue( control.isEnabled() ); } @Test public void testOpen_executesActions() { webSearchAction.open(); verify( searchAction ).execute( ui ); } @Test public void testOpen_activatesText() { webSearchAction.open(); assertTrue( text.getVisible() ); assertTrue( text.isListening( SWT.Modify ) ); assertFalse( ( ( RowData )text.getLayoutData() ).exclude ); assertSame( text, display.getFocusControl() ); } @Test public void testOpen_deactivatesControl() { webSearchAction.open(); assertFalse( control.getVisible() ); assertTrue( ( ( RowData )control.getLayoutData() ).exclude ); } @Test public void testOpen_doesLayout() { webSearchAction.open(); verify( uiRenderer ).layout(); } @Test public void testSetQuery() { webSearchAction.setQuery( "foo" ); assertEquals( "foo", text.getText() ); } @Test public void testSetMessage() { webSearchAction.setMessage( "foo" ); assertEquals( "foo", text.getMessage() ); } @Test public void testControlSelectionEvent_activatesText() { control.notifyListeners( SWT.Selection, new Event() ); assertTrue( text.getVisible() ); assertTrue( text.isListening( SWT.Modify ) ); assertFalse( ( ( RowData )text.getLayoutData() ).exclude ); assertSame( text, display.getFocusControl() ); } @Test public void testControlSelectionEvent_callsActionExecute() { control.notifyListeners( SWT.Selection, new Event() ); verify( searchAction ).execute( ui ); } @Test public void testDoSearch_deactivatesText() { webSearchAction.open(); text.notifyListeners( SWT.DefaultSelection, new Event() ); assertFalse( text.getVisible() ); assertFalse( text.isListening( SWT.Modify ) ); assertTrue( ( ( RowData )text.getLayoutData() ).exclude ); } @Test public void testDoSearch_callsActionSearch() { webSearchAction.open(); text.setText( "foo" ); text.notifyListeners( SWT.DefaultSelection, new Event() ); verify( searchAction ).search( "foo" ); } @Test public void testDoSearchNotifiesListener() { SearchActionListener listener = mock( SearchActionListener.class ); mockUI( listener ); webSearchAction.open(); text.setText( "foo" ); text.notifyListeners( SWT.DefaultSelection, new Event() ); verify( listener ).searched( ui, searchAction, "foo" ); } @Test public void testDoSearch_clearsText() { webSearchAction.open(); text.setText( "foo" ); text.notifyListeners( SWT.DefaultSelection, new Event() ); assertEquals( "", text.getText() ); } @Test public void testDoSearch_clearsMenuItems() { webSearchAction.open(); new MenuItem( proposalsMenu, SWT.PUSH ); text.notifyListeners( SWT.DefaultSelection, new Event() ); assertEquals( 0, proposalsMenu.getItemCount() ); } @Test public void testFocusIn_activatesServerPush() { text.notifyListeners( SWT.FocusIn, new Event() ); assertTrue( ServerPushManager.getInstance().isServerPushActive() ); } @Test public void testFocusOut_deactivatesServerPush() { text.notifyListeners( SWT.FocusOut, new Event() ); assertFalse( ServerPushManager.getInstance().isServerPushActive() ); } @Test public void testFocusOut_deactivatesText() { text.notifyListeners( SWT.FocusOut, new Event() ); assertFalse( text.getVisible() ); assertFalse( text.isListening( SWT.Modify ) ); assertTrue( ( ( RowData )text.getLayoutData() ).exclude ); } @Test public void testModify_callsActionModify() { webSearchAction.open(); text.setText( "foo" ); verify( searchAction ).modified( eq( "foo" ), any( ProposalHandler.class ) ); } @Test public void testModifyNotifiesListenerModify() { SearchActionListener listener = mock( SearchActionListener.class ); mockUI( listener ); webSearchAction.open(); text.setText( "foo" ); verify( listener ).modified( ui, searchAction, "foo" ); } @Test public void testShowProposals_updatesMenuItems() { List<String> proposals = new ArrayList<String>(); proposals.add( "foo" ); proposals.add( "bar" ); webSearchAction.showProposals( proposals ); assertEquals( 2, proposalsMenu.getItemCount() ); assertEquals( "foo", proposalsMenu.getItem( 0 ).getText() ); assertEquals( "bar", proposalsMenu.getItem( 1 ).getText() ); } @Test public void testShowProposals_showsMenu_withProposals() { List<String> proposals = new ArrayList<String>(); proposals.add( "foo" ); proposals.add( "bar" ); webSearchAction.showProposals( proposals ); assertTrue( proposalsMenu.getVisible() ); } @Test public void testShowProposals_doesNotShowMenu_withoutProposals() { List<String> proposals = new ArrayList<String>(); webSearchAction.showProposals( proposals ); assertFalse( proposalsMenu.getVisible() ); } private ActionDescriptor mockDescriptor( Action action ) { ActionDescriptor descriptor = mock( ActionDescriptor.class ); when( descriptor.getAction() ).thenReturn( action ); InputStream image = RemoteActionTest.class.getResourceAsStream( "testImage.png" ); when( descriptor.getImage() ).thenReturn( ImageUtil.getBytes( image ) ); when( descriptor.getTitle() ).thenReturn( "bar" ); doReturn( Boolean.FALSE ).when( descriptor ).isEnabled(); doReturn( Boolean.FALSE ).when( descriptor ).isVisible(); return descriptor; } private void mockUI( SearchActionListener listener ) { UIConfiguration configuration = new UIConfiguration(); configuration.addActionListener( listener ); when( ui.getConfiguration() ).thenReturn( configuration ); } }