-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinvoke.js
98 lines (77 loc) · 3.35 KB
/
invoke.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
var assert = require('assert');
var java = require('../');
var vm = java.createVm();
var cls = vm.findClass("test/Test");
assert.strictEqual(vm.findClass("test/Test"), cls);
// newInstance
var javaObject = cls.newInstance('ZBCSIFDJLjava/lang/String;',
true, 127, 'A', 4095, 1048575, 12.34, Math.PI, Date.now(), 'Hello world');
console.time('invoke');
javaObject.invoke('method(Ljava/lang/String;)V', 'test');
assert(javaObject.invoke('method(Z)Z', false));
assert.strictEqual(javaObject.invoke('method(B)B', 1), 2);
assert.strictEqual(javaObject.invoke('method(S)S', 1), 2);
assert.strictEqual(javaObject.invoke('method(C)C', '你好'), 20321);
assert.strictEqual(javaObject.invoke('method(I)I', 1234), ~1234);
assert.strictEqual(javaObject.invoke('method(I)I', -1234), ~-1234);
assert.strictEqual(javaObject.invoke('method(F)F', 12.5), 13.5);
assert.strictEqual(javaObject.invoke('method(D)D', 12.5), 12.5 + Math.PI);
assert.strictEqual(javaObject.invoke('method(J)J', 1234), 1234 + 10000000000000000);
assert.strictEqual(javaObject.invoke('method(CC)Ljava/lang/String;', 0x41, 0x42), "AB");
var dummy = javaObject.invoke("method(Ltest/Test;)Ltest/Test;", javaObject);
assert(javaObject.invoke("equals(Ljava/lang/Object;)Z", dummy));
assert.strictEqual(javaObject.invoke('nullMethod()Ljava/lang/Object;'), null);
assert.strictEqual(javaObject.invoke('nullStringMethod()Ljava/lang/String;'), null);
assert.strictEqual(javaObject.invoke("method(Ltest/Test;)Ltest/Test;", null), null);
var str = javaObject.invoke("method(Ljava/lang/String;I)Ljava/lang/Object;", "foobar", 3);
assert.strictEqual(javaObject.invoke("method(Ljava/lang/String;C)Ljava/lang/String;", str, 'z'), 'barz');
var _e;
try {
javaObject.invoke('throwRuntimeException(Ljava/lang/String;)V', 'sync')
} catch (e) {
assert(/^java.lang.RuntimeException: \d{13}: sync$/.test(e.message));
_e = true;
}
assert(_e);
console.timeEnd('invoke');
assert.strictEqual(javaObject.getClass(), cls);
assert.strictEqual(dummy.getClass(), cls);
_e = null;
try {
javaObject.invoke('notFound()V')
} catch (e) {
assert.strictEqual(e.message, "method `notFound' with signature `()V' not found.");
_e = true;
}
assert(_e);
// new Date().toString()
console.log("new Date(Date.now()).toString(): " + vm.findClass("java/util/Date").newInstance("J", Date.now()).invoke("toString()Ljava/lang/String;"));
console.time('static');
// invokeStatic
var System = vm.findClass('java/lang/System');
console.log("System.currentTimeMillis(): " + System.invoke('currentTimeMillis()J'));
console.log("Math.random(): " + vm.findClass("java/lang/Math").invoke('random()D'));
console.timeEnd('static');
var _async_ok = false;
// invoke async
javaObject.invokeAsync("method(Ltest/Test;)Ltest/Test;", javaObject).then(function (dummy) {
assert(dummy);
return dummy.invokeAsync('throwRuntimeException(Ljava/lang/String;)V', 'async');
}, function (err) {
throw err
}).then(function () {
throw new Error('should not be here')
}, function (err) {
assert(/^java.lang.RuntimeException: \d{13}: async$/.test(err.message));
return vm.findClass('java/lang/System').invokeAsync('currentTimeMillis()J')
}).then(function (timestamp) {
assert(Math.abs(timestamp - Date.now()) < 10);
_async_ok = true;
}, function (err) {
throw err;
});
process.on('exit', function () {
if (!_async_ok) {
console.log('async_ok not set');
}
});