diff options
Diffstat (limited to 'src/test/java/org/glavo/javah/ClassMetaInfoTest.java')
-rw-r--r-- | src/test/java/org/glavo/javah/ClassMetaInfoTest.java | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/test/java/org/glavo/javah/ClassMetaInfoTest.java b/src/test/java/org/glavo/javah/ClassMetaInfoTest.java new file mode 100644 index 0000000..9c1042c --- /dev/null +++ b/src/test/java/org/glavo/javah/ClassMetaInfoTest.java @@ -0,0 +1,54 @@ +package org.glavo.javah; + +import org.junit.jupiter.api.Test; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; + +import java.io.IOException; +import java.lang.reflect.Modifier; +import java.util.*; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.*; + +public class ClassMetaInfoTest { + static class TestData { + ClassName name; + ClassName superName; + + TestData(ClassName name, ClassName superName) { + this.name = name; + this.superName = superName; + } + } + + class C1 { + public native int f(); + } + + @Test + void test() throws IOException, ClassNotFoundException { + TestData[] data = new TestData[]{ + new TestData(ClassName.of("java.lang.Object"), null), + new TestData(ClassName.of("java.lang.String"), ClassName.of("java.lang.Object")), + new TestData(ClassName.of(C1.class.getName()), ClassName.of(C1.class.getSuperclass().getName())) + }; + for (TestData d : data) { + Class<?> cls = Class.forName(d.name.className()); + List<NativeMethod> methods = Arrays.stream(cls.getDeclaredMethods()) + .filter(m -> (m.getModifiers() & Modifier.NATIVE) != 0) + .map(m -> NativeMethod.of(m.getModifiers(), m.getName(), Type.getMethodDescriptor(m))) + .collect(Collectors.toList()); + + ClassMetaInfo info = new ClassMetaInfo(); + ClassReader reader = new ClassReader(d.name.className()); + reader.accept(info, ClassReader.SKIP_CODE | ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); + + assertEquals(info.name, d.name); + assertEquals(info.superClassName, d.superName); + + assertTrue(info.methods.containsAll(methods) && methods.containsAll(info.methods)); + } + } +} |