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> NewDelegate_1 ()
591 var f = new Func<int> (await NewDelegate_1_0 ());
595 static async Task<Func<int>> NewDelegate_1_0 ()
597 await Task.Factory.StartNew (() => { });
601 async Task<int> NewInitTest_1 ()
605 var b = new Base (value, await Task.Factory.StartNew (() => 33)) { };
606 if (b.field_int != 9)
609 b = new Base (value, await Task.Factory.StartNew (() => 11)) {
610 field_int = await Task.Factory.StartNew (() => 12),
611 PropertyInt = await Task.Factory.StartNew (() => 13)
614 if (b.field_int != 25)
618 field_int = await Task.Factory.StartNew (() => 12),
619 PropertyInt = await Task.Factory.StartNew (() => 13)
622 if (b.field_int != 25)
628 async Task<int> NewInitTest_2 ()
632 var s = new S (value, await Task.Factory.StartNew (() => "x")) { };
636 s = new S (value, await Task.Factory.StartNew (() => "y")) {
637 Value = await Task.Factory.StartNew (() => 12)
644 Value = await Task.Factory.StartNew (() => 13)
653 async Task<bool> NewArrayInitTest_1 ()
655 var a = new int[await Task.Factory.StartNew (() => 5)];
656 return a.Length == 5;
659 async Task<bool> NewArrayInitTest_2 ()
661 var a = new short[await Task.Factory.StartNew (() => 3), await Task.Factory.StartNew (() => 4)];
662 return a.Length == 12;
665 async Task<int> NewArrayInitTest_3 ()
667 var a = new byte[] { await Task.Factory.StartNew (() => (byte)5) };
671 async Task<bool> NewArrayInitTest_4 ()
673 var a = new ushort[,] {
674 { await Task.Factory.StartNew (() => (ushort) 5), 50 },
675 { 30, await Task.Factory.StartNew (() => (ushort) 3) }
678 return a [0, 0] * a [1, 1] == 15;
681 async Task<int> NewArrayInitTest_5 ()
683 var a = new S[] { await Task.Factory.StartNew (() => new S () { Value = 4 }) };
684 return a [0].Value - 4;
687 async Task<bool> NewArrayInitTest_6 ()
689 var a = new int[] { 2, 3, 2, 3, 5, 6, 7, 2, 4, await Task.Factory.StartNew (() => 5), 11, 23, 45 };
690 return a.Length == 13;
693 async Task<bool> NewArrayInitTest_7 ()
695 var res = new [] { "a", new [] { "1", await Task.FromResult ("2") } [1], "b" };
696 return res [1] == "2";
699 async Task<bool> PropertyTest_1 ()
701 PropertyInt = await Task.Factory.StartNew (() => 6);
702 return PropertyInt == 6;
705 async Task<int> PropertyTest_2 ()
707 PropertyThis.PropertyInt += await Task.Factory.StartNew (() => 6);
708 if (property_this_counter != 1)
711 return PropertyInt - 6;
714 async Task<int> PropertyTest_3 ()
716 var r = PropertyThis.PropertyInt = await Task.Factory.StartNew (() => 9);
720 PropertyThis.PropertyInt = 4;
721 int[] a = new int[4];
722 a [await Task.Factory.StartNew (() => 1)] = PropertyThis.PropertyInt += await Task.Factory.StartNew (() => 8);
726 if (PropertyThis.PropertyInt != 34)
732 async Task<bool> StringConcatTest_1 ()
734 return (await Task.Factory.StartNew (() => "a") +
735 await Task.Factory.StartNew (() => "b") +
736 await Task.Factory.StartNew (() => (string) null) == "ab");
739 async Task<bool> UnaryTest_1 ()
742 return (a + checked (-await Task.Factory.StartNew (() => 2))) == -1;
745 async Task<bool> UnaryTest_2 ()
749 return (value * ~await Task.Factory.StartNew (() => s)) == -6;
752 async Task<bool> UnaryTest_3 ()
754 var d = new decimal? [2];
756 var r = ++d[await Task.Factory.StartNew (() => 1)];
760 async Task<bool> VariableInitializer_1 ()
762 int a = 2, b = await Task.Factory.StartNew (() => 1), c = await Task.Factory.StartNew (() => 1);
766 static bool RunTest (MethodInfo test)
768 Console.Write ("Running test {0, -25}", test.Name);
770 Task t = test.Invoke (new Tester (), null) as Task;
771 if (!Task.WaitAll (new[] { t }, 1000)) {
772 Console.WriteLine ("FAILED (Timeout)");
776 var ti = t as Task<int>;
778 if (ti.Result != 0) {
779 Console.WriteLine ("FAILED (Result={0})", ti.Result);
783 var tb = t as Task<bool>;
786 Console.WriteLine ("FAILED (Result={0})", tb.Result);
792 Console.WriteLine ("OK");
794 } catch (Exception e) {
795 Console.WriteLine ("FAILED");
796 Console.WriteLine (e.ToString ());
801 public static int Main ()
803 var tests = from test in typeof (Tester).GetMethods (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly)
804 where test.GetParameters ().Length == 0 && !test.IsDefined (typeof (CompilerGeneratedAttribute), false)
806 select RunTest (test);
808 int failures = tests.Count (a => !a);
809 Console.WriteLine (failures + " tests failed");