(t *testing.T)
| 970 | } |
| 971 | |
| 972 | func TestContextAsync(t *testing.T) { |
| 973 | useStableOwnerHooksForLegacySubtests(t) |
| 974 | |
| 975 | rt := NewRuntime() |
| 976 | defer rt.Close() |
| 977 | ctx := rt.NewContext() |
| 978 | defer ctx.Close() |
| 979 | |
| 980 | t.Run("EventLoop", func(t *testing.T) { |
| 981 | result := ctx.Eval(` |
| 982 | var executed = false; |
| 983 | setTimeout(() => { executed = true; }, 10); |
| 984 | `) |
| 985 | defer result.Free() |
| 986 | require.False(t, result.IsException()) |
| 987 | |
| 988 | ctx.Loop() |
| 989 | |
| 990 | executedResult := ctx.Eval(`executed`) |
| 991 | defer executedResult.Free() |
| 992 | require.False(t, executedResult.IsException()) |
| 993 | require.True(t, executedResult.ToBool()) |
| 994 | }) |
| 995 | |
| 996 | // Updated: Use Function + Promise instead of AsyncFunction |
| 997 | t.Run("AwaitPromises", func(t *testing.T) { |
| 998 | // Test successful promise using new Promise API |
| 999 | asyncTestFn := ctx.NewFunction(func(ctx *Context, this *Value, args []*Value) *Value { |
| 1000 | return ctx.NewPromise(func(resolve, reject func(*Value)) { |
| 1001 | resolve(ctx.NewString("awaited result")) |
| 1002 | }) |
| 1003 | }) |
| 1004 | ctx.Globals().Set("asyncTest", asyncTestFn) |
| 1005 | |
| 1006 | promiseResult := ctx.Eval(`asyncTest()`) |
| 1007 | require.False(t, promiseResult.IsException()) |
| 1008 | require.True(t, promiseResult.IsPromise()) |
| 1009 | |
| 1010 | awaitedResult := ctx.Await(promiseResult) |
| 1011 | defer awaitedResult.Free() |
| 1012 | require.False(t, awaitedResult.IsException()) |
| 1013 | require.EqualValues(t, "awaited result", awaitedResult.ToString()) |
| 1014 | |
| 1015 | // Test rejected promise using new Promise API |
| 1016 | asyncRejectFn := ctx.NewFunction(func(ctx *Context, this *Value, args []*Value) *Value { |
| 1017 | return ctx.NewPromise(func(resolve, reject func(*Value)) { |
| 1018 | errorObj := ctx.NewError(errors.New("rejection reason")) |
| 1019 | defer errorObj.Free() |
| 1020 | reject(errorObj) |
| 1021 | }) |
| 1022 | }) |
| 1023 | ctx.Globals().Set("asyncReject", asyncRejectFn) |
| 1024 | |
| 1025 | rejectPromise := ctx.Eval(`asyncReject()`) |
| 1026 | require.False(t, rejectPromise.IsException()) |
| 1027 | |
| 1028 | rejectedResult := ctx.Await(rejectPromise) |
| 1029 | defer rejectedResult.Free() |
nothing calls this directly
no test coverage detected