[CI] ignore appdomain-unload-asmload.exe on interp and full-aot
[mono.git] / mono / tests / generic-virtual.2.cs
index d20c72ba650855b95974ce494a83c350e068ff95..3cf9ce579d13a72854597f270148bb0625e89940 100644 (file)
@@ -3,6 +3,8 @@ using System;
 public class ClassA {}
 public class ClassB {}
 
+public delegate string[] StringArrayDelegate ();
+
 public class Gen<T> {
        static bool checkArr<S> (Array arr, int length) {
                if (arr.GetType () != typeof (S[]))
@@ -43,6 +45,10 @@ public class GenSubSub : GenSub<ClassA> {
        public override S[] newArr<S> () {
                return new S[5];
        }
+
+       public static S[] staticNewArr<S> () {
+               return new S[5];
+       }
 }
 
 public class main {
@@ -50,13 +56,43 @@ public class main {
                Gen<ClassA> ga = new Gen<ClassA> ();
                Gen<ClassA> gsa = new GenSub<ClassA> ();
                Gen<ClassA> gss = new GenSubSub ();
+               int i;
+
+               for (i = 0; i < 100; ++i) {
+                       if (!ga.test ())
+                               return 1;
+                       if (!gsa.test ())
+                               return 1;
+                       if (!gss.test ())
+                               return 1;
+
+                       StringArrayDelegate sad = new StringArrayDelegate (GenSubSub.staticNewArr<string>);
+                       string[] arr = sad ();
+                       if (arr.GetType () != typeof (string[]))
+                               return 1;
+                       if (arr.Length != 5)
+                               return 1;
+
+                       sad = new StringArrayDelegate (gss.newArr<string>);
+                       arr = sad ();
+                       if (arr.GetType () != typeof (string[]))
+                               return 1;
+                       if (arr.Length != 5)
+                               return 1;
+               }
+
+               /* A test for rebuilding generic virtual thunks */
+               for (i = 0; i < 1000; ++i) {
+                       object o = ga.newArr<string> ();
+                       if (!(o is string[]))
+                               return 2;
+               }
+               for (i = 0; i < 1000; ++i) {
+                       object o = ga.newArr<object> ();
+                       if (!(o is object[]))
+                               return 2;
+               }
 
-               if (!ga.test ())
-                       return 1;
-               if (!gsa.test ())
-                       return 1;
-               if (!gss.test ())
-                       return 1;
                return 0;
        }
 }