/*******************************************************************************
* 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.widgets.swipe;
import static com.eclipsesource.tabris.internal.DataWhitelist.WhiteListEntry.SWIPE;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.Serializable;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.InOrder;
import com.eclipsesource.tabris.internal.SwipeItemHolder;
import com.eclipsesource.tabris.internal.ZIndexStackLayout;
import com.eclipsesource.tabris.test.util.TabrisEnvironment;
public class SwipeTest {
@Rule
public TabrisEnvironment environment = new TabrisEnvironment();
private Shell shell;
@Before
public void setUp() {
shell = new Shell( new Display() );
}
@Test
public void testIsSerializable() {
assertTrue( Serializable.class.isAssignableFrom( Swipe.class ) );
}
@Test
public void testSwipeListenerIsSerializable() {
assertTrue( Serializable.class.isAssignableFrom( SwipeListener.class ) );
}
@Test
public void testSwipeItemProviderIsSerializable() {
assertTrue( Serializable.class.isAssignableFrom( SwipeItemProvider.class ) );
}
@Test
public void testSwipeItemIsSerializable() {
assertTrue( Serializable.class.isAssignableFrom( SwipeItem.class ) );
}
@Test( expected = IllegalArgumentException.class )
public void testFailsWithNullParent() {
new Swipe( null, mock( SwipeItemProvider.class ) );
}
@Test( expected = IllegalArgumentException.class )
public void testFailsWithNullProvider() {
new Swipe( mock( Composite.class ), null );
}
@Test
public void testSetsSwipeData() {
SwipeItemProvider itemProvider = mockProvider( 0 );
Swipe swipe = new Swipe( shell, itemProvider );
Composite container = swipe.getContainer();
Object data = container.getData( SWIPE.getKey() );
assertEquals( Boolean.TRUE, data );
}
@Test
public void testGetControl() {
SwipeItemProvider itemProvider = mockProvider( 0 );
Swipe swipe = new Swipe( shell, itemProvider );
Control control = swipe.getControl();
assertEquals( shell, control.getParent() );
}
@Test
public void testControlUsesSwipeLayout() {
SwipeItemProvider itemProvider = mockProvider( 0 );
Swipe swipe = new Swipe( shell, itemProvider );
Composite control = ( Composite )swipe.getControl();
assertTrue( control.getLayout() instanceof ZIndexStackLayout );
}
@Test
public void testGetControlDoesNotCreateNewControl() {
SwipeItemProvider itemProvider = mockProvider( 0 );
Swipe swipe = new Swipe( shell, itemProvider );
Control control = swipe.getControl();
Control control2 = swipe.getControl();
assertSame( control, control2 );
}
@Test( expected = IllegalArgumentException.class )
public void testShowWithNegativeValueFails() {
SwipeItemProvider itemProvider = mockProvider( 0 );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( -1 );
}
@Test( expected = IllegalArgumentException.class )
public void testShowWithNonExistingItemFails() {
SwipeItemProvider itemProvider = mockProvider( 0 );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 23 );
}
@Test
public void testShowsZeroByDefault() {
SwipeItemProvider itemProvider = mockProvider( 2 );
SwipeItem firstItem = mockSwipeItem( itemProvider, 0, true );
SwipeItem secondItem = mockSwipeItem( itemProvider, 1, true );
new Swipe( shell, itemProvider );
InOrder order = inOrder( firstItem, secondItem );
order.verify( firstItem ).load( any( Composite.class ) );
order.verify( firstItem ).activate( any( SwipeContext.class ) );
order.verify( secondItem ).load( any( Composite.class ) );
}
@Test
public void testInitializesWithFirstTwoItemsOnShowZero() {
SwipeItemProvider itemProvider = mockProvider( 2 );
SwipeItem firstItem = mockSwipeItem( itemProvider, 0, true );
SwipeItem secondItem = mockSwipeItem( itemProvider, 1, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 0 );
InOrder order = inOrder( firstItem, secondItem );
order.verify( firstItem ).load( any( Composite.class ) );
order.verify( firstItem ).activate( any( SwipeContext.class ) );
order.verify( secondItem ).load( any( Composite.class ) );
}
@Test
public void testInitializesWithFirstTwoItemsOnShowZeroWithBiggerCache() {
SwipeItemProvider itemProvider = mockProvider( 0 );
SwipeItem firstItem = mockSwipeItem( itemProvider, 0, true );
SwipeItem secondItem = mockSwipeItem( itemProvider, 1, true );
SwipeItem thirdItem = mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
mockProviderSize( itemProvider, 3 );
swipe.setCacheSize( 2 );
swipe.show( 0 );
InOrder order = inOrder( firstItem, secondItem, thirdItem );
order.verify( firstItem ).load( any( Composite.class ) );
order.verify( firstItem ).activate( any( SwipeContext.class ) );
order.verify( secondItem ).load( any( Composite.class ) );
order.verify( thirdItem ).load( any( Composite.class ) );
}
@Test
public void testLoadsItemsOnlyOnce() {
SwipeItemProvider itemProvider = mockProvider( 0 );
SwipeItem currentItem = mockSwipeItem( itemProvider, 0, true );
SwipeItem nextItem = mockSwipeItem( itemProvider, 1, true );
Swipe swipe = new Swipe( shell, itemProvider );
mockProviderSize( itemProvider, 2 );
swipe.show( 0 );
swipe.show( 0 );
verify( nextItem ).isPreloadable();
verify( currentItem ).load( any( Composite.class ) );
verify( currentItem ).activate( any( SwipeContext.class ) );
verify( nextItem ).load( any( Composite.class ) );
}
@Test
public void testPreloadsNextItem() {
SwipeItemProvider itemProvider = mockProvider( 2 );
mockSwipeItem( itemProvider, 0, true );
SwipeItem nextItem = mockSwipeItem( itemProvider, 1, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 0 );
verify( nextItem ).isPreloadable();
verify( nextItem ).load( any( Composite.class ) );
}
@Test
public void testPreloadsNextItemsWithBiggerCache() {
SwipeItemProvider itemProvider = mockProvider( 0 );
mockSwipeItem( itemProvider, 0, true );
SwipeItem nextItem = mockSwipeItem( itemProvider, 1, true );
SwipeItem thridItem = mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
mockProviderSize( itemProvider, 3 );
swipe.setCacheSize( 2 );
swipe.show( 0 );
verify( nextItem ).isPreloadable();
verify( nextItem ).load( any( Composite.class ) );
verify( thridItem ).isPreloadable();
verify( thridItem ).load( any( Composite.class ) );
}
@Test
public void testRefreshLoadsNewItems() {
SwipeItemProvider itemProvider = mockProvider( 1 );
mockSwipeItem( itemProvider, 0, true );
SwipeItem nextItem = mockSwipeItem( itemProvider, 1, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 0 );
mockProviderSize( itemProvider, 2 );
swipe.refresh();
verify( nextItem ).isPreloadable();
verify( nextItem ).load( any( Composite.class ) );
}
@Test
public void testSetCacheSizeTriggersRefresh() {
SwipeItemProvider itemProvider = mockProvider( 3 );
mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 1, true );
SwipeItem itemToLoad = mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.setCacheSize( 2 );
verify( itemToLoad ).isPreloadable();
verify( itemToLoad ).load( any( Composite.class ) );
}
@Test
public void testDeactivatesPreviousItemAndLoadsNextFromLeft() {
SwipeItemProvider itemProvider = mockProvider( 3 );
SwipeItem previousItem = mockSwipeItem( itemProvider, 0, true );
SwipeItem currentItem = mockSwipeItem( itemProvider, 1, true );
SwipeItem nextItem = mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 0 );
swipe.show( 1 );
InOrder order = inOrder( previousItem, currentItem, nextItem );
order.verify( previousItem ).deactivate( any( SwipeContext.class ) );
order.verify( currentItem ).activate( any( SwipeContext.class ) );
order.verify( nextItem ).load( any( Composite.class ) );
}
@Test
public void testDeactivatesPreviousItemAndLoadsNextFromLeftWithBiggerCache() {
SwipeItemProvider itemProvider = mockProvider( 5 );
mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 1, true );
SwipeItem thirdItem = mockSwipeItem( itemProvider, 2, true );
SwipeItem fourthItem = mockSwipeItem( itemProvider, 3, true );
SwipeItem fifthItem = mockSwipeItem( itemProvider, 4, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.setCacheSize( 2 );
swipe.show( 3 );
swipe.show( 4 );
InOrder order = inOrder( thirdItem, fourthItem, fifthItem );
order.verify( fourthItem ).load( any( Composite.class ) );
order.verify( fourthItem ).activate( any( SwipeContext.class ) );
order.verify( fifthItem ).load( any( Composite.class ) );
order.verify( fourthItem ).deactivate( any( SwipeContext.class ) );
}
@Test
public void testDeactivatesPreviousItemAndLoadsNextFromRight() {
SwipeItemProvider itemProvider = mockProvider( 0 );
SwipeItem nextItem = mockSwipeItem( itemProvider, 0, true );
SwipeItem currentItem = mockSwipeItem( itemProvider, 1, true );
SwipeItem previousItem = mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
mockProviderSize( itemProvider, 3 );
swipe.show( 2 );
swipe.show( 1 );
verify( previousItem ).deactivate( any( SwipeContext.class ) );
verify( currentItem ).load( any( Composite.class ) );
verify( currentItem ).activate( any( SwipeContext.class ) );
verify( nextItem ).load( any( Composite.class ) );
}
@Test
public void testDeactivatesPreviousItemAndLoadsNextFromRightWithBiggerCache() {
SwipeItemProvider itemProvider = mockProvider( 0 );
SwipeItem zeroItem = mockSwipeItem( itemProvider, 0, true );
SwipeItem firstItem = mockSwipeItem( itemProvider, 1, true );
SwipeItem secondItem = mockSwipeItem( itemProvider, 2, true );
SwipeItem thirdItem = mockSwipeItem( itemProvider, 3, true );
SwipeItem fourthItem = mockSwipeItem( itemProvider, 4, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.setCacheSize( 2 );
mockProviderSize( itemProvider, 5 );
swipe.show( 3 );
swipe.show( 2 );
verify( thirdItem ).load( any( Composite.class ) );
verify( thirdItem ).activate( any( SwipeContext.class ) );
verify( firstItem ).load( any( Composite.class ) );
verify( secondItem ).load( any( Composite.class ) );
verify( fourthItem ).load( any( Composite.class ) );
verify( thirdItem ).deactivate( any( SwipeContext.class ) );
verify( secondItem ).activate( any( SwipeContext.class ) );
verify( zeroItem ).load( any( Composite.class ) );
}
@Test
public void testDisposesItemContentWhenOutOfRangeFromLeft() {
SwipeItemProvider itemProvider = mockProvider( 4 );
TestItem outOfRangeItem = mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 1, true );
mockSwipeItem( itemProvider, 2, true );
mockSwipeItem( itemProvider, 3, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 1 );
swipe.show( 2 );
verify( outOfRangeItem ).load( any( Composite.class ) );
assertTrue( outOfRangeItem.getLoadedComposite().isDisposed() );
}
@Test
public void testDisposesItemContentWhenOutOfRangeFromRight() {
SwipeItemProvider itemProvider = mockProvider( 4 );
TestItem outOfRangeItem = mockSwipeItem( itemProvider, 3, true );
mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 1, true );
mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 2 );
swipe.show( 1 );
verify( outOfRangeItem ).load( any( Composite.class ) );
assertTrue( outOfRangeItem.getLoadedComposite().isDisposed() );
}
@Test
public void testLoadsPreviousAndNextItem() {
SwipeItemProvider itemProvider = mockProvider( 3 );
SwipeItem previousItem = mockSwipeItem( itemProvider, 0, true );
SwipeItem currentItem = mockSwipeItem( itemProvider, 1, true );
SwipeItem nextItem = mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 1 );
InOrder order = inOrder( previousItem, currentItem, nextItem );
order.verify( previousItem ).load( any( Composite.class ) );
order.verify( currentItem ).activate( any( SwipeContext.class ) );
order.verify( nextItem ).load( any( Composite.class ) );
}
@Test
public void testDoesNotPreLoadPreviousAndNextItemWhenForbidden() {
SwipeItemProvider itemProvider = mockProvider( 0 );
SwipeItem previousItem = mockSwipeItem( itemProvider, 0, false );
SwipeItem currentItem = mockSwipeItem( itemProvider, 1, true );
SwipeItem nextItem = mockSwipeItem( itemProvider, 2, false );
Swipe swipe = new Swipe( shell, itemProvider );
mockProviderSize( itemProvider, 3 );
swipe.show( 1 );
InOrder order = inOrder( previousItem, currentItem, nextItem );
order.verify( previousItem, never() ).load( any( Composite.class ) );
order.verify( currentItem ).load( any( Composite.class ) );
order.verify( currentItem ).activate( any( SwipeContext.class ) );
order.verify( nextItem, never() ).load( any( Composite.class ) );
}
@Test
public void testDoesRespectItemsSize() {
SwipeItemProvider itemProvider = mockProvider( 3 );
mockSwipeItem( itemProvider, 0, true );
SwipeItem previousItem = mockSwipeItem( itemProvider, 1, true );
SwipeItem currentItem = mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 2 );
InOrder order = inOrder( previousItem, currentItem, itemProvider );
order.verify( previousItem ).load( any( Composite.class ) );
order.verify( currentItem ).load( any( Composite.class ) );
order.verify( currentItem ).activate( any( SwipeContext.class ) );
order.verify( itemProvider, never() ).getItem( 3 );
}
@Test
public void testDoesRespectItemsSizeWhenShiftingLeft() {
SwipeItemProvider itemProvider = mockProvider( 3 );
mockSwipeItem( itemProvider, 0, true );
SwipeItem previousItem = mockSwipeItem( itemProvider, 1, true );
SwipeItem currentItem = mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.setCacheSize( 2 );
swipe.show( 2 );
swipe.show( 1 );
InOrder order = inOrder( previousItem, currentItem, itemProvider );
order.verify( previousItem ).load( any( Composite.class ) );
order.verify( currentItem ).load( any( Composite.class ) );
order.verify( currentItem ).activate( any( SwipeContext.class ) );
order.verify( itemProvider, never() ).getItem( 3 );
order.verify( itemProvider, never() ).getItem( 4 );
}
@Test
public void testRotateLoadsItemOnlyOnce() {
SwipeItemProvider itemProvider = mockProvider( 3 );
SwipeItem middleItem = mockSwipeItem( itemProvider, 1, true );
mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 0 );
swipe.show( 1 );
swipe.show( 2 );
swipe.show( 1 );
swipe.show( 0 );
verify( middleItem, times( 1 ) ).load( any( Composite.class ) );
}
@Test
public void testRotateLoadsItemMultipleTimesWhenItWasOutOfRange() {
SwipeItemProvider itemProvider = mockProvider( 4 );
SwipeItem middleItem = mockSwipeItem( itemProvider, 1, true );
mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 2, true );
mockSwipeItem( itemProvider, 3, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 0 );
swipe.show( 1 );
swipe.show( 2 );
swipe.show( 3 );
swipe.show( 2 );
swipe.show( 1 );
verify( middleItem, times( 2 ) ).load( any( Composite.class ) );
}
@Test
public void testRotateActivatesItemTwice() {
SwipeItemProvider itemProvider = mockProvider( 3 );
SwipeItem middleItem = mockSwipeItem( itemProvider, 1, true );
mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 0 );
swipe.show( 1 );
swipe.show( 2 );
swipe.show( 1 );
swipe.show( 0 );
verify( middleItem, times( 2 ) ).activate( any( SwipeContext.class ) );
}
@Test
public void testFlipFlopActivatesItemMultipleTimesButLoadsItOnlyOnce() {
SwipeItemProvider itemProvider = mockProvider( 3 );
SwipeItem middleItem = mockSwipeItem( itemProvider, 1, true );
mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
for( int i = 0; i < 10; i++ ) {
swipe.show( 0 );
swipe.show( 1 );
}
verify( middleItem, times( 1 ) ).load( any( Composite.class ) );
verify( middleItem, times( 10 ) ).activate( any( SwipeContext.class ) );
}
@Test
public void testShowUpdatesActiveClientItem() {
SwipeItemProvider itemProvider = mockProvider( 2 );
mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 1, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 0 );
swipe.show( 1 );
int activeClientItem = swipe.getHandler().getActiveClientItem();
assertEquals( 1, activeClientItem );
}
@Test
public void testShowSetsTopControlOnStack() {
SwipeItemProvider itemProvider = mockProvider( 1 );
TestItem item = mockSwipeItem( itemProvider, 0, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 0 );
Composite control = ( Composite )swipe.getControl();
ZIndexStackLayout layout = ( ZIndexStackLayout )control.getLayout();
assertSame( item.getLoadedComposite(), layout.getOnTopControl() );
}
@Test
public void testShowSetsTopControlOnStackWithMoultipleItems() {
SwipeItemProvider itemProvider = mockProvider( 2 );
TestItem item = mockSwipeItem( itemProvider, 0, true );
TestItem item2 = mockSwipeItem( itemProvider, 1, true );
Swipe swipe = new Swipe( shell, itemProvider );
Composite control = ( Composite )swipe.getControl();
ZIndexStackLayout layout = ( ZIndexStackLayout )control.getLayout();
swipe.show( 0 );
assertSame( item.getLoadedComposite(), layout.getOnTopControl() );
swipe.show( 1 );
assertSame( item2.getLoadedComposite(), layout.getOnTopControl() );
}
@Test
public void testGetSwipeContextDoesNotCreateNewContext() {
SwipeItemProvider itemProvider = mockProvider( 0 );
Swipe swipe = new Swipe( shell, itemProvider );
SwipeContext context1 = swipe.getContext();
SwipeContext context2 = swipe.getContext();
assertSame( context1, context2 );
}
@Test
public void testUsesSameContextForActivation() {
SwipeItemProvider itemProvider = mockProvider( 3 );
SwipeItem previousItem = mockSwipeItem( itemProvider, 0, true );
SwipeItem currentItem = mockSwipeItem( itemProvider, 1, true );
SwipeItem nextItem = mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
SwipeContext context = swipe.getContext();
swipe.show( 0 );
swipe.show( 1 );
swipe.show( 2 );
InOrder order = inOrder( previousItem, currentItem, nextItem );
order.verify( previousItem ).activate( context );
order.verify( currentItem ).activate( context );
order.verify( nextItem ).activate( context );
}
@Test
public void testUsesSameContextForDeactivation() {
SwipeItemProvider itemProvider = mockProvider( 3 );
SwipeItem previousItem = mockSwipeItem( itemProvider, 0, true );
SwipeItem currentItem = mockSwipeItem( itemProvider, 1, true );
SwipeItem nextItem = mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
SwipeContext context = swipe.getContext();
swipe.show( 0 );
swipe.show( 1 );
swipe.show( 2 );
swipe.show( 1 );
InOrder order = inOrder( previousItem, currentItem, nextItem );
order.verify( previousItem ).deactivate( context );
order.verify( currentItem ).deactivate( context );
order.verify( nextItem ).deactivate( context );
}
@Test
public void testHandlesJumpCorreclty() {
SwipeItemProvider itemProvider = mockProvider( 6 );
SwipeItem firstPreviousItem = mockSwipeItem( itemProvider, 0, true );
SwipeItem firstCurrentItem = mockSwipeItem( itemProvider, 1, true );
SwipeItem firstNextItem = mockSwipeItem( itemProvider, 2, true );
SwipeItem secondPreviousItem = mockSwipeItem( itemProvider, 3, true );
SwipeItem secondCurrentItem = mockSwipeItem( itemProvider, 4, true );
SwipeItem secondNextItem = mockSwipeItem( itemProvider, 5, true );
Swipe swipe = new Swipe( shell, itemProvider );
SwipeContext context = swipe.getContext();
swipe.show( 1 );
swipe.show( 4 );
InOrder order = inOrder( firstPreviousItem, firstCurrentItem, firstNextItem,
secondPreviousItem, secondCurrentItem, secondNextItem );
order.verify( firstPreviousItem ).load( any( Composite.class ) );
order.verify( firstCurrentItem ).load( any( Composite.class ) );
order.verify( firstCurrentItem ).activate( context );
order.verify( firstNextItem ).load( any( Composite.class ) );
order.verify( firstCurrentItem ).deactivate( context );
order.verify( secondPreviousItem ).load( any( Composite.class ) );
order.verify( secondCurrentItem ).load( any( Composite.class ) );
order.verify( secondCurrentItem ).activate( context );
order.verify( secondNextItem ).load( any( Composite.class ) );
}
@Test
public void testRegistersDisposeListenerOnControl() {
SwipeItemProvider itemProvider = mockProvider( 0 );
Swipe swipe = new Swipe( shell, itemProvider );
Control control = swipe.getControl();
control.dispose();
verify( environment.getRemoteObject() ).destroy();
}
@Test
public void testDisposeDisposesControl() {
SwipeItemProvider itemProvider = mockProvider( 0 );
Swipe swipe = new Swipe( shell, itemProvider );
Control control = swipe.getControl();
swipe.dispose();
assertTrue( control.isDisposed() );
}
@Test
public void testDisposeDestroysRemoteObject() {
SwipeItemProvider itemProvider = mockProvider( 0 );
new Swipe( shell, itemProvider );
shell.dispose();
verify( environment.getRemoteObject() ).destroy();
}
@Test
public void testDisposeRemovesItems() {
SwipeItemProvider itemProvider = mockProvider( 1 );
mockSwipeItem( itemProvider, 0, true );
Swipe swipe = new Swipe( shell, itemProvider );
SwipeItemHolder itemHolder = swipe.getItemHolder();
swipe.show( 0 );
swipe.dispose();
assertNull( itemHolder.getItem( 0 ) );
}
@Test
public void testDisposeNotifiesListeners() {
SwipeItemProvider itemProvider = mockProvider( 1 );
mockSwipeItem( itemProvider, 0, true );
Swipe swipe = new Swipe( shell, itemProvider );
SwipeListener listener = mock( SwipeListener.class );
swipe.addSwipeListener( listener );
swipe.show( 0 );
shell.dispose();
verify( listener ).disposed( swipe.getContext() );
}
@Test( expected = IllegalStateException.class )
public void testShowAfterDisposeFails() {
SwipeItemProvider itemProvider = mockProvider( 1 );
mockSwipeItem( itemProvider, 0, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.dispose();
swipe.show( 0 );
}
@Test( expected = IllegalStateException.class )
public void testSetCacheSizeAfterDisposeFails() {
SwipeItemProvider itemProvider = mockProvider( 1 );
mockSwipeItem( itemProvider, 0, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.dispose();
swipe.setCacheSize( 23 );
}
@Test( expected = IllegalStateException.class )
public void testAddListenerAfterDisposeFails() {
SwipeItemProvider itemProvider = mockProvider( 1 );
mockSwipeItem( itemProvider, 0, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.dispose();
swipe.addSwipeListener( mock( SwipeListener.class ) );
}
@Test( expected = IllegalStateException.class )
public void testRemoveListenerAfterDisposeFails() {
SwipeItemProvider itemProvider = mockProvider( 1 );
mockSwipeItem( itemProvider, 0, true );
Swipe swipe = new Swipe( shell, itemProvider );
SwipeListener listener = mock( SwipeListener.class );
swipe.addSwipeListener( listener );
swipe.dispose();
swipe.removeSwipeListener( listener );
}
@Test
public void testNotifiesListenerAboutLoadingAndActivation() {
SwipeItemProvider itemProvider = mockProvider( 0 );
SwipeItem previousItem = mockSwipeItem( itemProvider, 0, true );
SwipeItem currentItem = mockSwipeItem( itemProvider, 1, true );
SwipeItem nextItem = mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
SwipeListener listener = mock( SwipeListener.class );
swipe.addSwipeListener( listener );
mockProviderSize( itemProvider, 3 );
swipe.show( 1 );
InOrder order = inOrder( listener );
order.verify( listener ).itemLoaded( previousItem, 0 );
order.verify( listener ).itemActivated( eq( currentItem ), eq( 1 ), any( SwipeContext.class ) );
order.verify( listener ).itemLoaded( nextItem, 2 );
}
@Test
public void testNotifiesListenerAboutActivationFromLeft() {
SwipeItemProvider itemProvider = mockProvider( 0 );
SwipeItem previousItem = mockSwipeItem( itemProvider, 0, true );
SwipeItem currentItem = mockSwipeItem( itemProvider, 1, true );
mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
SwipeListener listener = mock( SwipeListener.class );
swipe.addSwipeListener( listener );
mockProviderSize( itemProvider, 3 );
swipe.show( 1 );
swipe.show( 0 );
InOrder order = inOrder( listener );
order.verify( listener ).itemActivated( eq( currentItem ), eq( 1 ), any( SwipeContext.class ) );
order.verify( listener ).itemActivated( eq( previousItem ), eq( 0 ), any( SwipeContext.class ) );
}
@Test
public void testNotifiesListenerAboutDeactivation() {
SwipeItemProvider itemProvider = mockProvider( 3 );
SwipeItem previousItem = mockSwipeItem( itemProvider, 0, true );
SwipeItem currentItem = mockSwipeItem( itemProvider, 1, true );
SwipeItem nextItem = mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
SwipeListener listener = mock( SwipeListener.class );
swipe.addSwipeListener( listener );
swipe.show( 0 );
swipe.show( 1 );
InOrder order = inOrder( listener );
order.verify( listener ).itemDeactivated( eq( previousItem ), eq( 0 ), any( SwipeContext.class ) );
order.verify( listener ).itemActivated( eq( currentItem ), eq( 1 ), any( SwipeContext.class ) );
order.verify( listener ).itemLoaded( nextItem, 2 );
}
@Test
public void testNotifiesListenerAboutDeactivationWithBiggerCacheSize() {
SwipeItemProvider itemProvider = mockProvider( 0 );
mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 1, true );
mockSwipeItem( itemProvider, 2, true );
mockSwipeItem( itemProvider, 3, true );
mockSwipeItem( itemProvider, 4, true );
Swipe swipe = new Swipe( shell, itemProvider );
SwipeListener listener = mock( SwipeListener.class );
swipe.addSwipeListener( listener );
swipe.setCacheSize( 2 );
mockProviderSize( itemProvider, 5 );
swipe.show( 2 );
swipe.show( 3 );
verify( listener, times( 1 ) ).itemDeactivated( any( SwipeItem.class ), anyInt(), any( SwipeContext.class ) );
}
@Test( expected = IllegalStateException.class )
public void testShowRightLockedFails() {
SwipeItemProvider itemProvider = mockProvider( 2 );
mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 1, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 0 );
swipe.lock( SWT.RIGHT );
swipe.show( 1 );
}
@Test
public void testShowRightUnlockedFailsNot() {
SwipeItemProvider itemProvider = mockProvider( 2 );
mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 1, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 0 );
swipe.lock( SWT.RIGHT );
swipe.unlock( SWT.RIGHT );
swipe.show( 1 );
}
@Test( expected = IllegalStateException.class )
public void testShowLeftLockedFails() {
SwipeItemProvider itemProvider = mockProvider( 2 );
mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 1, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 1 );
swipe.lock( SWT.LEFT );
swipe.show( 0 );
}
@Test( expected = IllegalStateException.class )
public void testShowLeftLockedFailsWithJump() {
SwipeItemProvider itemProvider = mockProvider( 4 );
mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 1, true );
mockSwipeItem( itemProvider, 2, true );
mockSwipeItem( itemProvider, 3, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 2 );
swipe.lock( SWT.LEFT );
swipe.show( 3 );
swipe.show( 0 );
}
@Test
public void testShowLeftLockedFailsNotWhenJumpToLockedItem() {
SwipeItemProvider itemProvider = mockProvider( 4 );
mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 1, true );
mockSwipeItem( itemProvider, 2, true );
mockSwipeItem( itemProvider, 3, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 1 );
swipe.lock( SWT.LEFT );
swipe.show( 2 );
swipe.show( 3 );
swipe.lock( SWT.RIGHT );
swipe.show( 1 );
}
@Test
public void testShowLeftUnlockedFailsNot() {
SwipeItemProvider itemProvider = mockProvider( 2 );
mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 1, true );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.show( 1 );
swipe.lock( SWT.LEFT );
swipe.unlock( SWT.LEFT );
swipe.show( 0 );
}
@Test( expected = IllegalArgumentException.class )
public void testLockFailsWIthInvalidDirection() {
SwipeItemProvider itemProvider = mockProvider( 0 );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.lock( SWT.ABORT );
}
@Test( expected = IllegalArgumentException.class )
public void testUnLockFailsWIthInvalidDirection() {
SwipeItemProvider itemProvider = mockProvider( 0 );
Swipe swipe = new Swipe( shell, itemProvider );
swipe.unlock( SWT.ABORT );
}
@Test( expected = IllegalStateException.class )
public void testFailsWhenRemovingActiveItem() {
SwipeItemProvider itemProvider = mockProvider( 0 );
mockSwipeItem( itemProvider, 0, true );
mockSwipeItem( itemProvider, 1, true );
mockSwipeItem( itemProvider, 2, true );
Swipe swipe = new Swipe( shell, itemProvider );
mockProviderSize( itemProvider, 3 );
swipe.show( 1 );
mockProviderSize( itemProvider, 1 );
swipe.refresh();
}
public static TestItem mockSwipeItem( SwipeItemProvider itemProvider, int itemIndex, boolean preloadable ) {
TestItem swipeItem = spy( new TestItem() );
when( itemProvider.getItem( itemIndex ) ).thenReturn( swipeItem );
doReturn( Boolean.valueOf( preloadable ) ).when( swipeItem ).isPreloadable();
return swipeItem;
}
public static SwipeItemProvider mockProvider( int itemCount ) {
SwipeItemProvider provider = mock( SwipeItemProvider.class );
doReturn( Integer.valueOf( itemCount ) ).when( provider ).getItemCount();
return provider;
}
public static void mockProviderSize( SwipeItemProvider provider, int itemCount ) {
doReturn( Integer.valueOf( itemCount ) ).when( provider ).getItemCount();
}
public static class TestItem implements SwipeItem {
private Composite composite;
public Composite getLoadedComposite() {
return composite;
}
@Override
public Composite load( Composite parent ) {
composite = new Composite( parent, SWT.NONE );
return composite;
}
@Override
public void activate( SwipeContext context ) {
// do nothing, used for mocking
}
@Override
public void deactivate( SwipeContext context ) {
// do nothing, used for mocking
}
@Override
public boolean isPreloadable() {
return true;
}
}
}