package org.jboss.weld.tests.arrays.test;
import org.junit.Assert;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.BeanArchive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.weld.test.util.Utils;
import org.junit.Test;
import org.junit.runner.RunWith;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.util.TypeLiteral;
import javax.inject.Inject;
import java.lang.annotation.Annotation;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
/**
*
*/
@RunWith(Arquillian.class)
public class AssignabilityTest {
@Inject
private BeanManager beanManager;
@Deployment
public static Archive<?> createTestArchive() {
return ShrinkWrap.create(BeanArchive.class, Utils.getDeploymentNameAsHash(AssignabilityTest.class))
.addClasses(Result.class);
}
@Test
public void testAssignabilityOfParameterizedTypeWithTypeVariablesToParameterizedTypeWithWildcards()
{
Set<Bean<Result<? extends Throwable, ? super Exception>>> beans = getBeans(new TypeLiteral<Result<? extends Throwable, ? super Exception>>() {
});
Assert.assertEquals(1, beans.size());
Assert.assertTrue(rawTypeSetMatches(beans.iterator().next().getTypes(), Result.class, Object.class));
}
@Test
public void testAssignabilityOfParameterizedTypeWithTypeVariablesToParameterizedTypeWithWildcards2()
{
Set<Bean<Result<? extends Exception, ? super Exception>>> beans = getBeans(new TypeLiteral<Result<? extends Exception, ? super Exception>>(){});
Assert.assertEquals(1, beans.size());
Assert.assertTrue(rawTypeSetMatches(beans.iterator().next().getTypes(), Result.class, Object.class));
}
public <T> Set<Bean<T>> getBeans(TypeLiteral<T> type, Annotation... bindings) {
return (Set)beanManager.getBeans(type.getType(), bindings);
}
public boolean rawTypeSetMatches(Set<Type> types, Class<?>... requiredTypes)
{
List<Class<?>> typeList = new ArrayList<Class<?>>();
typeList.addAll(Arrays.asList(requiredTypes));
for (Type type : types)
{
if (type instanceof Class<?>)
{
typeList.remove(type);
}
else if (type instanceof ParameterizedType)
{
typeList.remove(((ParameterizedType) type).getRawType());
}
}
return typeList.size() == 0;
}
}