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.StartAndSwallowException(); 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.StartAndSwallowException(); Assert.IsFalse(success); CollectionAssert.AreEqual(expectedOutput, output); Assert.IsNotNull(finallyException); }
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 => { lock (runOrder) { exception = ex; runOrder.Add("catch"); } }) .Finally((s, e, d) => { lock (runOrder) { success = s; finallyException = e; runOrder.Add("finally"); } return(d); }); await task.StartAndSwallowException(); 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); }