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> PropertyTest_1 ()
683 PropertyInt = await Task.Factory.StartNew (() => 6);
684 return PropertyInt == 6;
687 async Task<int> PropertyTest_2 ()
689 PropertyThis.PropertyInt += await Task.Factory.StartNew (() => 6);
690 if (property_this_counter != 1)
693 return PropertyInt - 6;
696 async Task<int> PropertyTest_3 ()
698 var r = PropertyThis.PropertyInt = await Task.Factory.StartNew (() => 9);
702 PropertyThis.PropertyInt = 4;
703 int[] a = new int[4];
704 a [await Task.Factory.StartNew (() => 1)] = PropertyThis.PropertyInt += await Task.Factory.StartNew (() => 8);
708 if (PropertyThis.PropertyInt != 34)
714 async Task<bool> StringConcatTest_1 ()
716 return (await Task.Factory.StartNew (() => "a") +
717 await Task.Factory.StartNew (() => "b") +
718 await Task.Factory.StartNew (() => (string) null) == "ab");
721 async Task<bool> UnaryTest_1 ()
724 return (a + checked (-await Task.Factory.StartNew (() => 2))) == -1;
727 async Task<bool> UnaryTest_2 ()
731 return (value * ~await Task.Factory.StartNew (() => s)) == -6;
734 async Task<bool> UnaryTest_3 ()
736 var d = new decimal? [2];
738 var r = ++d[await Task.Factory.StartNew (() => 1)];
742 async Task<bool> VariableInitializer_1 ()
744 int a = 2, b = await Task.Factory.StartNew (() => 1), c = await Task.Factory.StartNew (() => 1);
748 static bool RunTest (MethodInfo test)
750 Console.Write ("Running test {0, -25}", test.Name);
752 Task t = test.Invoke (new Tester (), null) as Task;
753 if (!Task.WaitAll (new[] { t }, 1000)) {
754 Console.WriteLine ("FAILED (Timeout)");
758 var ti = t as Task<int>;
760 if (ti.Result != 0) {
761 Console.WriteLine ("FAILED (Result={0})", ti.Result);
765 var tb = t as Task<bool>;
768 Console.WriteLine ("FAILED (Result={0})", tb.Result);
774 Console.WriteLine ("OK");
776 } catch (Exception e) {
777 Console.WriteLine ("FAILED");
778 Console.WriteLine (e.ToString ());
783 public static int Main ()
785 var tests = from test in typeof (Tester).GetMethods (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly)
786 where test.GetParameters ().Length == 0 && !test.IsDefined (typeof (CompilerGeneratedAttribute), false)
788 select RunTest (test);
790 int failures = tests.Count (a => !a);
791 Console.WriteLine (failures + " tests failed");