Package com.eclipsesource.tabris.widgets.swipe

Source Code of com.eclipsesource.tabris.widgets.swipe.SwipeTest

/*******************************************************************************
* 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;
    }

  }

}
TOP

Related Classes of com.eclipsesource.tabris.widgets.swipe.SwipeTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.