public async Task CatchAlwaysRunsBeforeFinally() { var success = false; Exception exception = null; Exception finallyException = null; var runOrder = new List <string>(); var output = new List <string>(); var expectedOutput = new List <string> { "one name" }; var task = new FuncTask <string>(Token, _ => "one name") { Affinity = TaskAffinity.UI } .Then((s, d) => output.Add(d)) .Then(_ => { throw new Exception("an exception"); }) .Then(new FuncTask <string>(Token, _ => "another name") { Affinity = TaskAffinity.Exclusive }) .Then((s, d) => { output.Add(d); return("done"); }) .Catch(ex => { Thread.Sleep(300); lock (runOrder) { exception = ex; runOrder.Add("catch"); } }) .Finally((s, e, d) => { Thread.Sleep(300); lock (runOrder) { success = s; finallyException = e; runOrder.Add("finally"); } return(d); }); await task.StartAsAsyncWithoutThrowing(); Assert.IsFalse(success); CollectionAssert.AreEqual(expectedOutput, output); Assert.IsNotNull(exception); Assert.IsNotNull(finallyException); Assert.AreEqual("an exception", exception.Message); Assert.AreEqual("an exception", finallyException.Message); CollectionAssert.AreEqual(new List <string> { "catch", "finally" }, runOrder); }
public async Task FinallyReportsException() { var success = false; Exception finallyException = null; var output = new List <string>(); var expectedOutput = new List <string> { "one name" }; var task = new FuncTask <string>(Token, _ => "one name") { Affinity = TaskAffinity.UI } .Then((s, d) => output.Add(d)) .Then(_ => { throw new Exception("an exception"); }) .Then(new FuncTask <string>(Token, _ => "another name") { Affinity = TaskAffinity.Exclusive }) .ThenInUI((s, d) => output.Add(d)) .Finally((s, e) => { success = s; finallyException = e; }); await task.StartAsAsyncWithoutThrowing(); Assert.IsFalse(success); CollectionAssert.AreEqual(expectedOutput, output); Assert.IsNotNull(finallyException); Assert.AreEqual("an exception", finallyException.Message); }
public async Task ThrowingInterruptsTaskChainButAlwaysRunsFinallyAndCatch() { var success = false; string thrown = ""; Exception finallyException = null; var output = new List <string>(); var expectedOutput = new List <string> { "one name" }; var task = new FuncTask <string>(Token, _ => "one name") { Affinity = TaskAffinity.UI } .Then((s, d) => output.Add(d)) .Then(_ => { throw new Exception("an exception"); }) .Catch(ex => thrown = ex.Message) .Then(new FuncTask <string>(Token, _ => "another name") { Affinity = TaskAffinity.Exclusive }) .ThenInUI((s, d) => output.Add(d)) .Finally((s, e) => { success = s; finallyException = e; }); await task.StartAsAsyncWithoutThrowing(); Assert.IsFalse(success); CollectionAssert.AreEqual(expectedOutput, output); Assert.IsNotNull(finallyException); }
public async Task TwoDefersInARowWillNotWork() { var runOrder = new List <int>(); var act = new FuncTask <List <int> >(Token, _ => runOrder) { Name = "First" } .Defer(GetData) .Defer(GetData2) .Finally((_, e, v) => v); ; var ret = await act.StartAsAsyncWithoutThrowing(); Assert.IsNull(ret); }
public async Task FinallyCanAlsoNotReturnData() { var success = false; Exception exception = null; Exception finallyException = null; var runOrder = new List <string>(); var output = new List <string>(); var expectedOutput = new List <string> { "one name", "another name", "done" }; var task = new FuncTask <string>(Token, _ => "one name") { Affinity = TaskAffinity.UI } .Then((s, d) => output.Add(d)) .Then(new FuncTask <string>(Token, _ => "another name") { Affinity = TaskAffinity.Exclusive }) .Then((s, d) => { output.Add(d); return("done"); }) .Finally((s, e, d) => { lock (runOrder) { success = s; output.Add(d); finallyException = e; runOrder.Add("finally"); } }); await task.StartAsAsyncWithoutThrowing(); Assert.IsTrue(success); CollectionAssert.AreEqual(expectedOutput, output); Assert.IsNull(exception); Assert.IsNull(finallyException); CollectionAssert.AreEqual(new List <string> { "finally" }, runOrder); }
public async Task AlwaysChainAsyncBodiesWithNonAsync() { var runOrder = new List <int>(); var act = new FuncTask <List <int> >(Token, _ => runOrder) { Name = "First" } .Defer(GetData) .Then((_, v) => { v.Add(2); return(v); }) .Defer(GetData2) .Then((_, v) => { v.Add(4); return(v); }) .Defer(async v => { await TaskEx.Delay(10); v.Add(5); return(v); }) .Then((_, v) => { v.Add(6); return(v); }) .Defer(v => new Task <List <int> >(() => { v.Add(7); return(v); }), TaskAffinity.Concurrent) .Finally((_, e, v) => v); ; var ret = await act.StartAsAsyncWithoutThrowing(); CollectionAssert.AreEqual(Enumerable.Range(1, 7), runOrder); }