/*
* JBoss, Home of Professional Open Source
* Copyright 2013, Red Hat, Inc., and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* 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.jboss.weld.tests.unit.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import org.jboss.weld.util.reflection.DeclaredMemberIndexer;
import org.junit.Test;
public class DeclaredMemberIndexerTest {
@Test
public void testFields() {
verifyFields(DeclaredMemberIndexer.getDeclaredFields(TestContainer.class), "bar", "baz", "foo", "qux");
try {
DeclaredMemberIndexer.getFieldForIndex(1000, TestContainer.class);
fail();
} catch (IndexOutOfBoundsException e) {
// Expected
}
}
@Test
public void testConstructors() {
List<Constructor<?>> constructors = DeclaredMemberIndexer.getDeclaredConstructors(TestContainer.class);
assertEquals(5, constructors.size());
verifyConstructor(constructors, 0);
verifyConstructor(constructors, 1, String.class);
verifyConstructor(constructors, 2, String.class, Integer.class);
verifyConstructor(constructors, 3, String.class, String.class);
verifyConstructor(constructors, 4, Integer.class, String.class, BigDecimal.class);
try {
DeclaredMemberIndexer.getConstructorForIndex(1000, TestContainer.class);
fail();
} catch (IndexOutOfBoundsException e) {
// Expected
}
}
@Test
public void testMethods() {
List<Method> methods = DeclaredMemberIndexer.getDeclaredMethods(TestContainer.class);
assertEquals(5, methods.size());
verifyMethod(methods, 0, "bar", Integer.class, String.class);
verifyMethod(methods, 1, "bar", String.class, Integer.class);
verifyMethod(methods, 2, "bar", String.class, Integer.class, Boolean.class);
verifyMethod(methods, 3, "foo", Integer.class);
verifyMethod(methods, 4, "noParam");
try {
DeclaredMemberIndexer.getMethodForIndex(1000, TestContainer.class);
fail();
} catch (IndexOutOfBoundsException e) {
// Expected
}
}
private void verifyFields(List<Field> fields, String... names) {
assertEquals(names.length, fields.size());
for (int i = 0; i < names.length; i++) {
assertEquals(names[i], fields.get(i).getName());
assertEquals(i, DeclaredMemberIndexer.getIndexForField(fields.get(i)));
assertEquals(fields.get(i), DeclaredMemberIndexer.getFieldForIndex(i, TestContainer.class));
}
}
private void verifyConstructor(List<Constructor<?>> constructors, int index, Class<?>... expectedParamTypes) {
Constructor<?> constructor = constructors.get(index);
assertEquals(constructor.getParameterTypes().length, expectedParamTypes.length);
for (int i = 0; i < expectedParamTypes.length; i++) {
if (!constructor.getParameterTypes()[i].getName().equals(expectedParamTypes[i].getName())) {
fail(constructor.getParameterTypes()[i].getName() + " ne " + expectedParamTypes[i].getName());
}
}
assertEquals(index, DeclaredMemberIndexer.getIndexForConstructor(constructor));
assertEquals(constructor, DeclaredMemberIndexer.getConstructorForIndex(index, TestContainer.class));
}
private void verifyMethod(List<Method> methods, int index, String expectedName, Class<?>... expectedParamTypes) {
Method method = methods.get(index);
assertEquals(expectedName, method.getName());
assertEquals(method.getParameterTypes().length, expectedParamTypes.length);
for (int i = 0; i < expectedParamTypes.length; i++) {
if (!method.getParameterTypes()[i].getName().equals(expectedParamTypes[i].getName())) {
fail(method.getParameterTypes()[i].getName() + " ne " + expectedParamTypes[i].getName());
}
}
assertEquals(index, DeclaredMemberIndexer.getIndexForMethod(method));
assertEquals(method, DeclaredMemberIndexer.getMethodForIndex(index, TestContainer.class));
}
@SuppressWarnings("unused")
private static class TestContainer extends Container {
String foo;
private Integer bar;
public Date baz;
protected Boolean qux;
private TestContainer() {
}
protected TestContainer(String foo) {
}
TestContainer(String foo, Integer bar) {
}
public TestContainer(String bar, String foo) {
}
private TestContainer(Integer bar, String foo, BigDecimal qux) {
}
public void noParam() {
}
protected void foo(Integer p1) {
}
public void bar(Integer p1, String p2) {
}
private void bar(String p1, Integer p2) {
}
public void bar(String p1, Integer p2, Boolean p3) {
}
}
@SuppressWarnings("unused")
private static class Container {
protected String inherited;
protected Container() {
}
public Container(String[] foos) {
}
public String alpha() {
return null;
}
}
}