/*
* Copyright 2002-2005 the original author or authors.
*
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.
*/
package org.springframework.core;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
/**
* @author Keith Donald
*/
public class ReflectiveVisitorHelperTests extends TestCase {
private ReflectiveVisitorHelper support;
public void setUp() {
support = new ReflectiveVisitorHelper();
}
public void testDirectDefaultLookup() {
ensureVisit(new DirectMockVisitor(), new ArrayList());
}
public void testDirectDefaultLookupCache() {
DirectMockVisitor visitor = new DirectMockVisitor();
ensureVisit(visitor, new ArrayList());
visitor.visited = false;
ensureVisit(visitor, new ArrayList());
}
public void testSuperClassDefaultLookup() {
ensureVisit(new SuperClassMockVisitor(), new ArrayList());
}
public void testPackagePrivateDefaultLookup() {
ensureVisit(new PackagePrivateMockVisitor(), new ArrayList());
}
public void testSuperClassSuperInterfaceDefaultLookup() {
ensureVisit(new SuperClassSuperInterfaceMockVisitor(), new ArrayList());
}
public void testInterfaceDefaultLookup() {
ensureVisit(new InterfaceMockVisitor(), new ArrayList());
}
public void testInnerClassArgument() {
Map.Entry entry = new Map.Entry() {
public Object getKey() {
return null;
}
public Object getValue() {
return null;
}
public Object setValue(Object value) {
return null;
}
};
ensureVisit(new DirectMockVisitor(), entry);
}
public void testInheritedValueLookup() {
ensureVisit(new InheritedArgMockVisitor(), new ArrayList());
}
public void testNullArgument() {
ensureVisit(new NullVisitor(), null);
}
public void testInvisibleClassVisitor() {
ensureVisit(new InvisibleClassVisitor(), new ArrayList());
}
public void testNullVisitor() {
try {
support.invokeVisit(null, new Object());
fail("null visitor was accepted");
}
catch (IllegalArgumentException e) {
// correct behavior.
}
catch (Exception e) {
fail("null visitor was not handled properly");
}
}
private void ensureVisit(AbstractMockVisitor visitor, Object argument) {
support.invokeVisit(visitor, argument);
assertTrue("Visitor was not visited!", visitor.visited);
}
public abstract class AbstractMockVisitor {
boolean visited;
}
public class DirectMockVisitor extends AbstractMockVisitor {
public void visit(ArrayList value) {
visited = true;
}
public void visit(Map.Entry entry) {
visited = true;
}
}
public class InheritedArgMockVisitor extends AbstractMockVisitor {
public void visit(Object value) {
visited = true;
}
}
public class SuperClassMockVisitor extends AbstractMockVisitor {
public void visit(AbstractList value) {
visited = true;
}
}
public class SuperClassSuperInterfaceMockVisitor extends AbstractMockVisitor {
public void visit(Collection value) {
visited = true;
}
}
public class InterfaceMockVisitor extends AbstractMockVisitor {
public void visit(List value) {
visited = true;
}
}
public class PackagePrivateMockVisitor extends AbstractMockVisitor {
void visit(ArrayList value) {
visited = true;
}
}
private class InvisibleClassVisitor extends AbstractMockVisitor {
public void visit(ArrayList list) {
visited = true;
}
}
public class NullVisitor extends AbstractMockVisitor {
public void visitNull() {
visited = true;
}
}
}