package builtin import ( "context" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "modernc.org/quickjs" ) type TestArgs struct { Field1 string `json:"field1"` } func (t TestArgs) Validate() error { return nil } func TestAsyncBuiltin(t *testing.T) { RegisterAsyncBuiltin("testAsync", func(_ context.Context, args TestArgs) (string, error) { return "result: " + args.Field1, nil }) registryMutex.RLock() builtin, ok := builtinRegistry["testAsync"] registryMutex.RUnlock() require.True(t, ok, "testAsync should be registered") assert.Contains(t, builtin.Definition(), "Promise", "definition should include Promise") } func TestAsyncBuiltinResolution(t *testing.T) { RegisterAsyncBuiltin("resolveTest", func(_ context.Context, args TestArgs) (string, error) { return "test-result", nil }) vm, err := quickjs.NewVM() require.NoError(t, err) defer func() { _ = vm.Close() }() vm.SetCanBlock(true) RegisterBuiltins(context.Background(), vm) result, err := vm.Eval(`resolveTest("hello")`, quickjs.EvalGlobal) require.NoError(t, err) assert.NotNil(t, result) } func TestAsyncBuiltinRejection(t *testing.T) { RegisterAsyncBuiltin("rejectTest", func(_ context.Context, args TestArgs) (string, error) { return "", assert.AnError }) vm, err := quickjs.NewVM() require.NoError(t, err) defer func() { _ = vm.Close() }() vm.SetCanBlock(true) RegisterBuiltins(context.Background(), vm) result, err := vm.Eval(`rejectTest({field1: "hello"})`, quickjs.EvalGlobal) require.NoError(t, err) assert.NotNil(t, result) } func TestNonPromise(t *testing.T) { RegisterBuiltin("nonPromiseTest", func(_ context.Context, args TestArgs) (string, error) { return "sync-result", nil }) vm, err := quickjs.NewVM() require.NoError(t, err) defer func() { _ = vm.Close() }() vm.SetCanBlock(true) RegisterBuiltins(context.Background(), vm) result, err := vm.Eval(`nonPromiseTest({field1: "hello"})`, quickjs.EvalGlobal) require.NoError(t, err) if obj, ok := result.(*quickjs.Object); ok { var arr []any if err := obj.Into(&arr); err == nil && len(arr) > 0 { assert.Equal(t, "sync-result", arr[0]) } } }