package org.jboss.resteasy.test.util; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jboss.resteasy.util.Types; import org.junit.Assert; import org.junit.Test; import javax.ws.rs.core.GenericType; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.WildcardType; import java.util.List; /** * @tpSubChapter Util tests * @tpChapter Unit tests * @tpTestCaseDetails Regression test for RESTEASY-1295, JBEAP-4713 * @tpSince RESTEasy 3.0.17 */ public class WildcardTypeTest { protected final Logger logger = LogManager.getLogger(WildcardTypeTest.class.getName()); /** * @tpTestDetails Tests upper bound. * @tpSince RESTEasy 3.0.17 */ @Test public void testWildcardTypeUpperBound() { GenericType<List<? extends String>> genericType = new GenericType<List<? extends String>>() { }; ParameterizedType pt = (ParameterizedType) genericType.getType(); Type t = pt.getActualTypeArguments()[0]; printTypes(t); Class<?> rawType = Types.getRawType(t); Assert.assertEquals(String.class, rawType); } /** * @tpTestDetails Tests lower bound. * @tpSince RESTEasy 3.0.17 */ @Test public void testWildcardTypeLowerBound() { GenericType<List<? super String>> genericType = new GenericType<List<? super String>>() { }; ParameterizedType pt = (ParameterizedType) genericType.getType(); Type t = pt.getActualTypeArguments()[0]; printTypes(t); Class<?> rawType = Types.getRawType(t); Assert.assertEquals(Object.class, rawType); } /** * @tpTestDetails Tests upper bound object. * @tpSince RESTEasy 3.0.17 */ @Test public void testWildcardTypeUpperBoundObject() { GenericType<List<? extends Object>> genericType = new GenericType<List<? extends Object>>() { }; ParameterizedType pt = (ParameterizedType) genericType.getType(); Type t = pt.getActualTypeArguments()[0]; printTypes(t); Class<?> rawType = Types.getRawType(t); Assert.assertEquals(Object.class, rawType); } /** * @tpTestDetails Tests lower bound object. * @tpSince RESTEasy 3.0.17 */ @Test public void testWildcardTypeLowerBoundObject() { GenericType<List<? super Object>> genericType = new GenericType<List<? super Object>>() { }; ParameterizedType pt = (ParameterizedType) genericType.getType(); Type t = pt.getActualTypeArguments()[0]; printTypes(t); Class<?> rawType = Types.getRawType(t); Assert.assertEquals(Object.class, rawType); } void printTypes(Type t) { WildcardType wt = (WildcardType) t; logger.debug("-----------"); logger.debug("type: " + t); logger.debug("upper: " + (wt.getUpperBounds().length > 0 ? wt.getUpperBounds()[0] : "[]")); logger.debug("lower: " + (wt.getLowerBounds().length > 0 ? wt.getLowerBounds()[0] : "[]")); } }