Author: gert
Date: 2007-12-22 13:50:30 -0500 (Sat, 22 Dec 2007)
New Revision: 91810

Modified:
   trunk/gert/standalone/bug322762/test.cs
Log:
On Mono, do not rely on the order in which the constructors are returned since
our ilasm does no retain the order from IL.


Modified: trunk/gert/standalone/bug322762/test.cs
===================================================================
--- trunk/gert/standalone/bug322762/test.cs     2007-12-22 13:18:15 UTC (rev 
91809)
+++ trunk/gert/standalone/bug322762/test.cs     2007-12-22 18:50:30 UTC (rev 
91810)
@@ -46,7 +46,13 @@
                GetFieldNestedTest (typeof (libC.Bar.Child));
 
                GetConstructorsTest (typeof (Bar), false);
+#if MONO
+               // Mono's ilasm does not retain the order of the constructors
+               // see bug #350517
+               GetConstructorsILTest (typeof (libA.Bar));
+#else
                GetConstructorsTest (typeof (libA.Bar), true);
+#endif
                GetConstructorsTest (typeof (libB.Bar), false);
                GetConstructorsTest (typeof (libC.Bar), false);
        }
@@ -4736,7 +4742,7 @@
                ctors = type.GetConstructors (flags);
 
                Assert.AreEqual (5, ctors.Length, "#A1");
-               Assert.IsFalse (ctors [0].IsAssembly, "#A2");
+               Assert.IsFalse (ctors [0].IsAssembly, "#A2:" + type.FullName);
                Assert.IsFalse (ctors [0].IsFamily, "#A3");
                Assert.IsFalse (ctors [0].IsFamilyAndAssembly, "#A4");
                Assert.IsFalse (ctors [0].IsFamilyOrAssembly, "#A5");
@@ -5029,6 +5035,151 @@
                Assert.IsTrue (ctors [0].IsStatic, "#N8");
        }
 
