blob: ec0dfdfef13eaa25d807a3ffac759d161768fc3d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002, 2012 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.swt.internal.widgets.listkit;
import static org.eclipse.rap.rwt.lifecycle.WidgetUtil.getId;
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.Arrays;
import junit.framework.TestCase;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.graphics.Graphics;
import org.eclipse.rap.rwt.internal.protocol.ClientMessageConst;
import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil;
import org.eclipse.rap.rwt.lifecycle.IWidgetAdapter;
import org.eclipse.rap.rwt.lifecycle.PhaseId;
import org.eclipse.rap.rwt.lifecycle.WidgetUtil;
import org.eclipse.rap.rwt.testfixture.Fixture;
import org.eclipse.rap.rwt.testfixture.Message;
import org.eclipse.rap.rwt.testfixture.Message.CreateOperation;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.internal.widgets.IListAdapter;
import org.eclipse.swt.internal.widgets.Props;
import org.eclipse.swt.internal.widgets.controlkit.ControlLCATestUtil;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Shell;
import org.json.JSONArray;
import org.json.JSONException;
import org.mockito.ArgumentCaptor;
public class ListLCA_Test extends TestCase {
private Display display;
private Shell shell;
private ListLCA lca;
private List list;
private ScrollBar hScroll;
private ScrollBar vScroll;
@Override
protected void setUp() throws Exception {
Fixture.setUp();
display = new Display();
shell = new Shell( display, SWT.NONE );
list = new List( shell, SWT.H_SCROLL | SWT.V_SCROLL );
hScroll = list.getHorizontalBar();
vScroll = list.getVerticalBar();
lca = new ListLCA();
Fixture.fakeNewRequest( display );
}
@Override
protected void tearDown() throws Exception {
Fixture.tearDown();
}
public void testControlListeners() throws IOException {
ControlLCATestUtil.testActivateListener( list );
ControlLCATestUtil.testFocusListener( list );
ControlLCATestUtil.testMouseListener( list );
ControlLCATestUtil.testKeyListener( list );
ControlLCATestUtil.testTraverseListener( list );
ControlLCATestUtil.testMenuDetectListener( list );
ControlLCATestUtil.testHelpListener( list );
}
public void testPreserveValues() {
Fixture.markInitialized( display );
// control: enabled
Fixture.preserveWidgets();
IWidgetAdapter adapter = WidgetUtil.getAdapter( list );
assertEquals( Boolean.TRUE, adapter.getPreserved( Props.ENABLED ) );
Fixture.clearPreserved();
list.setEnabled( false );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( list );
assertEquals( Boolean.FALSE, adapter.getPreserved( Props.ENABLED ) );
Fixture.clearPreserved();
list.setEnabled( true );
// visible
list.setSize( 10, 10 );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( list );
assertEquals( Boolean.TRUE, adapter.getPreserved( Props.VISIBLE ) );
Fixture.clearPreserved();
list.setVisible( false );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( list );
assertEquals( Boolean.FALSE, adapter.getPreserved( Props.VISIBLE ) );
Fixture.clearPreserved();
// menu
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( list );
assertEquals( null, adapter.getPreserved( Props.MENU ) );
Fixture.clearPreserved();
Menu menu = new Menu( list );
MenuItem item = new MenuItem( menu, SWT.NONE );
item.setText( "1 Item" );
list.setMenu( menu );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( list );
assertEquals( menu, adapter.getPreserved( Props.MENU ) );
Fixture.clearPreserved();
// bound
list.getFocusIndex();
Rectangle rectangle = new Rectangle( 10, 10, 30, 50 );
list.setBounds( rectangle );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( list );
assertEquals( rectangle, adapter.getPreserved( Props.BOUNDS ) );
Fixture.clearPreserved();
// foreground background font
Color background = Graphics.getColor( 122, 33, 203 );
list.setBackground( background );
Color foreground = Graphics.getColor( 211, 178, 211 );
list.setForeground( foreground );
Font font = Graphics.getFont( "font", 12, SWT.BOLD );
list.setFont( font );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( list );
assertEquals( background, adapter.getPreserved( Props.BACKGROUND ) );
assertEquals( foreground, adapter.getPreserved( Props.FOREGROUND ) );
assertEquals( font, adapter.getPreserved( Props.FONT ) );
Fixture.clearPreserved();
// tooltiptext
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( list );
assertEquals( null, list.getToolTipText() );
Fixture.clearPreserved();
list.setToolTipText( "some text" );
Fixture.preserveWidgets();
adapter = WidgetUtil.getAdapter( list );
assertEquals( "some text", list.getToolTipText() );
}
public void testReadSelectionForSingle() {
createListItems( 3 );
fakeSelection( new int[]{ 0 } );
lca.readData( list );
assertEquals( 0, list.getSelectionIndex() );
}
public void testReadSelectionForSingle_DeselectAll() {
createListItems( 3 );
list.setSelection( 1 );
fakeSelection( new int[]{} );
lca.readData( list );
assertEquals( -1, list.getSelectionIndex() );
}
public void testReadSelectionForMulti() {
list = new List( shell, SWT.MULTI );
createListItems( 3 );
fakeSelection( new int[]{ 0, 1 } );
lca.readData( list );
int[] expected = new int[]{ 0, 1 };
assertTrue( Arrays.equals( expected, list.getSelectionIndices() ) );
}
public void testSelectionEvent() {
createListItems( 2 );
SelectionListener listener = mock( SelectionListener.class );
list.addSelectionListener( listener );
Fixture.fakeNotifyOperation( getId( list ), ClientMessageConst.EVENT_SELECTION, null );
Fixture.readDataAndProcessAction( list );
ArgumentCaptor<SelectionEvent> captor = ArgumentCaptor.forClass( SelectionEvent.class );
verify( listener, times( 1 ) ).widgetSelected( captor.capture() );
SelectionEvent event = captor.getValue();
assertEquals( list, event.getSource() );
assertEquals( null, event.item );
assertEquals( SWT.NONE, event.detail );
assertEquals( 0, event.x );
assertEquals( 0, event.y );
assertEquals( 0, event.width );
assertEquals( 0, event.height );
assertEquals( true, event.doit );
}
public void testReadFocusedIndex() {
createListItems( 3 );
setFocusIndex( list, 0 );
fakeFocusIndex( 1 );
Fixture.readDataAndProcessAction( list );
assertEquals( 1, list.getFocusIndex() );
}
public void testReadFocusedIndex_Reset() {
createListItems( 3 );
setFocusIndex( list, 0 );
fakeFocusIndex( -1 );
Fixture.readDataAndProcessAction( list );
assertEquals( -1, list.getFocusIndex() );
}
public void testReadFocusedIndex_OutOfRange() {
createListItems( 3 );
setFocusIndex( list, 0 );
fakeFocusIndex(22 );
Fixture.readDataAndProcessAction( list );
assertEquals( 0, list.getFocusIndex() );
}
public void testReadTopIndex() {
list.setSize( 100, 100 );
createListItems( 10 );
fakeTopIndex( 5 );
Fixture.readDataAndProcessAction( list );
assertEquals( 5, list.getTopIndex() );
}
public void testRenderCreate() throws IOException {
lca.renderInitialization( list );
Message message = Fixture.getProtocolMessage();
CreateOperation operation = message.findCreateOperation( list );
assertEquals( "rwt.widgets.List", operation.getType() );
Object[] styles = operation.getStyles();
assertTrue( Arrays.asList( styles ).contains( "SINGLE" ) );
}
public void testRenderCreateWithMulti() throws IOException {
List list = new List( shell, SWT.MULTI );
lca.renderInitialization( list );
Message message = Fixture.getProtocolMessage();
CreateOperation operation = message.findCreateOperation( list );
Object[] styles = operation.getStyles();
assertTrue( Arrays.asList( styles ).contains( "MULTI" ) );
}
public void testRenderParent() throws IOException {
lca.renderInitialization( list );
Message message = Fixture.getProtocolMessage();
CreateOperation operation = message.findCreateOperation( list );
assertEquals( WidgetUtil.getId( list.getParent() ), operation.getParent() );
}
public void testRenderInitialItems() throws IOException {
lca.render( list );
Message message = Fixture.getProtocolMessage();
CreateOperation operation = message.findCreateOperation( list );
assertTrue( operation.getPropertyNames().indexOf( "items" ) == -1 );
}
public void testRenderItems() throws IOException, JSONException {
list.setItems( new String[] { "Item 1", "Item 2", "Item 3" } );
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
String expected = "[ \"Item 1\", \"Item 2\", \"Item 3\" ]";
JSONArray actual = ( JSONArray )message.findSetProperty( list, "items" );
assertTrue( ProtocolTestUtil.jsonEquals( expected, actual ) );
}
public void testRenderItemsUnchanged() throws IOException {
Fixture.markInitialized( display );
Fixture.markInitialized( list );
list.setItems( new String[] { "Item 1", "Item 2", "Item 3" } );
Fixture.preserveWidgets();
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
assertNull( message.findSetOperation( list, "items" ) );
}
public void testRenderInitialSelectionIndices() throws IOException {
lca.render( list );
Message message = Fixture.getProtocolMessage();
CreateOperation operation = message.findCreateOperation( list );
assertTrue( operation.getPropertyNames().indexOf( "selectionIndices" ) == -1 );
}
public void testRenderSelectionIndices() throws IOException, JSONException {
list.setItems( new String[] { "Item 1", "Item 2", "Item 3" } );
list.select( 1 );
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
JSONArray actual = ( JSONArray )message.findSetProperty( list, "selectionIndices" );
assertTrue( ProtocolTestUtil.jsonEquals( "[1]", actual ) );
}
public void testRenderSelectionIndicesWithMulti() throws IOException, JSONException {
List list = new List( shell, SWT.MULTI );
list.setItems( new String[] { "Item 1", "Item 2", "Item 3" } );
list.setSelection( new int[] { 1, 2 } );
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
JSONArray actual = ( JSONArray )message.findSetProperty( list, "selectionIndices" );
assertTrue( ProtocolTestUtil.jsonEquals( "[1,2]", actual ) );
}
public void testRenderSelectionIndicesUnchanged() throws IOException {
list.setItems( new String[] { "Item 1", "Item 2", "Item 3" } );
Fixture.markInitialized( display );
Fixture.markInitialized( list );
list.select( 1 );
Fixture.preserveWidgets();
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
assertNull( message.findSetOperation( list, "selectionIndices" ) );
}
public void testRenderInitialTopIndex() throws IOException {
lca.render( list );
Message message = Fixture.getProtocolMessage();
assertNull( message.findSetOperation( vScroll, "selection" ) );
}
public void testRenderTopIndex() throws IOException {
list.setItems( new String[] { "Item 1", "Item 2", "Item 3" } );
list.setTopIndex( 2 );
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
Integer expected = Integer.valueOf( 2 * list.getItemHeight() );
assertEquals( expected, message.findSetProperty( vScroll, "selection" ) );
}
public void testRenderTopIndexUnchanged() throws IOException {
list.setItems( new String[] { "Item 1", "Item 2", "Item 3" } );
Fixture.markInitialized( display );
Fixture.markInitialized( list );
Fixture.markInitialized( hScroll );
Fixture.markInitialized( vScroll );
list.setTopIndex( 2 );
Fixture.preserveWidgets();
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
assertNull( message.findSetOperation( vScroll, "selection" ) );
}
public void testRenderInitialFocusIndex() throws IOException {
lca.render( list );
Message message = Fixture.getProtocolMessage();
CreateOperation operation = message.findCreateOperation( list );
assertTrue( operation.getPropertyNames().indexOf( "focusIndex" ) == -1 );
}
public void testRenderFocusIndex() throws IOException {
list.setItems( new String[] { "Item 1", "Item 2", "Item 3" } );
setFocusIndex( list, 2 );
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
assertEquals( Integer.valueOf( 2 ), message.findSetProperty( list, "focusIndex" ) );
}
public void testRenderFocusIndexUnchanged() throws IOException {
list.setItems( new String[] { "Item 1", "Item 2", "Item 3" } );
Fixture.markInitialized( display );
Fixture.markInitialized( list );
setFocusIndex( list, 2 );
Fixture.preserveWidgets();
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
assertNull( message.findSetOperation( list, "focusIndex" ) );
}
public void testRenderInitialScrollBarsVisible() throws IOException {
lca.render( list );
Message message = Fixture.getProtocolMessage();
assertNull( message.findSetOperation( hScroll, "visibility" ) );
assertNull( message.findSetOperation( vScroll, "visibility" ) );
}
public void testRenderScrollBarsVisible_Horizontal() throws IOException {
Fixture.fakePhase( PhaseId.PROCESS_ACTION );
list.setSize( 20, 100 );
list.add( "Item 1" );
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
assertEquals( Boolean.TRUE, message.findSetProperty( hScroll, "visibility" ) );
assertNull( message.findSetOperation( vScroll, "visibility" ) );
}
public void testRenderScrollBarsVisible_Vertical() throws IOException {
list.setSize( 100, 20 );
list.setItems( new String[] { "Item 1", "Item 2", "Item 3" } );
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
assertNull( message.findSetOperation( hScroll, "visibility" ) );
assertEquals( Boolean.TRUE, message.findSetProperty( vScroll, "visibility" ) );
}
public void testRenderScrollBarsVisibleUnchanged() throws IOException {
Fixture.fakePhase( PhaseId.PROCESS_ACTION );
list.setSize( 20, 20 );
Fixture.markInitialized( display );
Fixture.markInitialized( list );
Fixture.markInitialized( hScroll );
Fixture.markInitialized( vScroll );
list.setItems( new String[] { "Item 1", "Item 2", "Item 3" } );
Fixture.preserveWidgets();
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
assertNull( message.findSetOperation( hScroll, "visibility" ) );
assertNull( message.findSetOperation( vScroll, "visibility" ) );
}
public void testRenderInitialItemDimensions() throws IOException {
list.setItems( new String[] { "Item 1", "Item 2", "Item 3" } );
lca.render( list );
Message message = Fixture.getProtocolMessage();
assertNotNull( message.findSetOperation( list, "itemDimensions" ) );
}
public void testRenderItemDimensions() throws IOException, JSONException {
list.setItems( new String[] { "Item 1", "Item 2", "Item 3" } );
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
JSONArray actual = ( JSONArray )message.findSetProperty( list, "itemDimensions" );
assertEquals( list.getItemHeight(), actual.getInt( 1 ) );
}
public void testRenderItemDimensionsUnchanged() throws IOException {
Fixture.markInitialized( display );
Fixture.markInitialized( list );
list.setItems( new String[] { "Item 1", "Item 2", "Item 3" } );
Fixture.preserveWidgets();
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
assertNull( message.findSetOperation( list, "itemDimensions" ) );
}
public void testRenderAddSelectionListener() throws Exception {
Fixture.markInitialized( display );
Fixture.markInitialized( list );
Fixture.preserveWidgets();
list.addListener( SWT.Selection, mock( Listener.class ) );
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
assertEquals( Boolean.TRUE, message.findListenProperty( list, "Selection" ) );
assertNull( message.findListenOperation( list, "DefaultSelection" ) );
}
public void testRenderRemoveSelectionListener() throws Exception {
Listener listener = mock( Listener.class );
list.addListener( SWT.Selection, listener );
Fixture.markInitialized( display );
Fixture.markInitialized( list );
Fixture.preserveWidgets();
list.removeListener( SWT.Selection, listener );
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
assertEquals( Boolean.FALSE, message.findListenProperty( list, "Selection" ) );
assertNull( message.findListenOperation( list, "DefaultSelection" ) );
}
public void testRenderAddDefaultSelectionListener() throws Exception {
Fixture.markInitialized( display );
Fixture.markInitialized( list );
Fixture.preserveWidgets();
list.addListener( SWT.DefaultSelection, mock( Listener.class ) );
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
assertEquals( Boolean.TRUE, message.findListenProperty( list, "DefaultSelection" ) );
assertNull( message.findListenOperation( list, "Selection" ) );
}
public void testRenderRemoveDefaultSelectionListener() throws Exception {
Listener listener = mock( Listener.class );
list.addListener( SWT.DefaultSelection, listener );
Fixture.markInitialized( display );
Fixture.markInitialized( list );
Fixture.preserveWidgets();
list.removeListener( SWT.DefaultSelection, listener );
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
assertEquals( Boolean.FALSE, message.findListenProperty( list, "DefaultSelection" ) );
assertNull( message.findListenOperation( list, "Selection" ) );
}
public void testRenderSelectionListenerUnchanged() throws Exception {
Fixture.markInitialized( display );
Fixture.markInitialized( list );
Fixture.preserveWidgets();
list.addSelectionListener( new SelectionAdapter() { } );
Fixture.preserveWidgets();
lca.renderChanges( list );
Message message = Fixture.getProtocolMessage();
assertNull( message.findListenOperation( list, "Selection" ) );
assertNull( message.findListenOperation( list, "DefaultSelection" ) );
}
public void testRenderMarkupEnabled() throws IOException {
list.setData( RWT.MARKUP_ENABLED, Boolean.TRUE );
lca.render( list );
Message message = Fixture.getProtocolMessage();
assertEquals( Boolean.TRUE, message.findCreateProperty( list, "markupEnabled" ) );
}
private static void setFocusIndex( List list, int focusIndex ) {
list.getAdapter( IListAdapter.class ).setFocusIndex( focusIndex );
}
private void createListItems( int number ) {
for( int i = 0; i < number; i++ ) {
list.add( "Item " + i );
}
}
private void fakeSelection( int[] values ) {
Fixture.fakeNewRequest( display );
Fixture.fakeSetParameter( getId( list ), "selection", values );
}
private void fakeFocusIndex( int value ) {
Fixture.fakeNewRequest( display );
Fixture.fakeSetParameter( getId( list ), "focusIndex", Integer.valueOf( value ) );
}
private void fakeTopIndex( int value ) {
Fixture.fakeNewRequest( display );
Integer selection = Integer.valueOf( value * list.getItemHeight() );
Fixture.fakeSetParameter( getId( list.getVerticalBar() ), "selection", selection );
}
}