Added:
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/type/TypeLiteralTypeResolutionTest.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/type/TypeLiteralTypeResolutionTest.java?rev=1241133&view=auto
==============================================================================
---
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/type/TypeLiteralTypeResolutionTest.java
(added)
+++
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/type/TypeLiteralTypeResolutionTest.java
Mon Feb 6 19:56:42 2012
@@ -0,0 +1,469 @@
+package org.apache.commons.beanutils2.type;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
+import static org.apache.commons.beanutils2.type.Asserts.assertEqualsBothWays;
+import static org.apache.commons.beanutils2.type.Asserts.assertNotSerializable;
+import static org.apache.commons.beanutils2.type.Types.arrayOf;
+import static org.apache.commons.beanutils2.type.Types.listOf;
+import static org.apache.commons.beanutils2.type.Types.newParameterizedType;
+import static
org.apache.commons.beanutils2.type.Types.newParameterizedTypeWithOwner;
+import static org.apache.commons.beanutils2.type.Types.setOf;
+
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.util.AbstractCollection;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.apache.commons.beanutils2.type.TypeLiteral;
+import org.apache.commons.beanutils2.type.Types;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * This test checks that TypeLiteral can perform type resolution on its
members.
+ *
+ * @author [email protected] (Jesse Wilson)
+ */
+public class TypeLiteralTypeResolutionTest
+{
+
+ Type arrayListOfString = newParameterizedType( ArrayList.class,
String.class );
+
+ Type hasGenericFieldsOfShort = newParameterizedTypeWithOwner( getClass(),
HasGenericFields.class, Short.class );
+
+ Type hasGenericConstructorOfShort = newParameterizedTypeWithOwner(
getClass(), GenericConstructor.class,
+
Short.class );
+
+ Type throwerOfNpe = newParameterizedTypeWithOwner( getClass(),
Thrower.class, NullPointerException.class );
+
+ Type hasArrayOfShort = newParameterizedTypeWithOwner( getClass(),
HasArray.class, Short.class );
+
+ Type hasRelatedOfString = newParameterizedTypeWithOwner( getClass(),
HasRelated.class, String.class, String.class );
+
+ Type mapK = Map.class.getTypeParameters()[0];
+
+ Type hashMapK = HashMap.class.getTypeParameters()[0];
+
+ Type setEntryKV;
+
+ Type entryStringInteger = setOf( newParameterizedTypeWithOwner( Map.class,
Map.Entry.class, String.class,
+
Integer.class ) );
+
+ Field list;
+
+ Field instance;
+
+ Constructor<GenericConstructor> newHasGenericConstructor;
+
+ Constructor<Thrower> newThrower;
+
+ Constructor newString;
+
+ Method stringIndexOf;
+
+ Method comparableCompareTo;
+
+ Method getArray;
+
+ Method getSetOfArray;
+
+ Method echo;
+
+ Method throwS;
+
+ @Before
+ public void setUp()
+ throws Exception
+ {
+
+ list = HasGenericFields.class.getField( "list" );
+ instance = HasGenericFields.class.getField( "instance" );
+ newHasGenericConstructor = GenericConstructor.class.getConstructor(
Object.class, Object.class );
+ newThrower = Thrower.class.getConstructor();
+ stringIndexOf = String.class.getMethod( "indexOf", String.class );
+ newString = String.class.getConstructor( String.class );
+ comparableCompareTo = Comparable.class.getMethod( "compareTo",
Object.class );
+ getArray = HasArray.class.getMethod( "getArray" );
+ getSetOfArray = HasArray.class.getMethod( "getSetOfArray" );
+ echo = HasRelated.class.getMethod( "echo", Object.class );
+ throwS = Thrower.class.getMethod( "throwS" );
+ setEntryKV = HashMap.class.getMethod( "entrySet"
).getGenericReturnType();
+ }
+
+ @Test
+ public void testDirectInheritance()
+ throws NoSuchMethodException
+ {
+ TypeLiteral<?> resolver = TypeLiteral.get( arrayListOfString );
+ assertEquals( listOf( String.class ),
+ resolver.getReturnType( List.class.getMethod( "subList",
int.class, int.class ) ).getType() );
+ assertEquals( ImmutableList.<TypeLiteral<?>> of( TypeLiteral.get(
String.class ) ),
+ resolver.getParameterTypes( Collection.class.getMethod(
"add", Object.class ) ) );
+ }
+
+ @Test
+ public void testGenericSupertype()
+ {
+ TypeLiteral<?> resolver = TypeLiteral.get( arrayListOfString );
+ assertEquals( newParameterizedType( Collection.class, String.class ),
+ resolver.getSupertype( Collection.class ).getType() );
+ assertEquals( newParameterizedType( Iterable.class, String.class ),
+ resolver.getSupertype( Iterable.class ).getType() );
+ assertEquals( newParameterizedType( AbstractList.class, String.class ),
+ resolver.getSupertype( AbstractList.class ).getType() );
+ assertEquals( Object.class, resolver.getSupertype( Object.class
).getType() );
+ }
+
+ @Test
+ public void testRecursiveTypeVariable()
+ {
+ TypeLiteral<?> resolver = TypeLiteral.get( MyInteger.class );
+ assertEquals( MyInteger.class, resolver.getParameterTypes(
comparableCompareTo ).get( 0 ).getType() );
+ }
+
+ interface MyComparable<E extends MyComparable<E>>
+ extends Comparable<E>
+ {
+ }
+
+ static class MyInteger
+ implements MyComparable<MyInteger>
+ {
+ int value;
+
+ public int compareTo( MyInteger o )
+ {
+ return value - o.value;
+ }
+ }
+
+ @Test
+ public void testFields()
+ {
+ TypeLiteral<?> resolver = TypeLiteral.get( hasGenericFieldsOfShort );
+ assertEquals( listOf( Short.class ), resolver.getFieldType( list
).getType() );
+ assertEquals( Short.class, resolver.getFieldType( instance ).getType()
);
+ }
+
+ static class HasGenericFields<T>
+ {
+ public List<T> list;
+
+ public T instance;
+ }
+
+ @Test
+ public void testGenericConstructor()
+ throws NoSuchMethodException
+ {
+ TypeLiteral<?> resolver = TypeLiteral.get(
hasGenericConstructorOfShort );
+ assertEquals( Short.class, resolver.getParameterTypes(
newHasGenericConstructor ).get( 0 ).getType() );
+ }
+
+ static class GenericConstructor<S>
+ {
+ @SuppressWarnings( "UnusedDeclaration" )
+ public <T> GenericConstructor( S s, T t )
+ {
+ }
+ }
+
+ @Test
+ public void testThrowsExceptions()
+ {
+ TypeLiteral<?> type = TypeLiteral.get( throwerOfNpe );
+ assertEquals( NullPointerException.class, type.getExceptionTypes(
newThrower ).get( 0 ).getType() );
+ assertEquals( NullPointerException.class, type.getExceptionTypes(
throwS ).get( 0 ).getType() );
+ }
+
+ static class Thrower<S extends Exception>
+ {
+ public Thrower()
+ throws S
+ {
+ }
+
+ public void throwS()
+ throws S
+ {
+ }
+ }
+
+ @Test
+ public void testArrays()
+ {
+ TypeLiteral<?> resolver = TypeLiteral.get( hasArrayOfShort );
+ assertEquals( arrayOf( Short.class ), resolver.getReturnType( getArray
).getType() );
+ assertEquals( setOf( arrayOf( Short.class ) ), resolver.getReturnType(
getSetOfArray ).getType() );
+ }
+
+ static interface HasArray<T extends Number>
+ {
+ T[] getArray();
+
+ Set<T[]> getSetOfArray();
+ }
+
+ @Test
+ public void testRelatedTypeVariables()
+ {
+ TypeLiteral<?> resolver = TypeLiteral.get( hasRelatedOfString );
+ assertEquals( String.class, resolver.getParameterTypes( echo ).get( 0
).getType() );
+ assertEquals( String.class, resolver.getReturnType( echo ).getType() );
+ }
+
+ interface HasRelated<T, R extends T>
+ {
+ T echo( R r );
+ }
+
+ /** Ensure the cache doesn't cache too much */
+ @Test
+ public void testCachingAndReindexing()
+ throws NoSuchMethodException
+ {
+ TypeLiteral<?> resolver =
+ TypeLiteral.get( newParameterizedTypeWithOwner( getClass(),
HasLists.class, String.class, Short.class ) );
+ assertEquals( listOf( String.class ), resolver.getReturnType(
HasLists.class.getMethod( "listS" ) ).getType() );
+ assertEquals( listOf( Short.class ), resolver.getReturnType(
HasLists.class.getMethod( "listT" ) ).getType() );
+ }
+
+ interface HasLists<S, T>
+ {
+ List<S> listS();
+
+ List<T> listT();
+
+ List<Map.Entry<S, T>> listEntries();
+ }
+
+ @Test
+ public void testUnsupportedQueries()
+ throws NoSuchMethodException
+ {
+ TypeLiteral<?> resolver = TypeLiteral.get( arrayListOfString );
+
+ try
+ {
+ resolver.getExceptionTypes( stringIndexOf );
+ fail();
+ }
+ catch ( IllegalArgumentException e )
+ {
+ assertEquals( "public int
java.lang.String.indexOf(java.lang.String) is not defined by a "
+ + "supertype of java.util.ArrayList<java.lang.String>",
e.getMessage() );
+ }
+ try
+ {
+ resolver.getParameterTypes( stringIndexOf );
+ fail();
+ }
+ catch ( Exception e )
+ {
+ assertEquals( "public int
java.lang.String.indexOf(java.lang.String) is not defined by a "
+ + "supertype of java.util.ArrayList<java.lang.String>",
e.getMessage() );
+ }
+ try
+ {
+ resolver.getReturnType( stringIndexOf );
+ fail();
+ }
+ catch ( Exception e )
+ {
+ assertEquals( "public int
java.lang.String.indexOf(java.lang.String) is not defined by a "
+ + "supertype of java.util.ArrayList<java.lang.String>",
e.getMessage() );
+ }
+ try
+ {
+ resolver.getSupertype( String.class );
+ fail();
+ }
+ catch ( Exception e )
+ {
+ assertEquals( "class java.lang.String is not a supertype of " +
"java.util.ArrayList<java.lang.String>",
+ e.getMessage() );
+ }
+ try
+ {
+ resolver.getExceptionTypes( newString );
+ fail();
+ }
+ catch ( Exception e )
+ {
+ assertEquals( "public java.lang.String(java.lang.String) does not
construct "
+ + "a supertype of java.util.ArrayList<java.lang.String>",
e.getMessage() );
+ }
+ try
+ {
+ resolver.getParameterTypes( newString );
+ fail();
+ }
+ catch ( Exception e )
+ {
+ assertEquals( "public java.lang.String(java.lang.String) does not
construct "
+ + "a supertype of java.util.ArrayList<java.lang.String>",
e.getMessage() );
+ }
+ }
+
+ @Test
+ public void testResolve()
+ {
+ TypeLiteral<?> typeResolver = TypeLiteral.get( StringIntegerMap.class
);
+ assertEquals( String.class, typeResolver.resolveType( mapK ) );
+
+ typeResolver = new TypeLiteral<Map<String, Integer>>()
+ {
+ };
+ assertEquals( String.class, typeResolver.resolveType( mapK ) );
+ assertEquals( Types.mapOf( String.class, Integer.class ),
typeResolver.getSupertype( Map.class ).getType() );
+
+ typeResolver = new TypeLiteral<BetterMap<String, Integer>>()
+ {
+ };
+ assertEquals( String.class, typeResolver.resolveType( mapK ) );
+
+ typeResolver = new TypeLiteral<BestMap<String, Integer>>()
+ {
+ };
+ assertEquals( String.class, typeResolver.resolveType( mapK ) );
+
+ typeResolver = TypeLiteral.get( StringIntegerHashMap.class );
+ assertEquals( String.class, typeResolver.resolveType( mapK ) );
+ assertEquals( String.class, typeResolver.resolveType( hashMapK ) );
+ assertEquals( entryStringInteger, typeResolver.resolveType( setEntryKV
) );
+ assertEquals( Object.class, typeResolver.getSupertype( Object.class
).getType() );
+ }
+
+ @Test
+ public void testOnObject()
+ {
+ TypeLiteral<?> typeResolver = TypeLiteral.get( Object.class );
+ assertEquals( Object.class, typeResolver.getSupertype( Object.class
).getType() );
+ assertEquals( Object.class, typeResolver.getRawType() );
+
+ // interfaces also resolve Object
+ typeResolver = TypeLiteral.get( Types.setOf( Integer.class ) );
+ assertEquals( Object.class, typeResolver.getSupertype( Object.class
).getType() );
+ }
+
+ interface StringIntegerMap
+ extends Map<String, Integer>
+ {
+ }
+
+ interface BetterMap<K1, V1>
+ extends Map<K1, V1>
+ {
+ }
+
+ interface BestMap<K2, V2>
+ extends BetterMap<K2, V2>
+ {
+ }
+
+ static class StringIntegerHashMap
+ extends HashMap<String, Integer>
+ {
+ }
+
+ @Test
+ public void testGetSupertype()
+ {
+ TypeLiteral<AbstractList<String>> listOfString = new
TypeLiteral<AbstractList<String>>()
+ {
+ };
+ assertEquals( Types.newParameterizedType( AbstractCollection.class,
String.class ),
+ listOfString.getSupertype( AbstractCollection.class
).getType() );
+
+ TypeLiteral arrayListOfE =
+ TypeLiteral.get( newParameterizedType( ArrayList.class,
ArrayList.class.getTypeParameters() ) );
+ assertEquals( newParameterizedType( AbstractCollection.class,
ArrayList.class.getTypeParameters() ),
+ arrayListOfE.getSupertype( AbstractCollection.class
).getType() );
+ }
+
+ @Test
+ public void testGetSupertypeForArraysAsList()
+ {
+ Class<? extends List> arraysAsListClass = Arrays.asList().getClass();
+ Type anotherE = arraysAsListClass.getTypeParameters()[0];
+ TypeLiteral type = TypeLiteral.get( newParameterizedType(
AbstractList.class, anotherE ) );
+ assertEquals( newParameterizedType( AbstractCollection.class, anotherE
),
+ type.getSupertype( AbstractCollection.class ).getType()
);
+ }
+
+ @Test
+ public void testWildcards()
+ throws NoSuchFieldException
+ {
+ TypeLiteral<Parameterized<String>> ofString = new
TypeLiteral<Parameterized<String>>()
+ {
+ };
+
+ assertEquals( new TypeLiteral<List<String>>()
+ {
+ }.getType(), ofString.getFieldType( Parameterized.class.getField( "t"
) ).getType() );
+ assertEquals( new TypeLiteral<List<? extends String>>()
+ {
+ }.getType(), ofString.getFieldType( Parameterized.class.getField(
"extendsT" ) ).getType() );
+ assertEquals( new TypeLiteral<List<? super String>>()
+ {
+ }.getType(), ofString.getFieldType( Parameterized.class.getField(
"superT" ) ).getType() );
+ }
+
+ static class Parameterized<T>
+ {
+ public List<T> t;
+
+ public List<? extends T> extendsT;
+
+ public List<? super T> superT;
+ }
+
+ // TODO(jessewilson): tests for tricky bounded types like <T extends
Collection, Serializable>
+
+ @Test
+ public void testEqualsAndHashCode()
+ throws IOException
+ {
+ TypeLiteral<?> a1 = TypeLiteral.get( arrayListOfString );
+ TypeLiteral<?> a2 = TypeLiteral.get( arrayListOfString );
+ TypeLiteral<?> b = TypeLiteral.get( listOf( String.class ) );
+ assertEqualsBothWays( a1, a2 );
+ assertNotSerializable( a1 );
+ assertFalse( a1.equals( b ) );
+ }
+
+}
Propchange:
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/type/TypeLiteralTypeResolutionTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/type/TypeLiteralTypeResolutionTest.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange:
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/type/TypeLiteralTypeResolutionTest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added:
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/type/TypesTest.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/type/TypesTest.java?rev=1241133&view=auto
==============================================================================
---
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/type/TypesTest.java
(added)
+++
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/type/TypesTest.java
Mon Feb 6 19:56:42 2012
@@ -0,0 +1,277 @@
+package org.apache.commons.beanutils2.type;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import static org.apache.commons.beanutils2.type.Asserts.assertContains;
+import static
org.apache.commons.beanutils2.type.Asserts.assertEqualWhenReserialized;
+import static org.apache.commons.beanutils2.type.Asserts.assertEqualsBothWays;
+import static org.apache.commons.beanutils2.type.Types.subtypeOf;
+import static org.apache.commons.beanutils2.type.Types.supertypeOf;
+
+import java.io.IOException;
+import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.WildcardType;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.apache.commons.beanutils2.type.MoreTypes;
+import org.apache.commons.beanutils2.type.TypeLiteral;
+import org.apache.commons.beanutils2.type.Types;
+
+
+/**
+ * @author [email protected] (Jesse Wilson)
+ */
+public class TypesTest
+{
+
+ // generic types for comparison
+ Map<String, Integer> a;
+
+ Inner<Float, Double> b;
+
+ List<String[][]> c;
+
+ List<String> d;
+
+ Set<String> e;
+
+ Outer<String>.Inner f;
+
+ private ParameterizedType mapStringInteger;
+
+ private ParameterizedType innerFloatDouble;
+
+ private ParameterizedType listStringArray;
+
+ private ParameterizedType listString;
+
+ private ParameterizedType setString;
+
+ private GenericArrayType stringArray;
+
+ private ParameterizedType outerInner;
+
+ @Before
+ public void setUp()
+ throws Exception
+ {
+ mapStringInteger = (ParameterizedType) getClass().getDeclaredField(
"a" ).getGenericType();
+ innerFloatDouble = (ParameterizedType) getClass().getDeclaredField(
"b" ).getGenericType();
+ listStringArray = (ParameterizedType) getClass().getDeclaredField( "c"
).getGenericType();
+ listString = (ParameterizedType) getClass().getDeclaredField( "d"
).getGenericType();
+ setString = (ParameterizedType) getClass().getDeclaredField( "e"
).getGenericType();
+ stringArray = (GenericArrayType)
listStringArray.getActualTypeArguments()[0];
+ outerInner = (ParameterizedType) getClass().getDeclaredField( "f"
).getGenericType();
+ }
+
+ @Test
+ public void testListSetMap()
+ {
+ assertEqualsBothWays( mapStringInteger, Types.mapOf( String.class,
Integer.class ) );
+ assertEqualsBothWays( listString, Types.listOf( String.class ) );
+ assertEqualsBothWays( setString, Types.setOf( String.class ) );
+ }
+
+ @Test
+ public void testDefensiveCopies()
+ {
+ Type[] arguments = new Type[] { String.class, Integer.class };
+ ParameterizedType parameterizedType = Types.newParameterizedType(
Map.class, arguments );
+ arguments[0] = null;
+ assertEquals( String.class,
parameterizedType.getActualTypeArguments()[0] );
+ parameterizedType.getActualTypeArguments()[1] = null;
+ assertEquals( Integer.class,
parameterizedType.getActualTypeArguments()[1] );
+ }
+
+ @Test
+ public void testTypeWithOwnerType()
+ {
+ ParameterizedType actual =
+ Types.newParameterizedTypeWithOwner( TypesTest.class, Inner.class,
Float.class, Double.class );
+ assertEquals( TypesTest.class, actual.getOwnerType() );
+ assertEqualsBothWays( innerFloatDouble, actual );
+ // The JDK prints this out as:
+ //
org.apache.commons.beanutils2.type.TypesTest.org.apache.commons.beanutils2.type.TypesTest$Inner<java.lang.Float,
java.lang.Double>
+ // and we think that's wrong, so the assertEquals comparison is
worthless. :-(
+ // assertEquals(innerFloatDouble.toString(), actual.toString());
+
+ // We think the correct comparison is:
+ assertEquals(
"org.apache.commons.beanutils2.type.TypesTest$Inner<java.lang.Float,
java.lang.Double>", actual.toString() );
+ }
+
+ @Test
+ public void testTypeParametersMustNotBePrimitives()
+ {
+ try
+ {
+ Types.newParameterizedType( Map.class, String.class, int.class );
+ fail();
+ }
+ catch ( IllegalArgumentException expected )
+ {
+ assertContains( expected.getMessage(), "Primitive types are not
allowed in type parameters: int" );
+ }
+ }
+
+ public List<? extends CharSequence> wildcardExtends;
+
+ public List<? super CharSequence> wildcardSuper;
+
+ public List<?> wildcardObject;
+
+ @Test
+ public void testWildcardTypes()
+ throws NoSuchFieldException, IOException
+ {
+ assertEqualsBothWays( getWildcard( "wildcardSuper" ), supertypeOf(
CharSequence.class ) );
+ assertEqualsBothWays( getWildcard( "wildcardExtends" ), subtypeOf(
CharSequence.class ) );
+ assertEqualsBothWays( getWildcard( "wildcardObject" ), subtypeOf(
Object.class ) );
+
+ assertEquals( "? super java.lang.CharSequence", supertypeOf(
CharSequence.class ).toString() );
+ assertEquals( "? extends java.lang.CharSequence", subtypeOf(
CharSequence.class ).toString() );
+ assertEquals( "?", subtypeOf( Object.class ).toString() );
+
+ assertEqualWhenReserialized( supertypeOf( CharSequence.class ) );
+ assertEqualWhenReserialized( subtypeOf( CharSequence.class ) );
+ }
+
+ @Test
+ public void testWildcardBoundsMustNotBePrimitives()
+ {
+ try
+ {
+ supertypeOf( int.class );
+ fail();
+ }
+ catch ( IllegalArgumentException expected )
+ {
+ assertContains( expected.getMessage(), "Primitive types are not
allowed in wildcard bounds: int" );
+ }
+
+ try
+ {
+ subtypeOf( int.class );
+ fail();
+ }
+ catch ( IllegalArgumentException expected )
+ {
+ assertContains( expected.getMessage(), "Primitive types are not
allowed in wildcard bounds: int" );
+ }
+ }
+
+ private WildcardType getWildcard( String fieldName )
+ throws NoSuchFieldException
+ {
+ ParameterizedType type = (ParameterizedType) getClass().getField(
fieldName ).getGenericType();
+ return (WildcardType) type.getActualTypeArguments()[0];
+ }
+
+ @Test
+ public void testEqualsAndHashcode()
+ {
+ ParameterizedType parameterizedType = Types.newParameterizedType(
Map.class, String.class, Integer.class );
+ assertEqualsBothWays( mapStringInteger, parameterizedType );
+ assertEquals( mapStringInteger.toString(),
parameterizedType.toString() );
+
+ GenericArrayType genericArrayType = Types.arrayOf( Types.arrayOf(
String.class ) );
+ assertEqualsBothWays( stringArray, genericArrayType );
+ assertEquals( stringArray.toString(), genericArrayType.toString() );
+ }
+
+ @Test
+ public void testToString()
+ {
+ Assert.assertEquals( "java.lang.String", MoreTypes.typeToString(
String.class ) );
+ assertEquals( "java.lang.String[][]", MoreTypes.typeToString(
stringArray ) );
+ assertEquals( "java.util.Map<java.lang.String, java.lang.Integer>",
MoreTypes.typeToString( mapStringInteger ) );
+ assertEquals( "java.util.List<java.lang.String[][]>",
MoreTypes.typeToString( listStringArray ) );
+ assertEquals( innerFloatDouble.toString(), MoreTypes.typeToString(
innerFloatDouble ) );
+ }
+
+ static class Owning<A>
+ {
+ }
+
+ /**
+ * Ensure that owning types are required when necessary, and forbidden
otherwise.
+ */
+ @Test
+ public void testCanonicalizeRequiresOwnerTypes()
+ throws NoSuchFieldException
+ {
+ try
+ {
+ Types.newParameterizedType( Owning.class, String.class );
+ fail();
+ }
+ catch ( IllegalArgumentException expected )
+ {
+ assertContains( expected.getMessage(), "No owner type for enclosed
" + Owning.class );
+ }
+
+ try
+ {
+ Types.newParameterizedTypeWithOwner( Object.class, Set.class,
String.class );
+ }
+ catch ( IllegalArgumentException expected )
+ {
+ assertContains( expected.getMessage(), "Owner type for unenclosed
" + Set.class );
+ }
+ }
+
+ @SuppressWarnings( "UnusedDeclaration" )
+ class Inner<T1, T2>
+ {
+ }
+
+ @Test
+ public void testInnerParameterizedEvenWithZeroArgs()
+ {
+ TypeLiteral<Outer<String>.Inner> type = new
TypeLiteral<Outer<String>.Inner>()
+ {
+ };
+ assertEqualsBothWays( outerInner, type.getType() );
+
+ ParameterizedType parameterizedType = (ParameterizedType)
type.getType();
+ assertEquals( 0, parameterizedType.getActualTypeArguments().length );
+ assertEquals( new TypeLiteral<Outer<String>>()
+ {
+ }.getType(), parameterizedType.getOwnerType() );
+ assertEquals( Outer.Inner.class, parameterizedType.getRawType() );
+ }
+
+ static class Outer<T>
+ {
+ class Inner
+ {
+ }
+ }
+
+}
Propchange:
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/type/TypesTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/type/TypesTest.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange:
commons/sandbox/beanutils2/trunk/src/test/java/org/apache/commons/beanutils2/type/TypesTest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain