/*******************************************************************************
* Copyright (c) 2012, 2015 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 org.eclipse.rap.rwt.internal.remote;
import static org.eclipse.rap.rwt.internal.service.ContextProvider.getProtocolWriter;
import static org.eclipse.rap.rwt.testfixture.internal.SerializationTestUtil.serializeAndDeserialize;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import org.eclipse.rap.json.JsonObject;
import org.eclipse.rap.json.JsonValue;
import org.eclipse.rap.rwt.internal.protocol.ProtocolMessageWriter;
import org.eclipse.rap.rwt.testfixture.internal.Fixture;
import org.eclipse.rap.rwt.testfixture.internal.TestMessage;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class DeferredRemoteObject_Test {
private String objectId;
private DeferredRemoteObject remoteObject;
private ProtocolMessageWriter writer;
@Before
public void setUp() {
Fixture.setUp();
Fixture.fakeResponseWriter();
objectId = "testId";
remoteObject = new DeferredRemoteObject( objectId, "type" );
writer = mock( ProtocolMessageWriter.class );
}
@After
public void tearDown() {
Fixture.tearDown();
}
@Test
public void testDoesNotRenderOperationsImmediately() {
remoteObject.call( "method", new JsonObject() );
assertEquals( 0, getMessage().getOperationCount() );
}
@Test
public void testOperationsAreRenderedDeferred() {
remoteObject.call( "method", null );
remoteObject.render( writer );
verify( writer ).appendCreate( anyString(), anyString() );
verify( writer ).appendCall( anyString(), anyString(), any( JsonObject.class ) );
}
@Test
public void testCreateIsRendered() {
remoteObject.render( writer );
verify( writer ).appendCreate( eq( objectId ), eq( "type" ) );
}
@Test
public void testCreateIsNotRenderedIfCreateTypeIsNull() {
DeferredRemoteObject remoteObject = new DeferredRemoteObject( "id", null );
remoteObject.render( writer );
verify( writer, times( 0 ) ).appendCreate( anyString(), anyString() );
}
@Test
public void testSet_int_isRendered() {
remoteObject.set( "property", 23 );
remoteObject.render( writer );
verify( writer ).appendSet( eq( objectId ), eq( "property" ), eq( 23 ) );
}
@Test
public void testSet_int_checksState() {
DeferredRemoteObject remoteObjectSpy = spy( remoteObject );
remoteObjectSpy.set( "property", 23 );
verify( remoteObjectSpy ).checkState();
}
@Test
public void testSet_double_isRendered() {
remoteObject.set( "property", 47.11 );
remoteObject.render( writer );
verify( writer ).appendSet( eq( objectId ), eq( "property" ), eq( 47.11 ) );
}
@Test
public void testSet_double_checksState() {
DeferredRemoteObject remoteObjectSpy = spy( remoteObject );
remoteObjectSpy.set( "property", 47.11 );
verify( remoteObjectSpy ).checkState();
}
@Test
public void testSet_boolean_isRendered() {
remoteObject.set( "property", true );
remoteObject.render( writer );
verify( writer ).appendSet( eq( objectId ), eq( "property" ), eq( true ) );
}
@Test
public void testSet_boolean_checksState() {
DeferredRemoteObject remoteObjectSpy = spy( remoteObject );
remoteObjectSpy.set( "property", true );
verify( remoteObjectSpy ).checkState();
}
@Test
public void testSet_string_isRendered() {
remoteObject.set( "property", "foo" );
remoteObject.render( writer );
verify( writer ).appendSet( eq( objectId ), eq( "property" ), eq( "foo" ) );
}
@Test
public void testSet_string_checksState() {
DeferredRemoteObject remoteObjectSpy = spy( remoteObject );
remoteObjectSpy.set( "property", "foo" );
verify( remoteObjectSpy ).checkState();
}
@Test
public void testSet_jsonValue_isRendered() {
JsonValue value = JsonValue.valueOf( 23 );
remoteObject.set( "property", value );
remoteObject.render( writer );
verify( writer ).appendSet( eq( objectId ), eq( "property" ), eq( value ) );
}
@Test( expected = NullPointerException.class )
public void testSet_jsonValue_checksValue() {
remoteObject.set( "foo", ( JsonValue )null );
}
@Test
public void testSet_jsonValue_checksState() {
DeferredRemoteObject remoteObjectSpy = spy( remoteObject );
remoteObjectSpy.set( "property", JsonValue.TRUE );
verify( remoteObjectSpy ).checkState();
}
@Test
public void testListen_isRendered() {
remoteObject.listen( "event", true );
remoteObject.render( writer );
verify( writer ).appendListen( eq( objectId ), eq( "event" ), eq( true ) );
}
@Test
public void testListen_checksState() {
DeferredRemoteObject remoteObjectSpy = spy( remoteObject );
remoteObjectSpy.listen( "event", true );
verify( remoteObjectSpy ).checkState();
}
@Test
public void testCall_isRendered() {
JsonObject parameters = mock( JsonObject.class );
remoteObject.call( "method", parameters );
remoteObject.render( writer );
verify( writer ).appendCall( eq( objectId ), eq( "method" ), eq( parameters ) );
}
@Test
public void testCall_checksState() {
DeferredRemoteObject remoteObjectSpy = spy( remoteObject );
remoteObjectSpy.call( "method", mock( JsonObject.class ) );
verify( remoteObjectSpy ).checkState();
}
@Test
public void testDestroy_isRendered() {
remoteObject.render( writer );
reset( writer );
remoteObject.destroy();
remoteObject.render( writer );
verify( writer ).appendDestroy( eq( objectId ) );
}
@Test
public void testDestroy_checksState() {
DeferredRemoteObject remoteObjectSpy = spy( remoteObject );
remoteObjectSpy.destroy();
verify( remoteObjectSpy ).checkState();
}
@Test
public void testRenderQueueIsClearedAfterRender() {
remoteObject.set( "property", 23 );
remoteObject.render( writer );
remoteObject.render( writer );
verify( writer, times( 1 ) ).appendSet( eq( objectId ), eq( "property" ), eq( 23 ) );
}
@Test
public void testRender_omitsImmediatelyDestroyedObjects() {
remoteObject.destroy();
remoteObject.render( writer );
verifyZeroInteractions( writer );
}
@Test
public void testIsSerializable() throws Exception {
remoteObject.set( "property", 23 );
DeferredRemoteObject deserializedRemoteObject = serializeAndDeserialize( remoteObject );
deserializedRemoteObject.render( writer );
verify( writer ).appendSet( eq( objectId ), eq( "property" ), eq( 23 ) );
}
private static TestMessage getMessage() {
return new TestMessage( getProtocolWriter().createMessage().toJson() );
}
}