Author: ivaynberg
Date: Sat Sep 17 18:54:11 2011
New Revision: 1172048

URL: http://svn.apache.org/viewvc?rev=1172048&view=rev
Log:

Issue: WICKET-3977

Modified:
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java?rev=1172048&r1=1172047&r2=1172048&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
 Sat Sep 17 18:54:11 2011
@@ -989,6 +989,28 @@ public class BaseWicketTester
        }
 
        /**
+        * Simulates invoking a listener on a component. As opposed to the
+        * {@link #executeListener(Component)} method, current request/response 
objects will be used
+        * 
+        * After the listener interface is invoked the page containing the 
component will be rendered
+        * (with an optional redirect - depending on {@link RenderStrategy}).
+        * 
+        * @param component
+        * @param listener
+        */
+       public void invokeListener(final Component component, final 
RequestListenerInterface listener)
+       {
+               Args.notNull(component, "component");
+
+               // there are two ways to do this. RequestCycle could be forced 
to call the handler
+               // directly but constructing and parsing the URL increases the 
chance of triggering bugs
+               IRequestHandler handler = new 
ListenerInterfaceRequestHandler(new PageAndComponentProvider(
+                       component.getPage(), component), listener);
+
+               processRequest(handler);
+       }
+
+       /**
         * Builds and processes a request suitable for invoking a listener. The 
<code>Component</code>
         * must implement any of the known <code>IListener</code> interfaces.
         * 

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java?rev=1172048&r1=1172047&r2=1172048&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
 Sat Sep 17 18:54:11 2011
@@ -123,12 +123,7 @@ public class FormTester
                protected abstract void 
assignValueToFormComponent(FormComponent<?> formComponent,
                        String value);
 
-               /**
-                * Selects a given index in a selectable 
<code>FormComponent</code>.
-                * 
-                * @param index
-                */
-               protected final void doSelect(final int index)
+               public String getChoiceValueForIndex(int index)
                {
                        if (formComponent instanceof RadioGroup)
                        {
@@ -137,9 +132,9 @@ public class FormTester
                                if (foundRadio == null)
                                {
                                        fail("RadioGroup " + 
formComponent.getPath() + " does not have index:" + index);
-                                       return;
+                                       return null;
                                }
-                               assignValueToFormComponent(formComponent, 
foundRadio.getValue());
+                               return foundRadio.getValue();
                        }
                        else if (formComponent instanceof CheckGroup)
                        {
@@ -148,10 +143,10 @@ public class FormTester
                                if (foundCheck == null)
                                {
                                        fail("CheckGroup " + 
formComponent.getPath() + " does not have index:" + index);
-                                       return;
+                                       return null;
                                }
 
-                               assignValueToFormComponent(formComponent, 
foundCheck.getValue());
+                               return foundCheck.getValue();
                        }
                        else
                        {
@@ -159,12 +154,25 @@ public class FormTester
                                if (idValue == null)
                                {
                                        fail(formComponent.getPath() + " is not 
a selectable Component.");
+                                       return null;
                                }
                                else
                                {
-                                       
assignValueToFormComponent(formComponent, idValue);
+                                       return idValue;
                                }
                        }
+
+               }
+
+               /**
+                * Selects a given index in a selectable 
<code>FormComponent</code>.
+                * 
+                * @param index
+                */
+               protected final void doSelect(final int index)
+               {
+                       String value = getChoiceValueForIndex(index);
+                       assignValueToFormComponent(formComponent, value);
                }
 
                /**
@@ -546,7 +554,7 @@ public class FormTester
                                boolean wantOnSelectionChangedNotifications = 
(Boolean)wantOnSelectionChangedNotificationsMethod.invoke(component);
                                if (wantOnSelectionChangedNotifications)
                                {
-                                       tester.executeListener(component, 
IOnChangeListener.INTERFACE);
+                                       tester.invokeListener(component, 
IOnChangeListener.INTERFACE);
                                }
                        }
                        catch (final Exception x)

Modified: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java?rev=1172048&r1=1172047&r2=1172048&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java
 Sat Sep 17 18:54:11 2011
@@ -16,15 +16,25 @@
  */
 package org.apache.wicket.util.tester;
 
+import java.util.Arrays;
+import java.util.List;
 import java.util.Locale;
 
 import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.Session;
 import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.markup.IMarkupResourceStreamProvider;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.form.DropDownChoice;
+import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.upload.FileUpload;
+import org.apache.wicket.model.Model;
 import org.apache.wicket.request.handler.ListenerInvocationNotAllowedException;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.file.File;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.StringResourceStream;
 import 
org.apache.wicket.util.tester.MockFormFileUploadPage.MockDomainObjectFileUpload;
 import org.apache.wicket.util.tester.MockFormPage.MockDomainObject;
 
@@ -238,7 +248,52 @@ public class FormTesterTest extends Wick
                }
                catch (ListenerInvocationNotAllowedException expected)
                {
-                       ;
+                       // expected
                }
        }
+
+       public void testWantOnChangeSelectionNotification()
+       {
+               class TestPage extends WebPage implements 
IMarkupResourceStreamProvider
+               {
+                       private String selection;
+
+                       public TestPage()
+                       {
+                               Form<Object> form = new Form<Object>("form");
+                               add(form);
+                               List<String> choices = Arrays.asList(new 
String[] { "opt 1", "opt 2" });
+                               form.add(new DropDownChoice<String>("selector", 
Model.of(""), choices)
+                               {
+                                       @Override
+                                       protected boolean 
wantOnSelectionChangedNotifications()
+                                       {
+                                               return true;
+                                       }
+
+                                       @Override
+                                       protected void onSelectionChanged(final 
String newSelection)
+                                       {
+                                               selection = newSelection;
+                                       }
+                               });
+                       }
+
+                       public IResourceStream 
getMarkupResourceStream(MarkupContainer container,
+                               Class<?> containerClass)
+                       {
+                               return new StringResourceStream(
+                                       "<html><body><form 
wicket:id='form'><select wicket:id='selector'></select></form></body></html>");
+                       }
+               }
+
+               TestPage page = new TestPage();
+               tester.startPage(page);
+
+               final FormTester form = tester.newFormTester("form");
+               form.select("selector", 0);
+
+               // Fails, because of null value passed to onSelectionChanged.
+               assertEquals("opt 1", page.selection);
+       }
 }


Reply via email to