2 using System.Threading.Tasks;
3 using System.Threading;
4 using System.Reflection;
6 using System.Runtime.CompilerServices;
12 public S (int a1, string a2)
17 public void SetValue (int value)
22 public static implicit operator S (Base b)
24 return new S (400, "a");
27 public static S operator + (S a, S b)
30 Value = a.Value + b.Value
42 public volatile int field_int;
43 protected int field_this;
44 protected int property_this_counter;
46 public event Action Event;
52 public Base (int arg, int arg2)
57 public bool PropertyBool {
63 public int PropertyInt {
72 protected Base PropertyThis {
74 ++property_this_counter;
79 public int this [int arg] {
84 field_this += value * arg;
88 public static bool operator true (Base a)
93 public static bool operator false (Base a)
98 public static Base operator & (Base a, Base b)
105 public static Base operator | (Base a, Base b)
112 protected int Call (int arg1, int arg2, int arg3)
126 protected int Call(ref char ch, int arg)
132 public void CallBool (bool b)
136 public int CallS (S s)
141 public T[] CreateArray<T> (int size)
146 protected static void CallRefParams (ref int i, params int[] i2)
151 protected int CallNamed (int a, int b)
156 protected void CallEvent ()
164 async Task<bool> ArrayAccessTest_1 ()
166 bool[] b = new bool[1];
167 b [0] = await Task.Factory.StartNew (() => true);
168 return b[await Task.Factory.StartNew (() => 0)];
171 async Task<int> ArrayAccessTest_2 ()
173 double[] b = new double[2];
174 b [await Task.Factory.StartNew (() => 1)] = 5.5;
178 var d = b [await Task.Factory.StartNew (() => 1)] = 2.5;
185 d = b [await Task.Factory.StartNew (() => 1)] = await Task.Factory.StartNew (() => 4.4);
192 async Task<int> ArrayAccessTest_3 ()
194 decimal[] d = new decimal [4];
197 var r = ++d[await Task.Factory.StartNew (() => 1)];
202 d [await Task.Factory.StartNew (() => 1)] += await Task.Factory.StartNew (() => 9.9m);
207 r = d [await Task.Factory.StartNew (() => 1)] -= await Task.Factory.StartNew (() => 5.9m);
214 async Task<bool> ArrayAccessTest_4 ()
216 string[] s = new string [4];
219 s [await Task.Factory.StartNew (() => 1)] += await Task.Factory.StartNew (() => "b");
220 return s [1] == "ab";
223 async Task<bool> ArrayAccessTest_5 ()
225 int[][] a = new int[3][];
228 CallRefParams (ref a[await Task.Factory.StartNew (() => index++)][0], await Task.Factory.StartNew (() => 3));
229 return a [1][0] == 5;
232 async Task<int> ArrayAccessTest_6 ()
235 int[] a = new int[3] { 3, 6, 9 };
236 return a [await Task.Factory.StartNew (() => (long)1)] + value;
239 async Task<bool> ArrayAccessTest_7 ()
241 short?[] s = new short?[] { 3, 2, 1 };
242 var r = s [await Task.Factory.StartNew (() => 1)]++;
246 async Task<int> ArrayAccessTest_8 ()
248 var s = new byte?[] { 3, 2, 1 };
249 var r = s [await Task.Factory.StartNew (() => 1)] += await Task.Factory.StartNew (() => (byte)30);
259 async Task<int> ArrayAccessTest_9 ()
262 s.CreateArray<int> (await Task.Factory.StartNew (() => 5)) [2] += 9;
263 s.CreateArray<int> (await Task.Factory.StartNew (() => 5)) [2] += await Task.Factory.StartNew (() => 9);
265 var res = s.CreateArray<int> (await Task.Factory.StartNew (() => 5)) [2] += await Task.Factory.StartNew (() => 9);
269 s.CreateArray<S> (await Task.Factory.StartNew (() => 5)) [2] += await Task.Factory.StartNew (() => new S () { Value = 4 });
273 async Task<int> AssignTest_1 ()
275 field_int = await Task.Factory.StartNew (() => 0);
279 async Task<bool> AssignTest_2 ()
281 long? l = await Task.Factory.StartNew<sbyte?> (() => null);
285 async Task<int> AssignTest_3 ()
287 int a = await Task.Factory.StartNew (() => 1), b = await Task.Factory.StartNew (() => 2);
296 async Task<int> BinaryTest_1 ()
298 return await Task.Factory.StartNew (() => { Thread.Sleep (10); return 5; }) +
299 await Task.Factory.StartNew (() => -3) +
300 await Task.Factory.StartNew (() => -2);
303 async Task<int> BinaryTest_2 ()
306 var b = await Task.Factory.StartNew (() => { i += 3; return true; }) &&
307 await Task.Factory.StartNew (() => { i += 4; return false; }) &&
308 await Task.Factory.StartNew (() => { i += 5; return true; });
310 return b ? -1 : i == 8 ? 0 : i;
313 async Task<int> BinaryTest_3 ()
315 var r = await Task.Factory.StartNew<bool?> (() => true) & await Task.Factory.StartNew<bool?> (() => null);
319 r = await Task.Factory.StartNew<bool?> (() => null) | await Task.Factory.StartNew<bool?> (() => true);
323 r = await Task.Factory.StartNew<bool?> (() => null) != await Task.Factory.StartNew<bool?> (() => true);
330 async Task<int> BinaryTest_4 ()
332 var r1 = await Task.Factory.StartNew<short?> (() => 2) * await Task.Factory.StartNew<byte?> (() => null);
336 var r2 = await Task.Factory.StartNew<decimal?> (() => 100) / await Task.Factory.StartNew<decimal?> (() => null);
343 async Task<int> BinaryTest_5 ()
345 var r1 = await Task.FromResult (1) == 9;
349 var r2 = 1 == await Task.FromResult (1);
356 async Task<bool> BinaryTest_6 ()
358 var t = Task.Delay (1);
359 if (t == await Task.WhenAny(new [] { t }))
365 async Task<int> CallTest_1 ()
368 await Task.Factory.StartNew (() => { Thread.Sleep (10); return 5; }),
369 await Task.Factory.StartNew (() => -3),
370 await Task.Factory.StartNew (() => 6));
373 async Task<bool> CallTest_2 ()
378 await Task.Factory.StartNew (() => { Thread.Sleep (10); return 5; }));
380 return ch == 'z' && r == 5;
383 async Task<int> CallTest_3 ()
386 s.SetValue (await Task.Factory.StartNew (() => 10));
390 async Task<bool> CallTest_4 ()
392 return E.E_1.Equals (unchecked (await Task.Factory.StartNew (() => E.E_1)));
395 async Task<int> CallTest_5 ()
399 b: await Task.Factory.StartNew (() => value++),
403 async Task<bool> CastTest_1 ()
406 return (value - await Task.Factory.StartNew (() => 66m)) == 1;
409 async Task<bool> CastTest_2 ()
411 var t = new Tester ();
412 return t.CallS (await Task.Factory.StartNew (() => this)) == 400;
415 async Task<bool> CoalescingTest_1 ()
417 var r = await Task.Factory.StartNew<string> (() => null) ?? await Task.Factory.StartNew (() => "x");
421 async Task<bool> CoalescingTest_2 ()
423 var r = await Task.Factory.StartNew<short?> (() => null) ?? await Task.Factory.StartNew<byte> (() => 2);
427 async Task<int> ConditionalTest_1 ()
429 return true ? await Task.Factory.StartNew (() => 0) : await Task.Factory.StartNew (() => 1);
432 async Task<int> ConditionalTest_2 ()
434 return PropertyBool ? await Task.Factory.StartNew (() => 0) : await Task.Factory.StartNew (() => 1);
437 async Task<int> ConditionalTest_3 ()
440 return v * (await Task.Factory.StartNew (() => true) ? 0 : await Task.Factory.StartNew (() => 1));
443 async Task<int> ConditionalTest_4 ()
446 return v * (v == 2 ? 3 : await Task.Factory.StartNew (() => 0));
449 async Task<int> DelegateInvoke_4 ()
451 Func<int, int> d = l => l - 3;
453 return value + d (await Task.Factory.StartNew (() => 2));
456 async Task<int> EventInvoke_1 ()
459 Event += await Task.Factory.StartNew (() => {
460 Action a = () => { value = 5; };
468 async Task<int> FieldTest_1 ()
472 s.field_int += await Task.Factory.StartNew (() => 6);
473 if (s.field_int != 9)
476 var r = s.field_int -= await Task.Factory.StartNew (() => 5);
480 if (s.field_int != 4)
485 async Task<bool> IndexerTest_1 ()
487 this[2] = await Task.Factory.StartNew (() => 6);
488 return this[2] == 12;
491 async Task<bool> IndexerTest_2 ()
493 this[await Task.Factory.StartNew (() => 3)] = await Task.Factory.StartNew (() => 6);
494 return this[3] == 18;
497 async Task<int> IndexerTest_3 ()
500 this[await Task.Factory.StartNew (() => value++)] += await Task.Factory.StartNew (() => 5);
504 async Task<int> IndexerTest_4 ()
507 PropertyThis[await Task.Factory.StartNew (() => value++)] += await Task.Factory.StartNew (() => -5);
508 return PropertyThis[3] + value + 11;
511 async Task<int> IndexerTest_5 ()
515 int res = PropertyThis[await Task.Factory.StartNew (() => value++)]++;
519 if (PropertyThis[0] != 27)
522 return PropertyThis[5] -= await Task.Factory.StartNew (() => 27);
525 async Task<int> IndexerTest_6 ()
527 var r = this[3] = await Task.Factory.StartNew (() => 9);
531 var r2 = this[await Task.Factory.StartNew (() => 55)] = await Task.Factory.StartNew (() => 8);
539 async Task<bool> IndexerTest_7 ()
542 var res = ++this[await Task.Factory.StartNew (() => value++)];
546 async Task<bool> IsTest_1 ()
548 new Tester ().CallBool (await Task.Factory.StartNew (() => new Tester ()) is Base);
552 async Task<bool> IsTest_2 ()
554 var r = await Task.Factory.StartNew<uint?> (() => 1) is uint;
558 async Task<bool> LogicalUserOperator_1 ()
560 var r = await Task.Factory.StartNew (() => new Base ()) && await Task.Factory.StartNew (() => new Base ());
561 return r.field_int == 100;
564 async Task<bool> LogicalUserOperator_2 ()
566 var r = new Base () && await Task.Factory.StartNew (() => new Base ());
567 return r.field_int == 100;
570 async Task<bool> LogicalUserOperator_3 ()
572 var r = await Task.Factory.StartNew (() => new Base ()) || await Task.Factory.StartNew (() => new Base ());
573 return r.field_int == 0;
576 async Task<bool> NewTest_1 ()
579 var b = new Base (value, await Task.Factory.StartNew (() => 33));
580 return b.field_int == 9;
583 async Task<bool> NewTest_2 ()
585 var s = new S (await Task.Factory.StartNew (() => 77), await Task.Factory.StartNew (() => "b"));
586 return s.Value == 77;
589 async Task<int> NewInitTest_1 ()
593 var b = new Base (value, await Task.Factory.StartNew (() => 33)) { };
594 if (b.field_int != 9)
597 b = new Base (value, await Task.Factory.StartNew (() => 11)) {
598 field_int = await Task.Factory.StartNew (() => 12),
599 PropertyInt = await Task.Factory.StartNew (() => 13)
602 if (b.field_int != 25)
606 field_int = await Task.Factory.StartNew (() => 12),
607 PropertyInt = await Task.Factory.StartNew (() => 13)
610 if (b.field_int != 25)
616 async Task<int> NewInitTest_2 ()
620 var s = new S (value, await Task.Factory.StartNew (() => "x")) { };
624 s = new S (value, await Task.Factory.StartNew (() => "y")) {
625 Value = await Task.Factory.StartNew (() => 12)
632 Value = await Task.Factory.StartNew (() => 13)
641 async Task<bool> NewArrayInitTest_1 ()
643 var a = new int[await Task.Factory.StartNew (() => 5)];
644 return a.Length == 5;
647 async Task<bool> NewArrayInitTest_2 ()
649 var a = new short[await Task.Factory.StartNew (() => 3), await Task.Factory.StartNew (() => 4)];
650 return a.Length == 12;
653 async Task<int> NewArrayInitTest_3 ()
655 var a = new byte[] { await Task.Factory.StartNew (() => (byte)5) };
659 async Task<bool> NewArrayInitTest_4 ()
661 var a = new ushort[,] {
662 { await Task.Factory.StartNew (() => (ushort) 5), 50 },
663 { 30, await Task.Factory.StartNew (() => (ushort) 3) }
666 return a [0, 0] * a [1, 1] == 15;
669 async Task<int> NewArrayInitTest_5 ()
671 var a = new S[] { await Task.Factory.StartNew (() => new S () { Value = 4 }) };
672 return a [0].Value - 4;
675 async Task<bool> NewArrayInitTest_6 ()
677 var a = new int[] { 2, 3, 2, 3, 5, 6, 7, 2, 4, await Task.Factory.StartNew (() => 5), 11, 23, 45 };
678 return a.Length == 13;
681 async Task<bool> NewArrayInitTest_7 ()
683 var res = new [] { "a", new [] { "1", await Task.FromResult ("2") } [1], "b" };
684 return res [1] == "2";
687 async Task<bool> PropertyTest_1 ()
689 PropertyInt = await Task.Factory.StartNew (() => 6);
690 return PropertyInt == 6;
693 async Task<int> PropertyTest_2 ()
695 PropertyThis.PropertyInt += await Task.Factory.StartNew (() => 6);
696 if (property_this_counter != 1)
699 return PropertyInt - 6;
702 async Task<int> PropertyTest_3 ()
704 var r = PropertyThis.PropertyInt = await Task.Factory.StartNew (() => 9);
708 PropertyThis.PropertyInt = 4;
709 int[] a = new int[4];
710 a [await Task.Factory.StartNew (() => 1)] = PropertyThis.PropertyInt += await Task.Factory.StartNew (() => 8);
714 if (PropertyThis.PropertyInt != 34)
720 async Task<bool> StringConcatTest_1 ()
722 return (await Task.Factory.StartNew (() => "a") +
723 await Task.Factory.StartNew (() => "b") +
724 await Task.Factory.StartNew (() => (string) null) == "ab");
727 async Task<bool> UnaryTest_1 ()
730 return (a + checked (-await Task.Factory.StartNew (() => 2))) == -1;
733 async Task<bool> UnaryTest_2 ()
737 return (value * ~await Task.Factory.StartNew (() => s)) == -6;
740 async Task<bool> UnaryTest_3 ()
742 var d = new decimal? [2];
744 var r = ++d[await Task.Factory.StartNew (() => 1)];
748 async Task<bool> VariableInitializer_1 ()
750 int a = 2, b = await Task.Factory.StartNew (() => 1), c = await Task.Factory.StartNew (() => 1);
754 static bool RunTest (MethodInfo test)
756 Console.Write ("Running test {0, -25}", test.Name);
758 Task t = test.Invoke (new Tester (), null) as Task;
759 if (!Task.WaitAll (new[] { t }, 1000)) {
760 Console.WriteLine ("FAILED (Timeout)");
764 var ti = t as Task<int>;
766 if (ti.Result != 0) {
767 Console.WriteLine ("FAILED (Result={0})", ti.Result);
771 var tb = t as Task<bool>;
774 Console.WriteLine ("FAILED (Result={0})", tb.Result);
780 Console.WriteLine ("OK");
782 } catch (Exception e) {
783 Console.WriteLine ("FAILED");
784 Console.WriteLine (e.ToString ());
789 public static int Main ()
791 var tests = from test in typeof (Tester).GetMethods (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly)
792 where test.GetParameters ().Length == 0 && !test.IsDefined (typeof (CompilerGeneratedAttribute), false)
794 select RunTest (test);
796 int failures = tests.Count (a => !a);
797 Console.WriteLine (failures + " tests failed");