aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/org')
-rw-r--r--src/test/java/org/glavo/javah/ClassMetaInfoTest.java54
-rw-r--r--src/test/java/org/glavo/javah/NativeMethodTests.java34
-rw-r--r--src/test/java/org/glavo/javah/RegexTests.java73
-rw-r--r--src/test/java/org/glavo/javah/RuntimeSearchPathTests.java31
4 files changed, 192 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));
+ }
+ }
+}
diff --git a/src/test/java/org/glavo/javah/NativeMethodTests.java b/src/test/java/org/glavo/javah/NativeMethodTests.java
new file mode 100644
index 0000000..32251f9
--- /dev/null
+++ b/src/test/java/org/glavo/javah/NativeMethodTests.java
@@ -0,0 +1,34 @@
+package org.glavo.javah;
+
+import org.junit.jupiter.api.Test;
+import org.objectweb.asm.Type;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class NativeMethodTests {
+ @Test
+ void testFactoryMethod() {
+ Map<String, Type> qualified = new LinkedHashMap<>() {
+ {
+ put("method0", Type.getType("()I"));
+ put("method1", Type.getType("(Ljava/lang/String;)I"));
+ }
+ };
+
+ Map<String, Type> wrongs = new LinkedHashMap<>() {
+ {
+ put("method0", Type.getType(String.class));
+ put("method1", Type.getType("()"));
+ put("method2", Type.getType("L;"));
+ }
+ };
+
+ qualified.forEach((name, type) -> assertDoesNotThrow(() -> NativeMethod.of(name, type)));
+ wrongs.forEach((name, type) -> assertThrows(IllegalArgumentException.class, () -> NativeMethod.of(name, type)));
+
+
+ }
+}
diff --git a/src/test/java/org/glavo/javah/RegexTests.java b/src/test/java/org/glavo/javah/RegexTests.java
new file mode 100644
index 0000000..026c5a5
--- /dev/null
+++ b/src/test/java/org/glavo/javah/RegexTests.java
@@ -0,0 +1,73 @@
+package org.glavo.javah;
+
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class RegexTests {
+
+ @Test
+ void testSimpleNamePattern() {
+ String[] names = {
+ "A", "a", "ABC", "AbC", "类名称", "_(*)", "a b c $ d ,", "<a"
+ };
+
+ String[] wrongNames = {
+ "", "A.B", "[A", "A;B", "A/B"
+ };
+
+ for (String name : names) {
+ assertTrue(Utils.SIMPLE_NAME_PATTERN.matcher(name).matches()
+ , String.format("'%s' match simple name pattern failed", name));
+ }
+
+ for (String name : wrongNames) {
+ assertFalse(Utils.SIMPLE_NAME_PATTERN.matcher(name).matches(),
+ String.format("'%s' match simple name pattern failed", name));
+ }
+ }
+
+ @Test
+ void testFullNamePattern() {
+ String[] names = {
+ "A", "a", "ABC", "AbC", "类名称", "_(*)", "a b c $ d ,",
+ "A.B.C", "A.bcd.E", "包1.包2.类名称", "_().B"
+ };
+
+ String[] wrongNames = {
+ "", "A..B", "A.", ".A", "[A", "A;B", "A/B"
+ };
+
+ for (String name : names) {
+ assertTrue(Utils.FULL_NAME_PATTERN.matcher(name).matches(),
+ String.format("'%s' match full name pattern failed", name));
+ }
+
+ for (String name : wrongNames) {
+ assertFalse(Utils.FULL_NAME_PATTERN.matcher(name).matches(),
+ String.format("'%s' match full name pattern failed", name));
+ }
+ }
+
+ @Test
+ void testMethodNamePattern() {
+ String[] names = {
+ "A", "a", "ABC", "AbC", "类名称", "_(*)", "a b c $ d ,", "<init>", "<cinit>"
+ };
+
+ String[] wrongNames = {
+ "", "A.B", "[A", "A;B", "A/B", "<", "b<a"
+ };
+
+ for (String name : names) {
+ assertTrue(Utils.METHOD_NAME_PATTERN.matcher(name).matches()
+ , String.format("'%s' match simple name pattern failed", name));
+ }
+
+ for (String name : wrongNames) {
+ assertFalse(Utils.METHOD_NAME_PATTERN.matcher(name).matches(),
+ String.format("'%s' match simple name pattern failed", name));
+ }
+ }
+}
diff --git a/src/test/java/org/glavo/javah/RuntimeSearchPathTests.java b/src/test/java/org/glavo/javah/RuntimeSearchPathTests.java
new file mode 100644
index 0000000..2530312
--- /dev/null
+++ b/src/test/java/org/glavo/javah/RuntimeSearchPathTests.java
@@ -0,0 +1,31 @@
+package org.glavo.javah;
+
+import org.junit.jupiter.api.Test;
+
+import java.io.InputStream;
+import java.nio.file.Files;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class RuntimeSearchPathTests {
+
+ @Test
+ void test() throws Exception {
+ Class<?>[] testClasses = {
+ String.class,
+ Test.class,
+ RuntimeSearchPathTests.class,
+ Main.class
+ };
+
+ for (Class<?> cls : testClasses) {
+ try (InputStream in = cls.getResourceAsStream(cls.getSimpleName() + ".class")) {
+ assertArrayEquals(
+ Files.readAllBytes(RuntimeSearchPath.searchClass(cls.getName())),
+ in.readAllBytes(),
+ "Search " + cls + " failed"
+ );
+ }
+ }
+ }
+}