/*******************************************************************************
* Copyright (c) 2002, 2015 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.widgets;
import static org.eclipse.rap.rwt.testfixture.internal.SerializationTestUtil.serializeAndDeserialize;
import static org.eclipse.rap.rwt.testfixture.internal.TestUtil.createImage;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
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 org.eclipse.rap.rwt.internal.lifecycle.WidgetLCA;
import org.eclipse.rap.rwt.testfixture.TestContext;
import org.eclipse.rap.rwt.testfixture.internal.Fixture;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.internal.widgets.IItemHolderAdapter;
import org.eclipse.swt.internal.widgets.tabfolderkit.TabFolderLCA;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
public class TabFolder_Test {
@Rule
public TestContext context = new TestContext();
private Display display;
private Shell shell;
private TabFolder folder;
@Before
public void setUp() {
display = new Display();
shell = new Shell( display );
folder = new TabFolder( shell, SWT.NONE );
}
@Test
public void testGetItems() {
assertEquals( 0, folder.getItems().length );
TabItem item = new TabItem( folder, SWT.NONE );
assertEquals( 1, folder.getItems().length );
assertSame( item, folder.getItems()[ 0 ] );
}
@Test
public void testInitialSelection() {
final java.util.List<SelectionEvent> log = new ArrayList<SelectionEvent>();
folder.setSize( 100, 100 );
SelectionListener selectionListener = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
log.add( e );
}
};
folder.addSelectionListener( selectionListener );
assertEquals( -1, folder.getSelectionIndex() );
assertEquals( 0, folder.getSelection().length );
// add first item which must become selected and fire a SelectionEvent
TabItem item = new TabItem( folder, SWT.NONE );
assertEquals( 0, folder.getSelectionIndex() );
assertEquals( 1, folder.getSelection().length );
assertSame( item, folder.getSelection()[ 0 ] );
assertEquals( 1, log.size() );
SelectionEvent event = log.get( 0 );
assertSame( folder, event.widget );
assertSame( item, event.item );
assertTrue( event.doit );
assertEquals( 0, event.x );
assertEquals( 0, event.y );
assertEquals( 0, event.width );
assertEquals( 0, event.height );
assertNull( event.data );
assertEquals( SWT.NONE, event.detail );
assertNull( event.text );
// ... and the same without a SelectionListener
folder.removeSelectionListener( selectionListener );
item.dispose();
item = new TabItem( folder, SWT.NONE );
assertEquals( 0, folder.getSelectionIndex() );
assertEquals( 1, folder.getSelection().length );
assertSame( item, folder.getSelection()[ 0 ] );
}
@Test
public void testIndexOf() {
TabItem item0 = new TabItem( folder, SWT.NONE );
TabItem item1 = new TabItem( folder, SWT.NONE );
assertEquals( 0, folder.indexOf( item0 ) );
assertEquals( 1, folder.indexOf( item1 ) );
item0.dispose();
assertEquals( 0, folder.indexOf( item1 ) );
TabFolder anotherTabFolder = new TabFolder( shell, SWT.NONE );
TabItem anotherItem = new TabItem( anotherTabFolder, SWT.NONE );
assertEquals( -1, folder.indexOf( anotherItem ) );
}
@Test
public void testSelection() {
TabItem item0 = new TabItem( folder, SWT.NONE );
TabItem item1 = new TabItem( folder, SWT.NONE );
folder.setSelection( new TabItem[]{ item0 } );
TabItem[] selection = folder.getSelection();
assertEquals( 1, selection.length );
assertSame( item0, selection[ 0 ] );
assertEquals( 0, folder.getSelectionIndex() );
folder.setSelection( new TabItem[]{ item1, item0 } );
selection = folder.getSelection();
assertEquals( 1, selection.length );
assertSame( item1, selection[ 0 ] );
assertEquals( 1, folder.getSelectionIndex() );
folder.setSelection( new TabItem[ 0 ] );
selection = folder.getSelection();
assertEquals( 0, selection.length );
assertEquals( -1, folder.getSelectionIndex() );
try {
folder.setSelection( ( TabItem )null );
fail( "No exception thrown for selection == null" );
} catch( IllegalArgumentException iae ) {
// expected
}
try {
folder.setSelection( ( TabItem[] )null );
fail( "Parameter items must not be null." );
} catch( IllegalArgumentException iae ) {
// expected
}
folder.setSelection( 1 );
selection = folder.getSelection();
assertEquals( 1, selection.length );
assertSame( item1, selection[ 0 ] );
assertEquals( 1, folder.getSelectionIndex() );
folder.setSelection( 3 );
selection = folder.getSelection();
assertEquals( 1, selection.length );
assertSame( item1, selection[ 0 ] );
assertEquals( 1, folder.getSelectionIndex() );
folder.setSelection( -2 );
selection = folder.getSelection();
assertEquals( 1, selection.length );
assertSame( item1, selection[ 0 ] );
assertEquals( 1, folder.getSelectionIndex() );
folder.setSelection( -1 );
selection = folder.getSelection();
assertEquals( 1, selection.length );
assertSame( item1, selection[ 0 ] );
assertEquals( 1, folder.getSelectionIndex() );
// Ensure that no event is fired when selection is changed programmatically
final boolean[] eventOccured = new boolean[] { false };
SelectionListener listener = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
eventOccured[ 0 ] = true;
}
};
folder.setSelection( 0 );
folder.addSelectionListener( listener );
folder.setSelection( 1 );
assertEquals( 1, folder.getSelectionIndex() );
assertFalse( eventOccured[ 0 ] );
folder.removeSelectionListener( listener );
// test change of selection index in case of disposing the item thats
// currently selected
// TODO: [fappel] note that this is only a preliminarily implementation
// since SWT behaves different in case that the selected
// tab is disposed.
folder.setSelection( 1 );
item1.dispose();
assertEquals( 0, folder.getSelectionIndex() );
assertSame( item0, folder.getSelection()[ 0 ] );
item1 = new TabItem( folder, SWT.NONE );
folder.setSelection( 0 );
item1.dispose();
assertEquals( 0, folder.getSelectionIndex() );
assertSame( item0, folder.getSelection()[ 0 ] );
}
@Test
public void testDispose() {
TabItem item = new TabItem( folder, SWT.NONE );
folder.dispose();
assertTrue( item.isDisposed() );
assertEquals( 0, folder.getAdapter( IItemHolderAdapter.class ).getItems().length );
}
@Test
public void testGetItemAtPoint_top() {
folder.setSize( 400, 400 );
createItems( folder, 3 );
assertEquals( folder.getItem( 0 ), folder.getItem( new Point( 10, 2 ) ) );
assertEquals( folder.getItem( 0 ), folder.getItem( new Point( 10, 10 ) ) );
assertNull( folder.getItem( new Point( 95, 2 ) ) );
assertEquals( folder.getItem( 1 ), folder.getItem( new Point( 95, 10 ) ) );
assertNull( folder.getItem( new Point( 130, 2 ) ) );
assertEquals( folder.getItem( 2 ), folder.getItem( new Point( 160, 10 ) ) );
assertNull( folder.getItem( new Point( 200, 200 ) ) );
}
@Test
public void testGetItemAtPoint_bottom() {
folder = new TabFolder( shell, SWT.BOTTOM );
folder.setSize( 400, 400 );
createItems( folder, 3 );
assertEquals( folder.getItem( 0 ), folder.getItem( new Point( 10, 398 ) ) );
assertEquals( folder.getItem( 0 ), folder.getItem( new Point( 10, 390 ) ) );
assertNull( folder.getItem( new Point( 95, 398 ) ) );
assertEquals( folder.getItem( 1 ), folder.getItem( new Point( 95, 390 ) ) );
assertNull( folder.getItem( new Point( 130, 398 ) ) );
assertEquals( folder.getItem( 2 ), folder.getItem( new Point( 160, 390 ) ) );
assertNull( folder.getItem( new Point( 200, 200 ) ) );
}
@Test( expected = IllegalArgumentException.class )
public void testGetItemAtPoint_nullArgument() {
folder.getItem( null );
}
@Test
public void testClientArea() {
folder.setSize( 100, 100 );
Rectangle expected = new Rectangle( 1, 1, 98, 98 );
assertEquals( expected, folder.getClientArea() );
folder = new TabFolder( shell, SWT.BORDER );
folder.setSize( 100, 100 );
expected = new Rectangle( 2, 2, 96, 96 );
assertEquals( expected, folder.getClientArea() );
folder = new TabFolder( shell, SWT.BOTTOM );
folder.setSize( 100, 100 );
expected = new Rectangle( 1, 1, 98, 98 );
assertEquals( expected, folder.getClientArea() );
folder = new TabFolder( shell, SWT.BOTTOM | SWT.BORDER );
folder.setSize( 100, 100 );
expected = new Rectangle( 2, 2, 96, 96 );
assertEquals( expected, folder.getClientArea() );
}
@Test
public void testClientArea_withTextInItem_top() {
folder = new TabFolder( shell, SWT.TOP );
folder.setSize( 100, 200 );
TabItem item = new TabItem( folder, SWT.NONE );
item.setText( "Item" );
Rectangle expected = new Rectangle( 1, 31, 98, 168 );
assertEquals( expected, folder.getClientArea() );
}
@Test
public void testClientArea_withTextInItem_bottom() {
folder = new TabFolder( shell, SWT.BOTTOM );
folder.setSize( 100, 200 );
TabItem item = new TabItem( folder, SWT.NONE );
item.setText( "Item" );
Rectangle expected = new Rectangle( 1, 1, 98, 168 );
assertEquals( expected, folder.getClientArea() );
}
@Test
public void testClientArea_withImageInItem_top() throws IOException {
folder = new TabFolder( shell, SWT.TOP );
folder.setSize( 100, 200 );
TabItem item = new TabItem( folder, SWT.NONE );
item.setImage( createImage( display, Fixture.IMAGE_50x100 ) );
Rectangle expected = new Rectangle( 1, 117, 98, 82 );
assertEquals( expected, folder.getClientArea() );
}
@Test
public void testClientArea_withImageInItem_bottom() throws IOException {
folder = new TabFolder( shell, SWT.BOTTOM );
folder.setSize( 100, 200 );
TabItem item = new TabItem( folder, SWT.NONE );
item.setImage( createImage( display, Fixture.IMAGE_50x100 ) );
Rectangle expected = new Rectangle( 1, 1, 98, 82 );
assertEquals( expected, folder.getClientArea() );
}
@Test
public void testComputeTrim() {
createItems( folder, 1 );
assertEquals( new Rectangle( -1, -31, 2, 32 ), folder.computeTrim( 0, 0, 0, 0 ) );
folder = new TabFolder( shell, SWT.BORDER );
createItems( folder, 1 );
assertEquals( new Rectangle( -2, -32, 4, 34 ), folder.computeTrim( 0, 0, 0, 0 ) );
folder = new TabFolder( shell, SWT.BOTTOM );
createItems( folder, 1 );
assertEquals( new Rectangle( -1, -1, 2, 32 ), folder.computeTrim( 0, 0, 0, 0 ) );
folder = new TabFolder( shell, SWT.BOTTOM | SWT.BORDER );
createItems( folder, 1 );
assertEquals( new Rectangle( -2, -2, 4, 34 ), folder.computeTrim( 0, 0, 0, 0 ) );
}
@Test
public void testDisposeWithFontDisposeInDisposeListener() {
createItems( folder, 2 );
final Font font = new Font( display, "font-name", 10, SWT.NORMAL );
folder.setFont( font );
folder.addDisposeListener( new DisposeListener() {
@Override
public void widgetDisposed( DisposeEvent event ) {
font.dispose();
}
} );
folder.dispose();
}
@Test
public void testIsSerializable() throws Exception {
TabItem item = new TabItem( folder, SWT.NONE );
item.setText( "item1" );
TabFolder deserializedFolder = serializeAndDeserialize( folder );
assertEquals( folder.getItemCount(), deserializedFolder.getItemCount() );
assertSame( deserializedFolder, deserializedFolder.getItem( 0 ).getParent() );
assertEquals( item.getText(), deserializedFolder.getItem( 0 ).getText() );
}
@Test
public void testAddSelectionListener() {
TabFolder tabFolder = new TabFolder( shell, SWT.NONE );
tabFolder.addSelectionListener( mock( SelectionListener.class ) );
assertTrue( tabFolder.isListening( SWT.Selection ) );
assertTrue( tabFolder.isListening( SWT.DefaultSelection ) );
}
@Test
public void testRemoveSelectionListener() {
TabFolder tabFolder = new TabFolder( shell, SWT.NONE );
SelectionListener listener = mock( SelectionListener.class );
tabFolder.addSelectionListener( listener );
tabFolder.removeSelectionListener( listener );
assertFalse( tabFolder.isListening( SWT.Selection ) );
assertFalse( tabFolder.isListening( SWT.DefaultSelection ) );
}
@Test
public void testAddSelectionListenerWithNullArgument() {
TabFolder tabFolder = new TabFolder( shell, SWT.NONE );
try {
tabFolder.addSelectionListener( null );
} catch( IllegalArgumentException expected ) {
}
}
@Test
public void testRemoveSelectionListenerWithNullArgument() {
TabFolder tabFolder = new TabFolder( shell, SWT.NONE );
try {
tabFolder.removeSelectionListener( null );
} catch( IllegalArgumentException expected ) {
}
}
@Test
public void testSelection_onFirstCreatedItem() {
createItems( folder, 3 );
assertEquals( 0, folder.getSelectionIndex() );
}
@Test
public void testSelection_addItem() {
createItems( folder, 3 );
new TabItem( folder, SWT.NONE, 0 );
assertEquals( 1, folder.getSelectionIndex() );
}
@Test
public void testSelection_removeSelectedItem() {
createItems( folder, 3 );
folder.setSelection( 1 );
folder.getItem( 1 ).dispose();
assertEquals( 0, folder.getSelectionIndex() );
}
@Test
public void testSelection_removeSelectedItemAtPositionZero() {
createItems( folder, 3 );
folder.setSelection( 0 );
folder.getItem( 0 ).dispose();
assertEquals( 0, folder.getSelectionIndex() );
}
@Test
public void testSelection_removeItemBeforeSelected() {
createItems( folder, 3 );
folder.setSelection( 1 );
folder.getItem( 0 ).dispose();
assertEquals( 0, folder.getSelectionIndex() );
}
@Test
public void testSelection_removeAllItems() {
createItems( folder, 3 );
for( int i = 0; i < 3; i++ ) {
folder.getItem( 0 ).dispose();
}
assertEquals( -1, folder.getSelectionIndex() );
}
@Test
public void testGetItemCount() {
createItems( folder, 3 );
assertEquals( 3, folder.getItemCount() );
}
@Test
public void testGetItemCount_initial() {
assertEquals( 0, folder.getItemCount() );
}
@Test
public void testGetItemCount_afterItemDispose() {
createItems( folder, 3 );
folder.getItem( 0 ).dispose();
assertEquals( 2, folder.getItemCount() );
}
@Test
public void testDispose_doesNotFireSelectionEvent() {
createItems( folder, 3 );
Listener listener = mock( Listener.class );
folder.addListener( SWT.Selection, listener );
folder.dispose();
verify( listener, times( 0 ) ).handleEvent( any( Event.class ) );
}
@Test
public void testGetAdapter_LCA() {
assertTrue( folder.getAdapter( WidgetLCA.class ) instanceof TabFolderLCA );
assertSame( folder.getAdapter( WidgetLCA.class ), folder.getAdapter( WidgetLCA.class ) );
}
private void createItems( TabFolder folder, int number ) {
for( int i = 0; i < number; i++ ) {
TabItem item = new TabItem( folder, SWT.NONE );
item.setText( "TabItem " + i );
}
}
}