1   package org.seasar.cubby.tags;
2   
3   import java.util.ArrayList;
4   import java.util.HashMap;
5   import java.util.List;
6   
7   import javax.servlet.jsp.JspTagException;
8   import javax.servlet.jsp.PageContext;
9   
10  import org.jdom.Element;
11  import org.seasar.framework.util.StringUtil;
12  
13  public class SelectTagTest extends JspTagTestCase {
14  
15  	SelectTag tag;
16  	List<ItemBean> items = new ArrayList<ItemBean>();
17  	
18  	@Override
19  	protected void setUp() throws Exception {
20  		super.setUp();
21  		tag = new SelectTag();
22  		setupSimpleTag(tag);
23  		context.setAttribute("fieldErrors", new HashMap<String, String>(), PageContext.REQUEST_SCOPE);
24  		items.add(new ItemBean(1, "name1"));
25  		items.add(new ItemBean(2, "name2"));
26  		items.add(new ItemBean(3, "name3"));
27  	}
28  
29  	public void testDoTag1() throws Exception {
30  		FormDto form = new FormDto();
31  		form.setStringField("1");
32  		context.setAttribute("__form", form, PageContext.REQUEST_SCOPE);
33  		tag.setDynamicAttribute(null, "name", "stringField");
34  		tag.setDynamicAttribute(null, "id", "stringField");
35  		tag.setItems(items);
36  		tag.setValueProperty("id");
37  		tag.setLabelProperty("name");
38  		tag.doTag();
39  
40  		Element element = getResultAsElementFromContext();
41  		String message = "基本";
42  		assertEquals(message, 2, element.getAttributes().size());
43  		assertEquals(message, "stringField", element.getAttributeValue("name"));
44  		assertEquals(message, "stringField", element.getAttributeValue("id"));
45  		assertEquals(message, 4, element.getChildren().size());
46  		for (Object o : element.getChildren("option")) {
47  			Element child = (Element) o;
48  			String value = child.getValue();
49  			if (StringUtil.isEmpty(value)) {
50  				assertEquals(message, 1, child.getAttributes().size());
51  				assertTrue(message, StringUtil.isEmpty(child.getAttributeValue("value")));
52  			} else if ("name1".equals(value)) {
53  				assertEquals(message, 2, child.getAttributes().size());
54  				assertEquals(message, "1", child.getAttributeValue("value"));
55  				assertEquals(message, "true", child.getAttributeValue("selected"));
56  			} else if ("name2".equals(value)) {
57  				assertEquals(message, 1, child.getAttributes().size());
58  				assertEquals(message, "2", child.getAttributeValue("value"));
59  			} else if ("name3".equals(value)) {
60  				assertEquals(message, 1, child.getAttributes().size());
61  				assertEquals(message, "3", child.getAttributeValue("value"));
62  			} else {
63  				fail(message);
64  			}
65  		}
66  //		assertEquals("基本",
67  //				"<select name=\"stringField\" id=\"stringField\" >\n" +
68  //				"<option value=\"\"></option>\n" +
69  //				"<option value=\"1\" selected=\"true\">name1</option>\n" +
70  //				"<option value=\"2\" >name2</option>\n" +
71  //				"<option value=\"3\" >name3</option>\n" +
72  //				"</select>\n", context.getResult());
73  	}
74  
75  	public void testDoTag2() throws Exception {
76  		FormDto form = new FormDto();
77  		form.setIntegerArrayField(new Integer[] {1, 3});
78  		context.setAttribute("__form", form, PageContext.REQUEST_SCOPE);
79  		tag.setDynamicAttribute(null, "name", "integerArrayField");
80  		tag.setDynamicAttribute(null, "size", "5");
81  		tag.setItems(items);
82  		tag.setValueProperty("id");
83  		tag.setLabelProperty("name");
84  		tag.doTag();
85  
86  		Element element = getResultAsElementFromContext();
87  		String message = "selectedの対象が2つ";
88  		assertEquals(message, 2, element.getAttributes().size());
89  		assertEquals(message, "integerArrayField", element.getAttributeValue("name"));
90  		assertEquals(message, "5", element.getAttributeValue("size"));
91  		assertEquals(message, 4, element.getChildren().size());
92  		for (Object o : element.getChildren("option")) {
93  			Element child = (Element) o;
94  			String value = child.getValue();
95  			if (StringUtil.isEmpty(value)) {
96  				assertEquals(message, 1, child.getAttributes().size());
97  				assertTrue(message, StringUtil.isEmpty(child.getAttributeValue("value")));
98  			} else if ("name1".equals(value)) {
99  				assertEquals(message, 2, child.getAttributes().size());
100 				assertEquals(message, "1", child.getAttributeValue("value"));
101 				assertEquals(message, "true", child.getAttributeValue("selected"));
102 			} else if ("name2".equals(value)) {
103 				assertEquals(message, 1, child.getAttributes().size());
104 				assertEquals(message, "2", child.getAttributeValue("value"));
105 			} else if ("name3".equals(value)) {
106 				assertEquals(message, 2, child.getAttributes().size());
107 				assertEquals(message, "3", child.getAttributeValue("value"));
108 				assertEquals(message, "true", child.getAttributeValue("selected"));
109 			} else {
110 				fail(message);
111 			}
112 		}
113 //		assertEquals("selectedの対象が2つ",
114 //				"<select size=\"5\" name=\"integerArrayField\" >\n" +
115 //				"<option value=\"\"></option>\n" +
116 //				"<option value=\"1\" selected=\"true\">name1</option>\n" +
117 //				"<option value=\"2\" >name2</option>\n" +
118 //				"<option value=\"3\" selected=\"true\">name3</option>\n" +
119 //				"</select>\n", context.getResult());
120 	}
121 
122 	public void testDoTag3() throws Exception {
123 		FormDto form = new FormDto();
124 		form.setStringField("1");
125 		context.setAttribute("__form", form, PageContext.REQUEST_SCOPE);
126 		tag.setDynamicAttribute(null, "name", "stringField");
127 		tag.setDynamicAttribute(null, "id", "stringField");
128 		tag.setItems(items);
129 		tag.setValueProperty("id");
130 		tag.doTag();
131 
132 		Element element = getResultAsElementFromContext();
133 		String message = "labelPropertyを省略";
134 		assertEquals(message, 2, element.getAttributes().size());
135 		assertEquals(message, "stringField", element.getAttributeValue("name"));
136 		assertEquals(message, "stringField", element.getAttributeValue("id"));
137 		assertEquals(message, 4, element.getChildren().size());
138 		for (Object o : element.getChildren("option")) {
139 			Element child = (Element) o;
140 			String value = child.getValue();
141 			if (StringUtil.isEmpty(value)) {
142 				assertEquals(message, 1, child.getAttributes().size());
143 				assertTrue(message, StringUtil.isEmpty(child.getAttributeValue("value")));
144 			} else if ("1".equals(value)) {
145 				assertEquals(message, 2, child.getAttributes().size());
146 				assertEquals(message, "1", child.getAttributeValue("value"));
147 				assertEquals(message, "true", child.getAttributeValue("selected"));
148 			} else if ("2".equals(value)) {
149 				assertEquals(message, 1, child.getAttributes().size());
150 				assertEquals(message, "2", child.getAttributeValue("value"));
151 			} else if ("3".equals(value)) {
152 				assertEquals(message, 1, child.getAttributes().size());
153 				assertEquals(message, "3", child.getAttributeValue("value"));
154 			} else {
155 				fail(message);
156 			}
157 		}
158 //		assertEquals("labelPropertyを省略",
159 //				"<select name=\"stringField\" id=\"stringField\" >\n" +
160 //				"<option value=\"\"></option>\n" +
161 //				"<option value=\"1\" selected=\"true\">1</option>\n" +
162 //				"<option value=\"2\" >2</option>\n" +
163 //				"<option value=\"3\" >3</option>\n" +
164 //				"</select>\n", context.getResult());
165 	}
166 
167 	public void testDoTag4() throws Exception {
168 		FormDto form = new FormDto();
169 		form.setStringField("1");
170 		context.setAttribute("__form", form, PageContext.REQUEST_SCOPE);
171 		tag.setDynamicAttribute(null, "name", "stringField");
172 		tag.setItems(items);
173 		tag.setValueProperty("id");
174 		tag.setLabelProperty("name");
175 		tag.setEmptyOption(false);
176 		tag.doTag();
177 
178 		Element element = getResultAsElementFromContext();
179 		String message = "emptyOption=false";
180 		assertEquals(message, 1, element.getAttributes().size());
181 		assertEquals(message, "stringField", element.getAttributeValue("name"));
182 		assertEquals(message, 3, element.getChildren().size());
183 		for (Object o : element.getChildren("option")) {
184 			Element child = (Element) o;
185 			String value = child.getValue();
186 			if ("name1".equals(value)) {
187 				assertEquals(message, 2, child.getAttributes().size());
188 				assertEquals(message, "1", child.getAttributeValue("value"));
189 				assertEquals(message, "true", child.getAttributeValue("selected"));
190 			} else if ("name2".equals(value)) {
191 				assertEquals(message, 1, child.getAttributes().size());
192 				assertEquals(message, "2", child.getAttributeValue("value"));
193 			} else if ("name3".equals(value)) {
194 				assertEquals(message, 1, child.getAttributes().size());
195 				assertEquals(message, "3", child.getAttributeValue("value"));
196 			} else {
197 				fail(message);
198 			}
199 		}
200 //		assertEquals("emptyOption=false",
201 //				"<select name=\"stringField\" >\n" +
202 //				"<option value=\"1\" selected=\"true\">name1</option>\n" +
203 //				"<option value=\"2\" >name2</option>\n" +
204 //				"<option value=\"3\" >name3</option>\n" +
205 //				"</select>\n", context.getResult());
206 	}
207 
208 	public void testDoTag5() throws Exception {
209 		FormDto form = new FormDto();
210 		form.setStringField("1");
211 		context.setAttribute("__form", form, PageContext.REQUEST_SCOPE);
212 		tag.setDynamicAttribute(null, "name", "stringField");
213 		tag.setItems(items);
214 		tag.setValueProperty("id");
215 		tag.setLabelProperty("name");
216 		tag.setEmptyOptionLabel("empty label");
217 		tag.doTag();
218 
219 		Element element = getResultAsElementFromContext();
220 		String message = "emptyOption=true, emptyOptionLabel=empty label";
221 		assertEquals(message, 1, element.getAttributes().size());
222 		assertEquals(message, "stringField", element.getAttributeValue("name"));
223 		assertEquals(message, 4, element.getChildren().size());
224 		for (Object o : element.getChildren("option")) {
225 			Element child = (Element) o;
226 			String value = child.getValue();
227 			if ("empty label".equals(value)) {
228 				assertEquals(message, 1, child.getAttributes().size());
229 				assertTrue(message, StringUtil.isEmpty(child.getAttributeValue("value")));
230 			} else if ("name1".equals(value)) {
231 				assertEquals(message, 2, child.getAttributes().size());
232 				assertEquals(message, "1", child.getAttributeValue("value"));
233 				assertEquals(message, "true", child.getAttributeValue("selected"));
234 			} else if ("name2".equals(value)) {
235 				assertEquals(message, 1, child.getAttributes().size());
236 				assertEquals(message, "2", child.getAttributeValue("value"));
237 			} else if ("name3".equals(value)) {
238 				assertEquals(message, 1, child.getAttributes().size());
239 				assertEquals(message, "3", child.getAttributeValue("value"));
240 			} else {
241 				fail(message);
242 			}
243 		}
244 //		assertEquals("emptyOption=true, emptyOptionLabel=empty label",
245 //				"<select name=\"stringField\" >\n" +
246 //				"<option value=\"\">empty label</option>\n" +
247 //				"<option value=\"1\" selected=\"true\">name1</option>\n" +
248 //				"<option value=\"2\" >name2</option>\n" +
249 //				"<option value=\"3\" >name3</option>\n" +
250 //				"</select>\n", context.getResult());
251 	}
252 
253 	public void testDoTagNotSetValueProperty() throws Exception {
254 		FormDto form = new FormDto();
255 		form.setStringField("1");
256 		context.setAttribute("__form", form, PageContext.REQUEST_SCOPE);
257 		tag.setDynamicAttribute(null, "name", "stringField");
258 		tag.setItems(items);
259 		tag.setEmptyOptionLabel("empty label");
260 		try {
261 			tag.doTag();
262 			fail();
263 		} catch (JspTagException e) {
264 			// ok;
265 		}
266 	}
267 
268 	public static class ItemBean {
269 		private Integer id;
270 		private String name;
271 		public ItemBean(int id, String name) {
272 			this.id = id;
273 			this.name = name;
274 		}
275 		public Integer getId() {
276 			return id;
277 		}
278 		public void setId(Integer id) {
279 			this.id = id;
280 		}
281 		public String getName() {
282 			return name;
283 		}
284 		public void setName(String name) {
285 			this.name = name;
286 		}
287 	}
288 }