public void AwaitOnCompleted_ForcesTaskCreation(int numAwaits, bool awaitUnsafe) { AsyncValueTaskMethodBuilder <int> b = ValueTask <int> .CreateAsyncMethodBuilder(); var dsm = new DelegateStateMachine(); TaskAwaiter <int> t = new TaskCompletionSource <int>().Task.GetAwaiter(); Assert.InRange(numAwaits, 1, int.MaxValue); for (int i = 1; i <= numAwaits; i++) { if (awaitUnsafe) { b.AwaitUnsafeOnCompleted(ref t, ref dsm); } else { b.AwaitOnCompleted(ref t, ref dsm); } } b.SetResult(42); Assert.True(WrapsTask(b.Task)); Assert.Equal(42, b.Task.Result); }
public async Task AwaitOnCompleted_InvokesStateMachineMethods(bool awaitUnsafe) { AsyncValueTaskMethodBuilder <int> b = ValueTask <int> .CreateAsyncMethodBuilder(); var ignored = b.Task; var callbackCompleted = new TaskCompletionSource <bool>(); IAsyncStateMachine foundSm = null; var dsm = new DelegateStateMachine { MoveNextDelegate = () => callbackCompleted.SetResult(true), SetStateMachineDelegate = sm => foundSm = sm }; TaskAwaiter t = Task.CompletedTask.GetAwaiter(); if (awaitUnsafe) { b.AwaitUnsafeOnCompleted(ref t, ref dsm); } else { b.AwaitOnCompleted(ref t, ref dsm); } await callbackCompleted.Task; Assert.Equal(dsm, foundSm); }