using System; using System.Collections.Generic; // Generics mutate tests class Disposable : IDisposable { public void Dispose () { } } interface IFoo { } class CA { public struct Nested { public static readonly T Value; public readonly T Value2; } } class Test { static Func For (List list) { T[] t = new T[2]; return () => { for (int i = 0; i < t.Length; ++i) { t[i] = list[i]; } return t; }; } static Func Throw (T t) { T l = t; return () => { throw new ApplicationException (l.ToString ()); }; } static Func TypeOf (T t) { T l = t; return () => { l = t; var e = typeof (Disposable); e = typeof (Disposable<>); e = typeof (IFoo<,>); return typeof (T); }; } static Func Do (T t) { T l = t; return () => { T t2; do { t2 = l; } while (default (T) != null); return t2; }; } static Func Lock (T t) { T l = t; return () => { lock (l.GetType ()) { l = default (T); return l; } }; } static Func Catch (T t) { T l = t; return () => { try { throw new ApplicationException (l.ToString ()); } catch { return l; } }; } static Func Catch_2 (T t) where T : Exception { T l = t; return () => { try { throw new NotSupportedException (); } catch (T e) { return l; } catch { throw new ApplicationException ("Should not be reached"); } }; } static Func Finally (T t) { T l = t; return () => { try { l = Lock (l) (); } finally { l = default (T); } return l; }; } static Func Using (T t) { T l = t; using (var d = new Disposable ()) { return () => { return l; }; } } static Func Switch (T t) { T l = t; int? i = 0; return () => { switch (i) { default: return l; } }; } static Func> ForForeach (T[] t) { return () => { foreach (T e in t) return new List () { e }; throw new ApplicationException (); }; } public void ArrayMutate (T[] array) { int r = 4; Action anonMeth = delegate (int slc) { long[] idx = new long[] { 0, 0 }; for (int i = 0; i < r; i++) { idx[0] = i; } }; } static Func ArrayMultiMutate (T[][] array) { return () => { for (int i = 0; i < 3; i++) { array[i][i] = default (T); } return array; }; } static Func ArrayMultiMutate (T[,] array) { return () => { return array[0, 0].GetHashCode (); }; } static Func NestedTypeMutate () where T : IEquatable { var local = new CA.Nested (); return () => { return new[] { CA.Nested.Value, local.Value2 }; }; } public static int Main () { if (For (new List { 5, 10 }) ()[1] != 10) return 1; var t = Throw (5); try { t (); return 2; } catch (ApplicationException) { } var t3 = Do ("rr"); if (t3 () != "rr") return 3; var t4 = Lock ('f'); if (t4 () != '\0') return 4; var t5 = Catch (3); if (t5 () != 3) return 5; var ex = new NotSupportedException (); var t5_2 = Catch_2 (ex); if (t5_2 () != ex) return 52; var t6 = Finally (5); if (t6 () != 0) return 6; var t7 = Using (1.1); if (t7 () != 1.1) return 7; var t8 = Switch (55); if (t8 () != 55) return 8; var t9 = ForForeach (new[] { 4, 1 }); if (t9 ()[0] != 4) return 9; var t10 = ArrayMultiMutate (new string[][] { new string[] { "a", "b", "c" }, new string[] { "1", "2", "3" }, new string[] { "A", "B", "C" } }); if (t10 ()[2][2] != null) return 10; var array = new short[,] { { 10, 20 } }; var t10a = ArrayMultiMutate (array); if (t10a () != array[0, 0].GetHashCode ()) return 100; var t11 = TypeOf ("b"); if (t11 () != typeof (string)) return 11; var t12 = NestedTypeMutate () (); if (t12[0] != 0 || t12[1] != 0) return 12; Console.WriteLine ("OK"); return 0; } }