diff --git a/.gitignore b/.gitignore index 0994fe6e..464a3ac3 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ node_modules # Generated by the generateApiBindings task (see codegen/, build.gradle) /src/main/java/com/zhekasmirnov/innercore/api/gen +/src/test/java/com/zhekasmirnov/innercore/api/gen \ No newline at end of file diff --git a/build.gradle b/build.gradle index 0e673754..38dcffa9 100644 --- a/build.gradle +++ b/build.gradle @@ -49,6 +49,15 @@ dependencies { implementation fileTree (dir: 'iclibs', include: '*.jar') implementation fileTree (dir: 'iclibs/dex2jar', include: '*.jar') + + testImplementation(platform("org.junit:junit-bom:5.10.0")) + testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") +} + +tasks.test { + dependsOn 'generateApiBindingsTest' + useJUnitPlatform() } def targetJavaVersion = 17 @@ -81,6 +90,25 @@ run { def apiGenSourceRoot = file('src/main/java/org/innercore') def apiGenOutputDir = layout.projectDirectory.dir('src/main/java/com/zhekasmirnov/innercore/api/gen') +def apiGenSourceTestRoot = file('src/test/java/org/innercore') +def apiGenOutputTestDir = layout.projectDirectory.dir('src/test/java/com/zhekasmirnov/innercore/api/gen') + +tasks.register('generateApiBindingsTest', JavaExec) { + group = 'codegen' + description = 'Generates JS binding base classes from @ApiBinding-annotated sources.' + javaLauncher = javaToolchains.launcherFor { + def javaVersion = JavaVersion.toVersion(targetJavaVersion) + if (JavaVersion.current() < javaVersion) { + languageVersion = JavaLanguageVersion.of(targetJavaVersion) + } + } + classpath = configurations.codegenClasspath + mainClass = 'org.innercore.codegen.Codegen' + args 'com.zhekasmirnov.innercore.api.gen', apiGenOutputTestDir.asFile.absolutePath, apiGenSourceTestRoot.absolutePath + inputs.files(fileTree(apiGenSourceRoot) { include '**/*.java' }).withPropertyName('apiBindingSources') + outputs.dir(apiGenOutputDir).withPropertyName('apiBindingOutput') +} + tasks.register('generateApiBindings', JavaExec) { group = 'codegen' description = 'Generates JS binding base classes from @ApiBinding-annotated sources.' diff --git a/src/test/java/org/innercore/icstd/CodeGen.java b/src/test/java/org/innercore/icstd/CodeGen.java new file mode 100644 index 00000000..954a6675 --- /dev/null +++ b/src/test/java/org/innercore/icstd/CodeGen.java @@ -0,0 +1,40 @@ +package org.innercore.icstd; + +import com.zhekasmirnov.innercore.api.gen.CodeGenBindGenBase; +import org.innercore.icstd.annotations.ApiBinding; + +@ApiBinding +public class CodeGen extends CodeGenBindGenBase { + @ApiBinding public int test; + + @ApiBinding + public CodeGen() { + this.test = 5; + } + + @ApiBinding + public int sum(int a, int b) { + return a + b; + } + + @ApiBinding + public int sum(int a, int b, int c) { + return a + b + c; + } + + @ApiBinding + public String other(String a, int b, CodeGen c) { + return a + b + c.test; + } + + @ApiBinding + public static int staticSum(int a, int b) { + return a + b; + } + + @ApiBinding + public static int staticSum(int a, int b, int c) { + return a + b + c; + } + +} diff --git a/src/test/java/org/innercore/icstd/extension/TimingExtension.java b/src/test/java/org/innercore/icstd/extension/TimingExtension.java new file mode 100644 index 00000000..a5510b3f --- /dev/null +++ b/src/test/java/org/innercore/icstd/extension/TimingExtension.java @@ -0,0 +1,22 @@ +package org.innercore.icstd.extension; + +import org.junit.jupiter.api.extension.AfterTestExecutionCallback; +import org.junit.jupiter.api.extension.BeforeTestExecutionCallback; +import org.junit.jupiter.api.extension.ExtensionContext; + +public class TimingExtension implements BeforeTestExecutionCallback, AfterTestExecutionCallback { + private static final String START_TIME = "start time"; + + @Override + public void beforeTestExecution(ExtensionContext context) throws Exception { + context.getStore(ExtensionContext.Namespace.GLOBAL) + .put(START_TIME, System.currentTimeMillis()); + } + + @Override + public void afterTestExecution(ExtensionContext context) throws Exception { + long startTime = context.getStore(ExtensionContext.Namespace.GLOBAL) + .remove(START_TIME, long.class); + System.out.printf("End test %s - %d ms%n", context.getDisplayName(), System.currentTimeMillis() - startTime); + } +} \ No newline at end of file diff --git a/src/test/java/org/innercore/icstd/test/CodeGenTest.java b/src/test/java/org/innercore/icstd/test/CodeGenTest.java new file mode 100644 index 00000000..aedc9852 --- /dev/null +++ b/src/test/java/org/innercore/icstd/test/CodeGenTest.java @@ -0,0 +1,44 @@ +package org.innercore.icstd.test; + +import com.zhekasmirnov.innercore.api.gen.CodeGenBindGenBase; +import org.innercore.icstd.extension.TimingExtension; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mozilla.javascript.Function; +import org.mozilla.javascript.Scriptable; + +@ExtendWith(TimingExtension.class) +public class CodeGenTest { + @Test + public void test() { + Scriptable api = CodeGenBindGenBase.createEmptyModuleObject(); + CodeGenBindGenBase.injectJsStatic(api, true); + + Function staticSum = (Function) api.get("staticSum", api); + + assert ((Number) staticSum.call(null, null, null, new Object[]{5, 5, 5, 5})).intValue() == 15; + assert ((Number) staticSum.call(null, null, null, new Object[]{5, 5, 5})).intValue() == 15; + assert ((Number) staticSum.call(null, null, null, new Object[]{5, 5})).intValue() == 10; + assert ((Number) staticSum.call(null, null, null, new Object[]{5, null, 2f})).intValue() == 7; + assert ((Number) staticSum.call(null, null, null, new Object[]{"5", "5"})).intValue() == 10; + + Scriptable self = ((Function) api).construct(null, null, new Object[]{}); + + Function sum = (Function) self.get("sum", self); + + assert ((Number) sum.call(null, null, self, new Object[]{5, 5, 5, 5})).intValue() == 15; + assert ((Number) sum.call(null, null, self, new Object[]{5, 5, 5})).intValue() == 15; + assert ((Number) sum.call(null, null, self, new Object[]{5, 5})).intValue() == 10; + assert ((Number) sum.call(null, null, self, new Object[]{5, null, 2f})).intValue() == 7; + assert ((Number) sum.call(null, null, self, new Object[]{"5", "5"})).intValue() == 10; + + Function other = (Function) self.get("other", self); + + assert (other.call(null, null, self, new Object[]{"test", "5", self})).toString().equals("test55"); + + assert ((Number) self.get("test", self)).intValue() == 5; + self.put("test", self, 1); + + assert (other.call(null, null, self, new Object[]{"test", "5", self})).toString().equals("test51"); + } +}