Author: ivaynberg
Date: Sat Sep 17 20:07:48 2011
New Revision: 1172057

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

Issue: WICKET-4058

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/FormTesterSubmitLinkTest.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=1172057&r1=1172056&r2=1172057&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 20:07:48 2011
@@ -26,7 +26,6 @@ import java.lang.reflect.Method;
 import java.nio.charset.Charset;
 import java.text.ParseException;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -2267,18 +2266,10 @@ public class BaseWicketTester
                                final String inputName = 
formComponent.getInputName();
                                if 
(!currentParameterNamesSet.contains(inputName))
                                {
-                                       final Object modelObject = 
formComponent.getModelObject();
-                                       if (modelObject instanceof 
Collection<?>)
+                                       String[] values = 
FormTester.getInputValue(formComponent);
+                                       for (String value : values)
                                        {
-                                               final Collection<?> 
collectionModelObject = (Collection<?>)modelObject;
-                                               for (Object value : 
collectionModelObject)
-                                               {
-                                                       
postParameters.addParameterValue(inputName, value.toString());
-                                               }
-                                       }
-                                       else
-                                       {
-                                               
postParameters.addParameterValue(inputName, formComponent.getValue());
+                                               
postParameters.addParameterValue(inputName, value);
                                        }
                                }
                        }

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=1172057&r1=1172056&r2=1172057&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 20:07:48 2011
@@ -47,7 +47,6 @@ import org.apache.wicket.protocol.http.m
 import org.apache.wicket.util.file.File;
 import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.string.StringValue;
-import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.visit.IVisit;
 import org.apache.wicket.util.visit.IVisitor;
 
@@ -389,108 +388,131 @@ public class FormTester
                                        return;
                                }
 
-                               // if component is text field and do not have 
exist value, fill
-                               // blank String if required
-                               if (formComponent instanceof 
AbstractTextComponent)
+                               String[] values = getInputValue(formComponent);
+                               if (formComponent instanceof 
AbstractTextComponent<?>)
                                {
-                                       if 
(Strings.isEmpty(getFormComponentValue(formComponent)))
+                                       if (values.length == 0 && 
fillBlankString)
                                        {
-                                               if (fillBlankString)
-                                               {
-                                                       
setFormComponentValue(formComponent, "");
-                                               }
-                                       }
-                                       else
-                                       {
-                                               
setFormComponentValue(formComponent, getFormComponentValue(formComponent));
+                                               
setFormComponentValue(formComponent, "");
                                        }
                                }
-                               else if ((formComponent instanceof 
DropDownChoice) ||
-                                       (formComponent instanceof RadioChoice) 
|| (formComponent instanceof CheckBox))
+                               for (String value : values)
                                {
-                                       setFormComponentValue(formComponent, 
getFormComponentValue(formComponent));
+                                       addFormComponentValue(formComponent, 
value);
                                }
