public void AsyncTaskBodyThrowsException() { int state = 0; var tcs = new TaskCompletionSource <int>(); Task task = tcs.Task; var ex = new Exception("Some text"); Func <Task> someMethod = async() => { state = 1; await task; state = 2; throw ex; }; Task asyncTask = someMethod(); Assert.AreEqual(asyncTask.Status, TaskStatus.Running, "asyncTask should be running immediately"); Assert.AreEqual(state, 1, "Async method should start running after being invoked"); Window.SetTimeout(() => { Assert.AreEqual(asyncTask.Status, TaskStatus.Running, "asyncTask should be running before awaited task is finished"); Assert.AreEqual(state, 1, "Async method should not continue past point 1 until task is finished"); }, 100); Window.SetTimeout(() => { tcs.SetResult(0); }, 200); Window.SetTimeout(() => { Assert.AreEqual(asyncTask.Status, TaskStatus.Faulted, "asyncTask should fault"); Assert.IsTrue(asyncTask.Exception != null, "asyncTask should have an exception"); Assert.IsTrue(asyncTask.Exception.InnerExceptions[0] == ex, "asyncTask should throw the correct exception"); Assert.AreEqual(state, 2, "Async method should finish after the task is finished"); QUnit.Start(); }, 300); }
public void AsyncVoid() { int state = 0; var tcs = new TaskCompletionSource <int>(); Task task = tcs.Task; Action someMethod = async() => { state = 1; await task; state = 2; }; someMethod(); Assert.AreEqual(state, 1, "Async method should start running after being invoked"); Window.SetTimeout(() => { Assert.AreEqual(state, 1, "Async method should not continue past point 1 until task is finished"); }, 100); Window.SetTimeout(() => { tcs.SetResult(0); }, 200); Window.SetTimeout(() => { Assert.AreEqual(state, 2, "Async method should finish after the task is finished"); QUnit.Start(); }, 300); }
public void AsyncTask() { int state = 0; var tcs = new TaskCompletionSource <int>(); Task task = tcs.Task; Func <Task> someMethod = async() => { state = 1; await task; state = 2; }; Task asyncTask = someMethod(); Assert.AreEqual(asyncTask.Status, TaskStatus.Running, "asyncTask should be running immediately"); Assert.AreEqual(state, 1, "Async method should start running after being invoked"); Window.SetTimeout(() => { Assert.AreEqual(asyncTask.Status, TaskStatus.Running, "asyncTask should be running before awaited task is finished"); Assert.AreEqual(state, 1, "Async method should not continue past point 1 until task is finished"); }, 100); Window.SetTimeout(() => { tcs.SetResult(0); }, 200); Window.SetTimeout(() => { Assert.AreEqual(asyncTask.Status, TaskStatus.RanToCompletion, "asyncTask should run to completion"); Assert.IsTrue(asyncTask.Exception == null, "asyncTask should not throw an exception"); Assert.AreEqual(state, 2, "Async method should finish after the task is finished"); QUnit.Start(); }, 300); }
public void TaskFromPromiseWithoutResultFactoryWorksWhenPromiseCompletes() { var promise = CreatePromise(); var task = Task.FromPromise(promise); Assert.AreEqual(task.Status, TaskStatus.Running, "Task should be running after being created"); bool continuationRun = false; task.ContinueWith(t => { Assert.IsTrue(t == task, "ContinueWith parameter should be correct"); continuationRun = true; }); Window.SetTimeout(() => { Assert.IsFalse(continuationRun, "Continuation should not be run too early."); Assert.AreEqual(task.Status, TaskStatus.Running, "Task should be running before promise is completed."); promise.Resolve(42, "result 123", 101); }, 100); Window.SetTimeout(() => { Assert.AreEqual(task.Status, TaskStatus.RanToCompletion, "Task should be completed after promise"); Assert.IsTrue(continuationRun, "Continuation should have been run after promise was completed."); Assert.AreEqual(task.Result, new object[] { 42, "result 123", 101 }, "The result should be correct"); QUnit.Start(); }, 200); }
public async void FailingPromiseCanBeAwaited() { var promise = CreatePromise(); bool continuationRun = false; Window.SetTimeout(() => { Assert.IsFalse(continuationRun, "Continuation should not be run too early."); promise.Reject(42, "result 123", 101); }, 100); Window.SetTimeout(() => { Assert.IsTrue(continuationRun, "Continuation should have been run after promise was rejected."); QUnit.Start(); }, 200); try { await promise; Assert.IsTrue(false, "Await should throw"); } catch (AggregateException ex) { Assert.AreEqual(ex.InnerExceptions.Length, 1, "Exception should have one inner exception"); Assert.IsTrue(ex.InnerExceptions[0] is PromiseException, "Inner exception should be a PromiseException"); Assert.AreEqual(((PromiseException)ex.InnerExceptions[0]).Arguments, new object[] { 42, "result 123", 101 }, "The PromiseException arguments should be correct"); } catch (Exception ex) { Assert.IsTrue(false, "Thrown exception should have been an AggregateException, was " + ex.GetType().FullName); } continuationRun = true; }
public void TaskFromPromiseWorksWhenPromiseFails() { var promise = CreatePromise(); var task = Task.FromPromise(promise); Assert.AreEqual(task.Status, TaskStatus.Running, "Task should be running after being created"); bool continuationRun = false; task.ContinueWith(t => { Assert.IsTrue(t == task, "ContinueWith parameter should be correct"); continuationRun = true; }); Window.SetTimeout(() => { Assert.IsFalse(continuationRun, "Continuation should not be run too early."); Assert.AreEqual(task.Status, TaskStatus.Running, "Task should be running before promise is completed."); promise.Reject(42, "result 123", 101); }, 100); Window.SetTimeout(() => { Assert.AreEqual(task.Status, TaskStatus.Faulted, "Task should have faulted after the promise was rejected."); Assert.IsTrue(continuationRun, "Continuation should have been run after promise was rejected."); Assert.IsTrue((object)task.Exception is AggregateException, "Exception should be an AggregateException"); Assert.AreEqual(task.Exception.InnerExceptions.Length, 1, "Exception should have one inner exception"); Assert.IsTrue(task.Exception.InnerExceptions[0] is PromiseException, "Inner exception should be a PromiseException"); Assert.AreEqual(((PromiseException)task.Exception.InnerExceptions[0]).Arguments, new object[] { 42, "result 123", 101 }, "The PromiseException arguments should be correct"); QUnit.Start(); }, 200); }
public async void CompletingPromiseCanBeAwaited() { var promise = CreatePromise(); object[] result = null; Window.SetTimeout(() => { Assert.IsTrue(result == null, "Await should not finish too early."); promise.Resolve(42, "result 123", 101); }, 100); Window.SetTimeout(() => { Assert.AreEqual(result, new object[] { 42, "result 123", 101 }, "The result should be correct"); QUnit.Start(); }, 200); result = await promise; }
public void TaskFromPromiseWithResultIndexWorksWhenPromiseCompletes() { var promise = CreatePromise(); var tasks = new Task <int>[] { Task.FromPromise <int>(promise, 0), Task.FromPromise <int>(promise, 1), Task.FromPromise <int>(promise, 2), Task.FromPromise <int>(promise, -3), Task.FromPromise <int>(promise, -2), Task.FromPromise <int>(promise, -1), }; var continuationsRun = new bool[6]; Assert.IsTrue(tasks.Every(t => t.Status == TaskStatus.Running), "Tasks should be running after being created"); tasks.ForEach((x, i, _) => x.ContinueWith(t => { Assert.IsTrue(t == x, "ContinueWith parameter should be correct"); continuationsRun[i] = true; })); Window.SetTimeout(() => { Assert.IsFalse(continuationsRun.Some(x => x), "Continuations should not be run too early."); Assert.IsTrue(tasks.Every(t => t.Status == TaskStatus.Running), "Tasks should be running before promise is completed."); promise.Resolve(10, 42, 38); }, 100); Window.SetTimeout(() => { Assert.IsTrue(tasks.Every(t => t.Status == TaskStatus.RanToCompletion), "Task should be completed after promise"); Assert.IsTrue(continuationsRun.Every(x => x), "Continuations should have been run after promise was completed."); Assert.AreEqual(tasks[0].Result, 10, "Task 0 result should be correct"); Assert.AreEqual(tasks[1].Result, 42, "Task 1 result should be correct"); Assert.AreEqual(tasks[2].Result, 38, "Task 2 result should be correct"); Assert.AreEqual(tasks[3].Result, 10, "Task 3 result should be correct"); Assert.AreEqual(tasks[4].Result, 42, "Task 4 result should be correct"); Assert.AreEqual(tasks[5].Result, 38, "Task 5 result should be correct"); QUnit.Start(); }, 200); }