/*******************************************************************************
* Copyright (c) 2016 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.internal;
import static org.eclipse.rap.rwt.internal.lifecycle.DisplayUtil.getLCA;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyFloat;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.IOException;
import org.eclipse.rap.json.JsonArray;
import org.eclipse.rap.json.JsonObject;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.internal.service.UISessionImpl;
import org.eclipse.rap.rwt.remote.Connection;
import org.eclipse.rap.rwt.remote.RemoteObject;
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 com.eclipsesource.tabris.test.util.TabrisEnvironment;
import com.eclipsesource.tabris.widgets.PlaybackListener;
import com.eclipsesource.tabris.widgets.Video;
@SuppressWarnings("restriction")
public class VideoRemoteAdapterTest {
@Rule
public TabrisEnvironment environment = new TabrisEnvironment();
private Display display;
private Video video;
private RemoteObject remoteObject;
@Before
public void setUp() {
display = new Display();
Shell shell = new Shell( display );
remoteObject = mock( RemoteObject.class );
Connection connection = mock( Connection.class );
when( connection.createRemoteObject( anyString() ) ).thenReturn( remoteObject );
replaceConnection( connection );
video = new Video( shell, "http://foo/bar" );
}
@Test
public void testRenderControlsVisible_initially() {
render();
verify( remoteObject, never() ).set( eq( "controlsVisible" ), anyBoolean() );
}
@Test
public void testRenderControlsVisible_changed() {
video.setPlayerControlsVisible( true );
render();
verify( remoteObject ).set( "controlsVisible", true );
}
@Test
public void testRenderControlsVisible_unchanged() {
video.setPlayerControlsVisible( true );
render();
reset( remoteObject );
render();
verify( remoteObject, never() ).set( eq( "controlsVisible" ), anyBoolean() );
}
@Test
public void testRenderControlsVisible_changedBack() {
video.setPlayerControlsVisible( true );
video.setPlayerControlsVisible( false );
render();
verify( remoteObject, never() ).set( eq( "controlsVisible" ), anyBoolean() );
}
@Test
public void testRenderPlaybackSpeed_initially() {
render();
verify( remoteObject, never() ).set( eq( "speed" ), anyFloat() );
}
@Test
public void testRenderPlaybackSpeed_changed() {
video.setSpeed( 0.8f );
render();
verify( remoteObject ).set( "speed", 0.8f );
}
@Test
public void testRenderPlaybackSpeed_unchanged() {
video.setSpeed( 0.8f );
render();
reset( remoteObject );
render();
verify( remoteObject, never() ).set( eq( "speed" ), anyFloat() );
}
@Test
public void testRenderPlaybackSpeed_changedBack() {
video.setSpeed( 0.8f );
video.setSpeed( Video.PAUSE_SPEED );
render();
verify( remoteObject, never() ).set( eq( "speed" ), anyFloat() );
}
@Test
public void testRenderPlaybackListener_initially() {
render();
verify( remoteObject, never() ).listen( eq( "Playback" ), anyBoolean() );
}
@Test
public void testRenderPlaybackListener_changed() {
video.addPlaybackListener( mock( PlaybackListener.class ) );
render();
verify( remoteObject ).listen( "Playback", true );
}
@Test
public void testRenderPlaybackListener_unchanged() {
video.addPlaybackListener( mock( PlaybackListener.class ) );
render();
reset( remoteObject );
render();
verify( remoteObject, never() ).listen( eq( "Playback" ), anyBoolean() );
}
@Test
public void testRenderPlaybackListener_changedBack() {
PlaybackListener listener = mock( PlaybackListener.class );
video.addPlaybackListener( listener );
video.removePlaybackListener( listener );
render();
verify( remoteObject, never() ).listen( eq( "Playback" ), anyBoolean() );
}
@Test
public void testRenderBounds_initially() {
render();
verify( remoteObject, never() ).set( eq( "bounds" ), any( JsonArray.class ) );
}
@Test
public void testRenderBounds_changed() throws Exception {
video.setBounds( 1, 2, 3, 4 );
render();
JsonArray expected = new JsonArray().add( 0 ).add( 0 ).add( 3 ).add( 4 );
verify( remoteObject ).set( eq( "bounds" ), eq( expected ) );
}
@Test
public void testRenderBounds_unchanged() {
video.setBounds( 1, 2, 3, 4 );
render();
reset( remoteObject );
render();
verify( remoteObject, never() ).set( eq( "bounds" ), any( JsonArray.class ) );
}
@Test
public void testRenderBounds_changedBack() {
video.setBounds( 1, 2, 3, 4 );
video.setBounds( 0, 0, 0, 0 );
render();
verify( remoteObject, never() ).set( eq( "bounds" ), any( JsonArray.class ) );
}
@Test
public void testRenderStepToTime() {
video.stepToTime( 5 );
render();
verify( remoteObject ).call( "stepToTime", new JsonObject().add( "time", 5 ) );
}
@Test
public void testRenderStepToTime_onlyOnce() {
video.stepToTime( 5 );
video.stepToTime( 10 );
render();
verify( remoteObject, times( 1 ) ).call( eq( "stepToTime" ), any( JsonObject.class ) );
}
@Test
public void testRenderStepToTime_suppressesSkipFromCurrent() {
video.skipFromCurrent( 10 );
video.stepToTime( 5 );
render();
verify( remoteObject, never() ).call( eq( "skip" ), any( JsonObject.class ) );
verify( remoteObject ).call( "stepToTime", new JsonObject().add( "time", 5 ) );
}
@Test
public void testRenderSkipFromCurrent() {
video.skipFromCurrent( 5 );
render();
verify( remoteObject ).call( "skip", new JsonObject().add( "time", 5 ) );
}
@Test
public void testRenderSkipFromCurrent_onlyOnce() {
video.skipFromCurrent( 5 );
video.skipFromCurrent( 10 );
render();
verify( remoteObject, times( 1 ) ).call( eq( "skip" ), any( JsonObject.class ) );
}
@Test
public void testRenderSkipFromCurrent_suppressesStepToFrame() {
video.stepToTime( 5 );
video.skipFromCurrent( 10 );
render();
verify( remoteObject ).call( "skip", new JsonObject().add( "time", 10 ) );
verify( remoteObject, never() ).call( eq( "stepToTime" ), any( JsonObject.class ) );
}
@Test
public void testRenderClearCache() {
video.clearCache();
render();
verify( remoteObject ).call( "clearCache", null );
}
@Test
public void testRenderClearCache_onlyOnce() {
video.clearCache();
video.clearCache();
render();
verify( remoteObject, times( 1 ) ).call( "clearCache", null );
}
private void render() {
try {
getLCA( display ).render( display );
} catch( IOException shouldNotHappen ) {
fail( shouldNotHappen.getMessage() );
}
}
private void replaceConnection( Connection connection ) {
UISessionImpl uiSession = ( UISessionImpl )RWT.getUISession();
uiSession.setConnection( connection );
}
}