/*
* Copyright (c) 2011 Petter Holmström
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.github.peholmst.mvp4vaadin.navigation;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.util.HashMap;
import org.junit.Before;
import org.junit.Test;
import com.github.peholmst.mvp4vaadin.navigation.ControllableView.HideOperation;
/**
* Test case for {@link DefaultViewController}.
*
* @author Petter Holmström
* @since 1.0
*/
@Deprecated
public class DefaultViewControllerTest {
DefaultViewController controller;
ControllableView view;
ControllableView view2;
ControllableView view3;
ControllableView view4;
ViewProvider viewProvider;
ViewControllerListener controllerListener;
@Before
public void setUp() {
controller = new DefaultViewController();
view = createMock("view", ControllableView.class);
view2 = createMock("view2", ControllableView.class);
view3 = createMock("view3", ControllableView.class);
view4 = createMock("view4", ControllableView.class);
viewProvider = createMock("viewProvider", ViewProvider.class);
controllerListener = createMock("controllerListener", ViewControllerListener.class);
}
@Test
public void testInitialState() {
assertNull(controller.getCurrentView());
assertNull(controller.getFirstView());
assertFalse(controller.isForwardNavigationPossible());
assertTrue(controller.getTrail().isEmpty());
assertNull(controller.getViewProvider());
assertFalse(controller.goForward());
assertFalse(controller.goBack());
assertFalse(controller.goToFirstView());
}
@Test
public void testSetViewProvider() {
controller.setViewProvider(viewProvider);
assertSame(viewProvider, controller.getViewProvider());
controller.setViewProvider(null);
assertNull(controller.getViewProvider());
}
@SuppressWarnings("serial")
@Test
public void testGoToViewSingleKeyValuePair() {
final boolean called[] = new boolean[1];
controller = new DefaultViewController() {
/*
* As the method under test should redirect to this method, we just override it
* to make sure it receives the proper parameters.
*/
public boolean goToView(ControllableView view, java.util.Map<String,Object> userData) {
assertSame(DefaultViewControllerTest.this.view, view);
assertEquals("world", userData.get("hello"));
called[0] = true;
return true;
};
};
assertTrue(controller.goToView(view, "hello", "world"));
assertTrue(called[0]);
}
@SuppressWarnings("serial")
@Test
public void testGoToViewSingleKeyValuePair_NullKey() {
final boolean called[] = new boolean[1];
controller = new DefaultViewController() {
/*
* As the method under test should redirect to this method, we just override it
* to make sure it receives the proper parameters.
*/
public boolean goToView(ControllableView view, java.util.Map<String,Object> userData) {
assertSame(DefaultViewControllerTest.this.view, view);
assertNull(userData);
called[0] = true;
return false; // Return false to check that the return value is also properly propagated
};
};
assertFalse(controller.goToView(view, null, null));
assertTrue(called[0]);
}
@SuppressWarnings("serial")
@Test
public void testGoToViewNoUserData() {
final boolean called[] = new boolean[1];
controller = new DefaultViewController() {
/*
* As the method under test should redirect to this method, we just override it
* to make sure it receives the proper parameters.
*/
public boolean goToView(ControllableView view, java.util.Map<String,Object> userData) {
assertSame(DefaultViewControllerTest.this.view, view);
assertNull(userData);
called[0] = true;
return true;
};
};
assertTrue(controller.goToView(view));
assertTrue(called[0]);
}
@SuppressWarnings("serial")
@Test
public void testGoToFirstView() {
final boolean called[] = new boolean[1];
controller = new DefaultViewController() {
/*
* As the method under test should redirect to this method, we just override it
* to make sure it receives the proper parameters.
*/
public boolean goToView(ControllableView view, java.util.Map<String,Object> userData) {
assertSame(DefaultViewControllerTest.this.view, view);
assertNull(userData);
called[0] = true;
return true;
};
};
controller.viewStack.push(view);
controller.viewStack.push(view2);
controller.viewStack.push(view3);
controller.currentView = view3;
controller.indexOfCurrentView = 2;
assertTrue(controller.goToFirstView());
assertTrue(called[0]);
}
@SuppressWarnings("serial")
@Test
public void testGoToViewSingleKeyValuePair_ViewProvider_Success() {
expect(viewProvider.getView("viewId")).andReturn(view);
replay(viewProvider);
final boolean called[] = new boolean[1];
controller = new DefaultViewController() {
/*
* As the method under test should redirect to this method, we just override it
* to make sure it receives the proper parameters.
*/
public boolean goToView(ControllableView view, java.util.Map<String,Object> userData) {
assertSame(DefaultViewControllerTest.this.view, view);
assertEquals("world", userData.get("hello"));
called[0] = true;
return true;
};
};
controller.setViewProvider(viewProvider);
assertTrue(controller.goToView("viewId", "hello", "world"));
assertTrue(called[0]);
verify(viewProvider);
}
@SuppressWarnings("serial")
@Test
public void testGoToViewNoUserData_ViewProvider_Success() {
expect(viewProvider.getView("viewId")).andReturn(view);
replay(viewProvider);
final boolean called[] = new boolean[1];
controller = new DefaultViewController() {
/*
* As the method under test should redirect to this method, we just override it
* to make sure it receives the proper parameters.
*/
public boolean goToView(ControllableView view, java.util.Map<String,Object> userData) {
assertSame(DefaultViewControllerTest.this.view, view);
assertNull(userData);
called[0] = true;
return true;
};
};
controller.setViewProvider(viewProvider);
assertTrue(controller.goToView("viewId"));
assertTrue(called[0]);
verify(viewProvider);
}
@SuppressWarnings("serial")
@Test
public void testGoToView_ViewProvider_Success() {
final HashMap<String, Object> userData = new HashMap<String, Object>();
userData.put("Hello", "World");
expect(viewProvider.getView("viewId")).andReturn(view);
replay(viewProvider);
final boolean called[] = new boolean[1];
controller = new DefaultViewController() {
/*
* As the method under test should redirect to this method, we just override it
* to make sure it receives the proper parameters.
*/
public boolean goToView(ControllableView view, java.util.Map<String,Object> userData2) {
assertSame(DefaultViewControllerTest.this.view, view);
assertSame(userData, userData2);
called[0] = true;
return true;
};
};
controller.setViewProvider(viewProvider);
assertTrue(controller.goToView("viewId", userData));
assertTrue(called[0]);
verify(viewProvider);
}
@Test(expected = IllegalStateException.class)
public void testGoToView_ViewProvider_NoProvider() {
controller.goToView("viewId", null);
}
@Test(expected = IllegalArgumentException.class)
public void testGoToView_ViewProvider_IllegalViewId() {
expect(viewProvider.getView("viewId")).andReturn(null);
replay(viewProvider);
controller.setViewProvider(viewProvider);
controller.goToView("viewId", null);
verify(viewProvider);
}
@Test(expected = IllegalArgumentException.class)
public void testGoToView_ViewProvider_NullViewId() {
controller.goToView((String) null, null);
}
@Test(expected = IllegalArgumentException.class)
public void testGoToView_NullView() {
controller.goToView((ControllableView) null, null);
}
@Test
public void testGoToView_EmptyStack() {
HashMap<String, Object> userData = new HashMap<String, Object>();
userData.put("Hello", "World");
// Instruct mocks
view.showView(controller, userData, null, Direction.FORWARD);
replay(view);
controllerListener.currentViewChanged(controller, null, view, Direction.FORWARD, true);
replay(controllerListener);
// Register listener
controller.addListener(controllerListener);
// Run test
assertTrue(controller.goToView(view, userData));
// Verify results
assertSame(view, controller.getCurrentView());
assertSame(view, controller.getFirstView());
assertEquals(1, controller.getTrail().size());
assertSame(view, controller.getTrail().get(0));
assertFalse(controller.isForwardNavigationPossible());
verify(view);
verify(controllerListener);
}
@Test
public void testGoToView_OneViewInStack() {
HashMap<String, Object> userData = new HashMap<String, Object>();
userData.put("Hello", "World");
// Instruct mocks
view.showView(controller, userData, null, Direction.FORWARD);
expect(view.hideView(controller, view2, Direction.FORWARD)).andReturn(HideOperation.ALLOW);
replay(view);
view2.showView(controller, userData, view, Direction.FORWARD);
replay(view2);
controllerListener.currentViewChanged(controller, null, view, Direction.FORWARD, true);
controllerListener.currentViewChanged(controller, view, view2, Direction.FORWARD, true);
replay(controllerListener);
// Register listener
controller.addListener(controllerListener);
// Run test
assertTrue(controller.goToView(view, userData));
assertTrue(controller.goToView(view2, userData));
// Verify results
assertSame(view2, controller.getCurrentView());
assertSame(view, controller.getFirstView());
assertEquals(2, controller.getTrail().size());
assertSame(view, controller.getTrail().get(0));
assertSame(view2, controller.getTrail().get(1));
assertFalse(controller.isForwardNavigationPossible());
verify(view);
verify(view2);
verify(controllerListener);
}
@Test
public void testGoToView_ThreeViewsInStack_Backwards_NoForwardNavigation() {
HashMap<String, Object> userData = new HashMap<String, Object>();
userData.put("Hello", "World");
// Instruct mocks
replay(view);
view2.showView(controller, userData, view3, Direction.BACKWARD);
replay(view2);
expect(view3.hideView(controller, view2, Direction.BACKWARD)).andReturn(HideOperation.ALLOW_WITHOUT_FORWARD_NAVIGATION);
replay(view3);
controllerListener.currentViewChanged(controller, view3, view2, Direction.BACKWARD, true);
replay(controllerListener);
// Setup views
controller.viewStack.push(view);
controller.viewStack.push(view2);
controller.viewStack.push(view3);
controller.currentView = view3;
controller.indexOfCurrentView = 2;
// Register listener
controller.addListener(controllerListener);
// Run test
assertTrue(controller.goToView(view2, userData));
// Verify results
assertSame(view2, controller.getCurrentView());
assertSame(view, controller.getFirstView());
assertEquals(2, controller.getTrail().size());
assertSame(view, controller.getTrail().get(0));
assertSame(view2, controller.getTrail().get(1));
assertFalse(controller.isForwardNavigationPossible());
verify(view);
verify(view2);
verify(view3);
verify(controllerListener);
}
@Test
public void testGoToView_ThreeViewsInStack_Backwards_WithForwardNavigation() {
HashMap<String, Object> userData = new HashMap<String, Object>();
userData.put("Hello", "World");
// Instruct mocks
replay(view);
view2.showView(controller, userData, view3, Direction.BACKWARD);
replay(view2);
expect(view3.hideView(controller, view2, Direction.BACKWARD)).andReturn(HideOperation.ALLOW);
replay(view3);
controllerListener.currentViewChanged(controller, view3, view2, Direction.BACKWARD, false);
replay(controllerListener);
// Setup views
controller.viewStack.push(view);
controller.viewStack.push(view2);
controller.viewStack.push(view3);
controller.currentView = view3;
controller.indexOfCurrentView = 2;
// Register listener
controller.addListener(controllerListener);
// Run test
assertTrue(controller.goToView(view2, userData));
// Verify results
assertSame(view2, controller.getCurrentView());
assertSame(view, controller.getFirstView());
assertEquals(3, controller.getTrail().size());
assertSame(view, controller.getTrail().get(0));
assertSame(view2, controller.getTrail().get(1));
assertSame(view3, controller.getTrail().get(2));
assertTrue(controller.isForwardNavigationPossible());
verify(view);
verify(view2);
verify(view3);
verify(controllerListener);
}
@Test
public void testGoToView_ThreeViewsInStack_Backwards_CurrentViewPrevents() {
HashMap<String, Object> userData = new HashMap<String, Object>();
userData.put("Hello", "World");
// Instruct mocks
replay(view);
replay(view2);
expect(view3.hideView(controller, view2, Direction.BACKWARD)).andReturn(HideOperation.PREVENT);
replay(view3);
replay(controllerListener);
// Setup views
controller.viewStack.push(view);
controller.viewStack.push(view2);
controller.viewStack.push(view3);
controller.currentView = view3;
controller.indexOfCurrentView = 2;
// Register listener
controller.addListener(controllerListener);
// Run test
assertFalse(controller.goToView(view2, userData));
// Verify results
assertSame(view3, controller.getCurrentView());
assertSame(view, controller.getFirstView());
assertEquals(3, controller.getTrail().size());
assertSame(view, controller.getTrail().get(0));
assertSame(view2, controller.getTrail().get(1));
assertSame(view3, controller.getTrail().get(2));
assertFalse(controller.isForwardNavigationPossible());
verify(view);
verify(view2);
verify(view3);
verify(controllerListener);
}
@Test
public void testGoToView_ThreeViewsInStack_Backwards_SecondViewPrevents() {
HashMap<String, Object> userData = new HashMap<String, Object>();
userData.put("Hello", "World");
// Instruct mocks
replay(view);
expect(view2.hideView(controller, view, Direction.BACKWARD)).andReturn(HideOperation.PREVENT);
view2.showView(controller, null, view3, Direction.BACKWARD);
replay(view2);
expect(view3.hideView(controller, view, Direction.BACKWARD)).andReturn(HideOperation.ALLOW_WITHOUT_FORWARD_NAVIGATION);
replay(view3);
controllerListener.currentViewChanged(controller, view3, view2, Direction.BACKWARD, true);
replay(controllerListener);
// Setup views
controller.viewStack.push(view);
controller.viewStack.push(view2);
controller.viewStack.push(view3);
controller.currentView = view3;
controller.indexOfCurrentView = 2;
// Register listener
controller.addListener(controllerListener);
// Run test
assertTrue(controller.goToView(view, userData));
// Verify results
assertSame(view2, controller.getCurrentView());
assertSame(view, controller.getFirstView());
assertEquals(2, controller.getTrail().size());
assertSame(view, controller.getTrail().get(0));
assertSame(view2, controller.getTrail().get(1));
assertFalse(controller.isForwardNavigationPossible());
verify(view);
verify(view2);
verify(view3);
verify(controllerListener);
}
@Test
public void testGoToView_AlreadyCurrentView() {
HashMap<String, Object> userData = new HashMap<String, Object>();
userData.put("Hello", "World");
// Instruct mocks
replay(view);
replay(controllerListener);
// Setup views
controller.viewStack.push(view);
controller.currentView = view;
controller.indexOfCurrentView = 0;
// Register listener
controller.addListener(controllerListener);
// Run test
assertFalse(controller.goToView(view, userData));
// Verify results
assertSame(view, controller.getCurrentView());
assertSame(view, controller.getFirstView());
assertEquals(1, controller.getTrail().size());
assertSame(view, controller.getTrail().get(0));
assertFalse(controller.isForwardNavigationPossible());
verify(view);
verify(controllerListener);
}
@Test
public void testGoBack_NoForwardNavigation() {
// Instruct mocks
replay(view);
view2.showView(controller, null, view3, Direction.BACKWARD);
replay(view2);
expect(view3.hideView(controller, view2, Direction.BACKWARD)).andReturn(HideOperation.ALLOW_WITHOUT_FORWARD_NAVIGATION);
replay(view3);
controllerListener.currentViewChanged(controller, view3, view2, Direction.BACKWARD, true);
replay(controllerListener);
// Setup views
controller.viewStack.push(view);
controller.viewStack.push(view2);
controller.viewStack.push(view3);
controller.currentView = view3;
controller.indexOfCurrentView = 2;
// Register listener
controller.addListener(controllerListener);
// Run test
assertTrue(controller.goBack());
// Verify results
assertSame(view2, controller.getCurrentView());
assertSame(view, controller.getFirstView());
assertEquals(2, controller.getTrail().size());
assertSame(view, controller.getTrail().get(0));
assertSame(view2, controller.getTrail().get(1));
assertFalse(controller.isForwardNavigationPossible());
verify(view);
verify(view2);
verify(view3);
verify(controllerListener);
}
@Test
public void testGoBack_WithForwardNavigation() {
// Instruct mocks
replay(view);
view2.showView(controller, null, view3, Direction.BACKWARD);
replay(view2);
expect(view3.hideView(controller, view2, Direction.BACKWARD)).andReturn(HideOperation.ALLOW);
replay(view3);
controllerListener.currentViewChanged(controller, view3, view2, Direction.BACKWARD, false);
replay(controllerListener);
// Setup views
controller.viewStack.push(view);
controller.viewStack.push(view2);
controller.viewStack.push(view3);
controller.currentView = view3;
controller.indexOfCurrentView = 2;
// Register listener
controller.addListener(controllerListener);
// Run test
assertTrue(controller.goBack());
// Verify results
assertSame(view2, controller.getCurrentView());
assertSame(view, controller.getFirstView());
assertEquals(3, controller.getTrail().size());
assertSame(view, controller.getTrail().get(0));
assertSame(view2, controller.getTrail().get(1));
assertSame(view3, controller.getTrail().get(2));
assertTrue(controller.isForwardNavigationPossible());
verify(view);
verify(view2);
verify(view3);
verify(controllerListener);
}
@Test
public void testGoBack_CurrentViewPrevents() {
// Instruct mocks
replay(view);
replay(view2);
expect(view3.hideView(controller, view2, Direction.BACKWARD)).andReturn(HideOperation.PREVENT);
replay(view3);
replay(controllerListener);
// Setup views
controller.viewStack.push(view);
controller.viewStack.push(view2);
controller.viewStack.push(view3);
controller.currentView = view3;
controller.indexOfCurrentView = 2;
// Register listener
controller.addListener(controllerListener);
// Run test
assertFalse(controller.goBack());
// Verify results
assertSame(view3, controller.getCurrentView());
assertSame(view, controller.getFirstView());
assertEquals(3, controller.getTrail().size());
assertSame(view, controller.getTrail().get(0));
assertSame(view2, controller.getTrail().get(1));
assertSame(view3, controller.getTrail().get(2));
assertFalse(controller.isForwardNavigationPossible());
verify(view);
verify(view2);
verify(view3);
verify(controllerListener);
}
@Test
public void testGoBack_OneView() {
// Instruct mocks
replay(view);
replay(controllerListener);
// Setup views
controller.viewStack.push(view);
controller.currentView = view;
controller.indexOfCurrentView = 0;
// Register listener
controller.addListener(controllerListener);
// Run test
assertFalse(controller.goBack());
// Verify results
assertSame(view, controller.getCurrentView());
assertSame(view, controller.getFirstView());
assertEquals(1, controller.getTrail().size());
assertSame(view, controller.getTrail().get(0));
assertFalse(controller.isForwardNavigationPossible());
verify(view);
verify(controllerListener);
}
@Test
public void testGoToNewViewsWithForwardNavigationPossible() {
// This test was written to detect a bug that Marcus found.
// Instruct mocks
expect(view.hideView(controller, view2, Direction.FORWARD)).andReturn(HideOperation.ALLOW_WITHOUT_FORWARD_NAVIGATION);
view.showView(controller, null, view2, Direction.BACKWARD);
expect(view.hideView(controller, view3, Direction.FORWARD)).andReturn(HideOperation.ALLOW_WITHOUT_FORWARD_NAVIGATION);
view.showView(controller, null, view3, Direction.BACKWARD);
expect(view.hideView(controller, view4, Direction.FORWARD)).andReturn(HideOperation.ALLOW_WITHOUT_FORWARD_NAVIGATION);
view.showView(controller, null, view4, Direction.BACKWARD);
replay(view);
view2.showView(controller, null, view, Direction.FORWARD);
expect(view2.hideView(controller, view, Direction.BACKWARD)).andReturn(HideOperation.ALLOW);
replay(view2);
view3.showView(controller, null, view, Direction.FORWARD);
expect(view3.hideView(controller, view, Direction.BACKWARD)).andReturn(HideOperation.ALLOW);
replay(view3);
view4.showView(controller, null, view, Direction.FORWARD);
expect(view4.hideView(controller, view, Direction.BACKWARD)).andReturn(HideOperation.ALLOW);
replay(view4);
// Setup views
controller.viewStack.push(view);
controller.currentView = view;
controller.indexOfCurrentView = 0;
// Run test
controller.goToView(view2);
controller.goBack();
controller.goToView(view3);
controller.goBack();
controller.goToView(view4);
controller.goBack();
// Verify results
assertSame(view, controller.getCurrentView());
verify(view);
verify(view2);
verify(view3);
verify(view4);
}
}