package com.cedarsoftware.util; import org.junit.Test; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.Map; import java.util.TimeZone; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** * @author John DeRegnaucourt (john@cedarsoftware.com) * <br> * Copyright (c) Cedar Software LLC * <br><br> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * <br><br> * http://www.apache.org/licenses/LICENSE-2.0 * <br><br> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ public class TestTraverser { class Alpha { String name; Collection contacts; Beta beta; } class Beta { int age; Map friends; Charlie charlie; } class Charlie { double salary; Collection timezones; Object[] dates; Alpha alpha; TimeZone zone = TimeZone.getDefault(); Delta delta; } class Delta { TimeZone timeZone = TimeZone.getDefault(); } @Test public void testCyclicTraverse() { Alpha alpha = new Alpha(); Beta beta = new Beta(); Charlie charlie = new Charlie(); alpha.name = "alpha"; alpha.beta = beta; alpha.contacts = new ArrayList(); alpha.contacts.add(beta); alpha.contacts.add(charlie); alpha.contacts.add("Harry"); beta.age = 45; beta.charlie = charlie; beta.friends = new LinkedHashMap(); beta.friends = new LinkedHashMap(); beta.friends.put("Tom", "Tom Jones"); beta.friends.put(alpha, "Alpha beta"); beta.friends.put("beta", beta); charlie.salary = 150000.01; charlie.alpha = alpha; charlie.timezones = new LinkedList(); charlie.timezones.add(TimeZone.getTimeZone("EST")); charlie.timezones.add(TimeZone.getTimeZone("GMT")); charlie.dates = new Date[] { new Date() }; final int[] visited = new int[4]; visited[0] = 0; visited[1] = 0; visited[2] = 0; visited[3] = 0; Traverser.Visitor visitor = new Traverser.Visitor() { public void process(Object o) { if (o instanceof Alpha) { visited[0]++; } else if (o instanceof Beta) { visited[1]++; } else if (o instanceof Charlie) { visited[2]++; } else if (o instanceof TimeZone) { visited[3]++; } } }; Traverser.traverse(alpha, visitor); assertEquals(1, visited[0]); assertEquals(1, visited[1]); assertEquals(1, visited[2]); assertTrue(visited[3] >= 1); visited[0] = 0; visited[1] = 0; visited[2] = 0; visited[3] = 0; Traverser.traverse(alpha, new Class[] { TimeZone.class }, visitor); assertEquals(1, visited[0]); assertEquals(1, visited[1]); assertEquals(1, visited[2]); assertEquals(0, visited[3]); } }