|
|
|
@@ -41,6 +41,16 @@ public class TestComplete {
|
|
|
|
|
var m = applyLambda.getDeclaredMethod("m");
|
|
|
|
|
var result = m.invoke(instance);
|
|
|
|
|
|
|
|
|
|
assertEquals(Object.class, m.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[0], m.getParameterTypes());
|
|
|
|
|
|
|
|
|
|
var lambda = applyLambda.getDeclaredMethod("lambda$0", Object.class);
|
|
|
|
|
assertEquals(Object.class, lambda.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Object.class}, lambda.getParameterTypes());
|
|
|
|
|
assertEquals(2, applyLambda.getDeclaredMethods().length);
|
|
|
|
|
|
|
|
|
|
var apply = classFiles.get("Apply");
|
|
|
|
|
assertEquals(0, apply.getDeclaredMethods().length);
|
|
|
|
|
assertEquals(result.getClass(), classFiles.get("Apply"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -52,6 +62,23 @@ public class TestComplete {
|
|
|
|
|
|
|
|
|
|
var m2 = binaryInMeth.getDeclaredMethod("m2", Integer.class, Integer.class);
|
|
|
|
|
var m3 = binaryInMeth.getDeclaredMethod("m3", Integer.class);
|
|
|
|
|
var mInteger = binaryInMeth.getDeclaredMethod("m", Integer.class);
|
|
|
|
|
var mDouble = binaryInMeth.getDeclaredMethod("m", Double.class);
|
|
|
|
|
var m2Double = binaryInMeth.getDeclaredMethod("m2", Double.class, Double.class);
|
|
|
|
|
var m3Double = binaryInMeth.getDeclaredMethod("m3", Double.class);
|
|
|
|
|
|
|
|
|
|
assertEquals(Integer.class, m2.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Integer.class, Integer.class}, m2.getParameterTypes());
|
|
|
|
|
assertEquals(Integer.class, m3.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Integer.class}, m3.getParameterTypes());
|
|
|
|
|
assertEquals(Integer.class, mInteger.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Integer.class}, mInteger.getParameterTypes());
|
|
|
|
|
assertEquals(Double.class, mDouble.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Double.class}, mDouble.getParameterTypes());
|
|
|
|
|
assertEquals(Double.class, m2Double.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Double.class, Double.class}, m2Double.getParameterTypes());
|
|
|
|
|
assertEquals(Double.class, m3Double.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Double.class}, m3Double.getParameterTypes());
|
|
|
|
|
|
|
|
|
|
assertEquals(6, m2.invoke(instance, 2, 3));
|
|
|
|
|
assertEquals(4, m3.invoke(instance, 2));
|
|
|
|
@@ -60,7 +87,24 @@ public class TestComplete {
|
|
|
|
|
@Test
|
|
|
|
|
public void classGenLamTest() throws Exception {
|
|
|
|
|
var classFiles = generateClassFiles(createClassLoader(), "ClassGenLam.jav");
|
|
|
|
|
classFiles.get("ClassGenLam").getDeclaredConstructor().newInstance();
|
|
|
|
|
var classGenLam = classFiles.get("ClassGenLam");
|
|
|
|
|
classGenLam.getDeclaredConstructor().newInstance();
|
|
|
|
|
|
|
|
|
|
assertEquals(1, classGenLam.getTypeParameters().length);
|
|
|
|
|
var typeParameter = classGenLam.getTypeParameters()[0];
|
|
|
|
|
|
|
|
|
|
var lam = classGenLam.getDeclaredField("lam");
|
|
|
|
|
assertEquals("lam", lam.getName());
|
|
|
|
|
assertEquals("Fun1$$LTPH$_$LTPH$_$", lam.getType().getName());
|
|
|
|
|
assertTrue(lam.getGenericType() instanceof ParameterizedType);
|
|
|
|
|
var lamType = (ParameterizedType) lam.getGenericType();
|
|
|
|
|
assertEquals(2, lamType.getActualTypeArguments().length);
|
|
|
|
|
assertEquals(typeParameter, lamType.getActualTypeArguments()[0]);
|
|
|
|
|
assertEquals(typeParameter, lamType.getActualTypeArguments()[1]);
|
|
|
|
|
|
|
|
|
|
var lambda = classGenLam.getDeclaredMethod("lambda$0", Object.class);
|
|
|
|
|
assertEquals(Object.class, lambda.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Object.class}, lambda.getParameterTypes());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@@ -70,6 +114,13 @@ public class TestComplete {
|
|
|
|
|
var instance = fac.getDeclaredConstructor().newInstance();
|
|
|
|
|
|
|
|
|
|
var getFac = fac.getDeclaredMethod("getFac", Integer.class);
|
|
|
|
|
var getFacDouble = fac.getDeclaredMethod("getFac", Double.class);
|
|
|
|
|
|
|
|
|
|
assertEquals(0, fac.getDeclaredFields().length);
|
|
|
|
|
assertEquals(Double.class, getFac.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Integer.class}, getFac.getParameterTypes());
|
|
|
|
|
assertEquals(Double.class, getFacDouble.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Double.class}, getFacDouble.getParameterTypes());
|
|
|
|
|
// assertEquals(6, getFac.invoke(instance, 3)); TODO This could be either an Integer or a Double so this simple test fails
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -83,6 +134,21 @@ public class TestComplete {
|
|
|
|
|
var instance = constructor.newInstance();
|
|
|
|
|
|
|
|
|
|
var getFact = fac.getDeclaredMethod("getFact", Integer.class);
|
|
|
|
|
var lambda = fac.getDeclaredMethod("lambda$0", Object.class);
|
|
|
|
|
var fact = fac.getDeclaredField("fact");
|
|
|
|
|
|
|
|
|
|
assertEquals(1, fac.getDeclaredFields().length);
|
|
|
|
|
assertEquals("Fun1$$Ljava$lang$Integer$_$Ljava$lang$Integer$_$", fact.getType().getName());
|
|
|
|
|
assertTrue(fact.getGenericType() instanceof ParameterizedType);
|
|
|
|
|
var factType = (ParameterizedType) fact.getGenericType();
|
|
|
|
|
assertEquals(2, factType.getActualTypeArguments().length);
|
|
|
|
|
assertEquals(Integer.class, factType.getActualTypeArguments()[0]);
|
|
|
|
|
assertEquals(Integer.class, factType.getActualTypeArguments()[1]);
|
|
|
|
|
assertEquals(Integer.class, getFact.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Integer.class}, getFact.getParameterTypes());
|
|
|
|
|
assertEquals(Integer.class, lambda.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Object.class}, lambda.getParameterTypes());
|
|
|
|
|
|
|
|
|
|
assertEquals(6, getFact.invoke(instance, 3));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -91,7 +157,14 @@ public class TestComplete {
|
|
|
|
|
var classFiles = generateClassFiles(createClassLoader(), "Field.jav");
|
|
|
|
|
var field = classFiles.get("Field");
|
|
|
|
|
var instance = field.getDeclaredConstructor().newInstance();
|
|
|
|
|
var x = field.getDeclaredField("x");
|
|
|
|
|
var m = field.getDeclaredMethod("m");
|
|
|
|
|
|
|
|
|
|
assertEquals(1, field.getFields().length);
|
|
|
|
|
assertEquals(Integer.class, x.getType());
|
|
|
|
|
assertEquals(Integer.class, x.getGenericType());
|
|
|
|
|
assertEquals(Integer.class, m.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[0], m.getParameterTypes());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@@ -105,6 +178,24 @@ public class TestComplete {
|
|
|
|
|
m2.invoke(instance, 1);
|
|
|
|
|
|
|
|
|
|
var m = fieldtph2.getDeclaredMethod("m", Object.class);
|
|
|
|
|
var typeParameters = fieldtph2.getTypeParameters();
|
|
|
|
|
assertEquals(2, typeParameters.length);
|
|
|
|
|
var p = typeParameters[0];
|
|
|
|
|
var t = typeParameters[1];
|
|
|
|
|
assertEquals("P", p.getName());
|
|
|
|
|
assertEquals("T", t.getName());
|
|
|
|
|
assertEquals(p, t.getBounds()[0]);
|
|
|
|
|
|
|
|
|
|
assertEquals(Object.class, a.getType());
|
|
|
|
|
assertEquals(t, a.getGenericType());
|
|
|
|
|
assertEquals(Object.class, m.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Object.class}, m.getParameterTypes());
|
|
|
|
|
assertEquals(p, m.getGenericReturnType());
|
|
|
|
|
assertEquals(p, m.getGenericParameterTypes()[0]);
|
|
|
|
|
assertEquals(void.class, m2.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Object.class}, m2.getParameterTypes());
|
|
|
|
|
assertEquals(t, m2.getGenericParameterTypes()[0]);
|
|
|
|
|
|
|
|
|
|
assertEquals(1, m.invoke(instance, 1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -117,6 +208,35 @@ public class TestComplete {
|
|
|
|
|
var instance = ctor.newInstance("C");
|
|
|
|
|
var a = fieldTphConsMeth.getDeclaredField("a");
|
|
|
|
|
var id = fieldTphConsMeth.getDeclaredMethod("id", Object.class);
|
|
|
|
|
var typeParameter = fieldTphConsMeth.getTypeParameters()[0];
|
|
|
|
|
var setA = fieldTphConsMeth.getDeclaredMethod("setA", Object.class);
|
|
|
|
|
var m = fieldTphConsMeth.getDeclaredMethod("m", Object.class, Object.class);
|
|
|
|
|
|
|
|
|
|
assertEquals(1, fieldTphConsMeth.getTypeParameters().length);
|
|
|
|
|
assertEquals("AAB", typeParameter.getName());
|
|
|
|
|
assertEquals(Object.class, a.getType());
|
|
|
|
|
assertEquals(typeParameter, a.getGenericType());
|
|
|
|
|
assertEquals(Object.class, ctor.getParameterTypes()[0]);
|
|
|
|
|
assertEquals(1, ctor.getTypeParameters().length);
|
|
|
|
|
assertEquals(typeParameter, ctor.getTypeParameters()[0].getBounds()[0]);
|
|
|
|
|
assertEquals(ctor.getTypeParameters()[0], ctor.getGenericParameterTypes()[0]);
|
|
|
|
|
assertEquals(Object.class, setA.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Object.class}, setA.getParameterTypes());
|
|
|
|
|
assertEquals(typeParameter, setA.getGenericReturnType());
|
|
|
|
|
assertEquals(setA.getTypeParameters()[0], setA.getGenericParameterTypes()[0]);
|
|
|
|
|
assertEquals(typeParameter, setA.getTypeParameters()[0].getBounds()[0]);
|
|
|
|
|
assertEquals(Object.class, id.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Object.class}, id.getParameterTypes());
|
|
|
|
|
assertEquals(typeParameter, id.getGenericReturnType());
|
|
|
|
|
assertEquals(typeParameter, id.getGenericParameterTypes()[0]);
|
|
|
|
|
assertEquals(void.class, m.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Object.class, Object.class}, m.getParameterTypes());
|
|
|
|
|
assertEquals(3, m.getTypeParameters().length);
|
|
|
|
|
assertEquals(Object.class, m.getTypeParameters()[0].getBounds()[0]);
|
|
|
|
|
assertEquals(m.getTypeParameters()[2], m.getTypeParameters()[1].getBounds()[0]);
|
|
|
|
|
assertEquals(m.getTypeParameters()[0], m.getTypeParameters()[2].getBounds()[0]);
|
|
|
|
|
assertEquals(m.getTypeParameters()[0], m.getGenericParameterTypes()[0]);
|
|
|
|
|
assertEquals(m.getTypeParameters()[1], m.getGenericParameterTypes()[1]);
|
|
|
|
|
|
|
|
|
|
assertEquals(42, id.invoke(instance, 42));
|
|
|
|
|
assertEquals("C", a.get(instance));
|
|
|
|
@@ -132,9 +252,39 @@ public class TestComplete {
|
|
|
|
|
var instance2 = ctor.newInstance("C", 42, false);
|
|
|
|
|
|
|
|
|
|
var m = fieldTphMMeth.getDeclaredMethod("m", Object.class, Object.class, Boolean.class);
|
|
|
|
|
var m2 = fieldTphMMeth.getDeclaredMethod("m2", Object.class);
|
|
|
|
|
var m3 = fieldTphMMeth.getDeclaredMethod("m3", Object.class);
|
|
|
|
|
var a = fieldTphMMeth.getDeclaredField("a");
|
|
|
|
|
var classTypeParameter = fieldTphMMeth.getTypeParameters()[0];
|
|
|
|
|
|
|
|
|
|
assertEquals(1, fieldTphMMeth.getTypeParameters().length);
|
|
|
|
|
assertEquals("AF", classTypeParameter.getName());
|
|
|
|
|
assertEquals(Object.class, a.getType());
|
|
|
|
|
assertEquals(classTypeParameter, a.getGenericType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Object.class, Object.class, Boolean.class}, ctor.getParameterTypes());
|
|
|
|
|
assertEquals(2, ctor.getTypeParameters().length);
|
|
|
|
|
assertEquals(classTypeParameter, ctor.getTypeParameters()[0].getBounds()[0]);
|
|
|
|
|
assertEquals(classTypeParameter, ctor.getTypeParameters()[1].getBounds()[0]);
|
|
|
|
|
assertEquals(Object.class, m.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Object.class, Object.class, Boolean.class}, m.getParameterTypes());
|
|
|
|
|
assertEquals(2, m.getTypeParameters().length);
|
|
|
|
|
assertEquals(Object.class, m.getTypeParameters()[0].getBounds()[0]);
|
|
|
|
|
assertEquals(m.getTypeParameters()[0], m.getTypeParameters()[1].getBounds()[0]);
|
|
|
|
|
assertEquals(m.getTypeParameters()[0], m.getGenericReturnType());
|
|
|
|
|
assertEquals(m.getTypeParameters()[0], m.getGenericParameterTypes()[0]);
|
|
|
|
|
assertEquals(m.getTypeParameters()[1], m.getGenericParameterTypes()[1]);
|
|
|
|
|
assertEquals(void.class, m2.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Object.class}, m2.getParameterTypes());
|
|
|
|
|
assertEquals(classTypeParameter, m2.getTypeParameters()[0].getBounds()[0]);
|
|
|
|
|
assertEquals(m2.getTypeParameters()[0], m2.getGenericParameterTypes()[0]);
|
|
|
|
|
assertEquals(Object.class, m3.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Object.class}, m3.getParameterTypes());
|
|
|
|
|
assertEquals(classTypeParameter, m3.getTypeParameters()[0].getBounds()[0]);
|
|
|
|
|
assertEquals(m3.getTypeParameters()[0], m3.getGenericReturnType());
|
|
|
|
|
assertEquals(m3.getTypeParameters()[0], m3.getGenericParameterTypes()[0]);
|
|
|
|
|
|
|
|
|
|
assertEquals(42, m.invoke(instance1, "C", 42, false));
|
|
|
|
|
|
|
|
|
|
var a = fieldTphMMeth.getDeclaredField("a");
|
|
|
|
|
assertEquals("C", a.get(instance1));
|
|
|
|
|
assertEquals(42, a.get(instance2));
|
|
|
|
|
}
|
|
|
|
@@ -142,19 +292,74 @@ public class TestComplete {
|
|
|
|
|
@Test
|
|
|
|
|
public void genTest() throws Exception {
|
|
|
|
|
var classFiles = generateClassFiles(createClassLoader(), "Gen.jav");
|
|
|
|
|
var gen = classFiles.get("Gen");
|
|
|
|
|
var m = gen.getDeclaredMethod("m", Vector.class);
|
|
|
|
|
|
|
|
|
|
assertEquals(0, gen.getDeclaredFields().length);
|
|
|
|
|
assertEquals(Vector.class, m.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Vector.class}, m.getParameterTypes());
|
|
|
|
|
assertTrue(m.getGenericReturnType() instanceof ParameterizedType);
|
|
|
|
|
var returnType = (ParameterizedType) m.getGenericReturnType();
|
|
|
|
|
assertEquals(Vector.class, returnType.getRawType());
|
|
|
|
|
assertArrayEquals(new Type[]{Integer.class}, returnType.getActualTypeArguments());
|
|
|
|
|
assertTrue(m.getGenericParameterTypes()[0] instanceof ParameterizedType);
|
|
|
|
|
var parameterType = (ParameterizedType) m.getGenericParameterTypes()[0];
|
|
|
|
|
assertEquals(Vector.class, parameterType.getRawType());
|
|
|
|
|
assertArrayEquals(new Type[]{Integer.class}, parameterType.getActualTypeArguments());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void idTest() throws Exception {
|
|
|
|
|
var classFiles = generateClassFiles(createClassLoader(), "Id.jav");
|
|
|
|
|
var instance = classFiles.get("Id").getDeclaredConstructor().newInstance();
|
|
|
|
|
var id = classFiles.get("Id");
|
|
|
|
|
id.getDeclaredConstructor().newInstance();
|
|
|
|
|
|
|
|
|
|
assertEquals(1, id.getTypeParameters().length);
|
|
|
|
|
assertEquals("FAU", id.getTypeParameters()[0].getName());
|
|
|
|
|
|
|
|
|
|
var id2 = id.getDeclaredField("id2");
|
|
|
|
|
assertEquals("Fun1$$LTPH$_$LTPH$_$", id2.getType().getName());
|
|
|
|
|
|
|
|
|
|
var lambda = id.getDeclaredMethod("lambda$0", Object.class);
|
|
|
|
|
assertEquals(Object.class, lambda.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Object.class}, lambda.getParameterTypes());
|
|
|
|
|
|
|
|
|
|
var id3 = id.getDeclaredMethod("id3", Object.class);
|
|
|
|
|
assertEquals(Object.class, id3.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Object.class}, id3.getParameterTypes());
|
|
|
|
|
assertEquals(1, id3.getTypeParameters().length);
|
|
|
|
|
assertEquals("V", id3.getTypeParameters()[0].getName());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void infTest() throws Exception {
|
|
|
|
|
var classFiles = generateClassFiles(createClassLoader(), "Inf.jav");
|
|
|
|
|
var instance = classFiles.get("Inf").getDeclaredConstructor().newInstance();
|
|
|
|
|
// TODO check generics
|
|
|
|
|
var inf = classFiles.get("Inf");
|
|
|
|
|
inf.getDeclaredConstructor().newInstance();
|
|
|
|
|
var m = inf.getDeclaredMethod("m", Object.class, Object.class, Object.class);
|
|
|
|
|
|
|
|
|
|
assertEquals(0, inf.getDeclaredFields().length);
|
|
|
|
|
assertEquals(void.class, m.getReturnType());
|
|
|
|
|
assertArrayEquals(new Class<?>[]{Object.class, Object.class, Object.class}, m.getParameterTypes());
|
|
|
|
|
assertEquals(5, m.getTypeParameters().length);
|
|
|
|
|
var zn = m.getTypeParameters()[0];
|
|
|
|
|
var zo = m.getTypeParameters()[1];
|
|
|
|
|
var q = m.getTypeParameters()[2];
|
|
|
|
|
var o = m.getTypeParameters()[3];
|
|
|
|
|
var zp = m.getTypeParameters()[4];
|
|
|
|
|
assertEquals("ZN", zn.getName());
|
|
|
|
|
assertEquals("ZO", zo.getName());
|
|
|
|
|
assertEquals("Q", q.getName());
|
|
|
|
|
assertEquals("O", o.getName());
|
|
|
|
|
assertEquals("ZP", zp.getName());
|
|
|
|
|
assertEquals(zo, zn.getBounds()[0]);
|
|
|
|
|
assertEquals(zp, zo.getBounds()[0]);
|
|
|
|
|
assertEquals(zn, q.getBounds()[0]);
|
|
|
|
|
assertEquals(zn, o.getBounds()[0]);
|
|
|
|
|
assertEquals(Object.class, zp.getBounds()[0]);
|
|
|
|
|
assertEquals(o, m.getGenericParameterTypes()[0]);
|
|
|
|
|
assertEquals(zn, m.getGenericParameterTypes()[1]);
|
|
|
|
|
assertEquals(q, m.getGenericParameterTypes()[2]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@@ -1700,6 +1905,7 @@ public class TestComplete {
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testBug406() throws Exception {
|
|
|
|
|
ConsoleInterface.logLevel = LogLevel.INFO;
|
|
|
|
|
var classFiles = generateClassFiles(createClassLoader(), "Bug406.jav");
|
|
|
|
|
var clazz = classFiles.get("Bug406");
|
|
|
|
|
clazz.getDeclaredMethod("main", List.class).invoke(null, List.of());
|
|
|
|
|