package test;
import java.io.IOException;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.lang.reflect.TypeVariable;
import java.util.Collection;
import junit.framework.TestCase;
public class CompareTest<O extends Serializable> extends TestCase {
interface I<T> {}
class B {
class C<X extends O> {}
}
class A0 {}
// Declarations
class A1<T> { //
}
class A2<T extends Serializable> { //
}
class A3<T extends Exception & Serializable> { //
}
public static String foo0() {
return null;
}
public static <T> T foo1() {
return null;
}
public static <T extends Serializable> T foo2() {
return null;
}
public static <T extends Exception & I<String>> T foo3() {
return null;
}
@SuppressWarnings("static-method")
public <T extends O> T foo4() {
return null;
}
public void testGenericDeclaration() throws Exception {
assertTrue(A0.class.getTypeParameters().length == 0);
assertTrue(A1.class.getTypeParameters().length == 1);
assertEquals("T", A1.class.getTypeParameters()[0].getName());
assertEquals(1, A1.class.getTypeParameters()[0].getBounds().length);
assertEquals(Object.class, A1.class.getTypeParameters()[0].getBounds()[0]);
assertTrue(A2.class.getTypeParameters().length == 1);
assertEquals("T", A2.class.getTypeParameters()[0].getName());
assertEquals(1, A2.class.getTypeParameters()[0].getBounds().length);
assertEquals(Serializable.class, A2.class.getTypeParameters()[0].getBounds()[0]);
assertTrue(A3.class.getTypeParameters().length == 1);
assertEquals("T", A3.class.getTypeParameters()[0].getName());
assertEquals(2, A3.class.getTypeParameters()[0].getBounds().length);
assertEquals(Exception.class, A3.class.getTypeParameters()[0].getBounds()[0]);
assertEquals(Serializable.class, A3.class.getTypeParameters()[0].getBounds()[1]);
Method m = getClass().getMethod("foo0");
assertEquals(0, m.getTypeParameters().length);
m = getClass().getMethod("foo1");
assertEquals(1, m.getTypeParameters().length);
assertEquals("T", m.getTypeParameters()[0].getName());
assertEquals(1, m.getTypeParameters()[0].getBounds().length);
assertEquals(Object.class, m.getTypeParameters()[0].getBounds()[0]);
m = getClass().getMethod("foo3");
assertEquals(1, m.getTypeParameters().length);
assertEquals("T", m.getTypeParameters()[0].getName());
assertEquals(2, m.getTypeParameters()[0].getBounds().length);
assertEquals(Exception.class, m.getTypeParameters()[0].getBounds()[0]);
m = getClass().getMethod("foo4");
assertEquals(1, m.getTypeParameters().length);
assertEquals("T", m.getTypeParameters()[0].getName());
assertEquals(1, m.getTypeParameters()[0].getBounds().length);
assertTrue(m.getTypeParameters()[0].getBounds()[0] instanceof TypeVariable);
assertEquals(getClass(), ((TypeVariable< ? >) m.getTypeParameters()[0].getBounds()[0]).getGenericDeclaration());
}
public A1<Collection<String>[]> a1;
@SuppressWarnings("static-method")
<Y, X extends A1<Y>> A1< ? extends X> bar() {
return null;
}
public static void testSimple() throws IOException {
// Scope root = new Scope(Access.PUBLIC, Kind.ROOT, ".");
// RuntimeSignatureBuilder pc = new RuntimeSignatureBuilder(root);
// pc.add(CompareTest.class);
// pc.add(A.class);
// pc.add(A.B.class);
//
// A a = new A<String, String, String, String, String>();
//
// pc.add(a.bar().getClass());
// pc.add(a.bar().foo().getClass());
//
// // ParseSignatureBuilder pb = new ParseSignatureBuilder(root);
// // pb.parse(new FileInputStream("bin/test/CompareTest$A$B$1.class"));
// // pb.parse(new FileInputStream("bin/test/CompareTest$A$1.class"));
// // pb.parse(new FileInputStream("bin/test/CompareTest$Z.class"));
//
// root.cleanRoot();
// PrintWriter pw = new PrintWriter(System.err);
// root.report(pw, 0);
// pw.flush();
//
// root.prune(EnumSet.of(Access.PUBLIC, Access.PROTECTED));
// root.report(pw, 0);
// pw.flush();
}
}