Mercurial > pub > ImplabNet
comparison Implab.Test/CancelationTests.cs @ 145:706fccb85524 v2
RC: cancellation support for promises + tests
author | cin |
---|---|
date | Sun, 08 Mar 2015 02:52:27 +0300 |
parents | |
children | eb793fbbe4ea |
comparison
equal
deleted
inserted
replaced
144:8c0b95069066 | 145:706fccb85524 |
---|---|
1 using System; | |
2 using Implab.Parallels; | |
3 | |
4 #if MONO | |
5 | |
6 using NUnit.Framework; | |
7 using TestClassAttribute = NUnit.Framework.TestFixtureAttribute; | |
8 using TestMethodAttribute = NUnit.Framework.TestAttribute; | |
9 | |
10 #else | |
11 | |
12 using Microsoft.VisualStudio.TestTools.UnitTesting; | |
13 | |
14 #endif | |
15 | |
16 namespace Implab.Test { | |
17 [TestClass] | |
18 public class CancelationTests { | |
19 | |
20 [TestMethod] | |
21 public void PromiseCancelTest() { | |
22 var p = new Promise(); | |
23 bool requested = false; | |
24 var reason = new Exception("Test"); | |
25 | |
26 // request cancelation | |
27 p.Cancel(reason); | |
28 | |
29 Assert.IsTrue(p.IsCancellationRequested); | |
30 Assert.AreSame(reason, p.CancellationReason); | |
31 Assert.IsFalse(p.IsCancelled); | |
32 | |
33 p.CancellationRequested(r => { | |
34 Assert.AreSame(reason, r); | |
35 requested = true; | |
36 }); | |
37 | |
38 Assert.IsTrue(requested); | |
39 | |
40 // cancel the promise | |
41 Assert.IsTrue(p.CancelOperationIfRequested()); | |
42 Assert.IsTrue(p.IsCancelled); | |
43 Assert.AreSame(reason, p.Error); | |
44 } | |
45 | |
46 [TestMethod] | |
47 public void CancelActionBeforeStartTask() { | |
48 bool run = false; | |
49 var task = new ActionTask(() => { | |
50 run = true; | |
51 }, null, null); | |
52 | |
53 // request cancelation | |
54 task.Cancel(); | |
55 Assert.IsTrue(task.IsCancelled); | |
56 task.Resolve(); | |
57 Assert.IsFalse(run); | |
58 } | |
59 | |
60 [TestMethod] | |
61 public void CancelActionAfterTaskStarted() { | |
62 var finish = new Signal(); | |
63 var started = new Signal(); | |
64 | |
65 var task = new ActionTask(() => { | |
66 started.Set(); | |
67 finish.Wait(); | |
68 }, null, null); | |
69 | |
70 AsyncPool.RunThread(() => { | |
71 task.Resolve(); | |
72 }); | |
73 | |
74 started.Wait(1000); | |
75 | |
76 task.Cancel(); | |
77 Assert.IsTrue(task.IsCancellationRequested); | |
78 Assert.IsFalse(task.IsCancelled); | |
79 Assert.IsFalse(task.IsResolved); | |
80 | |
81 finish.Set(); | |
82 task.Join(1000); | |
83 | |
84 } | |
85 | |
86 [TestMethod] | |
87 public void CancelTaskChainFromBottom() { | |
88 var check1 = new Signal(); | |
89 var requested = false; | |
90 var p1 = AsyncPool.RunThread(token => { | |
91 token.CancellationRequested(reason => requested = true); | |
92 check1.Wait(); | |
93 token.CancelOperationIfRequested(); | |
94 }); | |
95 | |
96 var p2 = p1.Then(() => { | |
97 }); | |
98 | |
99 Assert.IsFalse(p1.IsResolved); | |
100 Assert.IsFalse(p2.IsResolved); | |
101 | |
102 p2.Cancel(); | |
103 | |
104 Assert.IsFalse(p2.IsCancelled); | |
105 Assert.IsFalse(p1.IsCancelled); | |
106 Assert.IsTrue(requested); | |
107 | |
108 check1.Set(); | |
109 | |
110 try { | |
111 p2.Join(1000); | |
112 Assert.Fail("The chain isn't cancelled"); | |
113 } catch(OperationCanceledException){ | |
114 } | |
115 | |
116 Assert.IsTrue(p1.IsCancelled); | |
117 Assert.IsTrue(p2.IsCancelled); | |
118 } | |
119 | |
120 | |
121 | |
122 [TestMethod] | |
123 public void CancellableAsyncTask() { | |
124 var finish = new Signal(); | |
125 var started = new Signal(); | |
126 | |
127 var p = AsyncPool.RunThread(token => { | |
128 token.CancellationRequested(r => finish.Set()); | |
129 started.Set(); | |
130 finish.Wait(); | |
131 Assert.IsTrue(token.CancelOperationIfRequested()); | |
132 }); | |
133 | |
134 started.Wait(1000); | |
135 Assert.IsFalse(p.IsResolved); | |
136 p.Cancel(); | |
137 try { | |
138 p.Join(1000); | |
139 } catch (OperationCanceledException) { | |
140 } | |
141 } | |
142 } | |
143 } | |
144 |