blob: f2eac5a749c1dcd90c5d4e4945955409e61c42e5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 EclipseSource.
* 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.addons.dropdown.internal;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
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.when;
import org.eclipse.rap.clientscripting.internal.ClientListenerBinding;
import org.eclipse.rap.json.JsonObject;
import org.eclipse.rap.json.JsonValue;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.remote.*;
import org.eclipse.rap.rwt.testfixture.Fixture;
import org.junit.*;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
@SuppressWarnings("restriction")
public class Model_Test {
private static final String REMOTE_TYPE = "rwt.remote.Model";
private RemoteObject remoteObject;
private OperationHandler handler;
private Model model;
private Connection connection;
@Before
public void setUp() {
Fixture.setUp();
Fixture.fakeNewRequest();
remoteObject = mock( RemoteObject.class );
when( remoteObject.getId() ).thenReturn( "modelId" );
connection = spy( RWT.getUISession().getConnection() );
when( connection.createRemoteObject( REMOTE_TYPE ) ).thenReturn( remoteObject );
Fixture.fakeConnection( connection );
doAnswer( new Answer<Object>(){
public Object answer( InvocationOnMock invocation ) throws Throwable {
handler = ( OperationHandler )invocation.getArguments()[ 0 ];
return null;
}
} ).when( remoteObject ).setHandler( any( OperationHandler.class ) );
model = new Model();
}
@After
public void tearDown() {
Fixture.tearDown();
}
@Test
public void testConstructor_CreatesRemoteObject() {
verify( connection ).createRemoteObject( eq( REMOTE_TYPE ) );
}
@Test
public void testGetId() {
when( remoteObject.getId() ).thenReturn( "foo" );
assertEquals( "foo", model.getId() );
}
@Test
public void testDispose_CallsRemoteObjectDestroy() {
model.dispose();
verify( remoteObject ).destroy();
}
@Test
public void testDispose_callTwiceHasNoEffect() {
model.dispose();
model.dispose();
verify( remoteObject, times( 1 ) ).destroy();
}
@Test
public void testIsDisposed_returnsFalse() {
assertFalse( model.isDisposed() );
}
@Test
public void testIsDisposed_returnsTrueAfterDispose() {
model.dispose();
assertTrue( model.isDisposed() );
}
@Test
public void testDispose_DisposesListenerBinding() {
ClientModelListener listener = new ClientModelListener( "" );
model.addListener( "foo", listener );
ClientListenerBinding binding = listener.findBinding( model, "foo" );
model.dispose();
assertTrue( binding.isDisposed() );
}
@Test
public void testSet_CallsRemoteObjectSetString() {
model.set( "foo", "bar" );
verify( remoteObject ).set( eq( "foo" ), eq( "bar" ) );
}
@Test
public void testSet_CallsRemoteObjectSetInt() {
model.set( "foo", 1 );
verify( remoteObject ).set( eq( "foo" ), eq( 1 ) );
}
@Test
public void testSet_CallsRemoteObjectSetJsonValue() {
model.set( "foo", JsonValue.valueOf( "bar" ) );
verify( remoteObject ).set( eq( "foo" ), eq( JsonValue.valueOf( "bar" ) ) );
}
@Test
public void testAddListener_SetsListenTrue() {
model.addListener( "foo", mock( ModelListener.class ) );
verify( remoteObject ).listen( eq( "foo" ), eq( true ) );
}
@Test
public void testAddListener_ThrowsExceptionForNullListener() {
try{
model.addListener( "foo", null );
fail();
} catch( IllegalArgumentException ex ) {
// expected
}
verify( remoteObject, never() ).listen( anyString(), anyBoolean() );
}
@Test
public void testAddListener_ThrowsExceptionForNullType() {
try{
model.addListener( null, mock( ModelListener.class ) );
fail();
} catch( IllegalArgumentException ex ) {
// expected
}
verify( remoteObject, never() ).listen( anyString(), anyBoolean() );
}
@Test
public void testAddListener_DoesNotSetListenTrueIfNotFirstListener() {
model.addListener( "foo", mock( ModelListener.class ) );
reset( remoteObject );
model.addListener( "foo", mock( ModelListener.class ) );
verify( remoteObject, never() ).listen( eq( "foo" ), eq( true ) );
}
@Test
public void testAddListener_SetsListenTrueForDifferentEventType() {
model.addListener( "foo", mock( ModelListener.class ) );
reset( remoteObject );
model.addListener( "bar", mock( ModelListener.class ) );
verify( remoteObject ).listen( eq( "bar" ), eq( true ) );
}
@Test
public void testAddListener_DoesNotSetListenTrueIfClientListener() {
model.addListener( "foo", new ClientModelListener( "" ) );
verify( remoteObject, never() ).listen( eq( "foo" ), eq( true ) );
}
@Test
public void testAddListener_CreatesListenerBinding() {
ClientModelListener listener = new ClientModelListener( "" );
model.addListener( "foo", listener );
assertNotNull( listener.findBinding( model, "foo" ) );
}
@Test
public void testRemoveListener_SetsListenFalse() {
ModelListener listener = mock( ModelListener.class );
model.addListener( "foo", listener );
reset( remoteObject );
model.removeListener( "foo", listener );
verify( remoteObject ).listen( eq( "foo" ), eq( false ) );
}
@Test
public void testRemoveListener_DoesNotSetListenFalseIfListenerRemains() {
ModelListener listener = mock( ModelListener.class );
model.addListener( "foo", listener );
model.addListener( "foo", mock( ModelListener.class ) );
reset( remoteObject );
model.removeListener( "foo", listener );
verify( remoteObject, never() ).listen( eq( "foo" ), eq( false ) );
}
@Test
public void testRemoveListener_DoesSetListenFalseIfDifferentEventTypeRemains() {
ModelListener listener = mock( ModelListener.class );
model.addListener( "bar", listener );
model.addListener( "foo", mock( ModelListener.class ) );
reset( remoteObject );
model.removeListener( "bar", listener );
verify( remoteObject ).listen( eq( "bar" ), eq( false ) );
}
@Test
public void testRemoveListener_DoesNotSetListenFalseIfListenerWasNotRegistered() {
ModelListener listener = mock( ModelListener.class );
model.removeListener( "foo", listener );
verify( remoteObject, never() ).listen( eq( "foo" ), eq( false ) );
}
@Test
public void testRemoveListener_ThrowsExceptionForNullListener() {
try{
model.removeListener( "foo", null );
fail();
} catch( IllegalArgumentException ex ) {
// expected
}
verify( remoteObject, never() ).listen( anyString(), anyBoolean() );
}
@Test
public void testRemoveListener_ThrowsExceptionForNullType() {
try{
model.removeListener( null, mock( ModelListener.class ) );
fail();
} catch( IllegalArgumentException ex ) {
// expected
}
verify( remoteObject, never() ).listen( anyString(), anyBoolean() );
}
@Test
public void testRemoveListener_DisposesListenerBinding() {
ClientModelListener listener = new ClientModelListener( "" );
model.addListener( "foo", listener );
ClientListenerBinding binding = listener.findBinding( model, "foo" );
model.removeListener( "foo", listener );
assertTrue( binding.isDisposed() );
}
@Test
public void testProcessClientNotify_CallHandleEvent() {
ModelListener listener = mock( ModelListener.class );
model.addListener( "foo", listener );
JsonObject argument = mock( JsonObject.class );
handler.handleNotify( "foo", argument );
verify( listener ).handleEvent( eq( argument ) );
}
@Test
public void testProcessClientNotify_DoNotCallHandleEventTwice() {
ModelListener listener = mock( ModelListener.class );
model.addListener( "foo", listener );
model.addListener( "foo", listener );
handler.handleNotify( "foo", mock( JsonObject.class ) );
verify( listener, times( 1 ) ).handleEvent( any( JsonObject.class ) );
}
}