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.dxo.impl;
17  
18  import java.text.SimpleDateFormat;
19  import java.util.Arrays;
20  import java.util.Calendar;
21  import java.util.Date;
22  import java.util.HashMap;
23  import java.util.List;
24  import java.util.Map;
25  
26  import org.seasar.cubby.dxo.FormDxo;
27  import org.seasar.extension.unit.S2TestCase;
28  
29  /**
30   * 
31   * @author agata
32   * @author baba
33   */
34  public class FormDxoImplTest extends S2TestCase {
35  
36  	public FormDxo formDxo;
37  
38  	@Override
39  	protected void setUp() throws Exception {
40  		super.setUp();
41  		include(getClass().getName().replace('.', '/') + ".dicon");
42  	}
43  
44  	public void testBeanToMapNullSource() {
45  		TestBean bean = null;
46  		Map<String, String[]> map = new HashMap<String, String[]>();
47  		formDxo.convert(bean, map);
48  	}
49  
50  	public void testMapToBeanNullSource() {
51  		TestBean bean = new TestBean();
52  		Map<String, Object[]> map = null;
53  		formDxo.convert(map, bean);
54  	}
55  
56  	public void testBeanToMap() {
57  		Calendar cal = Calendar.getInstance();
58  		cal.set(2006, 0, 1);
59  
60  		TestBean bean = new TestBean();
61  		bean.setDate(cal.getTime());
62  		bean.setNum1(5);
63  		bean.setNum2(new Integer[] { 2, 3, 4 });
64  		bean.setNum3(Arrays.asList(new String[] { "abc", "def" }));
65  
66  		Map<String, String[]> map = new HashMap<String, String[]>();
67  
68  		formDxo.convert(bean, map);
69  		assertTrue(map.containsKey("date"));
70  		String[] values = map.get("date");
71  		assertEquals(1, values.length);
72  		assertEquals("2006-01-01", values[0]);
73  	}
74  
75  	public void testMapToBean() {
76  		Map<String, Object[]> map = new HashMap<String, Object[]>();
77  		map.put("date", new Object[] { "2006-01-01" });
78  
79  		TestBean bean = new TestBean();
80  
81  		formDxo.convert(map, bean);
82  		Calendar cal = Calendar.getInstance();
83  		cal.set(2006, 0, 1);
84  		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
85  		assertEquals(format.format(cal.getTime()), format
86  				.format(bean.getDate()));
87  	}
88  
89  	public void testMapToBean_OneValue() {
90  		Map<String, Object[]> map = new HashMap<String, Object[]>();
91  		map.put("num1", new Object[] { "1" });
92  		map.put("num2", new Object[] { "2" });
93  		map.put("num3", new Object[] { "def" });
94  
95  		TestBean bean = new TestBean();
96  
97  		formDxo.convert(map, bean);
98  		assertNotNull(bean.getNum1());
99  		assertEquals(Integer.valueOf(1), bean.getNum1());
100 		assertNotNull(bean.getNum2());
101 		assertEquals(1, bean.getNum2().length);
102 		assertEquals(Integer.valueOf(2), bean.getNum2()[0]);
103 		assertNotNull(bean.getNum3());
104 		assertEquals(1, bean.getNum3().size());
105 		assertEquals("def", bean.getNum3().get(0));
106 	}
107 
108 	public void testMapToBean_MultiValue() {
109 		Map<String, Object[]> map = new HashMap<String, Object[]>();
110 		map.put("num2", new Object[] { "1", "2" });
111 		map.put("num3", new Object[] { "abc", "def" });
112 
113 		TestBean bean = new TestBean();
114 
115 		formDxo.convert(map, bean);
116 		assertNotNull(bean.getNum2());
117 		assertEquals(2, bean.getNum2().length);
118 		assertEquals(Integer.valueOf(1), bean.getNum2()[0]);
119 		assertEquals(Integer.valueOf(2), bean.getNum2()[1]);
120 		assertNotNull(bean.getNum3());
121 		assertEquals(2, bean.getNum3().size());
122 		assertEquals("abc", bean.getNum3().get(0));
123 		assertEquals("def", bean.getNum3().get(1));
124 	}
125 
126 	public void testMapToBean_MultiValueIncludesEmptyValue() {
127 		Map<String, Object[]> map = new HashMap<String, Object[]>();
128 		map.put("num2", new String[] { "1", "", "2" });
129 
130 		TestBean bean = new TestBean();
131 
132 		formDxo.convert(map, bean);
133 		assertEquals(3, bean.getNum2().length);
134 		assertEquals(Integer.valueOf(1), bean.getNum2()[0]);
135 		assertEquals(null, bean.getNum2()[1]);
136 		assertEquals(Integer.valueOf(2), bean.getNum2()[2]);
137 	}
138 
139 	public void testNoCloneableObject() {
140 		Map<String, Object[]> map = new HashMap<String, Object[]>();
141 		NoDefaultConstructorBean bean = new NoDefaultConstructorBean("1");
142 		map.put("bean", new Object[] { bean });
143 
144 		NoDefaultConstructorBeanHolder dest = new NoDefaultConstructorBeanHolder();
145 
146 		formDxo.convert(map, dest);
147 		assertNotNull(dest.bean);
148 		assertSame(bean, dest.bean);
149 	}
150 
151 	public static class TestBean {
152 
153 		Date date;
154 
155 		Integer num1;
156 
157 		Integer[] num2;
158 
159 		List<String> num3;
160 
161 		public Date getDate() {
162 			return new Date(date.getTime());
163 		}
164 
165 		public void setDate(Date date) {
166 			this.date = new Date(date.getTime());
167 		}
168 
169 		public Integer getNum1() {
170 			return num1;
171 		}
172 
173 		public void setNum1(Integer num1) {
174 			this.num1 = num1;
175 		}
176 
177 		public Integer[] getNum2() {
178 			return num2 == null ? null : num2.clone();
179 		}
180 
181 		public void setNum2(Integer[] num2) {
182 			this.num2 = num2 == null ? null : num2.clone();
183 		}
184 
185 		public List<String> getNum3() {
186 			return num3;
187 		}
188 
189 		public void setNum3(List<String> num3) {
190 			this.num3 = num3;
191 		}
192 
193 	}
194 
195 	public static class NoDefaultConstructorBeanHolder {
196 		public NoDefaultConstructorBean bean;
197 	}
198 
199 	public static class NoDefaultConstructorBean {
200 		public String prop1;
201 
202 		public NoDefaultConstructorBean(String prop1) {
203 			this.prop1 = prop1;
204 		}
205 	}
206 }