diff options
author | Glavo <zjx001202@126.com> | 2019-12-06 03:42:00 +0800 |
---|---|---|
committer | Glavo <zjx001202@126.com> | 2019-12-06 03:42:00 +0800 |
commit | e48c0668029849af07d1966729c5b703e89b1d00 (patch) | |
tree | fec378e2c6e52d86e601f0df45ba13728003fa2b /src/test | |
parent | 6fd5804e3f2c337839efcf5c10426faed1d8b1af (diff) | |
download | gjavah-e48c0668029849af07d1966729c5b703e89b1d00.tar.gz gjavah-e48c0668029849af07d1966729c5b703e89b1d00.tar.bz2 gjavah-e48c0668029849af07d1966729c5b703e89b1d00.zip |
update
Diffstat (limited to 'src/test')
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" + ); + } + } + } +} |