// Copyright 2012 Google Inc. All Rights Reserved.
//
// 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.google.collide.client.history;
import com.google.collide.json.client.JsoStringMap;
import com.google.collide.json.shared.JsonStringMap;
/**
* Mock {@link Place}s used for testing.
*
*/
public class MockPlaces {
/**
* A Mock Child.
*
* Lets call him "Child A".
*/
public static class MockChildPlaceA extends MockPlace {
/**
* The {@link PlaceNavigationEvent} for Child A.
*/
public class NavigationEvent extends PlaceNavigationEvent<MockChildPlaceA> {
int someNumber;
String someString;
protected NavigationEvent() {
super(MockChildPlaceA.this);
}
@Override
public JsonStringMap<String> getBookmarkableState() {
JsoStringMap<String> keyValues = JsoStringMap.create();
keyValues.put(SOME_STRING_KEY, someString);
keyValues.put(SOME_NUMBER_KEY, someNumber + "");
return keyValues;
}
}
/**
* The {@link PlaceNavigationHandler} for Child A.
*/
public static class NavigationHandler extends MockPlaceNavigationHandler<
MockChildPlaceA.NavigationEvent> {
@Override
protected void enterPlace(MockChildPlaceA.NavigationEvent navigationEvent) {
super.enterPlace(navigationEvent);
navigationEvent.getPlace().registerChildHandler(GRANDCHILD_A, GRANDCHILD_A_NAV);
}
}
protected MockChildPlaceA() {
super("MockChildPlaceA");
}
@Override
public MockChildPlaceA.NavigationEvent createNavigationEvent(
JsonStringMap<String> decodedState) {
// If this decoded string is not a valid integer, this will throw. Which
// is fine. Let it break the test.
return createNavigationEvent(
decodedState.get(SOME_STRING_KEY), Integer.parseInt(decodedState.get(SOME_NUMBER_KEY)));
}
public MockChildPlaceA.NavigationEvent createNavigationEvent(
String someString, int someNumber) {
MockChildPlaceA.NavigationEvent navEvent = new MockChildPlaceA.NavigationEvent();
navEvent.someString = someString;
navEvent.someNumber = someNumber;
return navEvent;
}
}
/**
* A Mock Child with no bookmarkable state.
*
* Lets call him "GrandChild B".
*/
public static class MockGrandChildPlaceA extends MockPlace {
/**
* The {@link PlaceNavigationEvent} for GrandChild B.
*/
public class NavigationEvent extends PlaceNavigationEvent<MockGrandChildPlaceA> {
protected NavigationEvent() {
super(MockGrandChildPlaceA.this);
}
@Override
public JsonStringMap<String> getBookmarkableState() {
return JsoStringMap.create();
}
}
/**
* The {@link PlaceNavigationHandler} for Child B.
*/
public static class NavigationHandler extends MockPlaceNavigationHandler<
MockGrandChildPlaceA.NavigationEvent> {
}
protected MockGrandChildPlaceA() {
super("MockGrandChildPlaceA");
}
@Override
public MockGrandChildPlaceA.NavigationEvent createNavigationEvent(
JsonStringMap<String> decodedState) {
return new MockGrandChildPlaceA.NavigationEvent();
}
}
/**
* A Mock Parent.
*
* Lets call him "A".
*/
public static class MockParentPlaceA extends MockPlace {
/**
* The {@link PlaceNavigationEvent} for A.
*/
public class NavigationEvent extends PlaceNavigationEvent<MockParentPlaceA> {
String someString;
protected NavigationEvent() {
super(MockParentPlaceA.this);
}
@Override
public JsonStringMap<String> getBookmarkableState() {
JsoStringMap<String> keyValues = JsoStringMap.create();
keyValues.put(SOME_STRING_KEY, someString);
return keyValues;
}
}
/**
* The {@link PlaceNavigationHandler} for A.
*/
public static class NavigationHandler extends MockPlaceNavigationHandler<
MockParentPlaceA.NavigationEvent> {
@Override
protected void enterPlace(MockParentPlaceA.NavigationEvent navigationEvent) {
super.enterPlace(navigationEvent);
// Add a Child to ParentA.
navigationEvent.getPlace().registerChildHandler(MockPlaces.CHILD_A, CHILD_A_NAV);
}
}
protected MockParentPlaceA() {
super("MockParentPlaceA");
}
@Override
public MockParentPlaceA.NavigationEvent createNavigationEvent(
JsonStringMap<String> decodedState) {
return createNavigationEvent(decodedState.get(SOME_STRING_KEY));
}
public MockParentPlaceA.NavigationEvent createNavigationEvent(String someString) {
MockParentPlaceA.NavigationEvent navEvent = new MockParentPlaceA.NavigationEvent();
navEvent.someString = someString;
return navEvent;
}
}
/**
* A Mock Parent.
*
* Lets call him "B".
*/
public static class MockParentPlaceB extends MockPlace {
/**
* The {@link PlaceNavigationEvent} for B.
*/
public class NavigationEvent extends PlaceNavigationEvent<MockParentPlaceB> {
protected NavigationEvent() {
super(MockParentPlaceB.this);
}
@Override
public JsonStringMap<String> getBookmarkableState() {
// We keep no state.
return JsoStringMap.create();
}
}
/**
* The {@link PlaceNavigationHandler} for B.
*/
public static class NavigationHandler extends MockPlaceNavigationHandler<
MockParentPlaceB.NavigationEvent> {
}
protected MockParentPlaceB() {
super("MockParentPlaceB");
}
@Override
public MockParentPlaceB.NavigationEvent createNavigationEvent() {
return new MockParentPlaceB.NavigationEvent();
}
@Override
public MockParentPlaceB.NavigationEvent createNavigationEvent(
JsonStringMap<String> decodedState) {
return createNavigationEvent();
}
}
/**
* Base class for all mock Places.
*/
public abstract static class MockPlace extends Place {
protected MockPlace(String placeName) {
super(placeName);
}
}
/**
* Base class for mock PlaceNavigationHandlers. Lets us track invocation
* counts.
*/
abstract static class MockPlaceNavigationHandler<E extends PlaceNavigationEvent<?>>
extends PlaceNavigationHandler<E> {
private int enterCount;
private int cleanupCount;
private int reEnterCount;
private boolean hadNewState;
MockPlaceNavigationHandler() {
}
@Override
protected void cleanup() {
cleanupCount++;
}
@Override
protected void enterPlace(E navigationEvent) {
enterCount++;
}
@Override
protected void reEnterPlace(E navigationEvent, boolean newState) {
reEnterCount++;
hadNewState = newState;
}
public boolean hadNewState() {
return hadNewState;
}
public int getEnterCount() {
return enterCount;
}
public int getCleanupCount() {
return cleanupCount;
}
public int getReEnterCount() {
return reEnterCount;
}
public void resetCounts() {
enterCount = 0;
cleanupCount = 0;
reEnterCount = 0;
}
}
public static final MockChildPlaceA CHILD_A = new MockChildPlaceA();
public static final MockChildPlaceA.NavigationHandler CHILD_A_NAV =
new MockChildPlaceA.NavigationHandler();
public static final MockGrandChildPlaceA GRANDCHILD_A = new MockGrandChildPlaceA();
public static final MockGrandChildPlaceA.NavigationHandler GRANDCHILD_A_NAV =
new MockGrandChildPlaceA.NavigationHandler();
public static final MockParentPlaceA PARENT_A = new MockParentPlaceA();
public static final MockParentPlaceA.NavigationHandler PARENT_A_NAV =
new MockParentPlaceA.NavigationHandler();
public static final MockParentPlaceB PARENT_B = new MockParentPlaceB();
public static final MockParentPlaceB.NavigationHandler PARENT_B_NAV =
new MockParentPlaceB.NavigationHandler();
public static final String SOME_NUMBER_KEY = "someNumber";
public static final String SOME_STRING_KEY = "someString";
public static void resetCounts() {
CHILD_A_NAV.resetCounts();
CHILD_A.setIsActive(false, null);
GRANDCHILD_A_NAV.resetCounts();
GRANDCHILD_A.setIsActive(false, null);
PARENT_A_NAV.resetCounts();
PARENT_A.setIsActive(false, null);
PARENT_B_NAV.resetCounts();
PARENT_B.setIsActive(false, null);
}
private MockPlaces() {
}
}