(DISTFILES): Comment out a few missing files.
[mono-project.git] / mcs / class / corlib / Test / System.Reflection.Emit / ModuleBuilderTest.cs
blob11b8b9375d2d1bf80d1439ae5b9470bd89af4b7a
1 //
2 // ModuleBuilderTest - NUnit Test Cases for the ModuleBuilder class
3 //
4 // Zoltan Varga (vargaz@freemail.hu)
5 //
6 // (C) Ximian, Inc. http://www.ximian.com
7 //
8 //
11 using System;
12 using System.Threading;
13 using System.Reflection;
14 using System.Reflection.Emit;
15 using System.IO;
16 using System.Collections;
17 using System.Diagnostics.SymbolStore;
18 using System.Runtime.InteropServices;
20 using NUnit.Framework;
22 namespace MonoTests.System.Reflection.Emit
25 [TestFixture]
26 public class ModuleBuilderTest : Assertion
28 static string TempFolder = Path.Combine (Path.GetTempPath (), "MT.S.R.E.MBT");
30 [SetUp]
31 public void SetUp () {
32 while (Directory.Exists (TempFolder))
33 TempFolder = Path.Combine (TempFolder, "2");
34 Directory.CreateDirectory (TempFolder);
37 [TearDown]
38 public void TearDown () {
39 try {
40 // This throws an exception under MS.NET, since the directory contains loaded
41 // assemblies.
42 Directory.Delete (TempFolder, true);
44 catch (Exception) {
48 [Test]
49 public void TestIsTransient () {
50 AssemblyName assemblyName = new AssemblyName();
51 assemblyName.Name = "foo";
53 AssemblyBuilder ab
54 = Thread.GetDomain().DefineDynamicAssembly(
55 assemblyName, AssemblyBuilderAccess.RunAndSave, TempFolder);
56 ModuleBuilder mb1 = ab.DefineDynamicModule ("foo.dll");
57 AssertEquals (true, mb1.IsTransient ());
58 ModuleBuilder mb2 = ab.DefineDynamicModule ("foo2.dll", "foo2.dll");
59 AssertEquals (false, mb2.IsTransient ());
62 // Some of these tests overlap with the tests for Module
64 [Test]
65 public void TestGlobalData () {
67 AssemblyName assemblyName = new AssemblyName();
68 assemblyName.Name = "foo";
70 AssemblyBuilder ab
71 = Thread.GetDomain().DefineDynamicAssembly(
72 assemblyName, AssemblyBuilderAccess.RunAndSave, TempFolder);
74 string resfile = Path.Combine (TempFolder, "res");
75 using (StreamWriter sw = new StreamWriter (resfile)) {
76 sw.WriteLine ("FOO");
79 ModuleBuilder mb = ab.DefineDynamicModule("foo.dll", "foo.dll");
81 mb.DefineInitializedData ("DATA", new byte [100], FieldAttributes.Public);
82 mb.DefineInitializedData ("DATA2", new byte [100], FieldAttributes.Public);
83 mb.DefineInitializedData ("DATA3", new byte [99], FieldAttributes.Public);
84 mb.DefineUninitializedData ("DATA4", 101, FieldAttributes.Public);
85 mb.DefineInitializedData ("DATA_PRIVATE", new byte [100], 0);
86 mb.CreateGlobalFunctions ();
88 ab.Save ("foo.dll");
90 Assembly assembly = Assembly.LoadFrom (Path.Combine (TempFolder, "foo.dll"));
92 Module module = assembly.GetLoadedModules ()[0];
94 string[] expectedFieldNames = new string [] {
95 "DATA", "DATA2", "DATA3", "DATA4"
97 ArrayList fieldNames = new ArrayList ();
98 foreach (FieldInfo fi in module.GetFields ()) {
99 fieldNames.Add (fi.Name);
101 AssertArrayEqualsSorted (expectedFieldNames, fieldNames.ToArray (typeof (string)));
103 AssertEquals (module.GetField ("DATA") != null, true);
104 AssertEquals (module.GetField ("DATA2") != null, true);
105 AssertEquals (module.GetField ("DATA3") != null, true);
106 AssertEquals (module.GetField ("DATA4") != null, true);
107 AssertEquals (module.GetField ("DATA_PRIVATE"), null);
108 AssertEquals (module.GetField ("DATA_PRIVATE", BindingFlags.NonPublic | BindingFlags.Static) != null, true);
111 [Test]
112 public void TestGlobalMethods () {
113 AssemblyName an = new AssemblyName();
114 an.Name = "TestGlobalMethods";
115 AssemblyBuilder builder =
116 AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);
117 ModuleBuilder module = builder.DefineDynamicModule("MessageModule");
118 MethodBuilder method = module.DefinePInvokeMethod("printf", "libc.so",
119 MethodAttributes.PinvokeImpl | MethodAttributes.Static | MethodAttributes.Public,
120 CallingConventions.Standard, typeof(void), new Type[]{typeof(string)}, CallingConvention.Winapi,
121 CharSet.Auto);
122 method.SetImplementationFlags (MethodImplAttributes.PreserveSig |
123 method.GetMethodImplementationFlags());
124 module.CreateGlobalFunctions();
126 Assert (module.GetMethod ("printf") != null);
129 [Test]
130 public void DuplicateSymbolDocument () {
131 AssemblyName assemblyName = new AssemblyName();
132 assemblyName.Name = "ModuleBuilderTest.DuplicateSymbolDocument";
134 AssemblyBuilder ab
135 = Thread.GetDomain().DefineDynamicAssembly(
136 assemblyName, AssemblyBuilderAccess.RunAndSave, TempFolder);
138 ModuleBuilder mb = ab.DefineDynamicModule("foo.dll", "foo.dll", true);
140 // Check that it is possible to redefine a symbol document
141 ISymbolDocumentWriter doc1 =
142 mb.DefineDocument("foo.il", SymDocumentType.Text,
143 SymLanguageType.ILAssembly,SymLanguageVendor.Microsoft);
144 ISymbolDocumentWriter doc2 =
145 mb.DefineDocument("foo.il", SymDocumentType.Text,
146 SymLanguageType.ILAssembly,SymLanguageVendor.Microsoft);
149 private static void AssertArrayEqualsSorted (Array o1, Array o2) {
150 Array s1 = (Array)o1.Clone ();
151 Array s2 = (Array)o2.Clone ();
153 Array.Sort (s1);
154 Array.Sort (s2);
156 AssertEquals (s1.Length, s2.Length);
157 for (int i = 0; i < s1.Length; ++i)
158 AssertEquals (s1.GetValue (i), s2.GetValue (i));