-                               else if (formComponent instanceof 
ListMultipleChoice)
+                       }
+               });
+               workingForm.detach();
+       }
+
+       /**
+        * Gets request parameter values for the form component that represents 
its current model value
+        * 
+        * @param formComponent
+        * @return array containing parameter values
+        */
+       public static String[] getInputValue(FormComponent<?> formComponent)
+       {
+               // do nothing for invisible or disabled component -- the 
browser would not send any
+               // parameter for a disabled component
+               if (!(formComponent.isVisibleInHierarchy() && 
formComponent.isEnabledInHierarchy()))
+               {
+                       return new String[] { };
+               }
+
+               // if component is text field and do not have exist value, fill
+               // blank String if required
+               if (formComponent instanceof AbstractTextComponent)
+               {
+                       return new String[] { 
getFormComponentValue(formComponent) };
+               }
+               else if ((formComponent instanceof DropDownChoice) ||
+                       (formComponent instanceof RadioChoice) || 
(formComponent instanceof CheckBox))
+               {
+                       return new String[] { 
getFormComponentValue(formComponent) };
+               }
+               else if (formComponent instanceof ListMultipleChoice)
+               {
+                       return 
getFormComponentValue(formComponent).split(FormComponent.VALUE_SEPARATOR);
+               }
+               else if (formComponent instanceof CheckGroup)
+               {
+                       final Collection<?> checkGroupValues = 
(Collection<?>)formComponent.getDefaultModelObject();
+                       final List<String> result = new ArrayList<String>();
+                       formComponent.visitChildren(Check.class, new 
IVisitor<Component, Void>()
+                       {
+                               public void component(final Component 
component, final IVisit<Void> visit)
                                {
-                                       final String[] modelValues = 
getFormComponentValue(formComponent).split(
-                                               FormComponent.VALUE_SEPARATOR);
-                                       for (String modelValue : modelValues)
+                                       if 
(checkGroupValues.contains(component.getDefaultModelObject()))
                                        {
-                                               
addFormComponentValue(formComponent, modelValue);
+                                               
result.add(getFormComponentValue((Check<?>)component));
                                        }
                                }
-                               else if (formComponent instanceof CheckGroup)
+                       });
+                       return result.toArray(new String[result.size()]);
+               }
+               else if (formComponent instanceof RadioGroup)
+               {
+                       // TODO 1.5: see if all these transformations can be 
factored out into
+                       // checkgroup/radiogroup by them implementing some sort 
of interface {
+                       // getValue(); } otherwise all these implementation 
details leak into the tester
+                       final Object value = 
formComponent.getDefaultModelObject();
+                       String result = null;
+                       if (value != null)
+                       {
+                               result = 
formComponent.visitChildren(Radio.class, new IVisitor<Component, String>()
                                {
-                                       final Collection<?> checkGroupValues = 
(Collection<?>)formComponent.getDefaultModelObject();
-                                       
formComponent.visitChildren(Check.class, new IVisitor<Component, Void>()
+                                       public void component(final Component 
component, final IVisit<String> visit)
                                        {
-                                               public void component(final 
Component component, final IVisit<Void> visit)
+                                               if 
(value.equals(component.getDefaultModelObject()))
                                                {
-                                                       if 
(checkGroupValues.contains(component.getDefaultModelObject()))
-                                                       {
-                                                               
addFormComponentValue(formComponent,
-                                                                       
getFormComponentValue((Check<?>)component));
-                                                       }
+                                                       
visit.stop(getFormComponentValue((Radio<?>)component));
                                                }
-                                       });
-                               }
-                               else if (formComponent instanceof RadioGroup)
-                               {
-                                       // TODO 1.5: see if all these 
transformations can be factored out into
-                                       // checkgroup/radiogroup by them 
implementing some sort of interface {
-                                       // getValue(); } otherwise all these 
implementation details leak into the tester
-                                       final Object value = 
formComponent.getDefaultModelObject();
-                                       if (value != null)
-                                       {
-                                               
formComponent.visitChildren(Radio.class, new IVisitor<Component, Void>()
+                                               else
                                                {
-                                                       public void 
component(final Component component,
-                                                               final 
IVisit<Void> visit)
-                                                       {
-                                                               if 
(value.equals(component.getDefaultModelObject()))
-                                                               {
-                                                                       
addFormComponentValue(formComponent,
-                                                                               
getFormComponentValue((Radio<?>)component));
-                                                                       
visit.stop();
-                                                               }
-                                                               else
-                                                               {
-                                                                       
visit.dontGoDeeper();
-                                                               }
-                                                       }
-                                               });
+                                                       visit.dontGoDeeper();
+                                               }
                                        }
-                               }
+                               });
                        }
-
-                       private String getFormComponentValue(final 
FormComponent<?> formComponent)
+                       if (result == null)
                        {
-                               boolean oldEscape = 
formComponent.getEscapeModelStrings();
-                               formComponent.setEscapeModelStrings(false);
-                               String val = formComponent.getValue();
-                               formComponent.setEscapeModelStrings(oldEscape);
-                               return val;
+                               return new String[] { };
                        }
-
-                       private String getFormComponentValue(final Check<?> 
formComponent)
+                       else
                        {
-                               boolean oldEscape = 
formComponent.getEscapeModelStrings();
-                               formComponent.setEscapeModelStrings(false);
-                               String val = formComponent.getValue();
-                               formComponent.setEscapeModelStrings(oldEscape);
-                               return val;
+                               return new String[] { result };
                        }
+               }
+               return new String[] { };
+       }
 
