1 using System;
2 using System.Threading.Tasks;
3 using System.Threading;
4 using System.Reflection;
5 using System.Linq;
6 using System.Runtime.CompilerServices;
7 
8 struct S
9 {
10 	public int Value;
11 	public S2 s2;
12 
SS13 	public S (int a1, string a2)
14 	{
15 		Value = a1;
16 		s2 = new S2 ();
17 	}
18 
SetValueS19 	public void SetValue (int value)
20 	{
21 		Value = value;
22 	}
23 
operator SS24 	public static implicit operator S (Base b)
25 	{
26 		return new S (400, "a");
27 	}
28 
operator +S29 	public static S operator + (S a, S b)
30 	{
31 		return new S () {
32 			Value = a.Value + b.Value
33 		};
34 	}
35 }
36 
37 struct S2
38 {
39 	public int Value;
40 }
41 
42 enum E
43 {
44 	E_1 = 1
45 }
46 
47 class Base
48 {
49 	public volatile int field_int;
50 	protected int field_this;
51 	protected int property_this_counter;
52 
53 	public event Action Event;
54 
Base()55 	public Base ()
56 	{
57 	}
58 
Base(int arg, int arg2)59 	public Base (int arg, int arg2)
60 	{
61 		field_int = arg;
62 	}
63 
64 	public bool PropertyBool {
65 		get {
66 			return true;
67 		}
68 	}
69 
70 	public int PropertyInt {
71 		get {
72 			return field_int;
73 		}
74 		set {
75 			field_int += value;
76 		}
77 	}
78 
79 	protected Base PropertyThis {
80 		get {
81 			++property_this_counter;
82 			return this;
83 		}
84 	}
85 
86 	public int this [int arg] {
87 		get {
88 			return field_this;
89 		}
90 		set {
91 			field_this += value * arg;
92 		}
93 	}
94 
operator true(Base a)95 	public static bool operator true (Base a)
96 	{
97 		return true;
98 	}
99 
operator false(Base a)100 	public static bool operator false (Base a)
101 	{
102 		return false;
103 	}
104 
operator &(Base a, Base b)105 	public static Base operator & (Base a, Base b)
106 	{
107 		return new Base () {
108 			field_int = 100
109 		};
110 	}
111 
operator |(Base a, Base b)112 	public static Base operator | (Base a, Base b)
113 	{
114 		return new Base () {
115 			field_int = 200
116 		};
117 	}
118 
Call(int arg1, int arg2, int arg3)119 	protected int Call (int arg1, int arg2, int arg3)
120 	{
121 		if (arg1 != 5)
122 			return 1;
123 
124 		if (arg2 != -3)
125 			return 2;
126 
127 		if (arg3 != 6)
128 			return 3;
129 
130 		return 0;
131 	}
132 
Call(ref char ch, int arg)133 	protected int Call(ref char ch, int arg)
134 	{
135 		ch = 'z';
136 		return arg;
137 	}
138 
CallBool(bool b)139 	public void CallBool (bool b)
140 	{
141 	}
142 
CallS(S s)143 	public int CallS (S s)
144 	{
145 		return s.Value;
146 	}
147 
CreateArray(int size)148 	public T[] CreateArray<T> (int size)
149 	{
150 		return new T [size];
151 	}
152 
CallRefParams(ref int i, params int[] i2)153 	protected static void CallRefParams (ref int i, params int[] i2)
154 	{
155 		i = 5;
156 	}
157 
CallNamed(int a, int b)158 	protected int CallNamed (int a, int b)
159 	{
160 		return a - b;
161 	}
162 
CallEvent()163 	protected void CallEvent ()
164 	{
165 		Event ();
166 	}
167 }
168 
169 class Tester : Base
170 {
ArrayAccessTest_1()171 	async Task<bool> ArrayAccessTest_1 ()
172 	{
173 		bool[] b = new bool[1];
174 		b [0] = await Task.Factory.StartNew (() => true);
175 		return b[await Task.Factory.StartNew (() => 0)];
176 	}
177 
ArrayAccessTest_2()178 	async Task<int> ArrayAccessTest_2 ()
179 	{
180 		double[] b = new double[2];
181 		b [await Task.Factory.StartNew (() => 1)] = 5.5;
182 		if (b [1] != 5.5)
183 			return 1;
184 
185 		var d = b [await Task.Factory.StartNew (() => 1)] = 2.5;
186 		if (b [1] != 2.5)
187 			return 2;
188 
189 		if (d != 2.5)
190 			return 3;
191 
192 		d = b [await Task.Factory.StartNew (() => 1)] = await Task.Factory.StartNew (() => 4.4);
193 		if (d != 4.4)
194 			return 4;
195 
196 		return 0;
197 	}
198 
ArrayAccessTest_3()199 	async Task<int> ArrayAccessTest_3 ()
200 	{
201 		decimal[] d = new decimal [4];
202 		d[1] = 4;
203 
204 		var r = ++d[await Task.Factory.StartNew (() => 1)];
205 		if (r != 5)
206 			return 1;
207 
208 		d [1] = 6;
209 		d [await Task.Factory.StartNew (() => 1)] += await Task.Factory.StartNew (() => 9.9m);
210 		if (d [1] != 15.9m)
211 			return 2;
212 
213 		d [1] = 6;
214 		r =  d [await Task.Factory.StartNew (() => 1)] -= await Task.Factory.StartNew (() => 5.9m);
215 		if (d [1] != 0.1m)
216 			return 3;
217 
218 		return 0;
219 	}
220 
ArrayAccessTest_4()221 	async Task<bool> ArrayAccessTest_4 ()
222 	{
223 		string[] s = new string [4];
224 		s[1] = "a";
225 
226 		s [await Task.Factory.StartNew (() => 1)] += await Task.Factory.StartNew (() => "b");
227 		return s [1] == "ab";
228 	}
229 
ArrayAccessTest_5()230 	async Task<bool> ArrayAccessTest_5 ()
231 	{
232 		int[][] a = new int[3][];
233 		a [1] = new int [5];
234 		int index = 1;
235 		CallRefParams (ref a[await Task.Factory.StartNew (() => index++)][0], await Task.Factory.StartNew (() => 3));
236 		return a [1][0] == 5;
237 	}
238 
ArrayAccessTest_6()239 	async Task<int> ArrayAccessTest_6 ()
240 	{
241 		int value = -6;
242 		int[] a = new int[3] { 3, 6, 9 };
243 		return a [await Task.Factory.StartNew (() => (long)1)] + value;
244 	}
245 
ArrayAccessTest_7()246 	async Task<bool> ArrayAccessTest_7 ()
247 	{
248 		short?[] s = new short?[] { 3, 2, 1 };
249 		var r = s [await Task.Factory.StartNew (() => 1)]++;
250 		return r == 2;
251 	}
252 
ArrayAccessTest_8()253 	async Task<int> ArrayAccessTest_8 ()
254 	{
255 		var s = new byte?[] { 3, 2, 1 };
256 		var r = s [await Task.Factory.StartNew (() => 1)] += await Task.Factory.StartNew (() => (byte)30);
257 		if (r != 32)
258 			return 1;
259 
260 		if (s [1] != 32)
261 			return 2;
262 
263 		return 0;
264 	}
265 
ArrayAccessTest_9()266 	async Task<int> ArrayAccessTest_9 ()
267 	{
268 		var s = new Base ();
269 		s.CreateArray<int> (await Task.Factory.StartNew (() => 5)) [2] += 9;
270 		s.CreateArray<int> (await Task.Factory.StartNew (() => 5)) [2] += await Task.Factory.StartNew (() => 9);
271 
272 		var res = s.CreateArray<int> (await Task.Factory.StartNew (() => 5)) [2] += await Task.Factory.StartNew (() => 9);
273 		if (res != 9)
274 			return 1;
275 
276 		s.CreateArray<S> (await Task.Factory.StartNew (() => 5)) [2] += await Task.Factory.StartNew (() => new S () { Value = 4 });
277 		return 0;
278 	}
279 
ArrayAccessTest_10()280 	async Task<bool> ArrayAccessTest_10 ()
281 	{
282 		var b = new bool [1] { true };
283 
284 		var r = b [await Task.Factory.StartNew (() => 0)];
285 		return r;
286 	}
287 
ArrayAccessTest_11()288 	async Task<bool> ArrayAccessTest_11 ()
289 	{
290 		var a = new S [1];
291  		a [await Task.Factory.StartNew (() => 0)].s2.Value += 5;
292 		return a [await Task.Factory.StartNew(() => 0)].s2.Value == 5;
293 	}
294 
AssignTest_1()295 	async Task<int> AssignTest_1 ()
296 	{
297 		field_int = await Task.Factory.StartNew (() => 0);
298 		return field_int;
299 	}
300 
AssignTest_2()301 	async Task<bool> AssignTest_2 ()
302 	{
303 		long? l = await Task.Factory.StartNew<sbyte?> (() => null);
304 		return l == null;
305 	}
306 
AssignTest_3()307 	async Task<int> AssignTest_3 ()
308 	{
309 		int a = await Task.Factory.StartNew (() => 1), b = await Task.Factory.StartNew (() => 2);
310 		if (a != 1)
311 			return 1;
312 		if (b != 2)
313 			return b;
314 
315 		return 0;
316 	}
317 
BinaryTest_1()318 	async Task<int> BinaryTest_1 ()
319 	{
320 		return await Task.Factory.StartNew (() => { Thread.Sleep (10); return 5; }) +
321 			await Task.Factory.StartNew (() => -3) +
322 			await Task.Factory.StartNew (() => -2);
323 	}
324 
BinaryTest_2()325 	async Task<int> BinaryTest_2 ()
326 	{
327 		int i = 1;
328 		var b = await Task.Factory.StartNew (() => { i += 3; return true; }) &&
329 			await Task.Factory.StartNew (() => { i += 4; return false; }) &&
330 			await Task.Factory.StartNew (() => { i += 5; return true; });
331 
332 		return b ? -1 : i == 8 ? 0 : i;
333 	}
334 
BinaryTest_3()335 	async Task<int> BinaryTest_3 ()
336 	{
337 		var r = await Task.Factory.StartNew<bool?> (() => true) & await Task.Factory.StartNew<bool?> (() => null);
338 		if (r != null)
339 			return 1;
340 
341 		r = await Task.Factory.StartNew<bool?> (() => null) | await Task.Factory.StartNew<bool?> (() => true);
342 		if (r != true)
343 			return 2;
344 
345 		r = await Task.Factory.StartNew<bool?> (() => null) != await Task.Factory.StartNew<bool?> (() => true);
346 		if (r != true)
347 			return 3;
348 
349 		return 0;
350 	}
351 
BinaryTest_4()352 	async Task<int> BinaryTest_4 ()
353 	{
354 		var r1 = await Task.Factory.StartNew<short?> (() => 2) * await Task.Factory.StartNew<byte?> (() => null);
355 		if (r1 != null)
356 			return 1;
357 
358 		var r2 = await Task.Factory.StartNew<decimal?> (() => 100) / await Task.Factory.StartNew<decimal?> (() => null);
359 		if (r2 != null)
360 			return 2;
361 
362 		return 0;
363 	}
364 
BinaryTest_5()365 	async Task<int> BinaryTest_5 ()
366 	{
367 		var r1 = await Task.FromResult (1) == 9;
368 		if (r1)
369 			return 1;
370 
371 		var r2 = 1 == await Task.FromResult (1);
372 		if (!r2)
373 			return 2;
374 
375 		return 0;
376 	}
377 
BinaryTest_6()378 	async Task<bool> BinaryTest_6 ()
379 	{
380 		var t = Task.Delay (1);
381 		if (t == await Task.WhenAny(new [] { t }))
382 			return true;
383 
384 		return false;
385 	}
386 
CallTest_1()387 	async Task<int> CallTest_1 ()
388 	{
389 		return Call (
390 			await Task.Factory.StartNew (() => { Thread.Sleep (10); return 5; }),
391 			await Task.Factory.StartNew (() => -3),
392 			await Task.Factory.StartNew (() => 6));
393 	}
394 
CallTest_2()395 	async Task<bool> CallTest_2 ()
396 	{
397 		char ch = 'a';
398 		var r = Call (
399 			ref ch,
400 			await Task.Factory.StartNew (() => { Thread.Sleep (10); return 5; }));
401 
402 		return ch == 'z' && r == 5;
403 	}
404 
CallTest_3()405 	async Task<int> CallTest_3 ()
406 	{
407 		S s = new S ();
408 		s.SetValue (await Task.Factory.StartNew (() => 10));
409 		return s.Value - 10;
410 	}
411 
CallTest_4()412 	async Task<bool> CallTest_4 ()
413 	{
414 		return E.E_1.Equals (unchecked (await Task.Factory.StartNew (() => E.E_1)));
415 	}
416 
CallTest_5()417 	async Task<int> CallTest_5 ()
418 	{
419 		int value = 9;
420 		return CallNamed (
421 			b: await Task.Factory.StartNew (() => value++),
422 			a: value) - 1;
423 	}
424 
CastTest_1()425 	async Task<bool> CastTest_1 ()
426 	{
427 		decimal value = 67;
428 		return (value - await Task.Factory.StartNew (() => 66m)) == 1;
429 	}
430 
CastTest_2()431 	async Task<bool> CastTest_2 ()
432 	{
433 		var t = new Tester ();
434 		return t.CallS (await Task.Factory.StartNew (() => this)) == 400;
435 	}
436 
CoalescingTest_1()437 	async Task<bool> CoalescingTest_1 ()
438 	{
439 		var r = await Task.Factory.StartNew<string> (() => null)  ?? await Task.Factory.StartNew (() => "x");
440 		return r == "x";
441 	}
442 
CoalescingTest_2()443 	async Task<bool> CoalescingTest_2 ()
444 	{
445 		var r = await Task.Factory.StartNew<short?> (() => null)  ?? await Task.Factory.StartNew<byte> (() => 2);
446 		return r == 2;
447 	}
448 
ConditionalTest_1()449 	async Task<int> ConditionalTest_1 ()
450 	{
451 		return true ? await Task.Factory.StartNew (() => 0) : await Task.Factory.StartNew (() => 1);
452 	}
453 
ConditionalTest_2()454 	async Task<int> ConditionalTest_2 ()
455 	{
456 		return PropertyBool ? await Task.Factory.StartNew (() => 0) : await Task.Factory.StartNew (() => 1);
457 	}
458 
ConditionalTest_3()459 	async Task<int> ConditionalTest_3 ()
460 	{
461 		int v = 5;
462 		return v * (await Task.Factory.StartNew (() => true) ? 0 : await Task.Factory.StartNew (() => 1));
463 	}
464 
ConditionalTest_4()465 	async Task<int> ConditionalTest_4 ()
466 	{
467 		int v = 5;
468 		return v * (v == 2 ? 3 : await Task.Factory.StartNew (() => 0));
469 	}
470 
DelegateInvoke_4()471 	async Task<int> DelegateInvoke_4 ()
472 	{
473 		Func<int, int> d = l => l - 3;
474 		int value = 1;
475 		return value + d (await Task.Factory.StartNew (() => 2));
476 	}
477 
EventInvoke_1()478 	async Task<int> EventInvoke_1 ()
479 	{
480 		int value = 0;
481 		Event += await Task.Factory.StartNew (() => {
482 			Action a = () => { value = 5; };
483 			return a;
484 		});
485 
486 		CallEvent ();
487 		return value - 5;
488 	}
489 
FieldTest_1()490 	async Task<int> FieldTest_1 ()
491 	{
492 		var s = new Base ();
493 		s.field_int = 3;
494 		s.field_int += await Task.Factory.StartNew (() => 6);
495 		if (s.field_int != 9)
496 			return 1;
497 
498 		var r = s.field_int -= await Task.Factory.StartNew (() => 5);
499 		if (r != 4)
500 			return 2;
501 
502 		if (s.field_int != 4)
503 			return 3;
504 		return 0;
505 	}
506 
IndexerTest_1()507 	async Task<bool> IndexerTest_1 ()
508 	{
509 		this[2] = await Task.Factory.StartNew (() => 6);
510 		return this[2] == 12;
511 	}
512 
IndexerTest_2()513 	async Task<bool> IndexerTest_2 ()
514 	{
515 		this[await Task.Factory.StartNew (() => 3)] = await Task.Factory.StartNew (() => 6);
516 		return this[3] == 18;
517 	}
518 
IndexerTest_3()519 	async Task<int> IndexerTest_3 ()
520 	{
521 		int value = -5;
522 		this[await Task.Factory.StartNew (() => value++)] += await Task.Factory.StartNew (() => 5);
523 		return this[3] + 25;
524 	}
525 
IndexerTest_4()526 	async Task<int> IndexerTest_4 ()
527 	{
528 		int value = 3;
529 		PropertyThis[await Task.Factory.StartNew (() => value++)] += await Task.Factory.StartNew (() => -5);
530 		return PropertyThis[3] + value + 11;
531 	}
532 
IndexerTest_5()533 	async Task<int> IndexerTest_5 ()
534 	{
535 		int value = 3;
536 		field_this = 6;
537 		int res = PropertyThis[await Task.Factory.StartNew (() => value++)]++;
538 		if (res != 6)
539 			return 1;
540 
541 		if (PropertyThis[0] != 27)
542 			return 2;
543 
544 		return PropertyThis[5] -= await Task.Factory.StartNew (() => 27);
545 	}
546 
IndexerTest_6()547 	async Task<int> IndexerTest_6 ()
548 	{
549 		var r = this[3] = await Task.Factory.StartNew (() => 9);
550 		if (r != 9)
551 			return 1;
552 
553 		var r2 = this[await Task.Factory.StartNew (() => 55)] = await Task.Factory.StartNew (() => 8);
554 
555 		if (r2 != 8)
556 			return 2;
557 
558 		return 0;
559 	}
560 
IndexerTest_7()561 	async Task<bool> IndexerTest_7 ()
562 	{
563 		int value = -5;
564 		var res = ++this[await Task.Factory.StartNew (() => value++)];
565 		return res == 1;
566 	}
567 
IsTest_1()568 	async Task<bool> IsTest_1 ()
569 	{
570 		new Tester ().CallBool (await Task.Factory.StartNew (() => new Tester ()) is Base);
571 		return true;
572 	}
573 
IsTest_2()574 	async Task<bool> IsTest_2 ()
575 	{
576 		var r = await Task.Factory.StartNew<uint?> (() => 1) is uint;
577 		return r;
578 	}
579 
LogicalUserOperator_1()580 	async Task<bool> LogicalUserOperator_1 ()
581 	{
582 		var r = await Task.Factory.StartNew (() => new Base ()) && await Task.Factory.StartNew (() => new Base ());
583 		return r.field_int == 100;
584 	}
585 
LogicalUserOperator_2()586 	async Task<bool> LogicalUserOperator_2 ()
587 	{
588 		var r = new Base () && await Task.Factory.StartNew (() => new Base ());
589 		return r.field_int == 100;
590 	}
591 
LogicalUserOperator_3()592 	async Task<bool> LogicalUserOperator_3 ()
593 	{
594 		var r = await Task.Factory.StartNew (() => new Base ()) || await Task.Factory.StartNew (() => new Base ());
595 		return r.field_int == 0;
596 	}
597 
NewTest_1()598 	async Task<bool> NewTest_1 ()
599 	{
600 		int value = 9;
601 		var b = new Base (value, await Task.Factory.StartNew (() => 33));
602 		return b.field_int == 9;
603 	}
604 
NewTest_2()605 	async Task<bool> NewTest_2 ()
606 	{
607 		var s = new S (await Task.Factory.StartNew (() => 77), await Task.Factory.StartNew (() => "b"));
608 		return s.Value == 77;
609 	}
610 
NewDelegate_1()611 	async Task<int> NewDelegate_1 ()
612 	{
613 		var f = new Func<int> (await NewDelegate_1_0 ());
614 		return f ();
615 	}
616 
NewDelegate_1_0()617 	static async Task<Func<int>> NewDelegate_1_0 ()
618 	{
619 		await Task.Factory.StartNew (() => { });
620 		return () => 0;
621 	}
622 
NewInitTest_1()623 	async Task<int> NewInitTest_1 ()
624 	{
625 		int value = 9;
626 
627 		var b = new Base (value, await Task.Factory.StartNew (() => 33)) { };
628 		if (b.field_int != 9)
629 			return 1;
630 
631 		b = new Base (value, await Task.Factory.StartNew (() => 11)) {
632 			field_int = await Task.Factory.StartNew (() => 12),
633 			PropertyInt = await Task.Factory.StartNew (() => 13)
634 		};
635 
636 		if (b.field_int != 25)
637 			return 2;
638 
639 		b = new Base () {
640 			field_int = await Task.Factory.StartNew (() => 12),
641 			PropertyInt = await Task.Factory.StartNew (() => 13)
642 		};
643 
644 		if (b.field_int != 25)
645 			return 3;
646 
647 		return 0;
648 	}
649 
NewInitTest_2()650 	async Task<int> NewInitTest_2 ()
651 	{
652 		int value = 9;
653 
654 		var s = new S (value, await Task.Factory.StartNew (() => "x")) { };
655 		if (s.Value != 9)
656 			return 1;
657 
658 		s = new S (value, await Task.Factory.StartNew (() => "y")) {
659 			Value = await Task.Factory.StartNew (() => 12)
660 		};
661 
662 		if (s.Value != 12)
663 			return 2;
664 
665 		s = new S () {
666 			Value = await Task.Factory.StartNew (() => 13)
667 		};
668 
669 		if (s.Value != 13)
670 			return 3;
671 
672 		return 0;
673 	}
674 
NewArrayInitTest_1()675 	async Task<bool> NewArrayInitTest_1 ()
676 	{
677 		var a = new int[await Task.Factory.StartNew (() => 5)];
678 		return a.Length == 5;
679 	}
680 
NewArrayInitTest_2()681 	async Task<bool> NewArrayInitTest_2 ()
682 	{
683 		var a = new short[await Task.Factory.StartNew (() => 3), await Task.Factory.StartNew (() => 4)];
684 		return a.Length == 12;
685 	}
686 
NewArrayInitTest_3()687 	async Task<int> NewArrayInitTest_3 ()
688 	{
689 		var a = new byte[] { await Task.Factory.StartNew (() => (byte)5) };
690 		return a [0] - 5;
691 	}
692 
NewArrayInitTest_4()693 	async Task<bool> NewArrayInitTest_4 ()
694 	{
695 		var a = new ushort[,] {
696 			{ await Task.Factory.StartNew (() => (ushort) 5), 50 },
697 			{ 30, await Task.Factory.StartNew (() => (ushort) 3) }
698 		};
699 
700 		return a [0, 0] * a [1, 1] == 15;
701 	}
702 
NewArrayInitTest_5()703 	async Task<int> NewArrayInitTest_5 ()
704 	{
705 		var a = new S[] { await Task.Factory.StartNew (() => new S () { Value = 4 }) };
706 		return a [0].Value - 4;
707 	}
708 
NewArrayInitTest_6()709 	async Task<bool> NewArrayInitTest_6 ()
710 	{
711 		var a = new int[] { 2, 3, 2, 3, 5, 6, 7, 2, 4, await Task.Factory.StartNew (() => 5), 11, 23, 45 };
712 		return a.Length == 13;
713 	}
714 
NewArrayInitTest_7()715 	async Task<bool> NewArrayInitTest_7 ()
716 	{
717 		var res = new [] { "a", new [] { "1", await Task.FromResult ("2") } [1], "b" };
718 		return res [1] == "2";
719 	}
720 
PropertyTest_1()721 	async Task<bool> PropertyTest_1 ()
722 	{
723 		PropertyInt = await Task.Factory.StartNew (() => 6);
724 		return PropertyInt == 6;
725 	}
726 
PropertyTest_2()727 	async Task<int> PropertyTest_2 ()
728 	{
729 		PropertyThis.PropertyInt += await Task.Factory.StartNew (() => 6);
730 		if (property_this_counter != 1)
731 			return 1;
732 
733 		return PropertyInt - 6;
734 	}
735 
PropertyTest_3()736 	async Task<int> PropertyTest_3 ()
737 	{
738 		var r = PropertyThis.PropertyInt = await Task.Factory.StartNew (() => 9);
739 		if (r != 9)
740 			return 1;
741 
742 		PropertyThis.PropertyInt = 4;
743 		int[] a = new int[4];
744 		a [await Task.Factory.StartNew (() => 1)] = PropertyThis.PropertyInt += await Task.Factory.StartNew (() => 8);
745 		if (a[1] != 21)
746 			return 2;
747 
748 		if (PropertyThis.PropertyInt != 34)
749 			return 3;
750 
751 		return 0;
752 	}
753 
StringConcatTest_1()754 	async Task<bool> StringConcatTest_1 ()
755 	{
756 		return (await Task.Factory.StartNew (() => "a") +
757 			await Task.Factory.StartNew (() => "b") +
758 			await Task.Factory.StartNew (() => (string) null) == "ab");
759 	}
760 
UnaryTest_1()761 	async Task<bool> UnaryTest_1 ()
762 	{
763 		long a = 1;
764 		return (a + checked (-await Task.Factory.StartNew (() => 2))) == -1;
765 	}
766 
UnaryTest_2()767 	async Task<bool> UnaryTest_2 ()
768 	{
769 		short? s = 2;
770 		int value = 2;
771 		return (value * ~await Task.Factory.StartNew (() => s)) == -6;
772 	}
773 
UnaryTest_3()774 	async Task<bool> UnaryTest_3 ()
775 	{
776 		var d = new decimal? [2];
777 		d[1] = 4;
778 		var r = ++d[await Task.Factory.StartNew (() => 1)];
779 		return r == 5;
780 	}
781 
VariableInitializer_1()782 	async Task<bool> VariableInitializer_1 ()
783 	{
784 		int a = 2, b = await Task.Factory.StartNew (() => 1), c = await Task.Factory.StartNew (() => 1);
785 		return a == (b + c);
786 	}
787 
RunTest(MethodInfo test)788 	static bool RunTest (MethodInfo test)
789 	{
790 		Console.Write ("Running test {0, -25}", test.Name);
791 		try {
792 			Task t = test.Invoke (new Tester (), null) as Task;
793 			if (!Task.WaitAll (new[] { t }, 1000)) {
794 				Console.WriteLine ("FAILED (Timeout)");
795 				return false;
796 			}
797 
798 			var ti = t as Task<int>;
799 			if (ti != null) {
800 				if (ti.Result != 0) {
801 					Console.WriteLine ("FAILED (Result={0})", ti.Result);
802 					return false;
803 				}
804 			} else {
805 				var tb = t as Task<bool>;
806 				if (tb != null) {
807 					if (!tb.Result) {
808 						Console.WriteLine ("FAILED (Result={0})", tb.Result);
809 						return false;
810 					}
811 				}
812 			}
813 
814 			Console.WriteLine ("OK");
815 			return true;
816 		} catch (Exception e) {
817 			Console.WriteLine ("FAILED");
818 			Console.WriteLine (e.ToString ());
819 			return false;
820 		}
821 	}
822 
Main()823 	public static int Main ()
824 	{
825 		var tests = from test in typeof (Tester).GetMethods (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly)
826 					where test.GetParameters ().Length == 0 && !test.IsDefined (typeof (CompilerGeneratedAttribute), false)
827 					orderby test.Name
828 					select RunTest (test);
829 
830 		int failures = tests.Count (a => !a);
831 		Console.WriteLine (failures + " tests failed");
832 		return failures;
833 	}
834 }
835