Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mcs / tests / test-async-07.cs
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4
5 class Program
6 {
7         public static int Main ()
8         {
9                 var mre_l = new ManualResetEvent (false);
10                 var mre = new ManualResetEvent (false);
11
12                 Func<string, Task<string>> f = async l =>
13                         await Task.Factory.StartNew (() => {
14                                 if (!mre_l.WaitOne (3000))
15                                         throw new ApplicationException ("3");
16
17                                 return l;
18                         }).ConfigureAwait (false);
19
20                 var r = f ("a");
21                 mre_l.Set ();
22                 if (!r.Wait (3000))
23                         return 1;
24
25                 if (r.Result != "a")
26                         return 11;
27
28                 mre_l.Reset ();
29
30                 Func<Task> ff = async () =>
31                         await Task.Factory.StartNew (() => {
32                                 if (!mre_l.WaitOne (3000))
33                                         throw new ApplicationException ("3");
34                         }).ConfigureAwait (false);
35
36                 var rr = ff ();
37                 mre_l.Set ();
38                 if (!rr.Wait (3000))
39                         return 2;
40
41                 Func<short, Task<short>> f2 = async l => l;
42
43                 var r2 = f2 (88);
44                 if (r2.Result != 88)
45                         return 3;
46                 
47                 mre.Reset ();
48                 mre_l.Reset ();
49                 Action a = async () => await Task.Factory.StartNew (() => {
50                                 if (!mre_l.WaitOne (3000))
51                                         throw new ApplicationException ("4");
52                                 mre.Set ();
53                         }, CancellationToken.None).ConfigureAwait (false);
54                 
55                 a ();
56                 mre_l.Set ();
57                 if (!mre.WaitOne (3000))
58                         return 4;
59
60                 Console.WriteLine ("ok");
61                 return 0;
62         }
63 }