Skip to content

Commit

Permalink
wasm: add test for js.FuncOf
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
aykevl authored and deadprogram committed Oct 19, 2024
1 parent 5e3c816 commit cd2bb83
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 0 deletions.
27 changes: 27 additions & 0 deletions main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
17 changes: 17 additions & 0 deletions testdata/wasmfunc.go
Original file line number Diff line number Diff line change
@@ -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 changes: 21 additions & 0 deletions testdata/wasmfunc.js
Original file line number Diff line number Diff line change
@@ -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 changes: 7 additions & 0 deletions testdata/wasmfunc.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
calling callback!
inside callback! parameters:
parameter: 1
parameter: 2
parameter: 3
parameter: 4
result from callback: 10

0 comments on commit cd2bb83

Please sign in to comment.