+#if MONO
+       static void GetConstructorsILTest (Type type)
+       {
+               BindingFlags flags;
+               ConstructorInfo [] ctors;
+
+               flags = BindingFlags.Instance | BindingFlags.NonPublic;
+               ctors = type.GetConstructors (flags);
+
+               Assert.AreEqual (5, ctors.Length, "#A1");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Private, false, "#A2"), "#A2");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Family, false, "#A3"), "#A3");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.FamANDAssem, false, "#A4"), "#A4");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.FamORAssem, false, "#A5"), "#A5");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Assembly, false, "#A6"), "#A6");
+
+               flags = BindingFlags.Instance | BindingFlags.Public;
+               ctors = type.GetConstructors (flags);
+
+               Assert.AreEqual (1, ctors.Length, "#B1");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Public, false, "#B2"), "#B2");
+
+               flags = BindingFlags.Static | BindingFlags.Public;
+               ctors = type.GetConstructors (flags);
+
+               Assert.AreEqual (0, ctors.Length, "#C1");
+
+               flags = BindingFlags.Static | BindingFlags.NonPublic;
+               ctors = type.GetConstructors (flags);
+
+               Assert.AreEqual (1, ctors.Length, "#D1");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Private, true, "#D2"), "#D2");
+
+               flags = BindingFlags.Instance | BindingFlags.NonPublic |
+                       BindingFlags.FlattenHierarchy;
+               ctors = type.GetConstructors (flags);
+
+               Assert.AreEqual (5, ctors.Length, "#E1");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Private, false, "#E2"), "#E2");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Family, false, "#E3"), "#E3");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.FamANDAssem, false, "#E4"), "#E4");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.FamORAssem, false, "#E5"), "#E5");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Assembly, false, "#E6"), "#E6");
+
+               flags = BindingFlags.Instance | BindingFlags.Public |
+                       BindingFlags.FlattenHierarchy;
+               ctors = type.GetConstructors (flags);
+
+               Assert.AreEqual (1, ctors.Length, "#F1");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Public, false, "#F2"), "#F2");
+
+               flags = BindingFlags.Static | BindingFlags.Public |
+                       BindingFlags.FlattenHierarchy;
+               ctors = type.GetConstructors (flags);
+
+               Assert.AreEqual (0, ctors.Length, "#G1");
+
+               flags = BindingFlags.Static | BindingFlags.NonPublic |
+                       BindingFlags.FlattenHierarchy;
+               ctors = type.GetConstructors (flags);
+
+               Assert.AreEqual (1, ctors.Length, "#H1");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Private, true, "#H2"), "#H2");
+
+               flags = BindingFlags.Instance | BindingFlags.NonPublic |
+                       BindingFlags.DeclaredOnly;
+               ctors = type.GetConstructors (flags);
+
+               Assert.AreEqual (5, ctors.Length, "#I1");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Private, false, "#I2"), "#I2");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Family, false, "#I3"), "#I3");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.FamANDAssem, false, "#I4"), "#I4");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.FamORAssem, false, "#I5"), "#I5");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Assembly, false, "#I6"), "#I6");
+
+               flags = BindingFlags.Instance | BindingFlags.Public |
+                       BindingFlags.DeclaredOnly;
+               ctors = type.GetConstructors (flags);
+
+               Assert.AreEqual (1, ctors.Length, "#J1");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Public, false, "#J2"), "#J2");
+
+               flags = BindingFlags.Static | BindingFlags.Public |
+                       BindingFlags.DeclaredOnly;
+               ctors = type.GetConstructors (flags);
+
+               Assert.AreEqual (0, ctors.Length, "#K1");
+
+               flags = BindingFlags.Static | BindingFlags.NonPublic |
+                       BindingFlags.DeclaredOnly;
+               ctors = type.GetConstructors (flags);
+
+               Assert.AreEqual (1, ctors.Length, "#L1");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Private, true, "#L2"), "#L2");
+
+               flags = BindingFlags.Instance | BindingFlags.NonPublic |
+                       BindingFlags.Public;
+               ctors = type.GetConstructors (flags);
+
+               Assert.AreEqual (6, ctors.Length, "#M1");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Private, false, "#M2"), "#M2");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Family, false, "#M3"), "#M3");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.FamANDAssem, false, "#M4"), "#M4");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.FamORAssem, false, "#M5"), "#M5");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Assembly, false, "#M6"), "#M6");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Public, false, "#M7"), "#M7");
+
+               flags = BindingFlags.Static | BindingFlags.NonPublic |
+                       BindingFlags.Public;
+               ctors = type.GetConstructors (flags);
+
+               Assert.AreEqual (1, ctors.Length, "#N1");
+               Assert.IsTrue (ContainsConstructor (ctors, 
MethodAttributes.Private, true, "#N2"), "#N2");
+       }
+
+       static bool ContainsConstructor (ConstructorInfo [] ctors, 
MethodAttributes access, bool isStatic, string msg)
+       {
+               foreach (ConstructorInfo c in ctors) {
+                       if ((c.Attributes & MethodAttributes.MemberAccessMask) 
!= access)
+                               continue;
+
+                       if (c.IsStatic != isStatic)
+                               continue;
+
+                       bool isAssembly = (access == MethodAttributes.Assembly);
+                       bool IsFamily = (access == MethodAttributes.Family);
+                       bool isFamilyAndAssembly = (access == 
MethodAttributes.FamANDAssem);
+                       bool isFamilyOrAssembly = (access == 
MethodAttributes.FamORAssem);
+                       bool isPrivate = (access == MethodAttributes.Private);
+                       bool isPublic = (access == MethodAttributes.Public);
+
+                       Assert.AreEqual (isAssembly, c.IsAssembly, msg + "1");
+                       Assert.AreEqual (IsFamily, c.IsFamily, msg + "2");
+                       Assert.AreEqual (isFamilyAndAssembly, 
c.IsFamilyAndAssembly, msg + "3");
+                       Assert.AreEqual (isFamilyOrAssembly, 
c.IsFamilyOrAssembly, msg + "4");
+                       Assert.AreEqual (isPrivate, c.IsPrivate, msg + "5");
+                       Assert.AreEqual (isPublic, c.IsPublic, msg + "6");
+
+                       return true;
+               }
+
+               return false;
+       }
+#endif
+
        static bool ContainsMethod (MethodInfo [] methods, string name)
        {
                foreach (MethodInfo m in methods)

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to