blob: 4dedbb9df7bff6553721ff8ba36561f67fdba000 [file] [log] [blame]
package gls.generics
class GenericsTest extends GenericsTestBase {
public void testExtendsWithParameter() {
createClassInfo """
class B<T> extends ArrayList<T> {}
"""
assert signatures==["class":"<T:Ljava/lang/Object;>Ljava/util/ArrayList<TT;>;Lgroovy/lang/GroovyObject;"]
}
public void testNestedExtendsWithParameter() {
createClassInfo """
class B<T> extends HashMap<T,List<T>> {}
"""
assert signatures == ["class":"<T:Ljava/lang/Object;>Ljava/util/HashMap<TT;Ljava/util/List<TT;>;>;Lgroovy/lang/GroovyObject;"]
}
public void testImplementsWithParameter() {
createClassInfo """
abstract class B<T> implements List<T> {}
"""
assert signatures==["class":"<T:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/List<TT;>;Lgroovy/lang/GroovyObject;"]
}
public void testMultipleImplementsWithParameter() {
createClassInfo """
abstract class B<T> implements Runnable,List<T> {}
"""
assert signatures == ["class":"<T:Ljava/lang/Object;>Ljava/lang/Object;Ljava/lang/Runnable;Ljava/util/List<TT;>;Lgroovy/lang/GroovyObject;"]
}
public void testBoundInterface() {
createClassInfo """
class B<T extends List> {}
"""
assert signatures == ["class":"<T::Ljava/util/List;>Ljava/lang/Object;Lgroovy/lang/GroovyObject;"]
}
public void testNestedReuseOfParameter() {
createClassInfo """
class B<Y,T extends Map<String,Map<Y,Integer>>> {}
"""
assert signatures == ["class":"<Y:Ljava/lang/Object;T::Ljava/util/Map<Ljava/lang/String;Ljava/util/Map<TY;Ljava/lang/Integer;>;>;>Ljava/lang/Object;Lgroovy/lang/GroovyObject;"]
}
public void testFieldWithParameter() {
createClassInfo """
class B { public Collection<Integer> books }
"""
assert signatures == [books : "Ljava/util/Collection<Ljava/lang/Integer;>;"]
}
public void testFieldReusedParameter() {
createClassInfo """
class B<T> { public Collection<T> collection }
"""
assert signatures == ["class" : "<T:Ljava/lang/Object;>Ljava/lang/Object;Lgroovy/lang/GroovyObject;",
collection : "Ljava/util/Collection<TT;>;"]
}
public void testParameterAsReturnType() {
createClassInfo """
class B {
static <T> T foo() {return null}
}
"""
assert signatures == ["foo()Ljava/lang/Object;":"<T:Ljava/lang/Object;>()TT;"]
}
public void testParameterAsReturnTypeAndParameter() {
createClassInfo """
class B {
static <T> T foo(T t) {return null}
}
"""
assert signatures == ["foo(Ljava/lang/Object;)Ljava/lang/Object;":"<T:Ljava/lang/Object;>(TT;)TT;"]
}
public void testParameterAsMethodParameter() {
createClassInfo """
class B<T> {
void foo(T t){}
}
"""
assert signatures == ["class" : "<T:Ljava/lang/Object;>Ljava/lang/Object;Lgroovy/lang/GroovyObject;",
"foo(Ljava/lang/Object;)V":"(TT;)V"]
}
public void testParameterAsNestedMethodParameter() {
createClassInfo """
class B<T> {
void foo(List<T> t){}
}
"""
assert signatures == ["class" : "<T:Ljava/lang/Object;>Ljava/lang/Object;Lgroovy/lang/GroovyObject;",
"foo(Ljava/util/List;)V":"(Ljava/util/List<TT;>;)V"]
}
public void testParameterAsNestedMethodParameterReturningInterface() {
createClassInfo """
class B<T> {
Cloneable foo(List<T> t){}
}
"""
assert signatures == ["class" : "<T:Ljava/lang/Object;>Ljava/lang/Object;Lgroovy/lang/GroovyObject;",
"foo(Ljava/util/List;)Ljava/lang/Cloneable;":"(Ljava/util/List<TT;>;)Ljava/lang/Cloneable;"]
}
public void testMultipleBounds() {
createClassInfo """
class Pair< A extends Comparable<A> & Cloneable ,
B extends Cloneable & Comparable<B> >
{
A foo(){}
B bar(){}
}
"""
assert signatures ==
["class" : "<A::Ljava/lang/Comparable<TA;>;:Ljava/lang/Cloneable;B::Ljava/lang/Cloneable;:Ljava/lang/Comparable<TB;>;>Ljava/lang/Object;Lgroovy/lang/GroovyObject;",
"foo()Ljava/lang/Comparable;" : "()TA;",
"bar()Ljava/lang/Cloneable;" : "()TB;"]
}
public void testWildCard() {
createClassInfo """
class B {
private Collection<?> f1
private List<? extends Number> f2
private Comparator<? super String> f3
private Map<String,?> f4
}
"""
assert signatures==[
f1 : "Ljava/util/Collection<*>;",
f2 : "Ljava/util/List<+Ljava/lang/Number;>;",
f3 : "Ljava/util/Comparator<-Ljava/lang/String;>;",
f4 : "Ljava/util/Map<Ljava/lang/String;*>;"
]
}
public void testParameterAsParameterForReturnTypeAndFieldClass() {
createClassInfo """
public class B<T> {
private T owner;
public Class<T> getOwnerClass(){}
}
"""
assert signatures==[
"class" : "<T:Ljava/lang/Object;>Ljava/lang/Object;Lgroovy/lang/GroovyObject;",
"owner" : "TT;",
"getOwnerClass()Ljava/lang/Class;" : "()Ljava/lang/Class<TT;>;"
]
}
public void testClassWithoutParameterExtendsClassWithFixedParameter() {
createClassInfo """
class B extends ArrayList<Long> {}
"""
assert signatures==[
"class" : "Ljava/util/ArrayList<Ljava/lang/Long;>;Lgroovy/lang/GroovyObject;",
]
}
public void testInvalidParameterUsage_FAILS() {
if (notYetImplemented()) return
shouldNotCompile """
abstract class B<T> implements Map<T>{}
"""
}
}