1 // OutputAvailableTest.cs
3 // Copyright (c) 2012 Petr Onderka
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:
12 // The above copyright notice and this permission notice shall be included in
13 // all copies or substantial portions of the Software.
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
24 using System.Threading;
25 using System.Threading.Tasks.Dataflow;
26 using NUnit.Framework;
28 namespace MonoTests.System.Threading.Tasks.Dataflow {
30 public class OutputAvailableTest {
32 public void ImmediateTest()
34 var scheduler = new TestScheduler();
35 var source = new BufferBlock<int>(new DataflowBlockOptions{TaskScheduler = scheduler});
37 Assert.IsTrue(source.Post(1));
39 var task = source.OutputAvailableAsync();
41 // not necessary in MS.NET
42 scheduler.ExecuteAll();
44 Assert.IsTrue(task.IsCompleted);
45 Assert.IsTrue(task.Result);
49 public void PostponedTest()
51 var source = new BufferBlock<int>(new DataflowBlockOptions());
53 var task = source.OutputAvailableAsync();
55 Assert.IsFalse(task.Wait(100));
57 Assert.IsTrue(source.Post(1));
59 Assert.IsTrue(task.Wait(100));
60 Assert.IsTrue(task.Result);
64 public void CompletedImmediateTest()
66 var source = new BufferBlock<int>();
69 var task = source.OutputAvailableAsync();
71 Assert.IsTrue(task.Wait(100));
72 Assert.IsFalse(task.Result);
76 public void CompletedPostponedTest()
78 var source = new BufferBlock<int>(new DataflowBlockOptions());
80 var task = source.OutputAvailableAsync();
82 Assert.IsFalse(task.Wait(100));
86 Assert.IsTrue(task.Wait(100));
87 Assert.IsFalse(task.Result);
91 public void FaultedImmediateTest()
93 var source = new BufferBlock<int>();
94 ((IDataflowBlock)source).Fault(new Exception());
96 var task = source.OutputAvailableAsync();
98 Assert.IsTrue(task.Wait(100));
99 Assert.IsFalse(task.Result);
103 public void FaultedPostponedTest()
105 var source = new BufferBlock<int>();
107 var task = source.OutputAvailableAsync();
109 Assert.IsFalse(task.Wait(100));
111 ((IDataflowBlock)source).Fault(new Exception());
113 Assert.IsTrue(task.Wait(100));
114 Assert.IsFalse(task.Result);
118 public void WithTargetTest()
120 var source = new BufferBlock<int>();
121 var target = new BufferBlock<int>();
122 source.LinkTo(target);
124 var task = source.OutputAvailableAsync();
126 Assert.IsTrue(source.Post(1));
128 Assert.IsFalse(task.Wait(100));
132 public void WithDecliningTargetTest()
134 var source = new BufferBlock<int>();
135 var target = new BufferBlock<int>();
136 source.LinkTo(target, i => false);
138 var task = source.OutputAvailableAsync();
140 Assert.IsTrue(source.Post(1));
142 Assert.IsTrue(task.Wait(100));
143 Assert.IsTrue(task.Result);
147 public void CancellationTest()
149 var source = new BufferBlock<int>();
151 var tokenSource = new CancellationTokenSource();
152 var task = source.OutputAvailableAsync(tokenSource.Token);
154 tokenSource.Cancel();
156 AssertEx.Throws<AggregateException>(() => task.Wait(100));
157 Assert.IsTrue(task.IsCanceled);