/*
* JBoss, Home of Professional Open Source
* Copyright 2014, 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.resolution;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.enterprise.util.TypeLiteral;
import org.jboss.weld.resolution.InvariantTypes;
import org.jboss.weld.util.reflection.GenericArrayTypeImpl;
import org.jboss.weld.util.reflection.ParameterizedTypeImpl;
import org.jboss.weld.util.reflection.WildcardTypeImpl;
import org.junit.Test;
/**
* Test for {@link InvariantTypes}
*
* @author Jozef Hartinger
*
*/
public class InvariantTypesTest {
/*
* Raw type
*/
@Test
public void testRawTypeAssignableFromRawType() {
assertTrue(InvariantTypes.isAssignableFrom(Number.class, Number.class));
assertTrue(InvariantTypes.isAssignableFrom(Integer.class, Integer.class));
assertTrue(InvariantTypes.isAssignableFrom(int.class, int.class));
assertFalse(InvariantTypes.isAssignableFrom(Integer.class, Number.class));
assertFalse(InvariantTypes.isAssignableFrom(Number.class, Integer.class));
}
@Test
public void testRawArrayAssignableFromRawArray() {
final Type numbers = new Number[0].getClass();
final Type integers = new Integer[0].getClass();
final Type ints = new int[0].getClass();
assertFalse(InvariantTypes.isAssignableFrom(Object.class, numbers));
assertFalse(InvariantTypes.isAssignableFrom(Object.class, integers));
assertFalse(InvariantTypes.isAssignableFrom(Object.class, ints));
assertTrue(InvariantTypes.isAssignableFrom(numbers, numbers));
assertFalse(InvariantTypes.isAssignableFrom(numbers, integers));
assertFalse(InvariantTypes.isAssignableFrom(numbers, ints));
assertTrue(InvariantTypes.isAssignableFrom(integers, integers));
assertFalse(InvariantTypes.isAssignableFrom(integers, ints));
assertFalse(InvariantTypes.isAssignableFrom(numbers, Object.class));
assertFalse(InvariantTypes.isAssignableFrom(integers, Object.class));
assertFalse(InvariantTypes.isAssignableFrom(ints, Object.class));
assertFalse(InvariantTypes.isAssignableFrom(integers, numbers));
assertFalse(InvariantTypes.isAssignableFrom(ints, numbers));
assertTrue(InvariantTypes.isAssignableFrom(WildcardTypeImpl.defaultInstance(), numbers));
assertTrue(InvariantTypes.isAssignableFrom(WildcardTypeImpl.defaultInstance(), integers));
assertTrue(InvariantTypes.isAssignableFrom(WildcardTypeImpl.defaultInstance(), ints));
assertTrue(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(numbers), numbers));
assertTrue(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(numbers), integers));
assertFalse(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(numbers), ints));
assertFalse(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(integers), numbers));
assertTrue(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(integers), integers));
assertFalse(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(integers), ints));
assertFalse(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(ints), numbers));
assertFalse(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(ints), integers));
assertTrue(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(ints), ints));
}
@Test
public void testRawTypeAssignableFromParameterizedType() {
assertFalse(InvariantTypes.isAssignableFrom(Map.class, new ParameterizedTypeImpl(Map.class, String.class, Integer.class)));
assertFalse(InvariantTypes.isAssignableFrom(Map.class, new ParameterizedTypeImpl(Map.class, Object.class, Object.class)));
assertFalse(InvariantTypes.isAssignableFrom(Map.class, new ParameterizedTypeImpl(HashMap.class, Object.class, Object.class)));
assertFalse(InvariantTypes.isAssignableFrom(Map.class, new ParameterizedTypeImpl(List.class, Object.class)));
}
@Test
public void testRawTypeAssignableFromGenericArrayType() {
assertFalse(InvariantTypes.isAssignableFrom(new List[0].getClass(), new GenericArrayTypeImpl(List.class, Object.class)));
assertFalse(InvariantTypes.isAssignableFrom(new List[0].getClass(), new GenericArrayTypeImpl(List.class, Integer.class)));
assertFalse(InvariantTypes.isAssignableFrom(new List[0].getClass(), new GenericArrayTypeImpl(ArrayList.class, Integer.class)));
assertFalse(InvariantTypes.isAssignableFrom(new ArrayList[0].getClass(), new GenericArrayTypeImpl(List.class, Integer.class)));
}
/*
* Parameterized types
*/
@Test
public void testParameterizedTypeAssignableFromParameterizedType() {
assertTrue(InvariantTypes.isAssignableFrom(new ParameterizedTypeImpl(Map.class, Number.class, String.class), new ParameterizedTypeImpl(Map.class, Number.class, String.class)));
assertFalse(InvariantTypes.isAssignableFrom(new ParameterizedTypeImpl(Map.class, Number.class, String.class), new ParameterizedTypeImpl(HashMap.class, Number.class, String.class)));
assertFalse(InvariantTypes.isAssignableFrom(new ParameterizedTypeImpl(Map.class, Number.class, String.class), new ParameterizedTypeImpl(Map.class, Integer.class, String.class)));
assertFalse(InvariantTypes.isAssignableFrom(new ParameterizedTypeImpl(Map.class, Number.class, String.class), new ParameterizedTypeImpl(Map.class, Number.class, Object.class)));
}
/*
* Type variables
*/
@Test
@SuppressWarnings("all")
public <A, B, C extends Number, D extends Integer, E extends A> void testTypeVariableAssignableFromTypeVariable() {
final int count = 5;
Type[] typeVariables = new Type[count];
typeVariables[0] = new TypeLiteral<A>() {
}.getType();
typeVariables[1] = new TypeLiteral<B>() {
}.getType();
typeVariables[2] = new TypeLiteral<C>() {
}.getType();
typeVariables[3] = new TypeLiteral<D>() {
}.getType();
typeVariables[4] = new TypeLiteral<E>() {
}.getType();
// type variables should only be assignable if they are equal
for (int i = 0; i < count; i++) {
for (int j = 0; j < count; j++) {
if (i == j) {
assertTrue(InvariantTypes.isAssignableFrom(typeVariables[i], typeVariables[j]));
} else {
assertFalse(InvariantTypes.isAssignableFrom(typeVariables[i], typeVariables[j]));
}
}
}
}
/*
* Generic array types
*/
@Test
public void testGenericArrayTypeAssignableGenericArrayType() {
assertTrue(InvariantTypes.isAssignableFrom(new GenericArrayTypeImpl(List.class, Number.class), new GenericArrayTypeImpl(List.class, Number.class)));
assertTrue(InvariantTypes.isAssignableFrom(new GenericArrayTypeImpl(Map.class, String.class, Runnable.class), new GenericArrayTypeImpl(Map.class, String.class, Runnable.class)));
assertFalse(InvariantTypes.isAssignableFrom(new GenericArrayTypeImpl(List.class, Number.class), new GenericArrayTypeImpl(List.class, Integer.class)));
assertFalse(InvariantTypes.isAssignableFrom(new GenericArrayTypeImpl(List.class, Number.class), new GenericArrayTypeImpl(List.class, Object.class)));
assertFalse(InvariantTypes.isAssignableFrom(new GenericArrayTypeImpl(Map.class, Object.class, Object.class), new GenericArrayTypeImpl(Map.class, String.class, Runnable.class)));
}
}