aboutsummaryrefslogtreecommitdiff
path: root/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/WildcardUsageTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/WildcardUsageTest.java')
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/WildcardUsageTest.java422
1 files changed, 422 insertions, 0 deletions
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/WildcardUsageTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/WildcardUsageTest.java
new file mode 100644
index 000000000..705805dd9
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/WildcardUsageTest.java
@@ -0,0 +1,422 @@
+/*
+ * 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.ResolvedTypeParameterDeclaration;
+import com.github.javaparser.resolution.types.ResolvedTypeVariable;
+import com.github.javaparser.resolution.types.ResolvedWildcard;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Collections;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class WildcardUsageTest {
+
+ class Foo {
+ }
+
+ class Bar extends Foo {
+ }
+
+ private TypeSolver typeSolver;
+ private ReferenceTypeImpl foo;
+ private ReferenceTypeImpl bar;
+ private ReferenceTypeImpl object;
+ private ReferenceTypeImpl string;
+ private ResolvedWildcard unbounded = ResolvedWildcard.UNBOUNDED;
+ private ResolvedWildcard superFoo;
+ private ResolvedWildcard superBar;
+ private ResolvedWildcard extendsFoo;
+ private ResolvedWildcard extendsBar;
+ private ResolvedWildcard superA;
+ private ResolvedWildcard extendsA;
+ private ResolvedWildcard superString;
+ private ResolvedWildcard extendsString;
+ private ResolvedTypeVariable a;
+
+ @Before
+ public void setup() {
+ typeSolver = new ReflectionTypeSolver();
+ foo = new ReferenceTypeImpl(new ReflectionClassDeclaration(Foo.class, typeSolver), typeSolver);
+ bar = new ReferenceTypeImpl(new ReflectionClassDeclaration(Bar.class, typeSolver), typeSolver);
+ object = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
+ string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver);
+ superFoo = ResolvedWildcard.superBound(foo);
+ superBar = ResolvedWildcard.superBound(bar);
+ extendsFoo = ResolvedWildcard.extendsBound(foo);
+ extendsBar = ResolvedWildcard.extendsBound(bar);
+ a = new ResolvedTypeVariable(ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList()));
+ superA = ResolvedWildcard.superBound(a);
+ extendsA = ResolvedWildcard.extendsBound(a);
+ superString = ResolvedWildcard.superBound(string);
+ extendsString = ResolvedWildcard.extendsBound(string);
+ }
+
+ @Test
+ public void testIsArray() {
+ assertEquals(false, unbounded.isArray());
+ assertEquals(false, superFoo.isArray());
+ assertEquals(false, superBar.isArray());
+ assertEquals(false, extendsFoo.isArray());
+ assertEquals(false, extendsBar.isArray());
+ }
+
+ @Test
+ public void testIsPrimitive() {
+ assertEquals(false, unbounded.isPrimitive());
+ assertEquals(false, superFoo.isPrimitive());
+ assertEquals(false, superBar.isPrimitive());
+ assertEquals(false, extendsFoo.isPrimitive());
+ assertEquals(false, extendsBar.isPrimitive());
+ }
+
+ @Test
+ public void testIsNull() {
+ assertEquals(false, unbounded.isNull());
+ assertEquals(false, superFoo.isNull());
+ assertEquals(false, superBar.isNull());
+ assertEquals(false, extendsFoo.isNull());
+ assertEquals(false, extendsBar.isNull());
+ }
+
+ @Test
+ public void testIsReference() {
+ assertEquals(true, unbounded.isReference());
+ assertEquals(true, superFoo.isReference());
+ assertEquals(true, superBar.isReference());
+ assertEquals(true, extendsFoo.isReference());
+ assertEquals(true, extendsBar.isReference());
+ }
+
+ @Test
+ public void testIsReferenceType() {
+ assertEquals(false, unbounded.isReferenceType());
+ assertEquals(false, superFoo.isReferenceType());
+ assertEquals(false, superBar.isReferenceType());
+ assertEquals(false, extendsFoo.isReferenceType());
+ assertEquals(false, extendsBar.isReferenceType());
+ }
+
+ @Test
+ public void testIsVoid() {
+ assertEquals(false, unbounded.isVoid());
+ assertEquals(false, superFoo.isVoid());
+ assertEquals(false, superBar.isVoid());
+ assertEquals(false, extendsFoo.isVoid());
+ assertEquals(false, extendsBar.isVoid());
+ }
+
+ @Test
+ public void testIsTypeVariable() {
+ assertEquals(false, unbounded.isTypeVariable());
+ assertEquals(false, superFoo.isTypeVariable());
+ assertEquals(false, superBar.isTypeVariable());
+ assertEquals(false, extendsFoo.isTypeVariable());
+ assertEquals(false, extendsBar.isTypeVariable());
+ }
+
+ @Test
+ public void testIsWildcard() {
+ assertEquals(true, unbounded.isWildcard());
+ assertEquals(true, superFoo.isWildcard());
+ assertEquals(true, superBar.isWildcard());
+ assertEquals(true, extendsFoo.isWildcard());
+ assertEquals(true, extendsBar.isWildcard());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsArrayTypeUsage() {
+ unbounded.asArrayType();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsReferenceTypeUsage() {
+ unbounded.asReferenceType();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsTypeParameter() {
+ unbounded.asTypeParameter();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsPrimitive() {
+ unbounded.asPrimitive();
+ }
+
+ @Test
+ public void testAsWildcard() {
+ assertTrue(unbounded == unbounded.asWildcard());
+ assertTrue(superFoo == superFoo.asWildcard());
+ assertTrue(superBar == superBar.asWildcard());
+ assertTrue(extendsFoo == extendsFoo.asWildcard());
+ assertTrue(extendsBar == extendsBar.asWildcard());
+ }
+
+ @Test
+ public void testAsDescribe() {
+ assertEquals("?", unbounded.describe());
+ assertEquals("? super com.github.javaparser.symbolsolver.model.typesystem.WildcardUsageTest.Foo", superFoo.describe());
+ assertEquals("? super com.github.javaparser.symbolsolver.model.typesystem.WildcardUsageTest.Bar", superBar.describe());
+ assertEquals("? extends com.github.javaparser.symbolsolver.model.typesystem.WildcardUsageTest.Foo", extendsFoo.describe());
+ assertEquals("? extends com.github.javaparser.symbolsolver.model.typesystem.WildcardUsageTest.Bar", extendsBar.describe());
+ }
+
+ @Test
+ public void testReplaceParam() {
+ ResolvedTypeParameterDeclaration tpA = ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList());
+ ResolvedTypeParameterDeclaration tpB = ResolvedTypeParameterDeclaration.onType("B", "foo.Bar", Collections.emptyList());
+ assertTrue(unbounded == unbounded.replaceTypeVariables(tpA, string));
+ assertTrue(superFoo == superFoo.replaceTypeVariables(tpA, string));
+ assertTrue(extendsFoo == extendsFoo.replaceTypeVariables(tpA, string));
+ assertEquals(superString, superA.replaceTypeVariables(tpA, string));
+ assertEquals(extendsString, extendsA.replaceTypeVariables(tpA, string));
+ assertTrue(superA == superA.replaceTypeVariables(tpB, string));
+ assertTrue(extendsA == extendsA.replaceTypeVariables(tpB, string));
+ }
+
+ @Test
+ public void testIsAssignableBySimple() {
+ assertEquals(false, unbounded.isAssignableBy(object));
+ assertEquals(true, object.isAssignableBy(unbounded));
+ assertEquals(false, string.isAssignableBy(unbounded));
+ assertEquals(true, superFoo.isAssignableBy(foo));
+ assertEquals(false, foo.isAssignableBy(superFoo));
+ assertEquals(false, extendsFoo.isAssignableBy(foo));
+ assertEquals(true, foo.isAssignableBy(extendsFoo));
+ }
+
+ /*@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));
+ }
+
+ @Test
+ public void testGetAllAncestorsConsideringGenericsCases() {
+ ReferenceTypeUsage foo = new ReferenceTypeUsage(new ReflectionClassDeclaration(Foo.class, typeSolver), typeSolver);
+ ReferenceTypeUsage bar = new ReferenceTypeUsage(new ReflectionClassDeclaration(Bar.class, typeSolver), typeSolver);
+ ReferenceTypeUsage left, right;
+
+ //YES MoreBazzing<Foo, Bar> e1 = new MoreBazzing<Foo, Bar>();
+ assertEquals(true,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver))
+ );
+
+ //YES MoreBazzing<? extends Foo, Bar> e2 = new MoreBazzing<Foo, Bar>();
+ assertEquals(true,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(WildcardUsage.extendsBound(foo), bar), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver))
+ );
+
+ //YES MoreBazzing<Foo, ? extends Bar> e3 = new MoreBazzing<Foo, Bar>();
+ assertEquals(true,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, WildcardUsage.extendsBound(bar)), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver))
+ );
+
+ //YES MoreBazzing<? extends Foo, ? extends Foo> e4 = new MoreBazzing<Foo, Bar>();
+ assertEquals(true,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(WildcardUsage.extendsBound(foo), WildcardUsage.extendsBound(foo)), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver))
+ );
+
+ //YES MoreBazzing<? extends Foo, ? extends Foo> e5 = new MoreBazzing<Bar, Bar>();
+ left = new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(WildcardUsage.extendsBound(foo), WildcardUsage.extendsBound(foo)), typeSolver);
+ right = new ReferenceTypeUsage(
+ 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 ReferenceTypeUsage(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(object, string, string), typeSolver);
+ right = new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(string, object), typeSolver);
+ assertEquals(true, left.isAssignableBy(right));
+
+ //YES Bazzer<String,String,String> e7 = new MoreBazzing<String, String>();
+ assertEquals(true,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(string, string, string), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(string, string), typeSolver))
+ );
+
+ //YES Bazzer<Bar,String,Foo> e8 = new MoreBazzing<Foo, Bar>();
+ assertEquals(true,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(bar, string, foo), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver))
+ );
+
+ //YES Bazzer<Foo,String,Bar> e9 = new MoreBazzing<Bar, Foo>();
+ assertEquals(true,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(foo, string, bar), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(bar, foo), typeSolver))
+ );
+
+ //NO Bazzer<Bar,String,Foo> n1 = new MoreBazzing<Bar, Foo>();
+ assertEquals(false,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(bar,string,foo), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(bar, foo), typeSolver))
+ );
+
+ //NO Bazzer<Bar,String,Bar> n2 = new MoreBazzing<Bar, Foo>();
+ assertEquals(false,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(bar, string, foo), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(bar, foo), typeSolver))
+ );
+
+ //NO Bazzer<Foo,Object,Bar> n3 = new MoreBazzing<Bar, Foo>();
+ assertEquals(false,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(foo, object, bar), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(bar, foo), typeSolver))
+ );
+ }
+
+ @Test
+ public void charSequenceIsAssignableToObject() {
+ TypeSolver typeSolver = new JreTypeSolver();
+ ReferenceTypeUsage charSequence = new ReferenceTypeUsage(new ReflectionInterfaceDeclaration(CharSequence.class, typeSolver), typeSolver);
+ ReferenceTypeUsage object = new ReferenceTypeUsage(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 JreTypeSolver();
+ ReferenceTypeUsage ref = new ReferenceTypeUsage(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).isTypeParameter());
+ assertEquals("A", ref.getFieldType("elements").get().asReferenceType().typeParametersValues().get(0).asTypeParameter().getName());
+
+ ref = new ReferenceTypeUsage(new ReflectionClassDeclaration(Foo.class, typeSolver),
+ ImmutableList.of(new ReferenceTypeUsage(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 JreTypeSolver();
+ ReferenceTypeUsage ref = new ReferenceTypeUsage(new ReflectionClassDeclaration(Foo.class, typeSolver), typeSolver);
+
+ assertEquals(false, ref.getFieldType("bar").isPresent());
+
+ ref = new ReferenceTypeUsage(new ReflectionClassDeclaration(Foo.class, typeSolver),
+ ImmutableList.of(new ReferenceTypeUsage(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver)),
+ typeSolver);
+
+ assertEquals(false, ref.getFieldType("bar").isPresent());
+ }*/
+
+}