package test;
import java.io.InputStream;
import java.io.Serializable;
import java.lang.reflect.Method;
import aQute.bnd.compatibility.Signatures;
import junit.framework.TestCase;
import test.signatures.Z;
@SuppressWarnings("restriction")
public class TestSignatures extends TestCase {
static Signatures s = new Signatures();
public static void testScopes() throws Exception {
assertEquals("<E:Ljava/lang/Object;>(TE;TC;TD;)V",
s.getSignature(Z.V.class.getMethod("fooLCO", Object.class, Object.class, Object.class)));
}
public static void testClass() throws Exception {
assertEquals(
"<C:Ljava/lang/Object;>Ltest/signatures/X<Ljava/lang/String;>;Ltest/signatures/Y<Ljava/lang/Integer;>;",
s.getSignature(Z.class));
assertEquals("<D:Ljava/lang/Object;>Ljava/lang/Object;", s.getSignature(Z.V.class));
}
public static void testMethodDeclarations() throws Exception {
assertEquals("<E:Ljava/lang/Object;>(TE;)V", s.getSignature(Z.class.getMethod("foo", Object.class)));
assertEquals("<E:Ljava/io/InputStream;>(TE;)V", s.getSignature(Z.class.getMethod("fooC", InputStream.class)));
assertEquals("<E:Ljava/io/InputStream;:Ljava/lang/Cloneable;>(TE;)V",
s.getSignature(Z.class.getMethod("fooCI", InputStream.class)));
assertEquals("<E:Ljava/io/InputStream;:Ljava/lang/Cloneable;:Ljava/io/Serializable;>(TE;)V",
s.getSignature(Z.class.getMethod("fooCII", InputStream.class)));
assertEquals("<E::Ljava/io/Serializable;:Ljava/lang/Cloneable;>(TE;)V",
s.getSignature(Z.class.getMethod("fooII", Serializable.class)));
assertEquals("<E::Ljava/lang/Cloneable;>(TE;)V", s.getSignature(Z.class.getMethod("fooI", Cloneable.class)));
assertEquals("<E:TC;>(TE;)V", s.getSignature(Z.class.getMethod("fooP", Object.class)));
assertEquals("<E:Ljava/lang/Object;F:Ljava/lang/Object;>(TE;TF;)V",
s.getSignature(Z.class.getMethod("foo", Object.class, Object.class)));
}
public static void testFields() throws Exception {
// Z<Long>.V<Integer>
assertEquals("Ltest/signatures/Z<Ljava/lang/Long;>.V<Ljava/lang/Integer;>;",
s.getSignature(Z.class.getField("referenceToNestedClass")));
//
assertEquals("Ltest/signatures/Z<TC;>.V<TC;>;", s.getSignature(Z.class.getField("vc")));
assertEquals(
"<C:Ljava/lang/Object;>Ltest/signatures/X<Ljava/lang/String;>;Ltest/signatures/Y<Ljava/lang/Integer;>;",
s.getSignature(Z.class));
assertEquals("<D:Ljava/lang/Object;>Ljava/lang/Object;", s.getSignature(Z.V.class));
assertEquals("Ltest/signatures/X<Ltest/signatures/Y<TC;>;>;", s.getSignature(Z.class.getField("field")));
}
public static void testWildcards() throws Exception {
assertEquals("Ljava/util/Collection<*>;", s.getSignature(Z.class.getField("wildcard_001")));
assertEquals("Ljava/util/Collection<+Ljava/lang/Cloneable;>;",
s.getSignature(Z.class.getField("wildcard_002")));
assertEquals("Ljava/util/Collection<-Ljava/lang/Cloneable;>;",
s.getSignature(Z.class.getField("wildcard_003")));
assertEquals("Ljava/util/Collection<+TC;>;", s.getSignature(Z.class.getField("wildcard_004")));
assertEquals("Ljava/util/Collection<-TC;>;", s.getSignature(Z.class.getField("wildcard_005")));
assertEquals("Ljava/util/Collection<+Ltest/signatures/Z<TC;>.V<Ljava/lang/Integer;>;>;",
s.getSignature(Z.class.getField("wildcard_006")));
assertEquals("Ljava/util/Collection<-Ltest/signatures/Z<TC;>.V<Ljava/lang/Integer;>;>;",
s.getSignature(Z.class.getField("wildcard_007")));
}
public static void testNormalize() {
assertEquals("Ltest/signatures/Z<Ljava/lang/Long;>.V<Ljava/lang/Integer;>;",
s.normalize("Ltest/signatures/Z<Ljava/lang/Long;>.V<Ljava/lang/Integer;>;"));
assertEquals(s.normalize("<A:Ljava/lang/Object;>(TA;)V"), s.normalize("<E:Ljava/lang/Object;>(TE;)V"));
assertEquals(s.normalize("<A:Ljava/lang/Object;>(TA;TB;)V"), s.normalize("<E:Ljava/lang/Object;>(TE;TC;)V"));
// we use (A,A) and test against (A,B)
assertFalse(
s.normalize("<A:Ljava/lang/Object;>(TA;TA;)V").equals(s.normalize("<E:Ljava/lang/Object;>(TE;TC;)V")));
assertEquals("<_0:Ljava/lang/Object;>(T_0;)V", s.normalize("<E:Ljava/lang/Object;>(TE;)V"));
assertEquals("<_0:Ljava/lang/Object;>(T_0;T_1;T_2;)V", s.normalize("<E:Ljava/lang/Object;>(TE;TC;TD;)V"));
assertEquals("<_0:Ljava/lang/Object;>Ljava/lang/Object;",
s.normalize("<_0:Ljava/lang/Object;>Ljava/lang/Object;"));
}
public static void testCompatibility() throws Exception {
String _001 = ns(Z.class.getMethod("compatibility_001"));
String _002 = ns(Z.class.getMethod("compatibility_002"));
String _003 = ns(Z.class.getMethod("compatibility_003"));
assertEquals(_001, _002);
assertTrue(_001.equals(_002));
assertFalse(_001.equals(_003));
}
private static String ns(Method method) throws Exception {
String sig = s.getSignature(method);
return s.normalize(sig);
}
}