Public(t.broyer@gmail.com):

Adds a unit-test to explicitly check that redundant calls to
showActivityWidget are okay. The test is needed because
AcceptsOneWidget passed to the Activity by ActivityManager is not
directly the one you passed to its setDisplay() method, so
ActivityManager could (theoretically) evolve in the future and break
this use case, which isn't documented as being a "valid use case".

Also "fixes" what looks like an oversight in AsyncActivity#start.

Review by rjrjr@google.com
http://gwt-code-reviews.appspot.com/999802

Review by: robertvawter@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9583 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/test/com/google/gwt/activity/shared/ActivityManagerTest.java b/user/test/com/google/gwt/activity/shared/ActivityManagerTest.java
index 0f25f8b..46e2892 100644
--- a/user/test/com/google/gwt/activity/shared/ActivityManagerTest.java
+++ b/user/test/com/google/gwt/activity/shared/ActivityManagerTest.java
@@ -41,6 +41,7 @@
     @Override
     public void start(AcceptsOneWidget display, EventBus eventBus) {
       this.display = display;
+      this.bus = eventBus;
     }
 
     void finish() {
@@ -455,4 +456,51 @@
     assertTrue(activity1.stopped);
     assertFalse(activity1.canceled);
   }
+  
+  /**
+   * Non-regression test: make sure an activity can call {@link AcceptsOneWidget#setWidget(IsWidget)} several times to switch views.
+   */
+  public void testSetWidgetSeveralTimesPerActivity() {
+    class TwoViewActivity extends SyncActivity {
+      MyView view2;
+      
+      public TwoViewActivity(MyView view1, MyView view2) {
+        super(view1);
+        this.view2 = view2;
+      }
+      
+      void secondView() {
+        display.setWidget(view2);
+      }
+      
+      void firstView() {
+        display.setWidget(view);
+      }
+    }
+    final TwoViewActivity activity = new TwoViewActivity(new MyView(), new MyView());
+    
+    ActivityMapper map = new ActivityMapper() {
+      public Activity getActivity(Place place) {
+        return activity;
+      }
+    };
+
+    manager = new ActivityManager(map, eventBus);
+    manager.setDisplay(realDisplay);
+    
+    // Start an activity
+    manager.onPlaceChange(new PlaceChangeEvent(place1));
+
+    assertEquals(activity.view, realDisplay.widget);
+    
+    // Call setWidget on the display several times, just to make sure it's possible
+    activity.secondView();
+    assertEquals(activity.view2, realDisplay.widget);
+
+    activity.firstView();
+    assertEquals(activity.view, realDisplay.widget);
+
+    activity.secondView();
+    assertEquals(activity.view2, realDisplay.widget);
+  }
 }