/******************************************************************************* * Copyright (c) 2002, 2016 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.rap.rwt.internal.lifecycle; import static org.eclipse.rap.rwt.internal.lifecycle.WidgetUtil.getId; import static org.eclipse.rap.rwt.internal.lifecycle.WidgetUtil.registerDataKeys; import static org.eclipse.rap.rwt.internal.protocol.ClientMessageConst.EVENT_HELP; import static org.eclipse.rap.rwt.internal.protocol.ClientMessageConst.EVENT_KEY_DOWN; import static org.eclipse.rap.rwt.internal.protocol.ClientMessageConst.EVENT_PARAM_CHAR_CODE; import static org.eclipse.rap.rwt.internal.protocol.ClientMessageConst.EVENT_PARAM_KEY_CODE; import static org.eclipse.rap.rwt.internal.protocol.ClientMessageConst.EVENT_PARAM_MODIFIER; import static org.eclipse.rap.rwt.internal.protocol.ClientMessageConst.EVENT_TRAVERSE; import static org.eclipse.rap.rwt.internal.protocol.RemoteObjectFactory.getRemoteObject; import static org.eclipse.rap.rwt.testfixture.internal.Fixture.getProtocolMessage; import static org.eclipse.rap.rwt.testfixture.internal.TestUtil.createImage; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; 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.io.IOException; import java.util.ArrayList; import java.util.List; import org.eclipse.rap.json.JsonArray; import org.eclipse.rap.json.JsonObject; import org.eclipse.rap.json.JsonValue; import org.eclipse.rap.rwt.internal.protocol.Operation.SetOperation; import org.eclipse.rap.rwt.testfixture.internal.Fixture; import org.eclipse.rap.rwt.testfixture.internal.TestMessage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.HelpEvent; import org.eclipse.swt.events.HelpListener; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.internal.graphics.ImageFactory; import org.eclipse.swt.internal.widgets.shellkit.ShellOperationHandler; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Shell; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; public class ControlLCAUtil_Test { private static final JsonArray RED_JSON = JsonArray.readFrom( "[255, 0, 0, 255]" ); private static final JsonArray RED_ALPHA_JSON = JsonArray.readFrom( "[255, 0, 0, 128]" ); private static final JsonArray TRANSPARENT_JSON = JsonArray.readFrom( "[0, 0, 0, 0]" ); private Display display; private Shell shell; private Control control; private Color red; private Color redAlpha; @Before public void setUp() { Fixture.setUp(); display = new Display(); red = display.getSystemColor( SWT.COLOR_RED ); redAlpha = new Color( display, 255, 0, 0, 128 ); shell = new Shell( display ); getRemoteObject( shell ).setHandler( new ShellOperationHandler( shell ) ); control = new Button( shell, SWT.PUSH ); Fixture.fakePhase( PhaseId.PROCESS_ACTION ); } @After public void tearDown() { display.dispose(); Fixture.tearDown(); } @Test public void testRenderChildren_initial() { ControlLCAUtil.renderChanges( shell ); JsonArray expected = new JsonArray().add( getId( control ) ); assertEquals( expected, getProtocolMessage().findSetProperty( shell, "children" ) ); } @Test public void testRenderChildren_initialOnControl() { ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "children" ) ); } @Test public void testRenderChildren_changed() { Fixture.markInitialized( control ); Fixture.clearPreserved(); Button button = new Button( shell, SWT.PUSH ); ControlLCAUtil.renderChanges( shell ); JsonArray expected = new JsonArray().add( getId( control ) ).add( getId( button ) ); assertEquals( expected, getProtocolMessage().findSetProperty( shell, "children" ) ); } @Test public void testRenderChildren_changedOrder() { Fixture.markInitialized( control ); Button button = new Button( shell, SWT.PUSH ); Fixture.clearPreserved(); control.moveBelow( button ); ControlLCAUtil.renderChanges( shell ); JsonArray expected = new JsonArray().add( getId( button ) ).add( getId( control ) ); assertEquals( expected, getProtocolMessage().findSetProperty( shell, "children" ) ); } @Test public void testRenderChildren_unchanged() { Fixture.markInitialized( shell ); new Button( shell, SWT.PUSH ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( shell ); assertNull( getProtocolMessage().findSetOperation( shell, "children" ) ); } @Test public void testRenderBounds_initial_withZeroBounds() { ControlLCAUtil.renderChanges( control ); JsonArray expected = JsonArray.readFrom( "[ 0, 0, 0, 0 ]" ); assertEquals( expected, getProtocolMessage().findSetProperty( control, "bounds" ) ); } @Test public void testRenderBounds_initial_withNotZeroBounds() { control.setBounds( 10, 20, 100, 200 ); ControlLCAUtil.renderChanges( control ); JsonArray expected = JsonArray.readFrom( "[ 10, 20, 100, 200 ]" ); assertEquals( expected, getProtocolMessage().findSetProperty( control, "bounds" ) ); } @Test public void testRenderBounds_changed() { Fixture.markInitialized( control ); control.setBounds( 1, 2, 3, 4 ); ControlLCAUtil.renderChanges( control ); JsonArray expected = JsonArray.readFrom( "[ 1, 2, 3, 4 ]" ); assertEquals( expected, getProtocolMessage().findSetProperty( control, "bounds" ) ); } @Test public void testRenderBounds_changedTwice() { Fixture.markInitialized( control ); control.setBounds( 1, 2, 3, 4 ); control.setBounds( 2, 3, 4, 5 ); ControlLCAUtil.renderChanges( control ); JsonArray expected = JsonArray.readFrom( "[ 2, 3, 4, 5 ]" ); assertEquals( expected, getProtocolMessage().findSetProperty( control, "bounds" ) ); } @Test public void testRenderBounds_unchanged() { Fixture.markInitialized( control ); ControlLCAUtil.renderChanges( control ); TestMessage message = getProtocolMessage(); assertNull( message.findSetOperation( control, "bounds" ) ); } @Test public void testRenderBounds_changedBackToOriginalValue() { control.setBounds( 1, 2, 3, 4 ); Fixture.clearPreserved(); Fixture.markInitialized( control ); control.setBounds( 2, 3, 4, 5 ); control.setBounds( 1, 2, 3, 4 ); ControlLCAUtil.renderChanges( control ); TestMessage message = getProtocolMessage(); assertNull( message.findSetOperation( control, "bounds" ) ); } @Test public void testRenderTabIndex_initial() { ControlLCAUtil.renderChanges( shell ); ControlLCAUtil.renderChanges( control ); assertEquals( 1, getProtocolMessage().findSetProperty( control, "tabIndex" ).asInt() ); } @Test public void testRenderTabIndex_disabled() { shell.setTabList( new Control[ 0 ] ); ControlLCAUtil.renderChanges( shell ); ControlLCAUtil.renderChanges( control ); assertEquals( -1, getProtocolMessage().findSetProperty( control, "tabIndex" ).asInt() ); } @Test public void testRenderTabIndex_nonFocusableControl() { control = new Composite( shell, SWT.NO_FOCUS ); ControlLCAUtil.renderChanges( shell ); ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "tabIndex" ) ); } @Test public void testRenderTabIndex_changed() { Fixture.markInitialized( control ); Fixture.clearPreserved(); shell.setTabList( new Control[] { new Button( shell, SWT.PUSH ), control } ); ControlLCAUtil.renderChanges( shell ); // needed for tab index recomputation ControlLCAUtil.renderChanges( control ); assertEquals( 2, getProtocolMessage().findSetProperty( control, "tabIndex" ).asInt() ); } @Test public void testRenderTabIndex_unchanged() { Fixture.markInitialized( control ); shell.setTabList( new Control[] { new Button( shell, SWT.PUSH ), control } ); ControlLCAUtil.renderChanges( shell ); // needed for tab index recomputation Fixture.clearPreserved(); ControlLCAUtil.renderChanges( shell ); // needed for tab index recomputation ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "tabIndex" ) ); } @Test public void testRenderToolTipText_initial() { ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "toolTip" ) ); } @Test public void testRenderToolTipText_unchanged() { Fixture.markInitialized( control ); control.setToolTipText( "foo" ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "toolTip" ) ); } @Test public void testRenderToolTipText_unchanged_null() { Fixture.markInitialized( control ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "toolTip" ) ); } @Test public void testRenderToolTipText_changed() { Fixture.markInitialized( control ); Fixture.clearPreserved(); control.setToolTipText( "foo" ); ControlLCAUtil.renderChanges( control ); assertEquals( "foo", getProtocolMessage().findSetProperty( control, "toolTip" ).asString() ); } @Test public void testRenderToolTipText_reset() { Fixture.markInitialized( control ); control.setToolTipText( "foo" ); Fixture.clearPreserved(); control.setToolTipText( null ); ControlLCAUtil.renderChanges( control ); assertEquals( "", getProtocolMessage().findSetProperty( control, "toolTip" ).asString() ); } @Test public void testRenderMenu_initial() { ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "menu" ) ); } @Test public void testRenderMenu_unchanged() { Fixture.markInitialized( control ); control.setMenu( new Menu( shell ) ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "menu" ) ); } @Test public void testRenderMenu_changed() { Fixture.markInitialized( control ); Fixture.clearPreserved(); control.setMenu( new Menu( shell ) ); ControlLCAUtil.renderChanges( control ); String expected = getId( control.getMenu() ); assertEquals( expected, getProtocolMessage().findSetProperty( control, "menu" ).asString() ); } @Test public void testRenderVisible_initial() { control.setSize( 16, 16 ); // needed to make the control visible ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "visibility" ) ); } @Test public void testRenderVisible_initialWithFalse() { control.setSize( 16, 16 ); // needed to make the control visible control.setVisible( false ); ControlLCAUtil.renderChanges( control ); assertEquals( JsonValue.FALSE, getProtocolMessage().findSetProperty( control, "visibility" ) ); } @Test public void testRenderVisible_unchanged() { control.setSize( 16, 16 ); // needed to make the control visible Fixture.markInitialized( control ); control.setVisible( false ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "visibility" ) ); } @Test public void testRenderVisible_changed() { control.setSize( 16, 16 ); // needed to make the control visible Fixture.markInitialized( control ); control.setVisible( false ); ControlLCAUtil.renderChanges( control ); assertEquals( JsonValue.FALSE, getProtocolMessage().findSetProperty( control, "visibility" ) ); } @Test public void testRenderEnabled_initial() { ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "enabled" ) ); } @Test public void testRenderEnabled_unchanged() { Fixture.markInitialized( control ); control.setEnabled( false ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "enabled" ) ); } @Test public void testRenderEnabled_changed() { Fixture.markInitialized( control ); control.setEnabled( false ); ControlLCAUtil.renderChanges( control ); assertEquals( JsonValue.FALSE, getProtocolMessage().findSetProperty( control, "enabled" ) ); } @Test public void testRenderOrientation_initial() { ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "direction" ) ); } @Test public void testRenderOrientation_unchanged() { Fixture.markInitialized( control ); control.setOrientation( SWT.RIGHT_TO_LEFT ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "direction" ) ); } @Test public void testRenderOrientation_changed() { Fixture.markInitialized( control ); control.setOrientation( SWT.RIGHT_TO_LEFT ); ControlLCAUtil.renderChanges( control ); assertEquals( "rtl", getProtocolMessage().findSetProperty( control, "direction" ).asString() ); } @Test public void testRenderForeground_initial() { ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "foreground" ) ); } @Test public void testRenderForeground_unchanged() { Fixture.markInitialized( control ); control.setForeground( red ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "foreground" ) ); } @Test public void testRenderForeground_changed() { Fixture.markInitialized( control ); Fixture.clearPreserved(); control.setForeground( red ); ControlLCAUtil.renderChanges( control ); assertEquals( RED_JSON, getProtocolMessage().findSetProperty( control, "foreground" ) ); } @Test public void testRenderForeground_reset() { Fixture.markInitialized( control ); control.setForeground( red ); Fixture.clearPreserved(); control.setForeground( null ); ControlLCAUtil.renderChanges( control ); assertEquals( JsonValue.NULL, getProtocolMessage().findSetProperty( control, "foreground" ) ); } @Test public void testRenderBackground_initial() { ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "background" ) ); } @Test public void testRenderBackground_unchanged() { Fixture.markInitialized( control ); control.setBackground( red ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "background" ) ); } @Test public void testRenderBackground_changed() { Fixture.markInitialized( control ); Fixture.clearPreserved(); control.setBackground( red ); ControlLCAUtil.renderChanges( control ); assertEquals( RED_JSON, getProtocolMessage().findSetProperty( control, "background" ) ); } @Test public void testRenderBackground_changed_withAlpha() { Fixture.markInitialized( control ); Fixture.clearPreserved(); control.setBackground( redAlpha ); ControlLCAUtil.renderChanges( control ); assertEquals( RED_ALPHA_JSON, getProtocolMessage().findSetProperty( control, "background" ) ); } @Test public void testRenderBackground_changedTransparency() { Fixture.markInitialized( control ); Fixture.clearPreserved(); control.getParent().setBackgroundMode( SWT.INHERIT_FORCE ); ControlLCAUtil.renderChanges( control ); assertEquals( TRANSPARENT_JSON, getProtocolMessage().findSetProperty( control, "background" ) ); } @Test public void testRenderBackground_reset() { Fixture.markInitialized( control ); control.setBackground( red ); Fixture.clearPreserved(); control.setBackground( null ); ControlLCAUtil.renderChanges( control ); assertEquals( JsonValue.NULL, getProtocolMessage().findSetProperty( control, "background" ) ); } @Test public void testRenderBackgroundImage_initial() { ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "backgroundImage" ) ); } @Test public void testRenderBackgroundImage_unchanged() throws IOException { Fixture.markInitialized( control ); control.setBackgroundImage( createImage( display, Fixture.IMAGE1 ) ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "backgroundImage" ) ); } @Test public void testRenderBackgroundImage_changed() throws IOException { Fixture.markInitialized( control ); Image image = createImage( display, Fixture.IMAGE1 ); control.setBackgroundImage( image ); ControlLCAUtil.renderChanges( control ); String imageLocation = ImageFactory.getImagePath( image ); JsonArray expected = new JsonArray().add( imageLocation ).add( 58 ).add( 12 ); assertEquals( expected, getProtocolMessage().findSetProperty( control, "backgroundImage" ) ); } @Test public void testRenderFont_initial() { ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "font" ) ); } @Test public void testRenderFont_changedNormal() { Fixture.markInitialized( control ); Fixture.clearPreserved(); control.setFont( new Font( display, "Arial", 12, SWT.NORMAL ) ); ControlLCAUtil.renderChanges( control ); JsonArray expected = JsonArray.readFrom( "[[\"Arial\"], 12, false, false]" ); assertEquals( expected, getProtocolMessage().findSetProperty( control, "font" ) ); } @Test public void testRenderFont_changedBold() { Fixture.markInitialized( control ); Fixture.clearPreserved(); control.setFont( new Font( display, "Arial", 12, SWT.BOLD ) ); ControlLCAUtil.renderChanges( control ); JsonArray expected = JsonArray.readFrom( "[[\"Arial\"], 12, true, false]" ); assertEquals( expected, getProtocolMessage().findSetProperty( control, "font" ) ); } @Test public void testRenderFont_changedItalic() { Fixture.markInitialized( control ); Fixture.clearPreserved(); control.setFont( new Font( display, "Arial", 12, SWT.ITALIC ) ); ControlLCAUtil.renderChanges( control ); JsonArray expected = JsonArray.readFrom( "[[\"Arial\"], 12, false, true]" ); assertEquals( expected, getProtocolMessage().findSetProperty( control, "font" ) ); } @Test public void testRenderFont_changedBoldItalic() { Fixture.markInitialized( control ); Fixture.clearPreserved(); control.setFont( new Font( display, "Arial", 12, SWT.BOLD | SWT.ITALIC ) ); ControlLCAUtil.renderChanges( control ); JsonArray expected = JsonArray.readFrom( "[[\"Arial\"], 12, true, true]" ); assertEquals( expected, getProtocolMessage().findSetProperty( control, "font" ) ); } @Test public void testRenderFont_unchanged() { Fixture.markInitialized( control ); control.setFont( new Font( display, "Arial", 12, SWT.NORMAL ) ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "font" ) ); } @Test public void testRenderFont_reset() { Fixture.markInitialized( control ); control.setFont( new Font( display, "Arial", 12, SWT.NORMAL ) ); Fixture.clearPreserved(); control.setFont( null ); ControlLCAUtil.renderChanges( control ); assertEquals( JsonObject.NULL, getProtocolMessage().findSetProperty( control, "font" ) ); } @Test public void testRenderCursor_initial() { ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "cursor" ) ); } @Test public void testRenderCursor_unchanged() { Fixture.markInitialized( control ); control.setCursor( display.getSystemCursor( SWT.CURSOR_HAND ) ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "cursor" ) ); } @Test public void testRenderCursor_changed() { Fixture.markInitialized( control ); Fixture.clearPreserved(); control.setCursor( display.getSystemCursor( SWT.CURSOR_HAND ) ); ControlLCAUtil.renderChanges( control ); assertEquals( "pointer", getProtocolMessage().findSetProperty( control, "cursor" ).asString() ); } @Test public void testRenderCursor_reset() { Fixture.markInitialized( control ); control.setCursor( display.getSystemCursor( SWT.CURSOR_HAND ) ); Fixture.clearPreserved(); control.setCursor( null ); ControlLCAUtil.renderChanges( control ); assertEquals( JsonObject.NULL, getProtocolMessage().findSetProperty( control, "cursor" ) ); } @Test public void testRenderData_initial() { ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "data" ) ); } @Test public void testRenderData_unchanged() { Fixture.markInitialized( control ); registerDataKeys( new String[]{ "foo" } ); control.setData( "foo", Boolean.TRUE ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findSetOperation( control, "data" ) ); } @Test public void testRenderData_changed() { Fixture.markInitialized( control ); registerDataKeys( new String[]{ "foo" } ); control.setData( "foo", Boolean.TRUE ); ControlLCAUtil.renderChanges( control ); JsonObject expected = new JsonObject().add( "foo", true ); assertEquals( expected, getProtocolMessage().findSetProperty( control, "data" ) ); } @Test public void testRenderData_inSameOperationWithOtherProperties() { registerDataKeys( new String[]{ "foo" } ); control.setData( "foo", "bar" ); control.setEnabled( false ); control.addListener( SWT.FocusIn, mock( Listener.class ) ); ControlLCAUtil.renderChanges( control ); TestMessage message = getProtocolMessage(); SetOperation operation = ( SetOperation )message.getOperation( 0 ); JsonObject properties = operation.getProperties(); assertNotNull( properties.get( "data" ) ); assertNotNull( properties.get( "enabled" ) ); } @Test public void testRenderListenActivate_initial() { ControlLCAUtil.renderChanges( control ); TestMessage message = getProtocolMessage(); assertNull( message.findListenOperation( control, "Activate" ) ); assertNull( message.findListenOperation( control, "Deactivate" ) ); } @Test public void testRenderListenActivate_unchanged() { Fixture.markInitialized( control ); control.addListener( SWT.Activate, mock( Listener.class ) ); control.addListener( SWT.Deactivate, mock( Listener.class ) ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); TestMessage message = getProtocolMessage(); assertNull( message.findListenOperation( control, "Activate" ) ); assertNull( message.findListenOperation( control, "Deactivate" ) ); } @Test public void testRenderListenActivate_activate() { control.addListener( SWT.Activate, mock( Listener.class ) ); ControlLCAUtil.renderChanges( control ); assertEquals( JsonValue.TRUE, getProtocolMessage().findListenProperty( control, "Activate" ) ); } @Test public void testRenderListenActivate_deactivate() { control.addListener( SWT.Deactivate, mock( Listener.class ) ); ControlLCAUtil.renderChanges( control ); assertEquals( JsonValue.TRUE, getProtocolMessage().findListenProperty( control, "Deactivate" ) ); } @Test public void testRenderListenActivate_removed() { Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); control.addListener( SWT.Activate, listener ); control.addListener( SWT.Deactivate, listener ); Fixture.clearPreserved(); control.removeListener( SWT.Activate, listener ); control.removeListener( SWT.Deactivate, listener ); ControlLCAUtil.renderChanges( control ); TestMessage message = getProtocolMessage(); assertEquals( JsonValue.FALSE, message.findListenProperty( control, "Activate" ) ); assertEquals( JsonValue.FALSE, message.findListenProperty( control, "Deactivate" ) ); } @Test public void testRenderListenMouse_initial() { ControlLCAUtil.renderChanges( control ); TestMessage message = getProtocolMessage(); assertNull( message.findListenOperation( control, "MouseDown" ) ); assertNull( message.findListenOperation( control, "MouseDoubleClick" ) ); assertNull( message.findListenOperation( control, "MouseUp" ) ); } @Test public void testRenderListenMouse_unchanged() { Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); control.addListener( SWT.MouseDown, listener ); control.addListener( SWT.MouseDoubleClick, listener ); control.addListener( SWT.MouseUp, listener ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); TestMessage message = getProtocolMessage(); assertNull( message.findListenOperation( control, "MouseDown" ) ); assertNull( message.findListenOperation( control, "MouseDoubleClick" ) ); assertNull( message.findListenOperation( control, "MouseUp" ) ); } @Test public void testRenderListenMouse_changed() { Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); Fixture.clearPreserved(); control.addListener( SWT.MouseDown, listener ); control.addListener( SWT.MouseDoubleClick, listener ); control.addListener( SWT.MouseUp, listener ); ControlLCAUtil.renderChanges( control ); TestMessage message = getProtocolMessage(); assertEquals( JsonValue.TRUE, message.findListenProperty( control, "MouseDown" ) ); assertEquals( JsonValue.TRUE, message.findListenProperty( control, "MouseDoubleClick" ) ); assertEquals( JsonValue.TRUE, message.findListenProperty( control, "MouseUp" ) ); } @Test public void testRenderListenMouse_removed() { Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); control.addListener( SWT.MouseDown, listener ); control.addListener( SWT.MouseDoubleClick, listener ); control.addListener( SWT.MouseUp, listener ); Fixture.clearPreserved(); control.removeListener( SWT.MouseDown, listener ); control.removeListener( SWT.MouseDoubleClick, listener ); control.removeListener( SWT.MouseUp, listener ); ControlLCAUtil.renderChanges( control ); TestMessage message = getProtocolMessage(); assertEquals( JsonValue.FALSE, message.findListenProperty( control, "MouseDown" ) ); assertEquals( JsonValue.FALSE, message.findListenProperty( control, "MouseDoubleClick" ) ); assertEquals( JsonValue.FALSE, message.findListenProperty( control, "MouseUp" ) ); } @Test public void testRenderListenFocus_initial() { ControlLCAUtil.renderChanges( control ); TestMessage message = getProtocolMessage(); assertNull( message.findListenOperation( control, "FocusIn" ) ); assertNull( message.findListenOperation( control, "FocusOut" ) ); } @Test public void testRenderListenFocus_unchanged() { Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); control.addListener( SWT.FocusIn, listener ); control.addListener( SWT.FocusOut, listener ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); TestMessage message = getProtocolMessage(); assertNull( message.findListenOperation( control, "FocusIn" ) ); assertNull( message.findListenOperation( control, "FocusOut" ) ); } @Test public void testRenderListenFocus_changed() { Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); Fixture.clearPreserved(); control.addListener( SWT.FocusIn, listener ); control.addListener( SWT.FocusOut, listener ); ControlLCAUtil.renderChanges( control ); TestMessage message = getProtocolMessage(); assertEquals( JsonValue.TRUE, message.findListenProperty( control, "FocusIn" ) ); assertEquals( JsonValue.TRUE, message.findListenProperty( control, "FocusOut" ) ); } @Test public void testRenderListenFocus_changed_onNotFocusableControl() { control = new Label( shell, SWT.NONE ); Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); Fixture.clearPreserved(); control.addListener( SWT.FocusIn, listener ); control.addListener( SWT.FocusOut, listener ); ControlLCAUtil.renderChanges( control ); TestMessage message = getProtocolMessage(); assertNull( message.findListenOperation( control, "FocusIn" ) ); assertNull( message.findListenOperation( control, "FocusOut" ) ); } @Test public void testRenderListenFocus_removed() { Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); control.addListener( SWT.FocusIn, listener ); control.addListener( SWT.FocusOut, listener ); Fixture.clearPreserved(); control.removeListener( SWT.FocusIn, listener ); control.removeListener( SWT.FocusOut, listener ); ControlLCAUtil.renderChanges( control ); TestMessage message = getProtocolMessage(); assertEquals( JsonValue.FALSE, message.findListenProperty( control, "FocusIn" ) ); assertEquals( JsonValue.FALSE, message.findListenProperty( control, "FocusOut" ) ); } @Test public void testRenderListenTraverse_initial() { ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findListenOperation( control, "Traverse" ) ); } @Test public void testRenderListenTraverse_unchanged() { Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); control.addListener( SWT.Traverse, listener ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findListenOperation( control, "Traverse" ) ); } @Test public void testRenderListenTraverse_changed() { Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); Fixture.clearPreserved(); control.addListener( SWT.Traverse, listener ); ControlLCAUtil.renderChanges( control ); assertEquals( JsonValue.TRUE, getProtocolMessage().findListenProperty( control, "Traverse" ) ); } @Test public void testRenderListenTraverse_removed() { Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); control.addListener( SWT.Traverse, listener ); Fixture.clearPreserved(); control.removeListener( SWT.Traverse, listener ); ControlLCAUtil.renderChanges( control ); assertEquals( JsonValue.FALSE, getProtocolMessage().findListenProperty( control, "Traverse" ) ); } @Test public void testRenderListenMenuDetect_initial() { ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findListenOperation( control, "MenuDetect" ) ); } @Test public void testRenderListenMenuDetect_changed() { Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); Fixture.clearPreserved(); control.addListener( SWT.MenuDetect, listener ); ControlLCAUtil.renderChanges( control ); assertEquals( JsonValue.TRUE, getProtocolMessage().findListenProperty( control, "MenuDetect" ) ); } @Test public void testRenderListenMenuDetect_unchanged() { Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); control.addListener( SWT.MenuDetect, listener ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findListenOperation( control, "MenuDetect" ) ); } @Test public void testRenderListenMenuDetect_removed() { Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); control.addListener( SWT.MenuDetect, listener ); Fixture.clearPreserved(); control.removeListener( SWT.MenuDetect, listener ); ControlLCAUtil.renderChanges( control ); assertEquals( JsonValue.FALSE, getProtocolMessage().findListenProperty( control, "MenuDetect" ) ); } @Test public void testRenderListenHelp_initial() { ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findListenOperation( control, "Help" ) ); } @Test public void testRenderListenHelp_changed() { Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); Fixture.clearPreserved(); control.addListener( SWT.Help, listener ); ControlLCAUtil.renderChanges( control ); assertEquals( JsonValue.TRUE, getProtocolMessage().findListenProperty( control, "Help" ) ); } @Test public void testRenderListenHelp_unchanged() { Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); control.addListener( SWT.Help, listener ); Fixture.clearPreserved(); ControlLCAUtil.renderChanges( control ); assertNull( getProtocolMessage().findListenOperation( control, "Help" ) ); } @Test public void testRenderListenHelp_removed() { Fixture.markInitialized( control ); Listener listener = mock( Listener.class ); control.addListener( SWT.Help, listener ); Fixture.clearPreserved(); control.removeListener( SWT.Help, listener ); ControlLCAUtil.renderChanges( control ); assertEquals( JsonValue.FALSE, getProtocolMessage().findListenProperty( control, "Help" ) ); } // TODO [rst] These test are not releated to the class under test. Delete them or move them to // a proper place @Test public void testProcessKeyEventWithDisplayFilter() { shell.open(); Listener listener = mock( Listener.class ); display.addFilter( SWT.KeyDown, listener ); fakeNotifyKeyDown( getId( shell ), 65, 97, "" ); Fixture.readDataAndProcessAction( display ); ArgumentCaptor<Event> captor = ArgumentCaptor.forClass( Event.class ); verify( listener, times( 1 ) ).handleEvent( captor.capture() ); assertEquals( 97, captor.getValue().keyCode ); assertEquals( 'a', captor.getValue().character ); assertEquals( 0, captor.getValue().stateMask ); } @Test public void testProcessKeyEventWithLowerCaseCharacter() { shell.open(); KeyListener listener = mock( KeyListener.class ); shell.addKeyListener( listener ); fakeNotifyKeyDown( getId( shell ), 65, 97, "" ); Fixture.readDataAndProcessAction( shell ); ArgumentCaptor<KeyEvent> captor = ArgumentCaptor.forClass( KeyEvent.class ); verify( listener, times( 1 ) ).keyPressed( captor.capture() ); assertEquals( 97, captor.getValue().keyCode ); assertEquals( 'a', captor.getValue().character ); assertEquals( 0, captor.getValue().stateMask ); } @Test public void testProcessKeyEventWithUpperCaseCharacter() { shell.open(); KeyListener listener = mock( KeyListener.class ); shell.addKeyListener( listener ); fakeNotifyKeyDown( getId( shell ), 65, 65, "" ); Fixture.readDataAndProcessAction( shell ); ArgumentCaptor<KeyEvent> captor = ArgumentCaptor.forClass( KeyEvent.class ); verify( listener, times( 1 ) ).keyPressed( captor.capture() ); assertEquals( 97, captor.getValue().keyCode ); assertEquals( 'A', captor.getValue().character ); assertEquals( 0, captor.getValue().stateMask ); } @Test public void testProcessKeyEventWithDigitCharacter() { shell.open(); KeyListener listener = mock( KeyListener.class ); shell.addKeyListener( listener ); fakeNotifyKeyDown( getId( shell ), 49, 49, "" ); Fixture.readDataAndProcessAction( shell ); ArgumentCaptor<KeyEvent> captor = ArgumentCaptor.forClass( KeyEvent.class ); verify( listener, times( 1 ) ).keyPressed( captor.capture() ); assertEquals( 49, captor.getValue().keyCode ); assertEquals( 49, captor.getValue().character ); assertEquals( 0, captor.getValue().stateMask ); } @Test public void testProcessKeyEventWithPunctuationCharacter() { shell.open(); KeyListener listener = mock( KeyListener.class ); shell.addKeyListener( listener ); fakeNotifyKeyDown( getId( shell ), 49, 33, "" ); Fixture.readDataAndProcessAction( shell ); ArgumentCaptor<KeyEvent> captor = ArgumentCaptor.forClass( KeyEvent.class ); verify( listener, times( 1 ) ).keyPressed( captor.capture() ); assertEquals( 49, captor.getValue().keyCode ); assertEquals( 33, captor.getValue().character ); assertEquals( 0, captor.getValue().stateMask ); } @Test public void testKeyAndTraverseEvents() { final List<Event> eventLog = new ArrayList<Event>(); shell.open(); Listener listener = new Listener() { @Override public void handleEvent( Event event ) { eventLog.add( event ); } }; shell.addListener( SWT.Traverse, listener ); shell.addListener( SWT.KeyDown, listener ); shell.addListener( SWT.KeyUp, listener ); fakeNotifyTraverse( getId( shell ), 27, 0, "" ); Fixture.readDataAndProcessAction( display ); assertEquals( 3, eventLog.size() ); Event traverseEvent = eventLog.get( 0 ); assertEquals( SWT.Traverse, traverseEvent.type ); assertEquals( SWT.TRAVERSE_ESCAPE, traverseEvent.detail ); assertTrue( traverseEvent.doit ); Event downEvent = eventLog.get( 1 ); assertEquals( SWT.KeyDown, downEvent.type ); Event upEvent = eventLog.get( 2 ); assertEquals( SWT.KeyUp, upEvent.type ); } @Test public void testProcessHelpEvent() { shell.open(); HelpListener listener = mock( HelpListener.class ); shell.addHelpListener( listener ); Fixture.fakeNotifyOperation( getId( shell ), EVENT_HELP, null ); Fixture.readDataAndProcessAction( shell ); verify( listener, times( 1 ) ).helpRequested( any( HelpEvent.class) ); } private void fakeNotifyKeyDown( String target, int keyCode, int charCode, String modifier ) { JsonObject properties = new JsonObject() .add( EVENT_PARAM_KEY_CODE, keyCode ) .add( EVENT_PARAM_CHAR_CODE, charCode ) .add( EVENT_PARAM_MODIFIER, modifier ); Fixture.fakeNotifyOperation( target, EVENT_KEY_DOWN, properties ); } private void fakeNotifyTraverse( String target, int keyCode, int charCode, String modifier ) { JsonObject properties = new JsonObject() .add( EVENT_PARAM_KEY_CODE, keyCode ) .add( EVENT_PARAM_CHAR_CODE, charCode ) .add( EVENT_PARAM_MODIFIER, modifier ); Fixture.fakeNotifyOperation( target, EVENT_KEY_DOWN, properties ); Fixture.fakeNotifyOperation( target, EVENT_TRAVERSE, properties ); } }