1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.struts2.components;
22
23 import java.io.StringWriter;
24 import java.util.Map;
25
26 import junit.framework.TestCase;
27 import ognl.Ognl;
28
29 import org.apache.struts2.util.StrutsTypeConverter;
30
31 import com.opensymphony.xwork2.util.ValueStack;
32 import com.opensymphony.xwork2.util.ValueStackFactory;
33 import com.opensymphony.xwork2.util.XWorkConverter;
34
35 /***
36 *
37 */
38 public class PropertyTest extends TestCase {
39 public void testNormalBehaviour() {
40 final ValueStack stack = ValueStackFactory.getFactory().createValueStack();
41 stack.push(new FooBar("foo-value", "bar-value"));
42 final Property property = new Property(stack);
43 property.setDefault("default");
44 property.setValue("foo");
45 assertPropertyOutput("foo-value", property);
46 }
47
48 public void testDefaultShouldBeOutputIfBeanNotAvailable() {
49 final ValueStack stack = ValueStackFactory.getFactory().createValueStack();
50 final Property property = new Property(stack);
51 property.setDefault("default");
52 property.setValue("foo");
53 assertPropertyOutput("default", property);
54 }
55
56 public void testDefaultShouldBeOutputIfPropertyIsNull() {
57 final ValueStack stack = ValueStackFactory.getFactory().createValueStack();
58 stack.push(new FooBar(null, "bar-value"));
59 final Property property = new Property(stack);
60 property.setDefault("default");
61 property.setValue("foo");
62 assertPropertyOutput("default", property);
63 }
64
65 public void testTopValueShouldReturnTopOfValueStack() {
66 final ValueStack stack = ValueStackFactory.getFactory().createValueStack();
67 stack.push(new FooBar("foo-value", "bar-value"));
68 final Property property = new Property(stack);
69 property.setDefault("default");
70 property.setValue("top");
71 assertPropertyOutput("foo-value/bar-value", property);
72 }
73
74 public void testTypeConverterShouldBeUsed() {
75 final ValueStack stack = ValueStackFactory.getFactory().createValueStack();
76 Ognl.setTypeConverter(stack.getContext(), new TestDefaultConverter());
77
78 stack.push(new FooBar("foo-value", "bar-value"));
79 final Property property = new Property(stack);
80 property.setDefault("default");
81 property.setValue("top");
82 assertPropertyOutput("*foo-value + bar-value*", property);
83 }
84
85 public void testTypeConverterReturningNullShouldLeadToDisplayOfDefaultValue() {
86 final ValueStack stack = ValueStackFactory.getFactory().createValueStack();
87 Ognl.setTypeConverter(stack.getContext(), new TestDefaultConverter());
88
89 stack.push(new FooBar("foo-value", null));
90 final Property property = new Property(stack);
91 property.setDefault("default");
92 property.setValue("top");
93 assertPropertyOutput("default", property);
94 }
95
96 private static void assertPropertyOutput(String expectedOutput, Property property) {
97 final StringWriter out = new StringWriter();
98 assertTrue(property.start(out));
99 assertEquals(expectedOutput, out.getBuffer().toString());
100 }
101
102 private final class FooBar {
103 private String foo;
104 private String bar;
105
106 public FooBar(String foo, String bar) {
107 this.foo = foo;
108 this.bar = bar;
109 }
110
111 public String getFoo() {
112 return foo;
113 }
114
115 public String getBar() {
116 return bar;
117 }
118
119 public String toString() {
120 return foo + "/" + bar;
121 }
122 }
123
124 private final class FooBarConverter extends StrutsTypeConverter {
125 public Object convertFromString(Map context, String[] values, Class toClass) {
126 return null;
127 }
128
129 public String convertToString(Map context, Object o) {
130 FooBar fooBar = (FooBar) o;
131 if (fooBar.getBar() == null) {
132 return null;
133 } else {
134 return "*" + fooBar.getFoo() + " + " + fooBar.getBar() + "*";
135 }
136 }
137 }
138
139 /*** a simple hack to simply register a custom converter in our test */
140 private final class TestDefaultConverter extends XWorkConverter {
141 protected TestDefaultConverter() {
142 super();
143 registerConverter("org.apache.struts2.components.PropertyTest$FooBar", new FooBarConverter());
144 }
145 }
146 }