diff options
Diffstat (limited to 'javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/ReferenceTypeTest.java')
-rw-r--r-- | javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/ReferenceTypeTest.java | 600 |
1 files changed, 600 insertions, 0 deletions
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/ReferenceTypeTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/ReferenceTypeTest.java new file mode 100644 index 000000000..3f4b318a7 --- /dev/null +++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/ReferenceTypeTest.java @@ -0,0 +1,600 @@ +/* + * Copyright 2016 Federico Tomassetti + * + * 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 com.github.javaparser.symbolsolver.model.typesystem; + +import com.github.javaparser.resolution.declarations.ResolvedClassDeclaration; +import com.github.javaparser.resolution.declarations.ResolvedInterfaceDeclaration; +import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration; +import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration; +import com.github.javaparser.resolution.types.*; +import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; +import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration; +import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionInterfaceDeclaration; +import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver; +import com.google.common.collect.ImmutableList; +import org.junit.Before; +import org.junit.Test; + +import java.io.Serializable; +import java.util.*; +import java.util.stream.Stream; + +import static org.junit.Assert.*; + +public class ReferenceTypeTest { + + private ReferenceTypeImpl listOfA; + private ReferenceTypeImpl listOfStrings; + private ReferenceTypeImpl linkedListOfString; + private ReferenceTypeImpl collectionOfString; + private ReferenceTypeImpl listOfWildcardExtendsString; + private ReferenceTypeImpl listOfWildcardSuperString; + private ReferenceTypeImpl object; + private ReferenceTypeImpl string; + private TypeSolver typeSolver; + + @Before + public void setup() { + typeSolver = new ReflectionTypeSolver(); + object = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver); + string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver); + listOfA = new ReferenceTypeImpl( + new ReflectionInterfaceDeclaration(List.class, typeSolver), + ImmutableList.of(new ResolvedTypeVariable(ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList()))), typeSolver); + listOfStrings = new ReferenceTypeImpl( + new ReflectionInterfaceDeclaration(List.class, typeSolver), + ImmutableList.of(new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver)), typeSolver); + linkedListOfString = new ReferenceTypeImpl( + new ReflectionClassDeclaration(LinkedList.class, typeSolver), + ImmutableList.of(new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver)), typeSolver); + collectionOfString = new ReferenceTypeImpl( + new ReflectionInterfaceDeclaration(Collection.class, typeSolver), + ImmutableList.of(new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver)), typeSolver); + listOfWildcardExtendsString = new ReferenceTypeImpl( + new ReflectionInterfaceDeclaration(List.class, typeSolver), + ImmutableList.of(ResolvedWildcard.extendsBound(string)), typeSolver); + listOfWildcardSuperString = new ReferenceTypeImpl( + new ReflectionInterfaceDeclaration(List.class, typeSolver), + ImmutableList.of(ResolvedWildcard.superBound(string)), typeSolver); + } + + @Test + public void testDerivationOfTypeParameters() { + ReflectionTypeSolver typeSolver = new ReflectionTypeSolver(); + ReferenceTypeImpl ref1 = new ReferenceTypeImpl(typeSolver.solveType(LinkedList.class.getCanonicalName()), typeSolver); + assertEquals(1, ref1.typeParametersValues().size()); + assertEquals(true, ref1.typeParametersValues().get(0).isTypeVariable()); + assertEquals("E", ref1.typeParametersValues().get(0).asTypeParameter().getName()); + } + + @Test + public void testIsArray() { + assertEquals(false, object.isArray()); + assertEquals(false, string.isArray()); + assertEquals(false, listOfA.isArray()); + assertEquals(false, listOfStrings.isArray()); + } + + @Test + public void testIsPrimitive() { + assertEquals(false, object.isPrimitive()); + assertEquals(false, string.isPrimitive()); + assertEquals(false, listOfA.isPrimitive()); + assertEquals(false, listOfStrings.isPrimitive()); + } + + @Test + public void testIsNull() { + assertEquals(false, object.isNull()); + assertEquals(false, string.isNull()); + assertEquals(false, listOfA.isNull()); + assertEquals(false, listOfStrings.isNull()); + } + + @Test + public void testIsReference() { + assertEquals(true, object.isReference()); + assertEquals(true, string.isReference()); + assertEquals(true, listOfA.isReference()); + assertEquals(true, listOfStrings.isReference()); + } + + @Test + public void testIsReferenceType() { + assertEquals(true, object.isReferenceType()); + assertEquals(true, string.isReferenceType()); + assertEquals(true, listOfA.isReferenceType()); + assertEquals(true, listOfStrings.isReferenceType()); + } + + @Test + public void testIsVoid() { + assertEquals(false, object.isVoid()); + assertEquals(false, string.isVoid()); + assertEquals(false, listOfA.isVoid()); + assertEquals(false, listOfStrings.isVoid()); + } + + @Test + public void testIsTypeVariable() { + assertEquals(false, object.isTypeVariable()); + assertEquals(false, string.isTypeVariable()); + assertEquals(false, listOfA.isTypeVariable()); + assertEquals(false, listOfStrings.isTypeVariable()); + } + + @Test + public void testAsReferenceTypeUsage() { + assertTrue(object == object.asReferenceType()); + assertTrue(string == string.asReferenceType()); + assertTrue(listOfA == listOfA.asReferenceType()); + assertTrue(listOfStrings == listOfStrings.asReferenceType()); + } + + @Test(expected = UnsupportedOperationException.class) + public void testAsTypeParameter() { + object.asTypeParameter(); + } + + @Test(expected = UnsupportedOperationException.class) + public void testAsArrayTypeUsage() { + object.asArrayType(); + } + + @Test + public void testAsDescribe() { + assertEquals("java.lang.Object", object.describe()); + assertEquals("java.lang.String", string.describe()); + assertEquals("java.util.List<A>", listOfA.describe()); + assertEquals("java.util.List<java.lang.String>", listOfStrings.describe()); + } + + @Test + public void testReplaceParam() { + ResolvedTypeParameterDeclaration tpA = ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList()); + assertTrue(object == object.replaceTypeVariables(tpA, object)); + assertTrue(string == string.replaceTypeVariables(tpA, object)); + assertEquals(listOfStrings, listOfStrings.replaceTypeVariables(tpA, object)); + assertEquals(listOfStrings, listOfA.replaceTypeVariables(tpA, string)); + } + + @Test + public void testIsAssignableBySimple() { + assertEquals(true, object.isAssignableBy(string)); + assertEquals(false, string.isAssignableBy(object)); + assertEquals(false, listOfStrings.isAssignableBy(listOfA)); + assertEquals(false, listOfA.isAssignableBy(listOfStrings)); + + assertEquals(false, object.isAssignableBy(ResolvedVoidType.INSTANCE)); + assertEquals(false, string.isAssignableBy(ResolvedVoidType.INSTANCE)); + assertEquals(false, listOfStrings.isAssignableBy(ResolvedVoidType.INSTANCE)); + assertEquals(false, listOfA.isAssignableBy(ResolvedVoidType.INSTANCE)); + + assertEquals(true, object.isAssignableBy(NullType.INSTANCE)); + assertEquals(true, string.isAssignableBy(NullType.INSTANCE)); + assertEquals(true, listOfStrings.isAssignableBy(NullType.INSTANCE)); + assertEquals(true, listOfA.isAssignableBy(NullType.INSTANCE)); + } + + @Test + public void testIsAssignableByBoxedPrimitive(){ + ResolvedReferenceType numberType = new ReferenceTypeImpl(new ReflectionClassDeclaration(Number.class, typeSolver),typeSolver); + ResolvedReferenceType intType = new ReferenceTypeImpl(new ReflectionClassDeclaration(Integer.class, typeSolver),typeSolver); + ResolvedReferenceType doubleType = new ReferenceTypeImpl(new ReflectionClassDeclaration(Double.class, typeSolver),typeSolver); + + assertEquals(true, numberType.isAssignableBy(ResolvedPrimitiveType.INT)); + assertEquals(true, numberType.isAssignableBy(ResolvedPrimitiveType.DOUBLE)); + assertEquals(true, numberType.isAssignableBy(ResolvedPrimitiveType.SHORT)); + assertEquals(true, numberType.isAssignableBy(ResolvedPrimitiveType.LONG)); + assertEquals(true, numberType.isAssignableBy(ResolvedPrimitiveType.FLOAT)); + assertEquals(false, numberType.isAssignableBy(ResolvedPrimitiveType.BOOLEAN)); + assertEquals(true, intType.isAssignableBy(ResolvedPrimitiveType.INT)); + assertEquals(true, doubleType.isAssignableBy(ResolvedPrimitiveType.DOUBLE)); + } + + @Test + public void testIsAssignableByGenerics() { + assertEquals(false, listOfStrings.isAssignableBy(listOfWildcardExtendsString)); + assertEquals(false, listOfStrings.isAssignableBy(listOfWildcardExtendsString)); + assertEquals(true, listOfWildcardExtendsString.isAssignableBy(listOfStrings)); + assertEquals(false, listOfWildcardExtendsString.isAssignableBy(listOfWildcardSuperString)); + assertEquals(true, listOfWildcardSuperString.isAssignableBy(listOfStrings)); + assertEquals(false, listOfWildcardSuperString.isAssignableBy(listOfWildcardExtendsString)); + } + + @Test + public void testIsAssignableByGenericsInheritance() { + assertEquals(true, collectionOfString.isAssignableBy(collectionOfString)); + assertEquals(true, collectionOfString.isAssignableBy(listOfStrings)); + assertEquals(true, collectionOfString.isAssignableBy(linkedListOfString)); + + assertEquals(false, listOfStrings.isAssignableBy(collectionOfString)); + assertEquals(true, listOfStrings.isAssignableBy(listOfStrings)); + assertEquals(true, listOfStrings.isAssignableBy(linkedListOfString)); + + assertEquals(false, linkedListOfString.isAssignableBy(collectionOfString)); + assertEquals(false, linkedListOfString.isAssignableBy(listOfStrings)); + assertEquals(true, linkedListOfString.isAssignableBy(linkedListOfString)); + } + + @Test + public void testGetAllAncestorsConsideringTypeParameters() { + assertTrue(linkedListOfString.getAllAncestors().contains(object)); + assertTrue(linkedListOfString.getAllAncestors().contains(listOfStrings)); + assertTrue(linkedListOfString.getAllAncestors().contains(collectionOfString)); + assertFalse(linkedListOfString.getAllAncestors().contains(listOfA)); + } + + class Foo { + + } + + class Bar extends Foo { + + } + + class Bazzer<A, B, C> { + + } + + class MoreBazzing<A, B> extends Bazzer<B, String, A> { + + } + + @Test + public void testGetAllAncestorsConsideringGenericsCases() { + ReferenceTypeImpl foo = new ReferenceTypeImpl(new ReflectionClassDeclaration(Foo.class, typeSolver), typeSolver); + ReferenceTypeImpl bar = new ReferenceTypeImpl(new ReflectionClassDeclaration(Bar.class, typeSolver), typeSolver); + ReferenceTypeImpl left, right; + + //YES MoreBazzing<Foo, Bar> e1 = new MoreBazzing<Foo, Bar>(); + assertEquals(true, + new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(foo, bar), typeSolver) + .isAssignableBy(new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(foo, bar), typeSolver)) + ); + + //YES MoreBazzing<? extends Foo, Bar> e2 = new MoreBazzing<Foo, Bar>(); + assertEquals(true, + new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(ResolvedWildcard.extendsBound(foo), bar), typeSolver) + .isAssignableBy(new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(foo, bar), typeSolver)) + ); + + //YES MoreBazzing<Foo, ? extends Bar> e3 = new MoreBazzing<Foo, Bar>(); + assertEquals(true, + new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(foo, ResolvedWildcard.extendsBound(bar)), typeSolver) + .isAssignableBy(new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(foo, bar), typeSolver)) + ); + + //YES MoreBazzing<? extends Foo, ? extends Foo> e4 = new MoreBazzing<Foo, Bar>(); + assertEquals(true, + new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(ResolvedWildcard.extendsBound(foo), ResolvedWildcard.extendsBound(foo)), typeSolver) + .isAssignableBy(new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(foo, bar), typeSolver)) + ); + + //YES MoreBazzing<? extends Foo, ? extends Foo> e5 = new MoreBazzing<Bar, Bar>(); + left = new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(ResolvedWildcard.extendsBound(foo), ResolvedWildcard.extendsBound(foo)), typeSolver); + right = new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(bar, bar), typeSolver); + assertEquals(true, left.isAssignableBy(right)); + + //YES Bazzer<Object, String, String> e6 = new MoreBazzing<String, Object>(); + left = new ReferenceTypeImpl( + new ReflectionClassDeclaration(Bazzer.class, typeSolver), + ImmutableList.of(object, string, string), typeSolver); + right = new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(string, object), typeSolver); + + // To debug the following + List<ResolvedReferenceType> ancestors = right.getAllAncestors(); + ResolvedReferenceType moreBazzingAncestor = ancestors.stream().filter(a -> a.getQualifiedName().endsWith("Bazzer")).findFirst().get(); + + assertEquals(true, left.isAssignableBy(right)); + + //YES Bazzer<String,String,String> e7 = new MoreBazzing<String, String>(); + assertEquals(true, + new ReferenceTypeImpl( + new ReflectionClassDeclaration(Bazzer.class, typeSolver), + ImmutableList.of(string, string, string), typeSolver) + .isAssignableBy(new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(string, string), typeSolver)) + ); + + //YES Bazzer<Bar,String,Foo> e8 = new MoreBazzing<Foo, Bar>(); + assertEquals(true, + new ReferenceTypeImpl( + new ReflectionClassDeclaration(Bazzer.class, typeSolver), + ImmutableList.of(bar, string, foo), typeSolver) + .isAssignableBy(new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(foo, bar), typeSolver)) + ); + + //YES Bazzer<Foo,String,Bar> e9 = new MoreBazzing<Bar, Foo>(); + assertEquals(true, + new ReferenceTypeImpl( + new ReflectionClassDeclaration(Bazzer.class, typeSolver), + ImmutableList.of(foo, string, bar), typeSolver) + .isAssignableBy(new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(bar, foo), typeSolver)) + ); + + //NO Bazzer<Bar,String,Foo> n1 = new MoreBazzing<Bar, Foo>(); + assertEquals(false, + new ReferenceTypeImpl( + new ReflectionClassDeclaration(Bazzer.class, typeSolver), + ImmutableList.of(bar, string, foo), typeSolver) + .isAssignableBy(new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(bar, foo), typeSolver)) + ); + + //NO Bazzer<Bar,String,Bar> n2 = new MoreBazzing<Bar, Foo>(); + assertEquals(false, + new ReferenceTypeImpl( + new ReflectionClassDeclaration(Bazzer.class, typeSolver), + ImmutableList.of(bar, string, foo), typeSolver) + .isAssignableBy(new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(bar, foo), typeSolver)) + ); + + //NO Bazzer<Foo,Object,Bar> n3 = new MoreBazzing<Bar, Foo>(); + assertEquals(false, + new ReferenceTypeImpl( + new ReflectionClassDeclaration(Bazzer.class, typeSolver), + ImmutableList.of(foo, object, bar), typeSolver) + .isAssignableBy(new ReferenceTypeImpl( + new ReflectionClassDeclaration(MoreBazzing.class, typeSolver), + ImmutableList.of(bar, foo), typeSolver)) + ); + } + + @Test + public void charSequenceIsAssignableToObject() { + TypeSolver typeSolver = new ReflectionTypeSolver(); + ReferenceTypeImpl charSequence = new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(CharSequence.class, typeSolver), typeSolver); + ReferenceTypeImpl object = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver); + assertEquals(false, charSequence.isAssignableBy(object)); + assertEquals(true, object.isAssignableBy(charSequence)); + } + + @Test + public void testGetFieldTypeExisting() { + class Foo<A> { + List<A> elements; + } + + TypeSolver typeSolver = new ReflectionTypeSolver(); + ReferenceTypeImpl ref = new ReferenceTypeImpl(new ReflectionClassDeclaration(Foo.class, typeSolver), typeSolver); + + assertEquals(true, ref.getFieldType("elements").isPresent()); + assertEquals(true, ref.getFieldType("elements").get().isReferenceType()); + assertEquals(List.class.getCanonicalName(), ref.getFieldType("elements").get().asReferenceType().getQualifiedName()); + assertEquals(1, ref.getFieldType("elements").get().asReferenceType().typeParametersValues().size()); + assertEquals(true, ref.getFieldType("elements").get().asReferenceType().typeParametersValues().get(0).isTypeVariable()); + assertEquals("A", ref.getFieldType("elements").get().asReferenceType().typeParametersValues().get(0).asTypeParameter().getName()); + + ref = new ReferenceTypeImpl(new ReflectionClassDeclaration(Foo.class, typeSolver), + ImmutableList.of(new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver)), + typeSolver); + + assertEquals(true, ref.getFieldType("elements").isPresent()); + assertEquals(true, ref.getFieldType("elements").get().isReferenceType()); + assertEquals(List.class.getCanonicalName(), ref.getFieldType("elements").get().asReferenceType().getQualifiedName()); + assertEquals(1, ref.getFieldType("elements").get().asReferenceType().typeParametersValues().size()); + assertEquals(true, ref.getFieldType("elements").get().asReferenceType().typeParametersValues().get(0).isReferenceType()); + assertEquals(String.class.getCanonicalName(), ref.getFieldType("elements").get().asReferenceType().typeParametersValues().get(0).asReferenceType().getQualifiedName()); + } + + @Test + public void testGetFieldTypeUnexisting() { + class Foo<A> { + List<A> elements; + } + + TypeSolver typeSolver = new ReflectionTypeSolver(); + ReferenceTypeImpl ref = new ReferenceTypeImpl(new ReflectionClassDeclaration(Foo.class, typeSolver), typeSolver); + + assertEquals(false, ref.getFieldType("bar").isPresent()); + + ref = new ReferenceTypeImpl(new ReflectionClassDeclaration(Foo.class, typeSolver), + ImmutableList.of(new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver)), + typeSolver); + + assertEquals(false, ref.getFieldType("bar").isPresent()); + } + + @Test + public void testTypeParamValue() { + TypeSolver typeResolver = new ReflectionTypeSolver(); + ResolvedClassDeclaration arraylist = new ReflectionClassDeclaration(ArrayList.class, typeResolver); + ResolvedClassDeclaration abstractList = new ReflectionClassDeclaration(AbstractList.class, typeResolver); + ResolvedClassDeclaration abstractCollection = new ReflectionClassDeclaration(AbstractCollection.class, typeResolver); + ResolvedInterfaceDeclaration list = new ReflectionInterfaceDeclaration(List.class, typeResolver); + ResolvedInterfaceDeclaration collection = new ReflectionInterfaceDeclaration(Collection.class, typeResolver); + ResolvedInterfaceDeclaration iterable = new ReflectionInterfaceDeclaration(Iterable.class, typeResolver); + ResolvedType string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver); + ResolvedReferenceType arrayListOfString = new ReferenceTypeImpl(arraylist, ImmutableList.of(string), typeResolver); + assertEquals(Optional.of(string), arrayListOfString.typeParamValue(arraylist.getTypeParameters().get(0))); + assertEquals(Optional.of(string), arrayListOfString.typeParamValue(abstractList.getTypeParameters().get(0))); + assertEquals(Optional.of(string), arrayListOfString.typeParamValue(abstractCollection.getTypeParameters().get(0))); + assertEquals(Optional.of(string), arrayListOfString.typeParamValue(list.getTypeParameters().get(0))); + assertEquals(Optional.of(string), arrayListOfString.typeParamValue(collection.getTypeParameters().get(0))); + assertEquals(Optional.of(string), arrayListOfString.typeParamValue(iterable.getTypeParameters().get(0))); + } + + @Test + public void testGetAllAncestorsOnRawType() { + TypeSolver typeResolver = new ReflectionTypeSolver(); + ResolvedClassDeclaration arraylist = new ReflectionClassDeclaration(ArrayList.class, typeResolver); + ResolvedReferenceType rawArrayList = new ReferenceTypeImpl(arraylist, typeResolver); + + Map<String, ResolvedReferenceType> ancestors = new HashMap<>(); + rawArrayList.getAllAncestors().forEach(a -> ancestors.put(a.getQualifiedName(), a)); + assertEquals(9, ancestors.size()); + + ResolvedTypeVariable tv = new ResolvedTypeVariable(arraylist.getTypeParameters().get(0)); + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(RandomAccess.class, typeResolver), typeResolver), ancestors.get("java.util.RandomAccess")); + assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(AbstractCollection.class, typeResolver), ImmutableList.of(tv), typeResolver), ancestors.get("java.util.AbstractCollection")); + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(List.class, typeResolver), ImmutableList.of(tv), typeResolver), ancestors.get("java.util.List")); + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Cloneable.class, typeResolver), typeResolver), ancestors.get("java.lang.Cloneable")); + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Collection.class, typeResolver), ImmutableList.of(tv), typeResolver), ancestors.get("java.util.Collection")); + assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(AbstractList.class, typeResolver), ImmutableList.of(tv), typeResolver), ancestors.get("java.util.AbstractList")); + assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeResolver), typeResolver), ancestors.get("java.lang.Object")); + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Iterable.class, typeResolver), ImmutableList.of(tv), typeResolver), ancestors.get("java.lang.Iterable")); + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Serializable.class, typeResolver), typeResolver), ancestors.get("java.io.Serializable")); + } + + @Test + public void testGetAllAncestorsOnTypeWithSpecifiedTypeParametersForInterface() { + TypeSolver typeResolver = new ReflectionTypeSolver(); + ResolvedInterfaceDeclaration list = new ReflectionInterfaceDeclaration(List.class, typeResolver); + ResolvedType string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver); + ResolvedReferenceType listOfString = new ReferenceTypeImpl(list, ImmutableList.of(string), typeResolver); + + Map<String, ResolvedReferenceType> ancestors = new HashMap<>(); + listOfString.getAllAncestors().forEach(a -> ancestors.put(a.getQualifiedName(), a)); + assertEquals(3, ancestors.size()); + + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Collection.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.Collection")); + assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeResolver), typeResolver), ancestors.get("java.lang.Object")); + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Iterable.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.lang.Iterable")); + } + + @Test + public void testGetAllAncestorsOnTypeWithSpecifiedTypeParametersForClassAbstractCollection() { + TypeSolver typeResolver = new ReflectionTypeSolver(); + ResolvedClassDeclaration abstractCollection = new ReflectionClassDeclaration(AbstractCollection.class, typeResolver); + ResolvedType string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver); + ResolvedReferenceType abstractCollectionOfString = new ReferenceTypeImpl(abstractCollection, ImmutableList.of(string), typeResolver); + + Map<String, ResolvedReferenceType> ancestors = new HashMap<>(); + abstractCollectionOfString.getAllAncestors().forEach(a -> ancestors.put(a.getQualifiedName(), a)); + assertEquals(3, ancestors.size()); + + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Collection.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.Collection")); + assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeResolver), typeResolver), ancestors.get("java.lang.Object")); + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Iterable.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.lang.Iterable")); + } + + @Test + public void testGetAllAncestorsOnTypeWithSpecifiedTypeParametersForClassAbstractList() { + TypeSolver typeResolver = new ReflectionTypeSolver(); + ResolvedClassDeclaration abstractList = new ReflectionClassDeclaration(AbstractList.class, typeResolver); + ResolvedType string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver); + ResolvedReferenceType abstractListOfString = new ReferenceTypeImpl(abstractList, ImmutableList.of(string), typeResolver); + + Map<String, ResolvedReferenceType> ancestors = new HashMap<>(); + abstractListOfString.getAllAncestors().forEach(a -> ancestors.put(a.getQualifiedName(), a)); + assertEquals(5, ancestors.size()); + + assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(AbstractCollection.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.AbstractCollection")); + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(List.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.List")); + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Collection.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.Collection")); + assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeResolver), typeResolver), ancestors.get("java.lang.Object")); + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Iterable.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.lang.Iterable")); + } + + @Test + public void testGetAllAncestorsOnTypeWithSpecifiedTypeParametersForClassArrayList() { + TypeSolver typeResolver = new ReflectionTypeSolver(); + ResolvedClassDeclaration arraylist = new ReflectionClassDeclaration(ArrayList.class, typeResolver); + ResolvedType string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver); + ResolvedReferenceType arrayListOfString = new ReferenceTypeImpl(arraylist, ImmutableList.of(string), typeResolver); + + Map<String, ResolvedReferenceType> ancestors = new HashMap<>(); + arrayListOfString.getAllAncestors().forEach(a -> ancestors.put(a.getQualifiedName(), a)); + assertEquals(9, ancestors.size()); + + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(RandomAccess.class, typeResolver), typeResolver), ancestors.get("java.util.RandomAccess")); + assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(AbstractCollection.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.AbstractCollection")); + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(List.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.List")); + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Cloneable.class, typeResolver), typeResolver), ancestors.get("java.lang.Cloneable")); + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Collection.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.Collection")); + assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(AbstractList.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.AbstractList")); + assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeResolver), typeResolver), ancestors.get("java.lang.Object")); + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Iterable.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.lang.Iterable")); + assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Serializable.class, typeResolver), typeResolver), ancestors.get("java.io.Serializable")); + } + + @Test + public void testTypeParametersValues() { + TypeSolver typeResolver = new ReflectionTypeSolver(); + ResolvedReferenceType stream = new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Stream.class, typeResolver), typeResolver); + assertEquals(1, stream.typeParametersValues().size()); + assertEquals(new ResolvedTypeVariable(new ReflectionInterfaceDeclaration(Stream.class, typeResolver).getTypeParameters().get(0)), stream.typeParametersValues().get(0)); + } + + @Test + public void testReplaceTypeVariables() { + TypeSolver typeResolver = new ReflectionTypeSolver(); + ResolvedInterfaceDeclaration streamInterface = new ReflectionInterfaceDeclaration(Stream.class, typeResolver); + ResolvedReferenceType stream = new ReferenceTypeImpl(streamInterface, typeResolver); + + ResolvedMethodDeclaration streamMap = streamInterface.getDeclaredMethods().stream().filter(m -> m.getName().equals("map")).findFirst().get(); + ResolvedTypeParameterDeclaration streamMapR = streamMap.findTypeParameter("T").get(); + ResolvedTypeVariable typeVariable = new ResolvedTypeVariable(streamMapR); + stream = stream.deriveTypeParameters(stream.typeParametersMap().toBuilder().setValue(stream.getTypeDeclaration().getTypeParameters().get(0), typeVariable).build()); + + ResolvedTypeParameterDeclaration tpToReplace = streamInterface.getTypeParameters().get(0); + ResolvedType replaced = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver); + + ResolvedType streamReplaced = stream.replaceTypeVariables(tpToReplace, replaced); + assertEquals("java.util.stream.Stream<java.lang.String>", streamReplaced.describe()); + } + + @Test + public void testReplaceTypeVariablesWithLambdaInBetween() { + TypeSolver typeResolver = new ReflectionTypeSolver(); + ResolvedInterfaceDeclaration streamInterface = new ReflectionInterfaceDeclaration(Stream.class, typeResolver); + ResolvedReferenceType stream = new ReferenceTypeImpl(streamInterface, typeResolver); + + ResolvedMethodDeclaration streamMap = streamInterface.getDeclaredMethods().stream().filter(m -> m.getName().equals("map")).findFirst().get(); + ResolvedTypeParameterDeclaration streamMapR = streamMap.findTypeParameter("T").get(); + ResolvedTypeVariable typeVariable = new ResolvedTypeVariable(streamMapR); + stream = stream.deriveTypeParameters(stream.typeParametersMap().toBuilder().setValue(stream.getTypeDeclaration().getTypeParameters().get(0), typeVariable).build()); + + ResolvedTypeParameterDeclaration tpToReplace = streamInterface.getTypeParameters().get(0); + ResolvedType replaced = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver); + + ResolvedType streamReplaced = stream.replaceTypeVariables(tpToReplace, replaced); + assertEquals("java.util.stream.Stream<java.lang.String>", streamReplaced.describe()); + } + +} |