diff options
author | Tim Buschtöns | 2013-08-04 12:13:48 +0000 |
---|---|---|
committer | Tim Buschtöns | 2013-08-04 12:13:48 +0000 |
commit | 609e4b00d6eff50568b50453565ec1d628bad95a (patch) | |
tree | 510834a9a29825cb194a865771391a7c72b319ab | |
parent | 7ed695ddc46d6edea66a92d5e095bae4b2b3cbb7 (diff) | |
download | org.eclipse.rap.incubator.dropdown-609e4b00d6eff50568b50453565ec1d628bad95a.tar.gz org.eclipse.rap.incubator.dropdown-609e4b00d6eff50568b50453565ec1d628bad95a.tar.xz org.eclipse.rap.incubator.dropdown-609e4b00d6eff50568b50453565ec1d628bad95a.zip |
Refactor AutoSuggest to be able to remove Model.java
11 files changed, 103 insertions, 552 deletions
diff --git a/bundles/org.eclipse.rap.addons.autosuggest/js/rwt/remote/Model.js b/bundles/org.eclipse.rap.addons.autosuggest/js/rwt/remote/Model.js index f7670f1..8b33b5a 100644 --- a/bundles/org.eclipse.rap.addons.autosuggest/js/rwt/remote/Model.js +++ b/bundles/org.eclipse.rap.addons.autosuggest/js/rwt/remote/Model.js @@ -80,16 +80,39 @@ notifyInternal( this, event, properties ); }, - addListener : function( event, listener ) { - if( !this._.listeners[ event ] ) { - this._.listeners[ event ] = []; + addListener : function() { + var event, listener; + if( arguments.length === 1 ) { + listener = arguments[ 0 ].listener; + event = arguments[ 0 ].type; + } else { + event = arguments[ 0 ]; + listener = arguments[ 1 ]; } - if( this._.listeners[ event ].indexOf( listener ) === -1 ) { - this._.listeners[ event ].push( listener ); + if( typeof listener === "string" ) { + var that = this; + rwt.remote.HandlerUtil.callWithTarget( listener, function( listener ) { + that.addListener( event, listener ); + } ); + } else { + if( !this._.listeners[ event ] ) { + this._.listeners[ event ] = []; + } + if( this._.listeners[ event ].indexOf( listener ) === -1 ) { + this._.listeners[ event ].push( listener ); + } } }, - removeListener : function( event, listener ) { + removeListener : function() { + var event, listener; + if( arguments.length === 1 ) { + listener = rwt.remote.ObjectRegistry.getObject( arguments[ 0 ].listener ); + event = arguments[ 0 ].event; + } else { + event = arguments[ 0 ]; + listener = arguments[ 1 ]; + } if( this._ && this._.listeners[ event ] ) { var index = this._.listeners[ event ].indexOf( listener ); rwt.util.Arrays.removeAt( this._.listeners[ event ], index ); diff --git a/bundles/org.eclipse.rap.addons.autosuggest/src/org/eclipse/rap/addons/autosuggest/AutoSuggest.java b/bundles/org.eclipse.rap.addons.autosuggest/src/org/eclipse/rap/addons/autosuggest/AutoSuggest.java index 732eb0f..3b446c6 100644 --- a/bundles/org.eclipse.rap.addons.autosuggest/src/org/eclipse/rap/addons/autosuggest/AutoSuggest.java +++ b/bundles/org.eclipse.rap.addons.autosuggest/src/org/eclipse/rap/addons/autosuggest/AutoSuggest.java @@ -15,16 +15,18 @@ import static org.eclipse.rap.rwt.lifecycle.WidgetUtil.getId; import java.util.ArrayList; import java.util.List; -import org.eclipse.rap.addons.autosuggest.internal.ClientModelListener; -import org.eclipse.rap.addons.autosuggest.internal.Model; -import org.eclipse.rap.addons.autosuggest.internal.ModelListener; +import org.eclipse.rap.addons.autosuggest.internal.AutoSuggestClientListener; import org.eclipse.rap.addons.autosuggest.internal.resources.AutoSuggestScript; import org.eclipse.rap.addons.autosuggest.internal.resources.EventDelegatorScript; +import org.eclipse.rap.addons.autosuggest.internal.resources.ModelResources; import org.eclipse.rap.addons.dropdown.DropDown; import org.eclipse.rap.clientscripting.ClientListener; import org.eclipse.rap.clientscripting.Script; import org.eclipse.rap.clientscripting.WidgetDataWhiteList; import org.eclipse.rap.json.JsonObject; +import org.eclipse.rap.rwt.RWT; +import org.eclipse.rap.rwt.remote.AbstractOperationHandler; +import org.eclipse.rap.rwt.remote.RemoteObject; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; @@ -34,17 +36,16 @@ import org.eclipse.swt.widgets.Text; public class AutoSuggest { private static final String EVENT_TYPE_SELECTION = "suggestionSelected"; - private static final String MODEL_ID_KEY - = "org.eclipse.rap.addons.autosuggest#Model"; + private static final String REMOTE_TYPE = "rwt.remote.Model"; + private static final String MODEL_ID_KEY = "org.eclipse.rap.addons.autosuggest#Model"; private final Text text; private final DropDown dropDown; - private final Model model; private final List<SuggestionSelectedListener> selectionListeners; - private final ModelListener modelListener; private ClientListener textClientListener; private int[] textClientListenerTypes; private boolean isDisposed; + private final RemoteObject remoteObject; public AutoSuggest( Text text ) { if( text == null ) { @@ -55,13 +56,17 @@ public class AutoSuggest { } this.text = text; dropDown = new DropDown( text ); - model = new Model(); - selectionListeners = new ArrayList<SuggestionSelectedListener>( 1 ); - modelListener = new ModelListener() { - public void handleEvent( JsonObject argument ) { - notifySelectionListeners(); + ModelResources.ensure(); + remoteObject = RWT.getUISession().getConnection().createRemoteObject( REMOTE_TYPE ); + remoteObject.setHandler( new AbstractOperationHandler() { + @Override + public void handleNotify( String event, JsonObject properties ) { + if( EVENT_TYPE_SELECTION.equals( event ) ) { + notifySelectionListeners(); + } } - }; + } ); + selectionListeners = new ArrayList<SuggestionSelectedListener>( 1 ); connectClientObjects(); attachClientListeners(); text.addListener( SWT.Dispose, new Listener() { @@ -73,7 +78,7 @@ public class AutoSuggest { public void setDataSource( DataSource dataSource ) { checkDisposed(); - model.set( "dataSourceId", dataSource != null ? dataSource.getId() : null ); + remoteObject.set( "dataSourceId", dataSource != null ? dataSource.getId() : null ); if( dataSource != null ) { ColumnTemplate template = dataSource.getTemplate(); if( template != null ) { @@ -94,7 +99,7 @@ public class AutoSuggest { public void setAutoComplete( boolean value ) { checkDisposed(); - model.set( "autoComplete", value ); + remoteObject.set( "autoComplete", value ); } public void addSelectionListener( SuggestionSelectedListener listener ) { @@ -106,7 +111,7 @@ public class AutoSuggest { selectionListeners.add( listener ); } if( selectionListeners.size() == 1 ) { - model.addListener( EVENT_TYPE_SELECTION, modelListener ); + remoteObject.listen( EVENT_TYPE_SELECTION, true ); } } @@ -116,15 +121,15 @@ public class AutoSuggest { throw new NullPointerException( "Parameter was null: listener" ); } selectionListeners.remove( listener ); - if( selectionListeners.isEmpty() ) { - model.removeListener( EVENT_TYPE_SELECTION, modelListener ); + if( selectionListeners.size() == 0 ) { + remoteObject.listen( EVENT_TYPE_SELECTION, false ); } } public void dispose() { isDisposed = true; dropDown.dispose(); - model.dispose(); + remoteObject.destroy(); removeTextClientListeners(); } @@ -175,19 +180,21 @@ public class AutoSuggest { } private void attachClientListenerToModel( Script script, String... types ) { - ClientModelListener clientModelListener = new ClientModelListener( script ); + AutoSuggestClientListener clientListener = new AutoSuggestClientListener( script ); + String listenerId = clientListener.getId(); for( String type : types ) { - model.addListener( type, clientModelListener ); + remoteObject.call( "addListener", + new JsonObject().add( "listener", listenerId ).add( "type", type ) ); } - model.set( "autoSuggestListenerId", clientModelListener.getId() ); + remoteObject.set( "autoSuggestListenerId", listenerId ); } private void connectClientObjects() { WidgetDataWhiteList.addKey( MODEL_ID_KEY ); - model.set( "textWidgetId", getId( text ) ); - model.set( "dropDownWidgetId", getId( dropDown ) ); - dropDown.setData( MODEL_ID_KEY, model.getId() ); - text.setData( MODEL_ID_KEY, model.getId() ); + remoteObject.set( "textWidgetId", getId( text ) ); + remoteObject.set( "dropDownWidgetId", getId( dropDown ) ); + dropDown.setData( MODEL_ID_KEY, remoteObject.getId() ); + text.setData( MODEL_ID_KEY, remoteObject.getId() ); } private void removeTextClientListeners() { diff --git a/bundles/org.eclipse.rap.addons.autosuggest/src/org/eclipse/rap/addons/autosuggest/internal/ModelListener.java b/bundles/org.eclipse.rap.addons.autosuggest/src/org/eclipse/rap/addons/autosuggest/internal/AutoSuggestClientListener.java index d826d65..6675748 100644 --- a/bundles/org.eclipse.rap.addons.autosuggest/src/org/eclipse/rap/addons/autosuggest/internal/ModelListener.java +++ b/bundles/org.eclipse.rap.addons.autosuggest/src/org/eclipse/rap/addons/autosuggest/internal/AutoSuggestClientListener.java @@ -10,9 +10,23 @@ ******************************************************************************/ package org.eclipse.rap.addons.autosuggest.internal; -import org.eclipse.rap.json.JsonObject; +import org.eclipse.rap.clientscripting.Script; +import org.eclipse.rap.clientscripting.internal.ClientFunction; -public interface ModelListener { - void handleEvent( JsonObject argument ); +@SuppressWarnings( "restriction" ) +public final class AutoSuggestClientListener extends ClientFunction { + + public AutoSuggestClientListener( String scriptCode ) { + super( scriptCode ); + } + + public AutoSuggestClientListener( Script script ) { + super( script ); + } + + public String getId() { + return getRemoteId(); + } + } diff --git a/bundles/org.eclipse.rap.addons.autosuggest/src/org/eclipse/rap/addons/autosuggest/internal/ClientModelListener.java b/bundles/org.eclipse.rap.addons.autosuggest/src/org/eclipse/rap/addons/autosuggest/internal/ClientModelListener.java deleted file mode 100644 index f34a44d..0000000 --- a/bundles/org.eclipse.rap.addons.autosuggest/src/org/eclipse/rap/addons/autosuggest/internal/ClientModelListener.java +++ /dev/null @@ -1,56 +0,0 @@ -/******************************************************************************* - * 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 org.eclipse.rap.addons.autosuggest.internal; - -import org.eclipse.rap.clientscripting.Script; -import org.eclipse.rap.clientscripting.internal.ClientFunction; -import org.eclipse.rap.clientscripting.internal.ClientListenerBinding; -import org.eclipse.rap.json.JsonObject; - - -@SuppressWarnings( "restriction" ) -public final class ClientModelListener extends ClientFunction implements ModelListener { - - public ClientModelListener( String scriptCode ) { - super( scriptCode ); - } - - public ClientModelListener( Script script ) { - super( script ); - } - - public void handleEvent( JsonObject argument ) { } - - public String getId() { - return getRemoteId(); - } - - void addTo( Model model, String eventType ) { - final ClientListenerBinding binding = addTo( model.getId(), eventType ); - if( binding != null ) { - model.addListener( "destroy", new ModelListener() { - public void handleEvent( JsonObject argument ) { - binding.dispose(); - } - } ); - } - } - - void removeFrom( Model model, String eventType ) { - removeFrom( model.getId(), eventType ); - } - - // For Testing only: - ClientListenerBinding findBinding( Model model, String eventType ) { - return findBinding( model.getId(), eventType ); - } - -} diff --git a/bundles/org.eclipse.rap.addons.autosuggest/src/org/eclipse/rap/addons/autosuggest/internal/Model.java b/bundles/org.eclipse.rap.addons.autosuggest/src/org/eclipse/rap/addons/autosuggest/internal/Model.java deleted file mode 100644 index f7bc039..0000000 --- a/bundles/org.eclipse.rap.addons.autosuggest/src/org/eclipse/rap/addons/autosuggest/internal/Model.java +++ /dev/null @@ -1,134 +0,0 @@ -/******************************************************************************* - * 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 org.eclipse.rap.addons.autosuggest.internal; - -import java.util.*; - -import org.eclipse.rap.addons.autosuggest.internal.resources.ModelResources; -import org.eclipse.rap.json.JsonObject; -import org.eclipse.rap.json.JsonValue; -import org.eclipse.rap.rwt.RWT; -import org.eclipse.rap.rwt.remote.AbstractOperationHandler; -import org.eclipse.rap.rwt.remote.RemoteObject; - - -public class Model { - - private static final String REMOTE_TYPE = "rwt.remote.Model"; - - private RemoteObject remoteObject; - private Map<String, List<ModelListener>> listeners = new HashMap<String, List<ModelListener>>(); - - private boolean isDisposed; - - public Model() { - ModelResources.ensure(); - remoteObject = RWT.getUISession().getConnection().createRemoteObject( REMOTE_TYPE ); - remoteObject.setHandler( new AbstractOperationHandler() { - @Override - public void handleNotify( String event, JsonObject properties ) { - notifyInternal( event, properties ); - } - } ); - } - - public void set( String name, String value ) { - remoteObject.set( name, value ); - } - - public void set( String name, int value ) { - remoteObject.set( name, value ); - } - - public void set( String name, boolean value ) { - remoteObject.set( name, value ); - } - - public void set( String name, JsonValue value ) { - remoteObject.set( name, value ); - } - - public void addListener( String eventType, ModelListener listener ) { - checkArguments( eventType, listener ); - if( listener instanceof ClientModelListener ) { - ( ( ClientModelListener )listener ).addTo( this, eventType ); - } else { - addServerListener( eventType, listener ); - } - } - - public void removeListener( String eventType, ModelListener listener ) { - checkArguments( eventType, listener ); - if( listener instanceof ClientModelListener ) { - ( ( ClientModelListener )listener ).removeFrom( this, eventType ); - } else { - boolean removed = getListeners( eventType ).remove( listener ); - if( removed && !hasListeners( eventType ) ) { - remoteObject.listen( eventType, false ); - } - } - } - - public void dispose() { - if( !isDisposed ) { - isDisposed = true; - remoteObject.destroy(); - notifyInternal( "destroy", null ); // TODO : find other solution or also fire on client - } - } - - public boolean isDisposed() { - return isDisposed; - } - - public String getId() { - return remoteObject.getId(); - } - - private static void checkArguments( Object... arguments ) { - for( Object argument : arguments ) { - if( argument == null ) { - throw new IllegalArgumentException( "Argument may not be null" ); - } - } - } - - private void addServerListener( String eventType, ModelListener listener ) { - if( !hasListeners( eventType ) ) { - remoteObject.listen( eventType, true ); - } - List<ModelListener> eventListeners = getListeners( eventType ); - if( !eventListeners.contains( listener ) ) { - eventListeners.add( listener ); - } - } - - private List<ModelListener> getListeners( String eventType ) { - List<ModelListener> result = listeners.get( eventType ); - if( result == null ) { - result = new ArrayList<ModelListener>(); - listeners.put( eventType, result ); - } - return result; - } - - private boolean hasListeners( String eventType ) { - return listeners.containsKey( eventType ) && !listeners.get( eventType ).isEmpty(); - } - - private void notifyInternal( String event, JsonObject properties ) { - List<ModelListener> eventListeners = getListeners( event ); - for( ModelListener eventListener : eventListeners ) { - eventListener.handleEvent( properties ); - } - } - -} diff --git a/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/AutoSuggestJs_Test.java b/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/AutoSuggestJs_Test.java index 7b012a1..da366de 100644 --- a/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/AutoSuggestJs_Test.java +++ b/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/AutoSuggestJs_Test.java @@ -42,8 +42,8 @@ public class AutoSuggestJs_Test { @Test public void testListenerSpec() { jasmine.addResource( "AutoSuggest.js", LOCAL, AUTO_SUGGEST_JS ); - jasmine.parseScript( CLIENTSCRIPTING, "org/eclipse/rap/clientscripting/SWT.js" ); - jasmine.parseScript( CLIENTSCRIPTING, "org/eclipse/rap/clientscripting/Function.js" ); + jasmine.parseScript( CLIENTSCRIPTING, "rwt/scripting/SWT.js" ); + jasmine.parseScript( CLIENTSCRIPTING, "rwt/scripting/FunctionFactory.js" ); jasmine.parseScript( LOCAL, "jasmine/specs/AutoSuggestSpec.js" ); jasmine.execute(); } diff --git a/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/fixture/rwt-mock.js b/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/fixture/rwt-mock.js index 481440a..b3596bd 100644 --- a/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/fixture/rwt-mock.js +++ b/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/fixture/rwt-mock.js @@ -33,6 +33,11 @@ rwt = { } } }, + remote : { + HandlerUtil : { + callWithTarget : function() {} + } + }, qx : { Class : { // NOTE: Rhino may create global objects such as "org" without asking. They can diff --git a/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/index.html b/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/index.html index 77075be..7727e50 100644 --- a/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/index.html +++ b/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/index.html @@ -6,8 +6,8 @@ <script type="text/javascript" src="fixture/rwt-mock.js"></script> <script type="text/javascript" src="fixture/rap-mock.js"></script> <script type="text/javascript" src="../../../../bundles/org.eclipse.rap.addons.autosuggest/js/rwt/remote/Model.js"></script> - <script type="text/javascript" src="../../../../../org.eclipse.rap.incubator.clientscripting/bundles/org.eclipse.rap.clientscripting/js/org/eclipse/rap/clientscripting/SWT.js"></script> - <script type="text/javascript" src="../../../../../org.eclipse.rap.incubator.clientscripting/bundles/org.eclipse.rap.clientscripting/js/org/eclipse/rap/clientscripting/Function.js"></script> + <script type="text/javascript" src="../../../../../org.eclipse.rap.incubator.clientscripting/bundles/org.eclipse.rap.clientscripting/js/rwt/scripting/SWT.js"></script> + <script type="text/javascript" src="../../../../../org.eclipse.rap.incubator.clientscripting/bundles/org.eclipse.rap.clientscripting/js/rwt/scripting/FunctionFactory.js"></script> <script type="text/javascript" src="specs/ModelSpec.js"></script> <script type="text/javascript" src="specs/AutoSuggestSpec.js"></script> <script type="text/javascript"> diff --git a/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/specs/AutoSuggestSpec.js b/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/specs/AutoSuggestSpec.js index de717ca..fd83554 100644 --- a/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/specs/AutoSuggestSpec.js +++ b/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/specs/AutoSuggestSpec.js @@ -14,10 +14,8 @@ var createClientListener = function( name ) { // NOTE : Using + "" to convert Java string to JavaScript string. Alternatives? var listenerScript = TestUtil.getResource( name ) + ""; - var listener = new org.eclipse.rap.clientscripting.Function( listenerScript ); - return function() { - listener.call.apply( listener, arguments ); - }; + var listener = rwt.scripting.FunctionFactory.createFunction( listenerScript, "handleEvent" ); + return listener; }; var getVarFromScript = function( scriptName, functionName ) { diff --git a/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/specs/ModelSpec.js b/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/specs/ModelSpec.js index 5333e36..32ab3e3 100644 --- a/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/specs/ModelSpec.js +++ b/tests/org.eclipse.rap.addons.autosuggest.test/jasmine/jasmine/specs/ModelSpec.js @@ -38,6 +38,19 @@ expect( log.length ).toBe( 1 ); } ); + it( "resloves listener id", function() { + spyOn( rwt.remote.HandlerUtil, "callWithTarget" ).andCallFake( function( target, callback ) { + if( target === "fooid" ) { + callback( logger ); + } + } ); + + model.addListener( { type : "Selection", listener : "fooid" } ); + model.notify( "Selection", { "foo" : "bar" } ); + + expect( log.length ).toBe( 1 ); + } ); + } ); describe( "removeListener", function() { diff --git a/tests/org.eclipse.rap.addons.autosuggest.test/src/org/eclipse/rap/addons/autosuggest/internal/Model_Test.java b/tests/org.eclipse.rap.addons.autosuggest.test/src/org/eclipse/rap/addons/autosuggest/internal/Model_Test.java deleted file mode 100644 index 708d1b6..0000000 --- a/tests/org.eclipse.rap.addons.autosuggest.test/src/org/eclipse/rap/addons/autosuggest/internal/Model_Test.java +++ /dev/null @@ -1,319 +0,0 @@ -/******************************************************************************* - * 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.autosuggest.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.addons.autosuggest.internal.ClientModelListener; -import org.eclipse.rap.addons.autosuggest.internal.Model; -import org.eclipse.rap.addons.autosuggest.internal.ModelListener; -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.Connection; -import org.eclipse.rap.rwt.remote.OperationHandler; -import org.eclipse.rap.rwt.remote.RemoteObject; -import org.eclipse.rap.rwt.testfixture.Fixture; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -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 ) ); - } - - -} |