/*******************************************************************************
* Copyright (c) 2010, 2014 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 org.eclipse.swt.events;
import static org.eclipse.rap.rwt.internal.protocol.RemoteObjectFactory.getRemoteObject;
import static org.eclipse.rap.rwt.internal.lifecycle.WidgetUtil.getId;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.rap.json.JsonObject;
import org.eclipse.rap.rwt.internal.protocol.ClientMessageConst;
import org.eclipse.rap.rwt.testfixture.internal.Fixture;
import org.eclipse.swt.SWT;
import org.eclipse.swt.internal.widgets.treekit.TreeOperationHandler;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
public class KeyEvent_Test {
private Display display;
private Shell shell;
private List<Object> events;
@Before
public void setUp() {
Fixture.setUp();
display = new Display();
shell = new Shell( display );
events = new LinkedList<Object>();
Fixture.fakeNewRequest();
}
@After
public void tearDown() {
Fixture.tearDown();
}
@Test
public void testUntypedEventConstructor() {
Event event = new Event();
event.display = display;
event.widget = mock( Widget.class );
event.time = 4325;
event.stateMask = 23;
event.keyCode = 42;
event.character = 'f';
event.doit = true;
event.data = new Object();
KeyEvent keyEvent = new KeyEvent( event );
EventTestHelper.assertFieldsEqual( keyEvent, event );
}
@Test
public void testKeySelectionEventsOrder() {
KeyListener keyListener = mock( KeyListener.class );
SelectionListener selectionListener = mock( SelectionListener.class );
Tree tree = createTreeWithKeyListener();
tree.addKeyListener( keyListener );
tree.addSelectionListener( selectionListener );
Fixture.fakeNewRequest();
fakeKeyDownRequest( tree, 65, 65 );
fakeSelectionRequest( tree, tree.getItem( 1 ) );
Fixture.readDataAndProcessAction( display );
InOrder inOrder = inOrder( keyListener, selectionListener );
inOrder.verify( keyListener ).keyPressed( any( KeyEvent.class ) );
inOrder.verify( selectionListener ).widgetSelected( any( SelectionEvent.class ) );
inOrder.verify( keyListener ).keyReleased( any( KeyEvent.class ) );
}
@Test
public void testKeyTreeEventsOrder() {
KeyListener keyListener = mock( KeyListener.class );
TreeListener treeListener = mock( TreeListener.class );
Tree tree = createTreeWithKeyListener();
Fixture.fakeNewRequest();
fakeKeyDownRequest( tree, 65, 65 );
fakeTreeRequest( tree.getItem( 1 ) );
tree.addKeyListener( keyListener );
tree.addTreeListener( treeListener );
Fixture.readDataAndProcessAction( display );
InOrder inOrder = inOrder( keyListener, treeListener );
inOrder.verify( keyListener ).keyPressed( any( KeyEvent.class ) );
inOrder.verify( treeListener ).treeExpanded( any( TreeEvent.class ) );
inOrder.verify( keyListener ).keyReleased( any( KeyEvent.class ) );
}
@Test
public void testKeyHelpEventsOrder() {
KeyListener keyListener = mock( KeyListener.class );
HelpListener helpListener = mock( HelpListener.class );
Tree tree = createTreeWithKeyListener();
Fixture.fakeNewRequest();
fakeKeyDownRequest( tree, 65, 65 );
fakeHelpRequest( tree );
tree.addKeyListener( keyListener );
tree.addHelpListener( helpListener );
Fixture.readDataAndProcessAction( display );
InOrder inOrder = inOrder( keyListener, helpListener );
inOrder.verify( keyListener ).keyPressed( any( KeyEvent.class ) );
inOrder.verify( helpListener ).helpRequested( any( HelpEvent.class ) );
inOrder.verify( keyListener ).keyReleased( any( KeyEvent.class ) );
}
private Tree createTreeWithKeyListener() {
Tree tree = new Tree( shell, SWT.NONE );
getRemoteObject( tree ).setHandler( new TreeOperationHandler( tree ) );
tree.setSize( 100, 100 );
for( int i = 0; i < 5; i++ ) {
TreeItem item = new TreeItem( tree, SWT.NONE);
for( int j = 0; j < 5; j++ ) {
new TreeItem( item, SWT.NONE);
}
}
tree.addKeyListener( new LoggingKeyListener( events ) );
return tree;
}
private static void fakeSelectionRequest( Widget widget, Widget item ) {
JsonObject parameters = new JsonObject()
.add( ClientMessageConst.EVENT_PARAM_ITEM, getId( item ) );
Fixture.fakeNotifyOperation( getId( widget ),
ClientMessageConst.EVENT_SELECTION,
parameters );
}
private static void fakeTreeRequest( TreeItem item ) {
JsonObject parameters = new JsonObject()
.add( ClientMessageConst.EVENT_PARAM_ITEM, getId( item ) );
Fixture.fakeNotifyOperation( getId( item.getParent() ), "Expand", parameters );
}
private static void fakeHelpRequest( Widget widget ) {
Fixture.fakeNotifyOperation( getId( widget ), ClientMessageConst.EVENT_HELP, null );
}
private static void fakeKeyDownRequest( Widget widget, int keyCode, int charCode ) {
JsonObject parameters = new JsonObject()
.add( ClientMessageConst.EVENT_PARAM_KEY_CODE, keyCode )
.add( ClientMessageConst.EVENT_PARAM_CHAR_CODE, charCode )
.add( ClientMessageConst.EVENT_PARAM_MODIFIER, "" );
Fixture.fakeNotifyOperation( getId( widget ), ClientMessageConst.EVENT_KEY_DOWN, parameters );
}
private static class LoggingKeyListener implements KeyListener {
private final List<Object> events;
private LoggingKeyListener( List<Object> events ) {
this.events = events;
}
public void keyPressed( KeyEvent event ) {
events.add( event );
}
public void keyReleased( KeyEvent event ) {
events.add( event );
}
}
}