2 * Copyright 2005-2010 the original author or authors.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org.wamblee.reflection;
18 import static org.mockito.Matchers.*;
19 import static org.mockito.Mockito.*;
21 import java.lang.reflect.Field;
22 import java.lang.reflect.Method;
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.HashSet;
26 import java.util.List;
30 import org.apache.derby.impl.sql.execute.OnceResultSet;
31 import org.junit.Before;
32 import org.junit.Test;
33 import org.mockito.Mock;
34 import org.mockito.MockitoAnnotations;
35 import org.wamblee.reflection.ObjectTraversal.ObjectVisitor;
37 import static junit.framework.TestCase.*;
39 public class ObjectTraversalTest {
42 private ObjectVisitor visitor;
44 private ObjectTraversal traversal;
48 MockitoAnnotations.initMocks(this);
49 traversal = new ObjectTraversal(visitor);
51 when(visitor.mustVisit(any(Class.class))).thenReturn(true);
52 when(visitor.mustVisit(any(Field.class))).thenReturn(true);
53 when(visitor.mustVisit(any(Method.class))).thenReturn(true);
55 when(visitor.visitPlainObject(any())).thenReturn(true);
56 when(visitor.visitArray(any())).thenReturn(true);
57 when(visitor.visitList(any(List.class))).thenReturn(true);
58 when(visitor.visitMap(any(Map.class))).thenReturn(true);
59 when(visitor.visitSet(any(Set.class))).thenReturn(true);
63 public static class X1 {
67 public static class X2 {
73 public void testTraverseFields() throws Exception {
78 verify(visitor).mustVisit(X2.class);
79 verify(visitor).mustVisit(X1.class);
80 verify(visitor).mustVisit(eq(X2.class.getDeclaredField("x")));
81 verify(visitor).visitPlainObject(same(x2));
82 verify(visitor).visitPlainObject(same(x1));
83 verifyNoMoreInteractions(visitor);
86 public static class TraversalNonTraversedFields {
88 private Object y = new Object();
92 public void testNonTraversedFields() throws Exception {
93 TraversalNonTraversedFields obj =new TraversalNonTraversedFields();
94 traversal.accept(obj);
95 verify(visitor).mustVisit(TraversalNonTraversedFields.class);
96 verify(visitor).mustVisit(eq(TraversalNonTraversedFields.class.getDeclaredField("x")));
97 verify(visitor).mustVisit(eq(TraversalNonTraversedFields.class.getDeclaredField("y")));
98 verify(visitor).visitPlainObject(same(obj));
101 public static class X3 {
105 public static class X4 {
113 public void testTraverseMethods() throws Exception {
115 traversal.accept(x4);
116 verify(visitor).mustVisit(X4.class);
117 verify(visitor).mustVisit(X3.class);
118 verify(visitor).mustVisit(eq(X4.class.getDeclaredMethod("getX3")));
119 verify(visitor).visitPlainObject(same(x4));
120 verify(visitor).visitPlainObject(isA(X3.class));
121 verifyNoMoreInteractions(visitor);
125 public void testTraverseList() {
126 List list = new ArrayList();
129 traversal.accept(list);
130 verify(visitor).visitList(same(list));
131 verify(visitor).visitPlainObject(isA(X1.class));
132 verify(visitor).visitPlainObject(isA(X3.class));
136 public void testTraverseMap() {
137 Map<String,Object> map = new HashMap<String,Object>();
138 map.put("x1", new X1());
139 map.put("x3", new X3());
140 traversal.accept(map);
141 verify(visitor).visitMap(same(map));
142 verify(visitor).visitPlainObject(isA(X1.class));
143 verify(visitor).visitPlainObject(isA(X3.class));
147 public void testTraverseSet() {
148 Set set = new HashSet();
151 traversal.accept(set);
152 verify(visitor).visitSet(same(set));
153 verify(visitor).visitPlainObject(isA(X1.class));
154 verify(visitor).visitPlainObject(isA(X3.class));
158 public void testTraverseArray() {
159 Object[] obj = new Object[2];
162 traversal.accept(obj);
163 verify(visitor).visitArray(same(obj));
164 verify(visitor).visitPlainObject(isA(X1.class));
165 verify(visitor).visitPlainObject(isA(X3.class));
169 public void testExcludeClasses() {
172 when(visitor.mustVisit(X1.class)).thenReturn(false);
173 traversal.accept(x2);
174 verify(visitor).visitPlainObject(same(x2));
175 verify(visitor, never()).visitPlainObject(same(x2.x));
179 public void testExcludeFields() {
182 when(visitor.mustVisit(any(Field.class))).thenReturn(false);
183 traversal.accept(x2);
184 verify(visitor).visitPlainObject(same(x2));
185 verify(visitor, never()).visitPlainObject(same(x2.x));
189 public void testExcludeMethods() {
191 when(visitor.mustVisit(any(Method.class))).thenReturn(false);
192 traversal.accept(x4);
193 verify(visitor).visitPlainObject(same(x4));
194 verify(visitor, never()).visitPlainObject(isA(X3.class));
197 public static class X5 {
201 public static class X6 {
206 public void testCyclic() {
211 traversal.accept(x6);
212 verify(visitor).visitPlainObject(same(x6));
213 verify(visitor).visitPlainObject(same(x5));
217 public void testCyclicList() {
218 List list = new ArrayList();
220 traversal.accept(list);
221 verify(visitor, times(1)).visitList(same(list));
225 public void testCyclicMap() {
226 Map map = new HashMap();
228 traversal.accept(map);
229 verify(visitor, times(1)).visitMap(same(map));
233 public void testCyclicSet() {
234 Set set = new HashSet();
236 traversal.accept(set);
237 verify(visitor, times(1)).visitSet(same(set));
241 public void testCyclicArray() {
242 Object[] obj = new Object[1];
244 traversal.accept(obj);
245 verify(visitor, times(1)).visitArray(same(obj));
249 public void testVisitNull() {
250 traversal.accept(null);
254 public void testExcludeFieldByReturningFalseInVisit() {
257 when(visitor.visitPlainObject(any())).thenReturn(false);
258 traversal.accept(x2);
259 verify(visitor).visitPlainObject(same(x2));
260 verify(visitor, never()).visitPlainObject(same(x2.x));
264 public void testTraverseListExcludeElements() {
265 List list = new ArrayList();
268 when(visitor.visitList(any(List.class))).thenReturn(false);
269 traversal.accept(list);
270 verify(visitor).visitList(same(list));
271 verify(visitor, never()).visitPlainObject(any());
275 public void testTraverseMapExcludeElements() {
276 Map<String,Object> map = new HashMap<String,Object>();
277 map.put("x1", new X1());
278 map.put("x3", new X3());
279 when(visitor.visitMap(any(Map.class))).thenReturn(false);
280 traversal.accept(map);
281 verify(visitor).visitMap(same(map));
282 verify(visitor, never()).visitPlainObject(any());
286 public void testTraverseSetExcludeElements() {
287 Set set = new HashSet();
290 when(visitor.visitSet(any(Set.class))).thenReturn(false);
292 traversal.accept(set);
293 verify(visitor).visitSet(same(set));
294 verify(visitor, never()).visitPlainObject(any());
298 public void testTraverseArrayExcludeElements() {
299 Object[] obj = new Object[2];
302 when(visitor.visitArray(any())).thenReturn(false);
304 traversal.accept(obj);
305 verify(visitor).visitArray(same(obj));
306 verify(visitor, never()).visitPlainObject(any());