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.util;
17  
18  import java.lang.reflect.Method;
19  import java.util.ArrayList;
20  import java.util.Arrays;
21  import java.util.Collection;
22  import java.util.List;
23  
24  import junit.framework.TestCase;
25  
26  import org.seasar.cubby.action.Action;
27  import org.seasar.cubby.action.ActionResult;
28  import org.seasar.cubby.action.Path;
29  import org.seasar.cubby.exception.ActionRuntimeException;
30  import org.seasar.framework.util.ClassUtil;
31  
32  public class CubbyUtilsTest extends TestCase {
33  
34  	public void testGetObjectSize() {
35  		// array
36  		assertEquals(0, CubbyUtils.getObjectSize(null));
37  		assertEquals(1, CubbyUtils.getObjectSize(""));
38  		assertEquals(0, CubbyUtils.getObjectSize(new Object[] {}));
39  		assertEquals(3, CubbyUtils.getObjectSize(new Object[] { 1, 2, 3 }));
40  		assertEquals(3, CubbyUtils.getObjectSize(new Object[] { null, 2, 3 }));
41  
42  		// collection
43  		assertEquals(0, CubbyUtils.getObjectSize(toCollection(new Object[] {})));
44  		assertEquals(3, CubbyUtils.getObjectSize(toCollection(new Object[] { 1,
45  				2, 3 })));
46  		assertEquals(3, CubbyUtils.getObjectSize(toCollection(new Object[] {
47  				null, 2, 3 })));
48  
49  	}
50  
51  	@SuppressWarnings("unchecked")
52  	private Collection toCollection(Object[] objects) {
53  		List<Object> list = new ArrayList<Object>();
54  		for (Object o : objects) {
55  			list.add(o);
56  		}
57  		return list;
58  	}
59  
60  	public void testGetActionPath() {
61  		assertEquals("/hoge/m1", CubbyUtils.getActionPath(Hoge1Action.class,
62  				ClassUtil.getMethod(Hoge1Action.class, "m1", null)));
63  		assertEquals("/hoge/m/m2", CubbyUtils.getActionPath(Hoge1Action.class,
64  				ClassUtil.getMethod(Hoge1Action.class, "m2", null)));
65  		assertEquals("/hoge/", CubbyUtils.getActionPath(Hoge1Action.class,
66  				ClassUtil.getMethod(Hoge1Action.class, "index", null)));
67  		assertEquals("/hoge/index2", CubbyUtils.getActionPath(
68  				Hoge1Action.class, ClassUtil.getMethod(Hoge1Action.class,
69  						"index2", null)));
70  		assertEquals("/hoge2/m1", CubbyUtils.getActionPath(Hoge2Action.class,
71  				ClassUtil.getMethod(Hoge2Action.class, "m1", null)));
72  		assertEquals("/hoge/m2", CubbyUtils.getActionPath(Hoge2Action.class,
73  				ClassUtil.getMethod(Hoge2Action.class, "m2", null)));
74  		assertEquals("/", CubbyUtils.getActionPath(MockAction.class, ClassUtil
75  				.getMethod(MockAction.class, "index", null)));
76  		assertEquals("/dummy1", CubbyUtils.getActionPath(MockAction.class,
77  				ClassUtil.getMethod(MockAction.class, "dummy1", null)));
78  		assertEquals("/dummy2", CubbyUtils.getActionPath(MockAction.class,
79  				ClassUtil.getMethod(MockAction.class, "dummy2", null)));
80  		assertEquals("/todo/lists", CubbyUtils.getActionPath(MockAction.class,
81  				ClassUtil.getMethod(MockAction.class, "todolist", null)));
82  		assertEquals("/tasklists", CubbyUtils.getActionPath(MockAction.class,
83  				ClassUtil.getMethod(MockAction.class, "tasklist", null)));
84  	}
85  
86  	public void testGetActionClassName() {
87  		assertEquals("hoge", CubbyUtils.getActionDirectory(Hoge1Action.class));
88  		assertEquals("hoge2", CubbyUtils.getActionDirectory(Hoge2Action.class));
89  	}
90  
91  	public void testReplaceFirst() {
92  		assertNull(CubbyUtils.replaceFirst(null, "", ""));
93  		assertEquals("abaa", CubbyUtils.replaceFirst("abaa", null, null));
94  		assertEquals("abaa", CubbyUtils.replaceFirst("abaa", "a", null));
95  		assertEquals("baa", CubbyUtils.replaceFirst("abaa", "a", ""));
96  		assertEquals("zbaa", CubbyUtils.replaceFirst("abaa", "a", "z"));
97  		assertEquals("xyzaab", CubbyUtils.replaceFirst("abaab", "ab", "xyz"));
98  		assertNull(CubbyUtils.replaceFirst(null, "", ""));
99  		assertEquals("3abaa", CubbyUtils.replaceFirst("3abaa", null, null));
100 		assertEquals("3abaa", CubbyUtils.replaceFirst("3abaa", "a", null));
101 		assertEquals("3baa", CubbyUtils.replaceFirst("3abaa", "a", ""));
102 		assertEquals("3zbaa", CubbyUtils.replaceFirst("3abaa", "a", "z"));
103 		assertEquals("3xyzaab", CubbyUtils.replaceFirst("3abaab", "ab", "xyz"));
104 	}
105 
106 	public void testSplit2() {
107 		assertNull(CubbyUtils.split2(null, '_'));
108 		assertTrue(Arrays.deepEquals(new String[] { "" }, CubbyUtils.split2("",
109 				'_')));
110 		assertTrue(Arrays.deepEquals(new String[] { "ab", "" }, CubbyUtils
111 				.split2("ab_", '_')));
112 		assertTrue(Arrays.deepEquals(new String[] { "ab_cd_de_" }, CubbyUtils
113 				.split2("ab_cd_de_", ',')));
114 		assertTrue(Arrays.deepEquals(new String[] { "ab", "cd_de_" },
115 				CubbyUtils.split2("ab_cd_de_", '_')));
116 	}
117 
118 	public void testGetPriority() throws Exception {
119 		Method method = TestGetPriprity.class.getMethod("m1", new Class[0]);
120 		assertEquals(Integer.MAX_VALUE, CubbyUtils.getPriority(method));
121 
122 		method = TestGetPriprity.class.getMethod("m2", new Class[0]);
123 		assertEquals(Integer.MAX_VALUE, CubbyUtils.getPriority(method));
124 
125 		method = TestGetPriprity.class.getMethod("m3", new Class[0]);
126 		assertEquals(0, CubbyUtils.getPriority(method));
127 	}
128 
129 	static class TestGetPriprity {
130 		public void m1() {
131 		}
132 
133 		@Path
134 		public void m2() {
135 
136 		}
137 
138 		@Path(value = "", priority = 0)
139 		public void m3() {
140 
141 		}
142 	}
143 
144 	public void testGetFormBean1() throws Exception {
145 		MockFormAction action = new MockFormAction();
146 		Method method = ClassUtil.getMethod(action.getClass(), "normal",
147 				new Class[0]);
148 		Object actual = CubbyUtils
149 				.getFormBean(action, MockAction.class, method);
150 		assertSame(action, actual);
151 	}
152 
153 	public void testGetFormBean2() throws Exception {
154 		MockFormAction action = new MockFormAction();
155 		Method method = ClassUtil.getMethod(action.getClass(), "legalForm",
156 				new Class[0]);
157 		Object actual = CubbyUtils
158 				.getFormBean(action, MockAction.class, method);
159 		assertSame(action.form, actual);
160 	}
161 
162 	public void testGetFormBean3() throws Exception {
163 		MockFormAction action = new MockFormAction();
164 		Method method = ClassUtil.getMethod(action.getClass(), "illegalForm",
165 				new Class[0]);
166 		try {
167 			CubbyUtils.getFormBean(action, MockAction.class, method);
168 			fail();
169 		} catch (ActionRuntimeException e) {
170 			// ok
171 			assertTrue(true);
172 		}
173 	}
174 	
175 	public void testIsActionClass() throws Exception {
176 		assertTrue("アクションクラスであればtrue", CubbyUtils.isActionClass(ChildAction.class));
177 		assertFalse("Actionを継承していないクラスはアクションクラスではない", CubbyUtils.isActionClass(Object.class));
178 		assertFalse("抽象クラスはアクションクラスではない", CubbyUtils.isActionClass(ParentAction.class));
179 	}
180 	
181 	public void testIsActionMethod() throws Exception {
182 		assertTrue("親クラスのアクションメソッド", CubbyUtils.isActionMethod(ChildAction.class.getMethod("m1")));
183 		assertTrue("オーバーライドした親クラスのアクションメソッド", CubbyUtils.isActionMethod(ChildAction.class.getMethod("m2")));
184 		assertTrue("子クラスのアクションメソッド", CubbyUtils.isActionMethod(ChildAction.class.getMethod("m3")));
185 		assertFalse("メソッドの引数が不正", CubbyUtils.isActionMethod(ChildAction.class.getMethod("m4", int.class)));
186 		assertFalse("メソッドの戻り値が不正", CubbyUtils.isActionMethod(ChildAction.class.getMethod("m5")));
187 	}
188 
189 	public abstract class ParentAction extends Action {
190 		public ActionResult m1() {
191 			return null; 
192 		}
193 		public abstract ActionResult m2();
194 	}
195 	
196 	public class ChildAction extends ParentAction {
197 		@Override
198 		public ActionResult m2() {
199 			return null;
200 		}
201 		public ActionResult m3() { 
202 			return null; 
203 		}
204 		public ActionResult m4(int value) {
205 			return null;
206 		}
207 		public Object m5() {
208 			return null;
209 		}
210 	}
211 }