1   /*
2    * Copyright 2004-2010 the Seasar Foundation and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  
17  package org.seasar.cubby.tags;
18  
19  import static org.junit.Assert.assertEquals;
20  import static org.junit.Assert.assertTrue;
21  import static org.junit.Assert.fail;
22  
23  import java.util.ArrayList;
24  import java.util.HashMap;
25  import java.util.List;
26  import java.util.Map;
27  
28  import javax.servlet.jsp.JspTagException;
29  
30  import org.jdom.Element;
31  import org.junit.Before;
32  import org.junit.Test;
33  import org.seasar.cubby.internal.util.StringUtils;
34  
35  public class SelectTagTest extends SimpleTagTestCase {
36  
37  	SelectTag tag;
38  
39  	List<ItemBean> items = new ArrayList<ItemBean>();
40  
41  	@Before
42  	public void setup() {
43  		tag = new SelectTag();
44  		setupSimpleTag(tag);
45  		setupErrors(context);
46  		items.add(new ItemBean(1, "name1"));
47  		items.add(new ItemBean(2, "name2"));
48  		items.add(new ItemBean(3, "name3"));
49  	}
50  
51  	@Test
52  	public void doTag1() throws Exception {
53  		Map<String, String[]> map = new HashMap<String, String[]>();
54  		map.put("stringField", new String[] { "1" });
55  		tag.setParent(new MockFormTag(map));
56  		tag.setName("stringField");
57  		tag.setDynamicAttribute(null, "id", "stringField");
58  		tag.setItems(items);
59  		tag.setValueProperty("id");
60  		tag.setLabelProperty("name");
61  		tag.doTag();
62  
63  		System.out.println(context.getResult());
64  
65  		Element element = getResultAsElementFromContext();
66  		String message = "基本";
67  		assertEquals(message, 2, element.getAttributes().size());
68  		assertEquals(message, "stringField", element.getAttributeValue("name"));
69  		assertEquals(message, "stringField", element.getAttributeValue("id"));
70  		assertEquals(message, 4, element.getChildren().size());
71  		for (Object o : element.getChildren("option")) {
72  			Element child = (Element) o;
73  			String value = child.getValue();
74  			if (StringUtils.isEmpty(value)) {
75  				assertEquals(message, 1, child.getAttributes().size());
76  				assertTrue(message, StringUtils.isEmpty(child
77  						.getAttributeValue("value")));
78  			} else if ("name1".equals(value)) {
79  				assertEquals(message, 2, child.getAttributes().size());
80  				assertEquals(message, "1", child.getAttributeValue("value"));
81  				assertEquals(message, "selected", child
82  						.getAttributeValue("selected"));
83  			} else if ("name2".equals(value)) {
84  				assertEquals(message, 1, child.getAttributes().size());
85  				assertEquals(message, "2", child.getAttributeValue("value"));
86  			} else if ("name3".equals(value)) {
87  				assertEquals(message, 1, child.getAttributes().size());
88  				assertEquals(message, "3", child.getAttributeValue("value"));
89  			} else {
90  				fail(message);
91  			}
92  		}
93  		// assertEquals("基本",
94  		// "<select name=\"stringField\" id=\"stringField\" >\n" +
95  		// "<option value=\"\"></option>\n" +
96  		// "<option value=\"1\" selected=\"true\">name1</option>\n" +
97  		// "<option value=\"2\" >name2</option>\n" +
98  		// "<option value=\"3\" >name3</option>\n" +
99  		// "</select>\n", context.getResult());
100 	}
101 
102 	@Test
103 	public void doTag2() throws Exception {
104 		Map<String, String[]> map = new HashMap<String, String[]>();
105 		map.put("integerArrayField", new String[] { "1", "3" });
106 		tag.setParent(new MockFormTag(map));
107 		tag.setName("integerArrayField");
108 		tag.setDynamicAttribute(null, "size", "5");
109 		tag.setItems(items);
110 		tag.setValueProperty("id");
111 		tag.setLabelProperty("name");
112 		tag.doTag();
113 
114 		System.out.println(context.getResult());
115 
116 		Element element = getResultAsElementFromContext();
117 		String message = "selectedの対象が2つ";
118 		assertEquals(message, 2, element.getAttributes().size());
119 		assertEquals(message, "integerArrayField", element
120 				.getAttributeValue("name"));
121 		assertEquals(message, "5", element.getAttributeValue("size"));
122 		assertEquals(message, 4, element.getChildren().size());
123 		for (Object o : element.getChildren("option")) {
124 			Element child = (Element) o;
125 			String value = child.getValue();
126 			if (StringUtils.isEmpty(value)) {
127 				assertEquals(message, 1, child.getAttributes().size());
128 				assertTrue(message, StringUtils.isEmpty(child
129 						.getAttributeValue("value")));
130 			} else if ("name1".equals(value)) {
131 				assertEquals(message, 2, child.getAttributes().size());
132 				assertEquals(message, "1", child.getAttributeValue("value"));
133 				assertEquals(message, "selected", child
134 						.getAttributeValue("selected"));
135 			} else if ("name2".equals(value)) {
136 				assertEquals(message, 1, child.getAttributes().size());
137 				assertEquals(message, "2", child.getAttributeValue("value"));
138 			} else if ("name3".equals(value)) {
139 				assertEquals(message, 2, child.getAttributes().size());
140 				assertEquals(message, "3", child.getAttributeValue("value"));
141 				assertEquals(message, "selected", child
142 						.getAttributeValue("selected"));
143 			} else {
144 				fail(message);
145 			}
146 		}
147 		// assertEquals("selectedの対象が2つ",
148 		// "<select size=\"5\" name=\"integerArrayField\" >\n" +
149 		// "<option value=\"\"></option>\n" +
150 		// "<option value=\"1\" selected=\"true\">name1</option>\n" +
151 		// "<option value=\"2\" >name2</option>\n" +
152 		// "<option value=\"3\" selected=\"true\">name3</option>\n" +
153 		// "</select>\n", context.getResult());
154 	}
155 
156 	@Test
157 	public void doTag3() throws Exception {
158 		Map<String, String[]> map = new HashMap<String, String[]>();
159 		map.put("stringField", new String[] { "1" });
160 		tag.setParent(new MockFormTag(map));
161 		tag.setName("stringField");
162 		tag.setDynamicAttribute(null, "id", "stringField");
163 		tag.setItems(items);
164 		tag.setValueProperty("id");
165 		tag.doTag();
166 
167 		Element element = getResultAsElementFromContext();
168 		String message = "labelPropertyを省略";
169 		assertEquals(message, 2, element.getAttributes().size());
170 		assertEquals(message, "stringField", element.getAttributeValue("name"));
171 		assertEquals(message, "stringField", element.getAttributeValue("id"));
172 		assertEquals(message, 4, element.getChildren().size());
173 		for (Object o : element.getChildren("option")) {
174 			Element child = (Element) o;
175 			String value = child.getValue();
176 			if (StringUtils.isEmpty(value)) {
177 				assertEquals(message, 1, child.getAttributes().size());
178 				assertTrue(message, StringUtils.isEmpty(child
179 						.getAttributeValue("value")));
180 			} else if ("1".equals(value)) {
181 				assertEquals(message, 2, child.getAttributes().size());
182 				assertEquals(message, "1", child.getAttributeValue("value"));
183 				assertEquals(message, "selected", child
184 						.getAttributeValue("selected"));
185 			} else if ("2".equals(value)) {
186 				assertEquals(message, 1, child.getAttributes().size());
187 				assertEquals(message, "2", child.getAttributeValue("value"));
188 			} else if ("3".equals(value)) {
189 				assertEquals(message, 1, child.getAttributes().size());
190 				assertEquals(message, "3", child.getAttributeValue("value"));
191 			} else {
192 				fail(message);
193 			}
194 		}
195 		// assertEquals("labelPropertyを省略",
196 		// "<select name=\"stringField\" id=\"stringField\" >\n" +
197 		// "<option value=\"\"></option>\n" +
198 		// "<option value=\"1\" selected=\"true\">1</option>\n" +
199 		// "<option value=\"2\" >2</option>\n" +
200 		// "<option value=\"3\" >3</option>\n" +
201 		// "</select>\n", context.getResult());
202 	}
203 
204 	@Test
205 	public void doTag4() throws Exception {
206 		Map<String, String[]> map = new HashMap<String, String[]>();
207 		map.put("stringField", new String[] { "1" });
208 		tag.setParent(new MockFormTag(map));
209 		tag.setName("stringField");
210 		tag.setItems(items);
211 		tag.setValueProperty("id");
212 		tag.setLabelProperty("name");
213 		tag.setEmptyOption(false);
214 		tag.doTag();
215 
216 		Element element = getResultAsElementFromContext();
217 		String message = "emptyOption=false";
218 		assertEquals(message, 1, element.getAttributes().size());
219 		assertEquals(message, "stringField", element.getAttributeValue("name"));
220 		assertEquals(message, 3, element.getChildren().size());
221 		for (Object o : element.getChildren("option")) {
222 			Element child = (Element) o;
223 			String value = child.getValue();
224 			if ("name1".equals(value)) {
225 				assertEquals(message, 2, child.getAttributes().size());
226 				assertEquals(message, "1", child.getAttributeValue("value"));
227 				assertEquals(message, "selected", child
228 						.getAttributeValue("selected"));
229 			} else if ("name2".equals(value)) {
230 				assertEquals(message, 1, child.getAttributes().size());
231 				assertEquals(message, "2", child.getAttributeValue("value"));
232 			} else if ("name3".equals(value)) {
233 				assertEquals(message, 1, child.getAttributes().size());
234 				assertEquals(message, "3", child.getAttributeValue("value"));
235 			} else {
236 				fail(message);
237 			}
238 		}
239 		// assertEquals("emptyOption=false",
240 		// "<select name=\"stringField\" >\n" +
241 		// "<option value=\"1\" selected=\"true\">name1</option>\n" +
242 		// "<option value=\"2\" >name2</option>\n" +
243 		// "<option value=\"3\" >name3</option>\n" +
244 		// "</select>\n", context.getResult());
245 	}
246 
247 	@Test
248 	public void doTag5() throws Exception {
249 		Map<String, String[]> map = new HashMap<String, String[]>();
250 		map.put("stringField", new String[] { "1" });
251 		tag.setParent(new MockFormTag(map));
252 		tag.setName("stringField");
253 		tag.setItems(items);
254 		tag.setValueProperty("id");
255 		tag.setLabelProperty("name");
256 		tag.setEmptyOptionLabel("empty label");
257 		tag.doTag();
258 
259 		Element element = getResultAsElementFromContext();
260 		String message = "emptyOption=true, emptyOptionLabel=empty label";
261 		assertEquals(message, 1, element.getAttributes().size());
262 		assertEquals(message, "stringField", element.getAttributeValue("name"));
263 		assertEquals(message, 4, element.getChildren().size());
264 		for (Object o : element.getChildren("option")) {
265 			Element child = (Element) o;
266 			String value = child.getValue();
267 			if ("empty label".equals(value)) {
268 				assertEquals(message, 1, child.getAttributes().size());
269 				assertTrue(message, StringUtils.isEmpty(child
270 						.getAttributeValue("value")));
271 			} else if ("name1".equals(value)) {
272 				assertEquals(message, 2, child.getAttributes().size());
273 				assertEquals(message, "1", child.getAttributeValue("value"));
274 				assertEquals(message, "selected", child
275 						.getAttributeValue("selected"));
276 			} else if ("name2".equals(value)) {
277 				assertEquals(message, 1, child.getAttributes().size());
278 				assertEquals(message, "2", child.getAttributeValue("value"));
279 			} else if ("name3".equals(value)) {
280 				assertEquals(message, 1, child.getAttributes().size());
281 				assertEquals(message, "3", child.getAttributeValue("value"));
282 			} else {
283 				fail(message);
284 			}
285 		}
286 		// assertEquals("emptyOption=true, emptyOptionLabel=empty label",
287 		// "<select name=\"stringField\" >\n" +
288 		// "<option value=\"\">empty label</option>\n" +
289 		// "<option value=\"1\" selected=\"true\">name1</option>\n" +
290 		// "<option value=\"2\" >name2</option>\n" +
291 		// "<option value=\"3\" >name3</option>\n" +
292 		// "</select>\n", context.getResult());
293 	}
294 
295 	@Test
296 	public void doTagNotSetValueProperty() throws Exception {
297 		Map<String, String[]> map = new HashMap<String, String[]>();
298 		map.put("stringField", new String[] { "1" });
299 		tag.setParent(new MockFormTag(map));
300 		tag.setName("stringField");
301 		tag.setItems(items);
302 		tag.setEmptyOptionLabel("empty label");
303 		try {
304 			tag.doTag();
305 			fail();
306 		} catch (JspTagException e) {
307 			// ok;
308 		}
309 	}
310 
311 	@Test
312 	public void doItemsAttributeIsNull() throws Exception {
313 		tag.setName("stringField");
314 		tag.setItems(null);
315 		try {
316 			tag.doTag();
317 			fail();
318 		} catch (JspTagException e) {
319 			// ok;
320 		}
321 	}
322 
323 	public static class ItemBean {
324 		private Integer id;
325 		private String name;
326 
327 		public ItemBean(int id, String name) {
328 			this.id = id;
329 			this.name = name;
330 		}
331 
332 		public Integer getId() {
333 			return id;
334 		}
335 
336 		public void setId(Integer id) {
337 			this.id = id;
338 		}
339 
340 		public String getName() {
341 			return name;
342 		}
343 
344 		public void setName(String name) {
345 			this.name = name;
346 		}
347 	}
348 }