mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-13 23:43:40 +00:00
wasm: add test for js.FuncOf
While there are some browser tests, Node.js is just a lot better for testing this kind of stuff because it's much faster and we don't need a browser for this.
This commit is contained in:
committed by
Ron Evans
parent
5e3c816373
commit
cd2bb8333d
@@ -690,6 +690,33 @@ func TestWasmExport(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test js.FuncOf (for syscall/js).
|
||||||
|
// This test might be extended in the future to cover more cases in syscall/js.
|
||||||
|
func TestWasmFuncOf(t *testing.T) {
|
||||||
|
// Build the wasm binary.
|
||||||
|
tmpdir := t.TempDir()
|
||||||
|
options := optionsFromTarget("wasm", sema)
|
||||||
|
buildConfig, err := builder.NewConfig(&options)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
result, err := builder.Build("testdata/wasmfunc.go", ".wasm", tmpdir, buildConfig)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("failed to build binary:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test the resulting binary using NodeJS.
|
||||||
|
output := &bytes.Buffer{}
|
||||||
|
cmd := exec.Command("node", "testdata/wasmfunc.js", result.Binary, buildConfig.BuildMode())
|
||||||
|
cmd.Stdout = output
|
||||||
|
cmd.Stderr = output
|
||||||
|
err = cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
t.Error("failed to run node:", err)
|
||||||
|
}
|
||||||
|
checkOutput(t, "testdata/wasmfunc.txt", output.Bytes())
|
||||||
|
}
|
||||||
|
|
||||||
// Test //go:wasmexport in JavaScript (using NodeJS).
|
// Test //go:wasmexport in JavaScript (using NodeJS).
|
||||||
func TestWasmExportJS(t *testing.T) {
|
func TestWasmExportJS(t *testing.T) {
|
||||||
type testCase struct {
|
type testCase struct {
|
||||||
|
|||||||
Vendored
+17
@@ -0,0 +1,17 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "syscall/js"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
js.Global().Call("setCallback", js.FuncOf(func(this js.Value, args []js.Value) any {
|
||||||
|
println("inside callback! parameters:")
|
||||||
|
sum := 0
|
||||||
|
for _, value := range args {
|
||||||
|
n := value.Int()
|
||||||
|
println(" parameter:", n)
|
||||||
|
sum += n
|
||||||
|
}
|
||||||
|
return sum
|
||||||
|
}))
|
||||||
|
js.Global().Call("callCallback")
|
||||||
|
}
|
||||||
Vendored
+21
@@ -0,0 +1,21 @@
|
|||||||
|
require('../targets/wasm_exec.js');
|
||||||
|
|
||||||
|
var callback;
|
||||||
|
|
||||||
|
global.setCallback = (cb) => {
|
||||||
|
callback = cb;
|
||||||
|
};
|
||||||
|
|
||||||
|
global.callCallback = () => {
|
||||||
|
console.log('calling callback!');
|
||||||
|
let result = callback(1, 2, 3, 4);
|
||||||
|
console.log('result from callback:', result);
|
||||||
|
};
|
||||||
|
|
||||||
|
let go = new Go();
|
||||||
|
WebAssembly.instantiate(fs.readFileSync(process.argv[2]), go.importObject).then((result) => {
|
||||||
|
go.run(result.instance);
|
||||||
|
}).catch((err) => {
|
||||||
|
console.error(err);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
calling callback!
|
||||||
|
inside callback! parameters:
|
||||||
|
parameter: 1
|
||||||
|
parameter: 2
|
||||||
|
parameter: 3
|
||||||
|
parameter: 4
|
||||||
|
result from callback: 10
|
||||||
Reference in New Issue
Block a user