Merge pull request #15293 from lewing/wasm-clean
[mono-project.git] / mcs / tests / test-anon-124.cs
blobb8f012ee9a2e598b4daf58cba07391494669f1fc
1 using System;
2 using System.Collections.Generic;
4 // Generics mutate tests
6 class Disposable<T> : IDisposable
8 public void Dispose ()
13 interface IFoo<TOne, TTwo>
17 class CA<T>
19 public struct Nested
21 public static readonly T Value;
22 public readonly T Value2;
26 class Test
28 static Func<T[]> For<T> (List<T> list)
30 T[] t = new T[2];
31 return () => {
32 for (int i = 0; i < t.Length; ++i) {
33 t[i] = list[i];
36 return t;
40 static Func<T> Throw<T> (T t)
42 T l = t;
43 return () => {
44 throw new ApplicationException (l.ToString ());
48 static Func<Type> TypeOf<T> (T t)
50 T l = t;
51 return () => {
52 l = t;
53 var e = typeof (Disposable<T>);
54 e = typeof (Disposable<>);
55 e = typeof (IFoo<,>);
56 return typeof (T);
60 static Func<T> Do<T> (T t)
62 T l = t;
63 return () => {
64 T t2;
65 do {
66 t2 = l;
67 } while (default (T) != null);
69 return t2;
73 static Func<T> Lock<T> (T t)
75 T l = t;
76 return () => {
77 lock (l.GetType ()) {
78 l = default (T);
79 return l;
84 static Func<T> Catch<T> (T t)
86 T l = t;
87 return () => {
88 try {
89 throw new ApplicationException (l.ToString ());
90 } catch {
91 return l;
96 static Func<T> Catch_2<T> (T t) where T : Exception
98 T l = t;
99 return () => {
100 try {
101 throw new NotSupportedException ();
102 } catch (T e) {
103 return l;
104 } catch {
105 throw new ApplicationException ("Should not be reached");
110 static Func<T> Finally<T> (T t)
112 T l = t;
113 return () => {
114 try {
115 l = Lock (l) ();
116 } finally {
117 l = default (T);
120 return l;
124 static Func<T> Using<T> (T t)
126 T l = t;
127 using (var d = new Disposable<T> ()) {
128 return () => {
129 return l;
134 static Func<T> Switch<T> (T t)
136 T l = t;
137 int? i = 0;
138 return () => {
139 switch (i) {
140 default: return l;
145 static Func<List<T>> ForForeach<T> (T[] t)
147 return () => {
148 foreach (T e in t)
149 return new List<T> () { e };
151 throw new ApplicationException ();
155 public void ArrayMutate<T> (T[] array)
157 int r = 4;
158 Action<int> anonMeth = delegate (int slc) {
159 long[] idx = new long[] { 0, 0 };
160 for (int i = 0; i < r; i++) {
161 idx[0] = i;
166 static Func<T[][]> ArrayMultiMutate<T> (T[][] array)
168 return () => {
169 for (int i = 0; i < 3; i++) {
170 array[i][i] = default (T);
173 return array;
177 static Func<int> ArrayMultiMutate<T> (T[,] array)
179 return () => {
180 return array[0, 0].GetHashCode ();
184 static Func<T[]> NestedTypeMutate<T> () where T : IEquatable<T>
186 var local = new CA<T>.Nested ();
187 return () => {
188 return new[] { CA<T>.Nested.Value, local.Value2 };
192 public static int Main ()
194 if (For (new List<int> { 5, 10 }) ()[1] != 10)
195 return 1;
197 var t = Throw (5);
198 try {
199 t ();
200 return 2;
201 } catch (ApplicationException) {
204 var t3 = Do ("rr");
205 if (t3 () != "rr")
206 return 3;
208 var t4 = Lock ('f');
209 if (t4 () != '\0')
210 return 4;
212 var t5 = Catch (3);
213 if (t5 () != 3)
214 return 5;
216 var ex = new NotSupportedException ();
217 var t5_2 = Catch_2 (ex);
218 if (t5_2 () != ex)
219 return 52;
221 var t6 = Finally (5);
222 if (t6 () != 0)
223 return 6;
225 var t7 = Using (1.1);
226 if (t7 () != 1.1)
227 return 7;
229 var t8 = Switch (55);
230 if (t8 () != 55)
231 return 8;
233 var t9 = ForForeach (new[] { 4, 1 });
234 if (t9 ()[0] != 4)
235 return 9;
237 var t10 = ArrayMultiMutate (new string[][] { new string[] { "a", "b", "c" }, new string[] { "1", "2", "3" }, new string[] { "A", "B", "C" } });
238 if (t10 ()[2][2] != null)
239 return 10;
241 var array = new short[,] { { 10, 20 } };
242 var t10a = ArrayMultiMutate (array);
243 if (t10a () != array[0, 0].GetHashCode ())
244 return 100;
246 var t11 = TypeOf ("b");
247 if (t11 () != typeof (string))
248 return 11;
250 var t12 = NestedTypeMutate<ulong> () ();
251 if (t12[0] != 0 || t12[1] != 0)
252 return 12;
254 Console.WriteLine ("OK");
255 return 0;