This is an automated email from the ASF dual-hosted git repository. lukaszlenart pushed a commit to branch WW-5192-radio in repository https://gitbox.apache.org/repos/asf/struts.git
commit e6c1cec7f81ff29dcce506d7dcc7e2b25d4d321f Author: Lukasz Lenart <lukaszlen...@apache.org> AuthorDate: Thu Jul 7 21:34:43 2022 +0200 WW-5192 Fixes brok radio tag when using with enums --- .../java/org/apache/struts2/components/Radio.java | 4 + .../test/java/org/apache/struts2/TestAction.java | 77 +++-- .../apache/struts2/views/jsp/AbstractTagTest.java | 68 +++-- .../org/apache/struts2/views/jsp/ui/RadioTest.java | 311 ++++++++++++++------- .../org/apache/struts2/views/jsp/ui/Radio-10.txt | 4 + .../org/apache/struts2/views/jsp/ui/Radio-9.txt | 4 + 6 files changed, 306 insertions(+), 162 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/components/Radio.java b/core/src/main/java/org/apache/struts2/components/Radio.java index ba5eb471f..7ef81000a 100644 --- a/core/src/main/java/org/apache/struts2/components/Radio.java +++ b/core/src/main/java/org/apache/struts2/components/Radio.java @@ -80,4 +80,8 @@ public class Radio extends ListUIBean { return true; } + protected Class<?> getValueClassType() { + return String.class; + } + } diff --git a/core/src/test/java/org/apache/struts2/TestAction.java b/core/src/test/java/org/apache/struts2/TestAction.java index 35b48b320..5543b4462 100644 --- a/core/src/test/java/org/apache/struts2/TestAction.java +++ b/core/src/test/java/org/apache/struts2/TestAction.java @@ -27,11 +27,12 @@ import com.opensymphony.xwork2.validator.annotations.Validations; import com.opensymphony.xwork2.validator.annotations.ValidatorType; import org.apache.struts2.views.jsp.ui.User; -import java.util.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; - -/** - */ public class TestAction extends ActionSupport { private static final long serialVersionUID = -8891365561914451494L; @@ -50,22 +51,22 @@ public class TestAction extends ActionSupport { private SomeEnum status = SomeEnum.COMPLETED; private Float floatNumber; private Long id; + private List<SomeEnum> enumList; + private List<Integer> intList; - private final Map<String, String> texts = new HashMap<String, String>(); + private final Map<String, String> texts = new HashMap<>(); /** * Define a text resource within this action that will be returned by the getText methods - * here before delegating to the default TextProvider - * - * call - * @param key - * @param value + * here before delegating to the default TextProvider call */ public void setText(String key, String value) { this.texts.put(key, value); } - /** Returns the test value if defined otherwise delegates to the default TextProvider */ + /** + * Returns the test value if defined otherwise delegates to the default TextProvider + */ public String getText(String key) { if (this.texts.containsKey(key)) { return this.texts.get(key); @@ -73,8 +74,10 @@ public class TestAction extends ActionSupport { return super.getText(key); } - /** This is the method invoked by the {@link org.apache.struts2.util.TextProviderHelper}. - * Returns the test value if defined otherwise delegates to the default TextProvider */ + /** + * This is the method invoked by the {@link org.apache.struts2.util.TextProviderHelper}. + * Returns the test value if defined otherwise delegates to the default TextProvider + */ public String getText(String key, String defaultValue, List<?> args, ValueStack stack) { if (this.texts.containsKey(key)) { return this.texts.get(key); @@ -180,20 +183,21 @@ public class TestAction extends ActionSupport { } @Validations( - requiredFields = { - @RequiredFieldValidator(type = ValidatorType.SIMPLE, fieldName = "status", message = "You must enter a value for field.") - }, - requiredStrings = { - @RequiredStringValidator(type = ValidatorType.SIMPLE, fieldName = "result", message = "You must enter a value for field.") - } + requiredFields = { + @RequiredFieldValidator(type = ValidatorType.SIMPLE, fieldName = "status", message = "You must enter a value for field.") + }, + requiredStrings = { + @RequiredStringValidator(type = ValidatorType.SIMPLE, fieldName = "result", message = "You must enter a value for field.") + } ) public String annotatedExecute1() throws Exception { return Action.SUCCESS; } + @Validations( - requiredFields = { - @RequiredFieldValidator(type = ValidatorType.SIMPLE, fieldName = "status", message = "You must enter a value for field.") - } + requiredFields = { + @RequiredFieldValidator(type = ValidatorType.SIMPLE, fieldName = "status", message = "You must enter a value for field.") + } ) public String annotatedExecute2() throws Exception { return Action.SUCCESS; @@ -207,16 +211,16 @@ public class TestAction extends ActionSupport { return INPUT; } - public SomeEnum getStatus() { - return status; - } + public SomeEnum getStatus() { + return status; + } - public void setStatus(SomeEnum status) { - this.status = status; - } + public void setStatus(SomeEnum status) { + this.status = status; + } public List<SomeEnum> getStatusList() { - return Arrays.asList(SomeEnum.values()); + return Arrays.asList(SomeEnum.values()); } public Float getFloatNumber() { @@ -235,4 +239,19 @@ public class TestAction extends ActionSupport { this.id = id; } + public List<SomeEnum> getEnumList() { + return enumList; + } + + public void setEnumList(List<SomeEnum> enumList) { + this.enumList = enumList; + } + + public List<Integer> getIntList() { + return intList; + } + + public void setIntList(List<Integer> intList) { + this.intList = intList; + } } diff --git a/core/src/test/java/org/apache/struts2/views/jsp/AbstractTagTest.java b/core/src/test/java/org/apache/struts2/views/jsp/AbstractTagTest.java index c22f90404..42e6f7e92 100644 --- a/core/src/test/java/org/apache/struts2/views/jsp/AbstractTagTest.java +++ b/core/src/test/java/org/apache/struts2/views/jsp/AbstractTagTest.java @@ -18,36 +18,31 @@ */ package org.apache.struts2.views.jsp; -import java.io.File; -import java.io.StringWriter; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - -import javax.servlet.http.HttpServletResponse; -import javax.servlet.jsp.JspWriter; - +import com.mockobjects.dynamic.Mock; +import com.opensymphony.xwork2.Action; +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.inject.Container; +import com.opensymphony.xwork2.util.ValueStack; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.struts2.ServletActionContext; import org.apache.struts2.StrutsInternalTestCase; import org.apache.struts2.TestAction; import org.apache.struts2.dispatcher.ApplicationMap; import org.apache.struts2.dispatcher.Dispatcher; -import org.apache.struts2.dispatcher.MockDispatcher; import org.apache.struts2.dispatcher.HttpParameters; +import org.apache.struts2.dispatcher.MockDispatcher; import org.apache.struts2.dispatcher.RequestMap; import org.apache.struts2.dispatcher.SessionMap; -import com.mockobjects.dynamic.Mock; -import com.opensymphony.xwork2.Action; -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.inject.Container; -import com.opensymphony.xwork2.util.ValueStack; - +import javax.servlet.http.HttpServletResponse; +import javax.servlet.jsp.JspWriter; +import java.io.File; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.Map; /** * Base class to extend for unit testing UI Tags. - * */ public abstract class AbstractTagTest extends StrutsInternalTestCase { protected Action action; @@ -62,7 +57,7 @@ public abstract class AbstractTagTest extends StrutsInternalTestCase { protected StrutsMockHttpServletRequest request; protected StrutsMockPageContext pageContext; protected HttpServletResponse response; - + protected Mock mockContainer; /** @@ -114,11 +109,11 @@ public abstract class AbstractTagTest extends StrutsInternalTestCase { Dispatcher.setInstance(du); session = new SessionMap<>(request); Map<String, Object> extraContext = du.createContextMap(new RequestMap(request), - HttpParameters.create(request.getParameterMap()).build(), - session, - new ApplicationMap(pageContext.getServletContext()), - request, - response); + HttpParameters.create(request.getParameterMap()).build(), + session, + new ApplicationMap(pageContext.getServletContext()), + request, + response); // let's not set the locale -- there is a test that checks if Dispatcher actually picks this up... // ... but generally we want to just use no locale (let it stay system default) extraContext = ActionContext.of(extraContext).withLocale(null).getContextMap(); @@ -149,18 +144,18 @@ public abstract class AbstractTagTest extends StrutsInternalTestCase { } /** - * Compare if two component tags are considered equal according to their fields as accessed + * Compare if two component tags are considered equal according to their fields as accessed * via reflection. - * - * Utilizes {@link EqualsBuilder#reflectionEquals(java.lang.Object, java.lang.Object, boolean)} to perform + * <p> + * Utilizes {@link EqualsBuilder#reflectionEquals(java.lang.Object, java.lang.Object, boolean)} to perform * the check, and compares transient fields as well. This may fail when run while a security manager is * active, due to a need to user reflection. - * + * <p> * This method may be useful for checking if the state of a tag is what is expected after a given set of operations, * or after clearing state such as for calls involving {@link StrutsBodyTagSupport#clearTagStateForTagPoolingServers()} * has taken place following {@link StrutsBodyTagSupport#doEndTag()} processing. When making comparisons, keep in mind the * pageContext and parent Tag state are not cleared by clearTagStateForTagPoolingServers(). - * + * * @param tag1 the first {@link StrutsBodyTagSupport} to compare against the other. * @param tag2 the second {@link StrutsBodyTagSupport} to compare against the other. * @return true if the Tags are equal based on field comparisons by reflection, false otherwise. @@ -170,15 +165,16 @@ public abstract class AbstractTagTest extends StrutsInternalTestCase { } /** - * Helper method to simplify setting the performClearTagStateForTagPoolingServers state for a - * {@link ComponentTagSupport} tag's {@link Component} to match expectations for the test. - * + * Helper method to simplify setting the performClearTagStateForTagPoolingServers state for a + * {@link ComponentTagSupport} tag's {@link import org.apache.struts2.components.Component} to match expectations + * for the test. + * <p> * The component reference is not available to the tag until after the doStartTag() method is called. - * We need to ensure the component's {@link Component#performClearTagStateForTagPoolingServers} state matches - * what we set for the Tag when a non-default (true) value is used, so this method accesses the component instance, - * sets the value specified and forces the tag's parameters to be repopulated again. - * - * @param tag The ComponentTagSupport tag upon whose component we will set the performClearTagStateForTagPoolingServers state. + * We need to ensure the component's {@link import org.apache.struts2.components.Component#performClearTagStateForTagPoolingServers} + * state matches what we set for the Tag when a non-default (true) value is used, so this method accesses + * the component instance, sets the value specified and forces the tag's parameters to be repopulated again. + * + * @param tag The ComponentTagSupport tag upon whose component we will set the performClearTagStateForTagPoolingServers state. * @param performClearTagStateForTagPoolingServers true to clear tag state, false otherwise */ protected void setComponentTagClearTagState(ComponentTagSupport tag, boolean performClearTagStateForTagPoolingServers) { diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/RadioTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/RadioTest.java index 8a8cbaa0f..72e4cbf06 100644 --- a/core/src/test/java/org/apache/struts2/views/jsp/ui/RadioTest.java +++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/RadioTest.java @@ -18,77 +18,82 @@ */ package org.apache.struts2.views.jsp.ui; +import org.apache.struts2.SomeEnum; import org.apache.struts2.TestAction; import org.apache.struts2.views.jsp.AbstractUITagTest; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.TreeMap; /** + * */ public class RadioTest extends AbstractUITagTest { - - public void testMapWithBooleanAsKey() throws Exception { - TestAction testAction = (TestAction) action; - - HashMap map = new LinkedHashMap(); - map.put(Boolean.TRUE, "male"); - map.put(Boolean.FALSE, "female"); - testAction.setMap(map); - - RadioTag tag = new RadioTag(); - tag.setPageContext(pageContext); - tag.setLabel("mylabel"); - tag.setName("myname"); - tag.setValue("%{true}"); - tag.setList("map"); - - tag.doStartTag(); - tag.doEndTag(); - - verify(RadioTag.class.getResource("Radio-3.txt")); - - // Basic sanity check of clearTagStateForTagPoolingServers() behaviour for Struts Tags after doEndTag(). - RadioTag freshTag = new RadioTag(); - freshTag.setPageContext(pageContext); - assertFalse("Tag state after doEndTag() under default tag clear state is equal to new Tag with pageContext/parent set. " + - "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", - strutsBodyTagsAreReflectionEqual(tag, freshTag)); - } - - public void testMapWithBooleanAsKey_clearTagStateSet() throws Exception { - TestAction testAction = (TestAction) action; - - HashMap map = new LinkedHashMap(); - map.put(Boolean.TRUE, "male"); - map.put(Boolean.FALSE, "female"); - testAction.setMap(map); - - RadioTag tag = new RadioTag(); - tag.setPerformClearTagStateForTagPoolingServers(true); // Explicitly request tag state clearing. - tag.setPageContext(pageContext); - tag.setLabel("mylabel"); - tag.setName("myname"); - tag.setValue("%{true}"); - tag.setList("map"); - - tag.doStartTag(); - setComponentTagClearTagState(tag, true); // Ensure component tag state clearing is set true (to match tag). - tag.doEndTag(); - - verify(RadioTag.class.getResource("Radio-3.txt")); - - // Basic sanity check of clearTagStateForTagPoolingServers() behaviour for Struts Tags after doEndTag(). - RadioTag freshTag = new RadioTag(); - freshTag.setPerformClearTagStateForTagPoolingServers(true); - freshTag.setPageContext(pageContext); - assertTrue("Tag state after doEndTag() and explicit tag state clearing is inequal to new Tag with pageContext/parent set. " + - "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", - strutsBodyTagsAreReflectionEqual(tag, freshTag)); - } + + public void testMapWithBooleanAsKey() throws Exception { + TestAction testAction = (TestAction) action; + + Map<Boolean, String> map = new LinkedHashMap<>(); + map.put(Boolean.TRUE, "male"); + map.put(Boolean.FALSE, "female"); + testAction.setMap(map); + + RadioTag tag = new RadioTag(); + tag.setPageContext(pageContext); + tag.setLabel("mylabel"); + tag.setName("myname"); + tag.setValue("%{true}"); + tag.setList("map"); + + tag.doStartTag(); + tag.doEndTag(); + + verify(RadioTag.class.getResource("Radio-3.txt")); + + // Basic sanity check of clearTagStateForTagPoolingServers() behaviour for Struts Tags after doEndTag(). + RadioTag freshTag = new RadioTag(); + freshTag.setPageContext(pageContext); + assertFalse("Tag state after doEndTag() under default tag clear state is equal to new Tag with pageContext/parent set. " + + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", + strutsBodyTagsAreReflectionEqual(tag, freshTag)); + } + + public void testMapWithBooleanAsKey_clearTagStateSet() throws Exception { + TestAction testAction = (TestAction) action; + + Map<Boolean, String> map = new LinkedHashMap<>(); + map.put(Boolean.TRUE, "male"); + map.put(Boolean.FALSE, "female"); + testAction.setMap(map); + + RadioTag tag = new RadioTag(); + tag.setPerformClearTagStateForTagPoolingServers(true); // Explicitly request tag state clearing. + tag.setPageContext(pageContext); + tag.setLabel("mylabel"); + tag.setName("myname"); + tag.setValue("%{true}"); + tag.setList("map"); + + tag.doStartTag(); + setComponentTagClearTagState(tag, true); // Ensure component tag state clearing is set true (to match tag). + tag.doEndTag(); + + verify(RadioTag.class.getResource("Radio-3.txt")); + + // Basic sanity check of clearTagStateForTagPoolingServers() behaviour for Struts Tags after doEndTag(). + RadioTag freshTag = new RadioTag(); + freshTag.setPerformClearTagStateForTagPoolingServers(true); + freshTag.setPageContext(pageContext); + assertTrue("Tag state after doEndTag() and explicit tag state clearing is inequal to new Tag with pageContext/parent set. " + + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", + strutsBodyTagsAreReflectionEqual(tag, freshTag)); + } public void testMapChecked() throws Exception { TestAction testAction = (TestAction) action; @@ -103,7 +108,7 @@ public class RadioTest extends AbstractUITagTest { tag.setPageContext(pageContext); tag.setLabel("mylabel"); tag.setName("myname"); - tag.setValue("\"1\""); + tag.setValue("1"); tag.setList("map"); tag.setListKey("key"); tag.setListValue("value"); @@ -118,7 +123,7 @@ public class RadioTest extends AbstractUITagTest { freshTag.setPageContext(pageContext); assertFalse("Tag state after doEndTag() under default tag clear state is equal to new Tag with pageContext/parent set. " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", - strutsBodyTagsAreReflectionEqual(tag, freshTag)); + strutsBodyTagsAreReflectionEqual(tag, freshTag)); } public void testMapChecked_clearTagStateSet() throws Exception { @@ -135,7 +140,7 @@ public class RadioTest extends AbstractUITagTest { tag.setPageContext(pageContext); tag.setLabel("mylabel"); tag.setName("myname"); - tag.setValue("\"1\""); + tag.setValue("1"); tag.setList("map"); tag.setListKey("key"); tag.setListValue("value"); @@ -152,14 +157,122 @@ public class RadioTest extends AbstractUITagTest { freshTag.setPageContext(pageContext); assertTrue("Tag state after doEndTag() and explicit tag state clearing is inequal to new Tag with pageContext/parent set. " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", - strutsBodyTagsAreReflectionEqual(tag, freshTag)); + strutsBodyTagsAreReflectionEqual(tag, freshTag)); + } + + public void testMapCheckedUsingEnum() throws Exception { + TestAction testAction = (TestAction) action; + + List<SomeEnum> enumList = new ArrayList<>(Arrays.asList(SomeEnum.values())); + testAction.setEnumList(enumList); + + RadioTag tag = new RadioTag(); + tag.setTheme("simple"); + tag.setPageContext(pageContext); + tag.setName("status"); + tag.setValue("INIT"); + tag.setList("enumList"); + + tag.doStartTag(); + tag.doEndTag(); + + verify(RadioTag.class.getResource("Radio-9.txt")); + + // Basic sanity check of clearTagStateForTagPoolingServers() behaviour for Struts Tags after doEndTag(). + RadioTag freshTag = new RadioTag(); + freshTag.setPageContext(pageContext); + assertFalse("Tag state after doEndTag() under default tag clear state is equal to new Tag with pageContext/parent set. " + + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", + strutsBodyTagsAreReflectionEqual(tag, freshTag)); + } + + public void testMapCheckedUsingEnum_clearTagStateSet() throws Exception { + TestAction testAction = (TestAction) action; + + List<SomeEnum> enumList = new ArrayList<>(Arrays.asList(SomeEnum.values())); + testAction.setEnumList(enumList); + + RadioTag tag = new RadioTag(); + tag.setPerformClearTagStateForTagPoolingServers(true); // Explicitly request tag state clearing. + tag.setTheme("simple"); + tag.setPageContext(pageContext); + tag.setName("status"); + tag.setValue("INIT"); + tag.setList("enumList"); + + tag.doStartTag(); + tag.doEndTag(); + + verify(RadioTag.class.getResource("Radio-9.txt")); + + // Basic sanity check of clearTagStateForTagPoolingServers() behaviour for Struts Tags after doEndTag(). + RadioTag freshTag = new RadioTag(); + freshTag.setPerformClearTagStateForTagPoolingServers(true); + freshTag.setPageContext(pageContext); + assertTrue("Tag state after doEndTag() and explicit tag state clearing is inequal to new Tag with pageContext/parent set. " + + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", + strutsBodyTagsAreReflectionEqual(tag, freshTag)); + } + + public void testMapCheckedUsingInteger() throws Exception { + TestAction testAction = (TestAction) action; + + List<Integer> intList = new ArrayList<>(Arrays.asList(1, 2)); + testAction.setIntList(intList); + + RadioTag tag = new RadioTag(); + tag.setTheme("simple"); + tag.setPageContext(pageContext); + tag.setName("status"); + tag.setValue("2"); + tag.setList("intList"); + + tag.doStartTag(); + tag.doEndTag(); + + verify(RadioTag.class.getResource("Radio-10.txt")); + + // Basic sanity check of clearTagStateForTagPoolingServers() behaviour for Struts Tags after doEndTag(). + RadioTag freshTag = new RadioTag(); + freshTag.setPageContext(pageContext); + assertFalse("Tag state after doEndTag() under default tag clear state is equal to new Tag with pageContext/parent set. " + + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", + strutsBodyTagsAreReflectionEqual(tag, freshTag)); + } + + public void testMapCheckedUsingInt_clearTagStateSet() throws Exception { + TestAction testAction = (TestAction) action; + + List<Integer> intList = new ArrayList<>(Arrays.asList(1, 2)); + testAction.setIntList(intList); + + RadioTag tag = new RadioTag(); + tag.setPerformClearTagStateForTagPoolingServers(true); // Explicitly request tag state clearing. + tag.setTheme("simple"); + tag.setPageContext(pageContext); + tag.setName("status"); + tag.setValue("2"); + tag.setList("intList"); + + tag.doStartTag(); + tag.doEndTag(); + + verify(RadioTag.class.getResource("Radio-10.txt")); + + // Basic sanity check of clearTagStateForTagPoolingServers() behaviour for Struts Tags after doEndTag(). + RadioTag freshTag = new RadioTag(); + freshTag.setPerformClearTagStateForTagPoolingServers(true); + freshTag.setPageContext(pageContext); + assertTrue("Tag state after doEndTag() and explicit tag state clearing is inequal to new Tag with pageContext/parent set. " + + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", + strutsBodyTagsAreReflectionEqual(tag, freshTag)); } public void testMapCheckedNull() throws Exception { TestAction testAction = (TestAction) action; testAction.setFoo("bar"); - HashMap map = new HashMap(); + Map<String, String> map = new HashMap<>(); map.put("1", "One"); map.put("2", "Two"); testAction.setMap(map); @@ -181,14 +294,14 @@ public class RadioTest extends AbstractUITagTest { freshTag.setPageContext(pageContext); assertFalse("Tag state after doEndTag() under default tag clear state is equal to new Tag with pageContext/parent set. " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", - strutsBodyTagsAreReflectionEqual(tag, freshTag)); + strutsBodyTagsAreReflectionEqual(tag, freshTag)); } public void testMapCheckedNull_clearTagStateSet() throws Exception { TestAction testAction = (TestAction) action; testAction.setFoo("bar"); - HashMap map = new HashMap(); + Map<String, String> map = new HashMap<>(); map.put("1", "One"); map.put("2", "Two"); testAction.setMap(map); @@ -213,15 +326,15 @@ public class RadioTest extends AbstractUITagTest { freshTag.setPageContext(pageContext); assertTrue("Tag state after doEndTag() and explicit tag state clearing is inequal to new Tag with pageContext/parent set. " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", - strutsBodyTagsAreReflectionEqual(tag, freshTag)); + strutsBodyTagsAreReflectionEqual(tag, freshTag)); } public void testSimple() throws Exception { TestAction testAction = (TestAction) action; testAction.setFoo("bar"); testAction.setList(new String[][]{ - {"hello", "world"}, - {"foo", "bar"} + {"hello", "world"}, + {"foo", "bar"} }); RadioTag tag = new RadioTag(); @@ -243,15 +356,15 @@ public class RadioTest extends AbstractUITagTest { freshTag.setPageContext(pageContext); assertFalse("Tag state after doEndTag() under default tag clear state is equal to new Tag with pageContext/parent set. " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", - strutsBodyTagsAreReflectionEqual(tag, freshTag)); + strutsBodyTagsAreReflectionEqual(tag, freshTag)); } public void testSimple_clearTagStateSet() throws Exception { TestAction testAction = (TestAction) action; testAction.setFoo("bar"); testAction.setList(new String[][]{ - {"hello", "world"}, - {"foo", "bar"} + {"hello", "world"}, + {"foo", "bar"} }); RadioTag tag = new RadioTag(); @@ -276,13 +389,15 @@ public class RadioTest extends AbstractUITagTest { freshTag.setPageContext(pageContext); assertTrue("Tag state after doEndTag() and explicit tag state clearing is inequal to new Tag with pageContext/parent set. " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", - strutsBodyTagsAreReflectionEqual(tag, freshTag)); + strutsBodyTagsAreReflectionEqual(tag, freshTag)); } public void testSimpleWithStringMap() throws Exception { - final Map<String, String> myMap = new TreeMap<String, String>(); + final Map<String, String> myMap = new TreeMap<>(); myMap.put("name", "Std."); - stack.push(new HashMap() {{ put ("myMap", myMap); }}); + stack.push(new HashMap<String, Map<String, String>>() {{ + put("myMap", myMap); + }}); RadioTag tag = new RadioTag(); tag.setPageContext(pageContext); @@ -298,13 +413,15 @@ public class RadioTest extends AbstractUITagTest { freshTag.setPageContext(pageContext); assertFalse("Tag state after doEndTag() under default tag clear state is equal to new Tag with pageContext/parent set. " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", - strutsBodyTagsAreReflectionEqual(tag, freshTag)); + strutsBodyTagsAreReflectionEqual(tag, freshTag)); } public void testSimpleWithStringMap_clearTagStateSet() throws Exception { - final Map<String, String> myMap = new TreeMap<String, String>(); + final Map<String, String> myMap = new TreeMap<>(); myMap.put("name", "Std."); - stack.push(new HashMap() {{ put ("myMap", myMap); }}); + stack.push(new HashMap<String, Map<String, String>>() {{ + put("myMap", myMap); + }}); RadioTag tag = new RadioTag(); tag.setPerformClearTagStateForTagPoolingServers(true); // Explicitly request tag state clearing. @@ -323,15 +440,15 @@ public class RadioTest extends AbstractUITagTest { freshTag.setPageContext(pageContext); assertTrue("Tag state after doEndTag() and explicit tag state clearing is inequal to new Tag with pageContext/parent set. " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", - strutsBodyTagsAreReflectionEqual(tag, freshTag)); + strutsBodyTagsAreReflectionEqual(tag, freshTag)); } public void testSimpleWithLabelSeparator() throws Exception { TestAction testAction = (TestAction) action; testAction.setFoo("bar"); testAction.setList(new String[][]{ - {"hello", "world"}, - {"foo", "bar"} + {"hello", "world"}, + {"foo", "bar"} }); RadioTag tag = new RadioTag(); @@ -354,15 +471,15 @@ public class RadioTest extends AbstractUITagTest { freshTag.setPageContext(pageContext); assertFalse("Tag state after doEndTag() under default tag clear state is equal to new Tag with pageContext/parent set. " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", - strutsBodyTagsAreReflectionEqual(tag, freshTag)); + strutsBodyTagsAreReflectionEqual(tag, freshTag)); } public void testSimpleWithLabelSeparator_clearTagStateSet() throws Exception { TestAction testAction = (TestAction) action; testAction.setFoo("bar"); testAction.setList(new String[][]{ - {"hello", "world"}, - {"foo", "bar"} + {"hello", "world"}, + {"foo", "bar"} }); RadioTag tag = new RadioTag(); @@ -388,27 +505,27 @@ public class RadioTest extends AbstractUITagTest { freshTag.setPageContext(pageContext); assertTrue("Tag state after doEndTag() and explicit tag state clearing is inequal to new Tag with pageContext/parent set. " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", - strutsBodyTagsAreReflectionEqual(tag, freshTag)); + strutsBodyTagsAreReflectionEqual(tag, freshTag)); } public void testGenericSimple() throws Exception { RadioTag tag = new RadioTag(); prepareTagGeneric(tag); - verifyGenericProperties(tag, "simple", new String[]{"id","value"}); + verifyGenericProperties(tag, "simple", new String[]{"id", "value"}); } public void testGenericXhtml() throws Exception { RadioTag tag = new RadioTag(); prepareTagGeneric(tag); - verifyGenericProperties(tag, "xhtml", new String[]{"id","value"}); + verifyGenericProperties(tag, "xhtml", new String[]{"id", "value"}); } public void testDynamicAttributes() throws Exception { TestAction testAction = (TestAction) action; testAction.setFoo("bar"); testAction.setList(new String[][]{ - {"hello", "world"}, - {"foo", "bar"} + {"hello", "world"}, + {"foo", "bar"} }); RadioTag tag = new RadioTag(); @@ -431,15 +548,15 @@ public class RadioTest extends AbstractUITagTest { freshTag.setPageContext(pageContext); assertFalse("Tag state after doEndTag() under default tag clear state is equal to new Tag with pageContext/parent set. " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", - strutsBodyTagsAreReflectionEqual(tag, freshTag)); + strutsBodyTagsAreReflectionEqual(tag, freshTag)); } public void testDynamicAttributes_clearTagStateSet() throws Exception { TestAction testAction = (TestAction) action; testAction.setFoo("bar"); testAction.setList(new String[][]{ - {"hello", "world"}, - {"foo", "bar"} + {"hello", "world"}, + {"foo", "bar"} }); RadioTag tag = new RadioTag(); @@ -465,7 +582,7 @@ public class RadioTest extends AbstractUITagTest { freshTag.setPageContext(pageContext); assertTrue("Tag state after doEndTag() and explicit tag state clearing is inequal to new Tag with pageContext/parent set. " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", - strutsBodyTagsAreReflectionEqual(tag, freshTag)); + strutsBodyTagsAreReflectionEqual(tag, freshTag)); } public void testNotExistingListValueKey() throws Exception { @@ -487,7 +604,7 @@ public class RadioTest extends AbstractUITagTest { freshTag.setPageContext(pageContext); assertFalse("Tag state after doEndTag() under default tag clear state is equal to new Tag with pageContext/parent set. " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", - strutsBodyTagsAreReflectionEqual(tag, freshTag)); + strutsBodyTagsAreReflectionEqual(tag, freshTag)); } public void testNotExistingListValueKey_clearTagStateSet() throws Exception { @@ -512,15 +629,15 @@ public class RadioTest extends AbstractUITagTest { freshTag.setPageContext(pageContext); assertTrue("Tag state after doEndTag() and explicit tag state clearing is inequal to new Tag with pageContext/parent set. " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", - strutsBodyTagsAreReflectionEqual(tag, freshTag)); + strutsBodyTagsAreReflectionEqual(tag, freshTag)); } private void prepareTagGeneric(RadioTag tag) { TestAction testAction = (TestAction) action; testAction.setFoo("bar"); testAction.setList(new String[][]{ - {"hello", "world"}, - {"foo", "bar"} + {"hello", "world"}, + {"foo", "bar"} }); tag.setList("list"); tag.setListKey("top[0]"); diff --git a/core/src/test/resources/org/apache/struts2/views/jsp/ui/Radio-10.txt b/core/src/test/resources/org/apache/struts2/views/jsp/ui/Radio-10.txt new file mode 100644 index 000000000..c4292bb8c --- /dev/null +++ b/core/src/test/resources/org/apache/struts2/views/jsp/ui/Radio-10.txt @@ -0,0 +1,4 @@ +<input type="radio" name="status" id="status1" value="1"/> +<label for="status1">1</label> +<input type="radio" name="status" id="status2" checked="checked" value="2"/> +<label for="status2">2</label> diff --git a/core/src/test/resources/org/apache/struts2/views/jsp/ui/Radio-9.txt b/core/src/test/resources/org/apache/struts2/views/jsp/ui/Radio-9.txt new file mode 100644 index 000000000..14c14b388 --- /dev/null +++ b/core/src/test/resources/org/apache/struts2/views/jsp/ui/Radio-9.txt @@ -0,0 +1,4 @@ +<input type="radio" name="status" id="statusINIT" checked="checked" value="INIT"/> +<label for="statusINIT">INIT</label> +<input type="radio" name="status" id="statusCOMPLETED" value="COMPLETED"/> +<label for="statusCOMPLETED">COMPLETED</label>