aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/org/glavo/javah/ClassMetaInfoTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/org/glavo/javah/ClassMetaInfoTest.java')
-rw-r--r--src/test/java/org/glavo/javah/ClassMetaInfoTest.java54
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));
+ }
+ }
+}