/*******************************************************************************
* 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.client;
import static org.eclipse.rap.rwt.testfixture.internal.SerializationTestUtil.serializeAndDeserialize;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import org.eclipse.rap.json.JsonObject;
import org.eclipse.rap.json.JsonValue;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.client.service.BrowserNavigation;
import org.eclipse.rap.rwt.client.service.BrowserNavigationEvent;
import org.eclipse.rap.rwt.client.service.BrowserNavigationListener;
import org.eclipse.rap.rwt.internal.lifecycle.PhaseId;
import org.eclipse.rap.rwt.internal.lifecycle.ProcessActionRunner;
import org.eclipse.rap.rwt.internal.protocol.Operation.CallOperation;
import org.eclipse.rap.rwt.testfixture.internal.Fixture;
import org.eclipse.rap.rwt.testfixture.internal.TestMessage;
import org.eclipse.swt.widgets.Display;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
public class BrowserNavigationImpl_Test {
private static final String TYPE = "rwt.client.BrowserNavigation";
private BrowserNavigationImpl navigation;
@Before
public void setUp() {
Fixture.setUp();
navigation = ( BrowserNavigationImpl )RWT.getClient().getService( BrowserNavigation.class );
new Display();
Fixture.fakeNewRequest();
}
@After
public void tearDown() {
Fixture.tearDown();
}
@Test
public void testCreateHistoryEntryWithEmptyId() {
try {
navigation.pushState( "", "name" );
fail();
} catch( IllegalArgumentException expected ) {
}
}
@Test
public void testCreateHistoryEntryWithNullId() {
try {
navigation.pushState( null, "name" );
fail();
} catch( NullPointerException expected ) {
}
}
@Test
public void testAddBrowserNavigationListener_failsWithNull() {
try {
navigation.addBrowserNavigationListener( null );
fail();
} catch( IllegalArgumentException e ) {
// expected
}
}
@Test
public void testAddBrowserNavigationListener_addsListenerToList() {
BrowserNavigationListener listener = mock( BrowserNavigationListener.class );
navigation.addBrowserNavigationListener( listener );
navigation.notifyListeners( mock( BrowserNavigationEvent.class ) );
verify( listener ).navigated( any( BrowserNavigationEvent.class ) );
}
@Test
public void testAddBrowserNavigationListener_doesNotAddListenerTwice() {
BrowserNavigationListener listener = mock( BrowserNavigationListener.class );
navigation.addBrowserNavigationListener( listener );
navigation.addBrowserNavigationListener( listener );
navigation.notifyListeners( mock( BrowserNavigationEvent.class ) );
verify( listener, times( 1 ) ).navigated( any( BrowserNavigationEvent.class ) );
}
@Test
public void testRemoveBrowserNavigationListener_failsWithNull() {
try {
navigation.removeBrowserNavigationListener( null );
fail();
} catch( IllegalArgumentException e ) {
// expected
}
}
@Test
public void testRemoveBrowserNavigationListener_removesListener() {
BrowserNavigationListener listener = mock( BrowserNavigationListener.class );
navigation.addBrowserNavigationListener( listener );
navigation.removeBrowserNavigationListener( listener );
navigation.notifyListeners( mock( BrowserNavigationEvent.class ) );
verify( listener, times( 0 ) ).navigated( any( BrowserNavigationEvent.class ) );
}
@Test
public void testFireNavigationEvent() {
BrowserNavigationListener listener = mock( BrowserNavigationListener.class );
navigation.addBrowserNavigationListener( listener );
JsonObject parameters = new JsonObject().add( "state", "foo" );
Fixture.fakeNotifyOperation( TYPE, "Navigation", parameters );
Fixture.executeLifeCycleFromServerThread();
ArgumentCaptor<BrowserNavigationEvent> captor
= ArgumentCaptor.forClass( BrowserNavigationEvent.class );
verify( listener, times( 1 ) ).navigated( captor.capture() );
BrowserNavigationEvent event = captor.getValue();
assertEquals( "foo", event.getState() );
}
@Test
public void testRenderAddNavigationListener() {
Fixture.fakePhase( PhaseId.READ_DATA );
ProcessActionRunner.add( new Runnable() {
public void run() {
navigation.addBrowserNavigationListener( new BrowserNavigationListener() {
public void navigated( BrowserNavigationEvent event ) {
}
} );
}
} );
Fixture.executeLifeCycleFromServerThread();
TestMessage message = Fixture.getProtocolMessage();
assertEquals( JsonValue.TRUE, message.findListenProperty( TYPE, "Navigation" ) );
}
@Test
public void testRenderRemoveNavigationListener() {
final BrowserNavigationListener listener = new BrowserNavigationListener() {
public void navigated( BrowserNavigationEvent event ) {
}
};
navigation.addBrowserNavigationListener( listener );
Fixture.fakePhase( PhaseId.READ_DATA );
ProcessActionRunner.add( new Runnable() {
public void run() {
navigation.removeBrowserNavigationListener( listener );
}
} );
Fixture.executeLifeCycleFromServerThread();
TestMessage message = Fixture.getProtocolMessage();
assertEquals( JsonValue.FALSE, message.findListenProperty( TYPE, "Navigation" ) );
}
@Test
public void testRenderNavigationListenerUnchanged() {
navigation.addBrowserNavigationListener( new BrowserNavigationListener() {
public void navigated( BrowserNavigationEvent event ) {
}
} );
Fixture.executeLifeCycleFromServerThread();
TestMessage message = Fixture.getProtocolMessage();
assertNull( message.findListenOperation( TYPE, "navigation" ) );
}
@Test
public void testRenderAddToHistory() {
navigation.pushState( "testId", "testText" );
Fixture.executeLifeCycleFromServerThread();
TestMessage message = Fixture.getProtocolMessage();
CallOperation operation = message.findCallOperation( TYPE, "addToHistory" );
assertEquals( "testId", operation.getParameters().get( "state" ).asString() );
assertEquals( "testText", operation.getParameters().get( "title" ).asString() );
}
@Test
public void testRenderAddToHistory_NoEntries() {
navigation.pushState( "testId", "testText" );
Fixture.executeLifeCycleFromServerThread();
Fixture.fakeNewRequest();
Fixture.executeLifeCycleFromServerThread();
TestMessage message = Fixture.getProtocolMessage();
assertNull( message.findCallOperation( TYPE, "addToHistory" ) );
}
@Test
public void testRenderAddToHistoryOrder() {
navigation.pushState( "testId1", "testText1" );
navigation.pushState( "testId2", "testText2" );
Fixture.executeLifeCycleFromServerThread();
TestMessage message = Fixture.getProtocolMessage();
CallOperation callOperation1 = ( CallOperation )message.getOperation( 0 );
CallOperation callOperation2 = ( CallOperation )message.getOperation( 1 );
assertEquals( "addToHistory", callOperation1.getMethodName() );
assertEquals( "testId1", callOperation1.getParameters().get( "state" ).asString() );
assertEquals( "testText1", callOperation1.getParameters().get( "title" ).asString() );
assertEquals( "addToHistory", callOperation2.getMethodName() );
assertEquals( "testId2", callOperation2.getParameters().get( "state" ).asString() );
assertEquals( "testText2", callOperation2.getParameters().get( "title" ).asString() );
}
@Test
public void testIsSerializable() throws Exception {
navigation.pushState( "testId1", "testText1" );
serializeAndDeserialize( navigation );
}
}