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:
Ayke van Laethem
2024-10-18 12:29:28 +02:00
committed by Ron Evans
parent 5e3c816373
commit cd2bb8333d
4 changed files with 72 additions and 0 deletions
+27
View File
@@ -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).
func TestWasmExportJS(t *testing.T) {
type testCase struct {
+17
View File
@@ -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")
}
+21
View File
@@ -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);
});
+7
View File
@@ -0,0 +1,7 @@
calling callback!
inside callback! parameters:
parameter: 1
parameter: 2
parameter: 3
parameter: 4
result from callback: 10