/******************************************************************************* * 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.anyBoolean; 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.rwt.RWT; import org.eclipse.rap.rwt.internal.lifecycle.RemoteAdapter; 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.SWT; import org.eclipse.swt.internal.widgets.WidgetRemoteAdapter; import org.eclipse.swt.widgets.Composite; 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.RefreshComposite; import com.eclipsesource.tabris.widgets.RefreshListener; @SuppressWarnings("restriction") public class RefreshCompositeRemoteAdapterTest { @Rule public TabrisEnvironment environment = new TabrisEnvironment(); private Display display; private RefreshComposite composite; 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 ); composite = new RefreshComposite( shell, SWT.NONE ); } @Test public void testRenderMessage_initially() { render(); verify( remoteObject, never() ).set( eq( "message" ), anyString() ); } @Test public void testRenderMessage_changed() { composite.setMessage( "foo" ); render(); verify( remoteObject ).set( "message", "foo" ); } @Test public void testRenderMessage_changed_twice() { composite.setMessage( "foo" ); render(); reset( remoteObject ); composite.setMessage( "bar" ); render(); verify( remoteObject ).set( "message", "bar" ); } @Test public void testRenderMessage_unchanged() { composite.setMessage( "foo" ); render(); reset( remoteObject ); render(); verify( remoteObject, never() ).set( eq( "message" ), anyString() ); } @Test public void testRenderMessage_changedBack() { composite.setMessage( "foo" ); render(); reset( remoteObject ); composite.setMessage( "bar" ); composite.setMessage( "foo" ); render(); verify( remoteObject, never() ).set( eq( "message" ), anyString() ); } @Test public void testRenderRefreshListener_initially() { render(); verify( remoteObject, never() ).listen( eq( "Refresh" ), anyBoolean() ); } @Test public void testRenderRefreshListener_changed() { composite.addRefreshListener( mock( RefreshListener.class ) ); render(); verify( remoteObject ).listen( "Refresh", true ); } @Test public void testRenderRefreshListener_unchanged() { composite.addRefreshListener( mock( RefreshListener.class ) ); render(); reset( remoteObject ); render(); verify( remoteObject, never() ).listen( eq( "Refresh" ), anyBoolean() ); } @Test public void testRenderRefreshListener_changedBack() { RefreshListener listener = mock( RefreshListener.class ); composite.addRefreshListener( listener ); composite.removeRefreshListener( listener ); render(); verify( remoteObject, never() ).listen( eq( "Refresh" ), anyBoolean() ); } @Test public void testRenderDone() { composite.done(); render(); verify( remoteObject ).call( "done", null ); } @Test public void testRenderDone_onlyOnce() { composite.done(); composite.done(); render(); verify( remoteObject, times( 1 ) ).call( "done", null ); } private void render() { try { getLCA( display ).render( display ); } catch( IOException shouldNotHappen ) { fail( shouldNotHappen.getMessage() ); } } protected static WidgetRemoteAdapter getRemoteAdapter( Composite composite ) { return ( WidgetRemoteAdapter )composite.getAdapter( RemoteAdapter.class ); } private void replaceConnection( Connection connection ) { UISessionImpl uiSession = ( UISessionImpl )RWT.getUISession(); uiSession.setConnection( connection ); } }