-                       private String getFormComponentValue(final Radio<?> 
formComponent)
-                       {
-                               boolean oldEscape = 
formComponent.getEscapeModelStrings();
-                               formComponent.setEscapeModelStrings(false);
-                               String val = formComponent.getValue();
-                               formComponent.setEscapeModelStrings(oldEscape);
-                               return val;
-                       }
-               });
-               workingForm.detach();
+
+       private static String getFormComponentValue(final FormComponent<?> 
formComponent)
+       {
+               boolean oldEscape = formComponent.getEscapeModelStrings();
+               formComponent.setEscapeModelStrings(false);
+               String val = formComponent.getValue();
+               formComponent.setEscapeModelStrings(oldEscape);
+               return val;
+       }
+
+       private static String getFormComponentValue(final Check<?> 
formComponent)
+       {
+               boolean oldEscape = formComponent.getEscapeModelStrings();
+               formComponent.setEscapeModelStrings(false);
+               String val = formComponent.getValue();
+               formComponent.setEscapeModelStrings(oldEscape);
+               return val;
+       }
+
+       private static String getFormComponentValue(final Radio<?> 
formComponent)
+       {
+               boolean oldEscape = formComponent.getEscapeModelStrings();
+               formComponent.setEscapeModelStrings(false);
+               String val = formComponent.getValue();
+               formComponent.setEscapeModelStrings(oldEscape);
+               return val;
        }
 
        /**

Modified: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterSubmitLinkTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterSubmitLinkTest.java?rev=1172057&r1=1172056&r2=1172057&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterSubmitLinkTest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterSubmitLinkTest.java
 Sat Sep 17 20:07:48 2011
@@ -16,12 +16,21 @@
  */
 package org.apache.wicket.util.tester;
 
+import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
+import org.apache.wicket.markup.IMarkupResourceStreamProvider;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.Radio;
+import org.apache.wicket.markup.html.form.RadioGroup;
 import org.apache.wicket.markup.html.form.SubmitLink;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.StringResourceStream;
 
 /**
  * <a href="https://issues.apache.org/jira/browse/WICKET-3711";>WICKET-3711</a>
@@ -58,6 +67,67 @@ public class FormTesterSubmitLinkTest ex
                        .getDefaultModelObjectAsString());
        }
 
+       public void testRadioComponentValueEncoding()
+       {
+
+               class TestPage extends WebPage implements 
IMarkupResourceStreamProvider
+               {
+                       private static final long serialVersionUID = 1L;
+
+                       private String value;
+                       private boolean submitted;
+
+                       public TestPage()
+                       {
+                               Form<Void> form = new Form<Void>("form");
+                               add(form);
+
+                               RadioGroup<String> group = new 
RadioGroup<String>("group",
+                                       new PropertyModel<String>(this, 
"value"));
+                               form.add(group);
+
+                               value = "a";
+
+                               group.add(new Radio<String>("a", 
Model.of("a")));
+                               group.add(new Radio<String>("b", 
Model.of("b")));
+
+                               form.add(new AjaxSubmitLink("submit")
+                               {
+                                       @Override
+                                       protected void 
onSubmit(AjaxRequestTarget target, Form<?> form)
+                                       {
+                                               submitted = true;
+                                       }
+
+                                       @Override
+                                       protected void 
onError(AjaxRequestTarget target, Form<?> form)
+                                       {
+                                       }
+                               });
+                       }
+
+
+                       public IResourceStream 
getMarkupResourceStream(MarkupContainer container,
+                               Class<?> containerClass)
+                       {
+                               return new StringResourceStream(
+                                       "<html><body><form 
wicket:id='form'><div wicket:id='group'><input type='radio' 
wicket:id='a'/><input type='radio' wicket:id='b'/></div><input 
wicket:id='submit' type='submit'/></form></body></html>");
+                       }
+               }
+
+               TestPage page = new TestPage();
+               WicketTester tester = new WicketTester();
+               tester.startPage(page);
+
+               // clicking an ajax submit link will force the form to be 
ajax-serialized, current values of
+               // form components copied into request. this will check that 
the value of radio is correctly
+               // serialized.
+
+               tester.clickLink("form:submit");
+               assertTrue(page.submitted);
+               assertEquals("a", page.value);
+       }
+
        /**
         * A test page for {@link FormTesterSubmitLinkTest}
         */


Reply via email to