1 // Task_T_Tests.cs 2 // 3 // Copyright (c) 2008 Jérémie "Garuma" Laval 4 // 5 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // of this software and associated documentation files (the "Software"), to deal 7 // in the Software without restriction, including without limitation the rights 8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 // copies of the Software, and to permit persons to whom the Software is 10 // furnished to do so, subject to the following conditions: 11 // 12 // The above copyright notice and this permission notice shall be included in 13 // all copies or substantial portions of the Software. 14 // 15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 // THE SOFTWARE. 22 // 23 // 24 25 26 using System; 27 using System.Threading; 28 using System.Threading.Tasks; 29 30 using NUnit.Framework; 31 32 namespace MonoTests.System.Threading.Tasks 33 { 34 [TestFixture] 35 public class Task_T_Tests 36 { InitTestTask()37 Task<int> InitTestTask() 38 { 39 return Task.Factory.StartNew<int> (() => 5); 40 } 41 42 [Test] SimpleTaskTestCase()43 public void SimpleTaskTestCase () 44 { 45 Task<int> f = InitTestTask (); 46 47 Assert.IsNotNull(f, "#1"); 48 Assert.AreEqual(5, f.Result, "#2"); 49 } 50 51 [Test] TaskContinueWithTestCase()52 public void TaskContinueWithTestCase () 53 { 54 bool result = false; 55 56 Task<int> f = InitTestTask (); 57 Task<int> cont = f.ContinueWith ((future) => { result = true; return future.Result * 2; }); 58 f.Wait (); 59 cont.Wait (); 60 61 Assert.IsNotNull (cont, "#1"); 62 Assert.IsTrue (result, "#2"); 63 Assert.AreEqual (10, cont.Result); 64 } 65 CreateNestedFuture(int level)66 static Task<int> CreateNestedFuture(int level) 67 { 68 if (level == 0) 69 return Task.Factory.StartNew(() => { Thread.Sleep (1); return 1; }); 70 71 var t = CreateNestedFuture(level - 1); 72 return Task.Factory.StartNew(() => t.Result + 1); 73 } 74 75 [Test] NestedFutureTest()76 public void NestedFutureTest () 77 { 78 ParallelTestHelper.Repeat (delegate { 79 var t = CreateNestedFuture(10); 80 var t2 = CreateNestedFuture(100); 81 var t3 = CreateNestedFuture(100); 82 83 Assert.AreEqual (11, t.Result); 84 Assert.AreEqual (101, t2.Result); 85 Assert.AreEqual (101, t3.Result); 86 }, 50); 87 } 88 89 [Test] FaultedFutureTest()90 public void FaultedFutureTest () 91 { 92 var thrown = new ApplicationException (); 93 var f = Task<int>.Factory.StartNew (() => { throw thrown; }); 94 AggregateException ex = null; 95 try { 96 f.Wait (); 97 } catch (AggregateException e) { 98 ex = e; 99 } 100 101 Assert.IsNotNull (ex); 102 Assert.AreEqual (thrown, ex.InnerException); 103 Assert.AreEqual (thrown, f.Exception.InnerException); 104 Assert.AreEqual (TaskStatus.Faulted, f.Status); 105 106 ex = null; 107 try { 108 var result = f.Result; 109 } catch (AggregateException e) { 110 ex = e; 111 } 112 113 Assert.IsNotNull (ex); 114 Assert.AreEqual (TaskStatus.Faulted, f.Status); 115 Assert.AreEqual (thrown, f.Exception.InnerException); 116 Assert.AreEqual (thrown, ex.InnerException); 117 } 118 } 119 } 120