java
Version:
Bridge API to connect with existing Java APIs.
277 lines (216 loc) • 7.59 kB
text/typescript
import { beforeAll, describe, expect, test } from "vitest";
import { Java, JavaObject } from "../java";
import { expectJavaError, getJava } from "../testHelpers";
describe("Dynamic Proxy", () => {
let java!: Java;
beforeAll(async () => {
java = await getJava();
});
test("0 Arguments", () => {
let callCount = 0;
const myProxy = java.newProxy("RunInterface$Interface0Arg", {
run: function () {
callCount++;
},
});
const runInterface = java.newInstanceSync("RunInterface");
runInterface.run0ArgsSync(myProxy);
expect(callCount).toBe(2);
});
test("1 Arguments", () => {
let runData = "";
const myProxy = java.newProxy("RunInterface$Interface1Arg", {
run: (str: string) => {
runData += str;
},
});
const runInterface = java.newInstanceSync("RunInterface");
runInterface.run1ArgsSync(myProxy);
expect(runData).toBe("test1test1");
});
test("1 Arguments with return data", () => {
const myProxy = java.newProxy("RunInterface$InterfaceWithReturn", {
run: (i: number) => {
return i + 1;
},
});
const runInterface = java.newInstanceSync("RunInterface");
const result = runInterface.runWithReturnSync(myProxy);
expect(result).toBe(43);
});
test("Listener test", () => {
let runData = "";
const myProxy = java.newProxy("ListenerInterface", {
onEvent: (_list: JavaObject, _runtime: JavaObject) => {
runData = "onEvent";
},
});
const listenerTester = java.newInstanceSync("ListenerTester");
listenerTester.setListenerSync(myProxy);
listenerTester.raiseEventSync();
expect(runData).toBe("onEvent");
});
test("thread", async () => {
await new Promise<void>((resolve, reject) => {
let callCount = 0;
const myProxy = java.newProxy("java.lang.Runnable", {
run: function () {
callCount++;
},
});
const thread = java.newInstanceSync("java.lang.Thread", myProxy);
thread.startSync();
let timeout = 50;
function waitForThread(): void {
if (callCount === 1) {
return resolve();
}
timeout--;
if (timeout < 0) {
return reject(new Error("Timeout"));
}
setTimeout(waitForThread, 100);
}
waitForThread();
});
});
test("thread issue #143", async () => {
await new Promise<void>((resolve) => {
const myProxy = java.newProxy("RunInterface$InterfaceWithReturn", {
run: (i: number) => {
return i - 1;
},
});
const runInterface = java.newInstanceSync("RunInterface");
runInterface.runInAnotherThread(myProxy, (err: Error | undefined, result: number) => {
expect(err).toBeUndefined();
expect(result).toBe(45);
resolve();
});
});
});
test("java equals()", () => {
const myProxy = java.newProxy("RunInterface$InterfaceWithReturn", {});
const runInterface = java.newInstanceSync("RunInterface");
const result = runInterface.runEqualsSync(myProxy);
expect(result).toBe(false);
});
test("java equals() same instance", () => {
const myProxy = java.newProxy("RunInterface$InterfaceWithReturn", {});
const runInterface = java.newInstanceSync("RunInterface");
runInterface.setInstanceSync(myProxy);
const result = runInterface.runEqualsInstanceSync(myProxy);
expect(result).toBe(true);
});
test("java equals() different instance", () => {
const myProxy = java.newProxy("RunInterface$InterfaceWithReturn", {});
const myProxy2 = java.newProxy("RunInterface$InterfaceWithReturn", {});
const runInterface = java.newInstanceSync("RunInterface");
runInterface.setInstanceSync(myProxy);
const result = runInterface.runEqualsInstanceSync(myProxy2);
expect(result).toBe(false);
});
test("js equals()", () => {
const myProxy = java.newProxy("RunInterface$InterfaceWithReturn", {
equals: (_obj: JavaObject) => {
return true;
},
});
const runInterface = java.newInstanceSync("RunInterface");
const result = runInterface.runEqualsSync(myProxy);
expect(result).toBe(true);
});
test("java hashCode()", () => {
const myProxy = java.newProxy("RunInterface$InterfaceWithReturn", {});
const runInterface = java.newInstanceSync("RunInterface");
const result = runInterface.runHashCodeSync(myProxy);
const result2 = runInterface.runHashCodeSync(myProxy);
const systemHashCode = java.callStaticMethodSync("java.lang.System", "identityHashCode", myProxy);
expect(result).toBe(result2);
expect(result).toBe(systemHashCode);
});
test("js hashCode()", () => {
const myProxy = java.newProxy("RunInterface$InterfaceWithReturn", {
hashCode: function () {
return 1234;
},
});
const runInterface = java.newInstanceSync("RunInterface");
const result = runInterface.runHashCodeSync(myProxy);
expect(result).toBe(1234);
});
test("java toString()", () => {
const myProxy = java.newProxy("RunInterface$InterfaceWithReturn", {});
const runInterface = java.newInstanceSync("RunInterface");
const result = runInterface.runToStringSync(myProxy);
expect(result).toBe("[object Object]");
});
test("js toString()", () => {
const myProxy = java.newProxy("RunInterface$InterfaceWithReturn", {
toString: () => {
return "myRunInterface";
},
});
const runInterface = java.newInstanceSync("RunInterface");
const result = runInterface.runToStringSync(myProxy);
expect(result).toBe("myRunInterface");
});
test("js string error", () => {
const myProxy = java.newProxy("RunInterface$InterfaceWithReturn", {
run: (_i: JavaObject) => {
// eslint-disable-next-line @typescript-eslint/only-throw-error
throw "myError";
},
});
const runInterface = java.newInstanceSync("RunInterface");
try {
runInterface.runWithReturnSync(myProxy);
throw new Error("Exception was not thrown");
} catch (e) {
expectJavaError(e);
expect(e.cause.getClassSync().getNameSync()).toBe("java.lang.RuntimeException");
expect(e.message).toMatch(/Caused by: node\.NodeJsException:.*myError/);
}
});
test("js Error", () => {
const myProxy = java.newProxy("RunInterface$InterfaceWithReturn", {
run: (_i: JavaObject) => {
throw new Error("newError");
},
});
const runInterface = java.newInstanceSync("RunInterface");
try {
runInterface.runWithReturnSync(myProxy);
throw new Error("Exception was not thrown");
} catch (e) {
expectJavaError(e);
expect(e.cause.getClassSync().getNameSync()).toBe("java.lang.RuntimeException");
expect(e.message).toMatch(/Caused by: node\.NodeJsException:.*newError/);
}
});
test("invocationHandler", () => {
const myProxy = java.newProxy("RunInterface$InterfaceWithReturn", {
run: (i: number) => {
return i + 2;
},
});
const result = myProxy.invocationHandler.run(42);
expect(result).toBe(44);
});
test("unref", () => {
const myProxy = java.newProxy("RunInterface$InterfaceWithReturn", {
run: (i: number) => {
return i + 1;
},
});
myProxy.unref();
try {
myProxy.invocationHandler.run(42);
} catch (e) {
expectJavaError(e);
expect(e.message).toBe("dynamicProxyData has been destroyed or corrupted");
}
// call again
myProxy.unref();
});
});