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