3c1f479b9d
Former-commit-id: 806294f5ded97629b74c85c09952f2a74fe182d9
299 lines
8.1 KiB
C#
299 lines
8.1 KiB
C#
//
|
|
// FieldBuilderTest.cs - NUnit Test Cases for the FieldBuilder class
|
|
//
|
|
// Gert Driesen (drieseng@users.sourceforge.net)
|
|
//
|
|
// (C) Novell, Inc. http://www.novell.com
|
|
|
|
using System;
|
|
using System.Globalization;
|
|
using System.Threading;
|
|
using System.Reflection;
|
|
using System.Reflection.Emit;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Security;
|
|
using System.Security.Permissions;
|
|
using System.Runtime.InteropServices;
|
|
|
|
using NUnit.Framework;
|
|
|
|
namespace MonoTests.System.Reflection.Emit
|
|
{
|
|
[TestFixture]
|
|
public class FieldBuilderTest
|
|
{
|
|
private static int typeIndexer = 0;
|
|
private TypeBuilder _tb;
|
|
private ModuleBuilder module;
|
|
|
|
[SetUp]
|
|
protected void SetUp ()
|
|
{
|
|
AssemblyName assemblyName = new AssemblyName ();
|
|
assemblyName.Name = "MonoTests.System.Reflection.Emit.FieldBuilderTest";
|
|
|
|
AssemblyBuilder assembly = Thread.GetDomain ().DefineDynamicAssembly (
|
|
assemblyName, AssemblyBuilderAccess.Run);
|
|
|
|
module = assembly.DefineDynamicModule ("module1");
|
|
_tb = module.DefineType (genTypeName (), TypeAttributes.Public);
|
|
}
|
|
|
|
[Test]
|
|
public void TestFieldProperties ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
Assert.AreEqual (FieldAttributes.Public, field.Attributes);
|
|
Assert.AreEqual (_tb, field.DeclaringType);
|
|
Assert.AreEqual (typeof(string), field.FieldType);
|
|
Assert.AreEqual ("name", field.Name);
|
|
Assert.AreEqual (_tb, field.ReflectedType);
|
|
}
|
|
|
|
[Test]
|
|
[ExpectedException (typeof(NotSupportedException))]
|
|
public void TestFieldHandleIncomplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
RuntimeFieldHandle handle = field.FieldHandle;
|
|
}
|
|
|
|
[Test]
|
|
[ExpectedException (typeof(NotSupportedException))]
|
|
public void TestFieldHandleComplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
_tb.CreateType ();
|
|
RuntimeFieldHandle handle = field.FieldHandle;
|
|
}
|
|
|
|
[Test]
|
|
[ExpectedException (typeof(NotSupportedException))]
|
|
public void TestGetCustomAttributesIncomplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
field.GetCustomAttributes (false);
|
|
}
|
|
|
|
[Test]
|
|
[ExpectedException (typeof(NotSupportedException))]
|
|
[Ignore ("mono supports this")]
|
|
public void TestGetCustomAttributesComplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
_tb.CreateType ();
|
|
field.GetCustomAttributes (false);
|
|
}
|
|
|
|
[Test]
|
|
[ExpectedException (typeof(NotSupportedException))]
|
|
public void TestGetCustomAttributesOfTypeIncomplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
field.GetCustomAttributes (typeof(ObsoleteAttribute), false);
|
|
}
|
|
|
|
[Test]
|
|
[ExpectedException (typeof(NotSupportedException))]
|
|
[Ignore ("mono supports this")]
|
|
public void TestGetCustomAttributesOfTypeComplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
_tb.CreateType ();
|
|
field.GetCustomAttributes (typeof(ObsoleteAttribute), false);
|
|
}
|
|
|
|
[Test]
|
|
[ExpectedException (typeof(NotSupportedException))]
|
|
public void TestGetValueIncomplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
field.GetValue (_tb);
|
|
}
|
|
|
|
[Test]
|
|
[ExpectedException (typeof(NotSupportedException))]
|
|
public void TestGetValueComplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
_tb.CreateType ();
|
|
field.GetValue (_tb);
|
|
}
|
|
|
|
[Test]
|
|
[ExpectedException (typeof(NotSupportedException))]
|
|
public void TestIsDefinedIncomplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
field.IsDefined (typeof(ObsoleteAttribute), true);
|
|
}
|
|
|
|
[Test]
|
|
[ExpectedException (typeof(NotSupportedException))]
|
|
public void TestIsDefinedComplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
_tb.CreateType ();
|
|
field.IsDefined (typeof(ObsoleteAttribute), true);
|
|
}
|
|
|
|
[Test]
|
|
public void TestSetConstantIncomplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
field.SetConstant ("default");
|
|
}
|
|
|
|
[Test]
|
|
[ExpectedException (typeof(InvalidOperationException))]
|
|
public void TestSetConstantComplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
_tb.CreateType ();
|
|
field.SetConstant ("default");
|
|
}
|
|
|
|
[Test]
|
|
public void TestSetConstantDateTime ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("datetime",
|
|
typeof(DateTime), FieldAttributes.Public);
|
|
field.SetConstant (DateTime.MinValue);
|
|
_tb.CreateType ();
|
|
}
|
|
|
|
[Test]
|
|
[ExpectedException (typeof(InvalidOperationException))]
|
|
public void TestSetCustomAttributeCaBuilderComplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
_tb.CreateType ();
|
|
|
|
ConstructorInfo guidCtor = typeof(GuidAttribute).GetConstructor (
|
|
new Type[] {
|
|
typeof(string)
|
|
});
|
|
CustomAttributeBuilder caBuilder = new CustomAttributeBuilder (guidCtor,
|
|
new object[] {
|
|
Guid.NewGuid ().ToString ("D")
|
|
}, new FieldInfo[0], new object[0]);
|
|
|
|
field.SetCustomAttribute (caBuilder);
|
|
}
|
|
|
|
[Test]
|
|
[ExpectedException (typeof(InvalidOperationException))]
|
|
public void TestSetCustomAttributeCtorComplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
_tb.CreateType ();
|
|
|
|
ConstructorInfo guidCtor = typeof(GuidAttribute).GetConstructor (
|
|
new Type[] {
|
|
typeof(string)
|
|
});
|
|
|
|
field.SetCustomAttribute (guidCtor, new byte[] { 01,00,01,00,00 });
|
|
}
|
|
|
|
[Test]
|
|
[ExpectedException (typeof(InvalidOperationException))]
|
|
public void TestSetMarshalComplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
_tb.CreateType ();
|
|
field.SetMarshal (UnmanagedMarshal.DefineSafeArray (UnmanagedType.BStr));
|
|
}
|
|
|
|
[Test]
|
|
[ExpectedException (typeof(InvalidOperationException))]
|
|
public void TestSetOffsetComplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
_tb.CreateType ();
|
|
field.SetOffset (1);
|
|
}
|
|
|
|
[Test]
|
|
[ExpectedException (typeof(NotSupportedException))]
|
|
public void TestSetValueComplete ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
_tb.CreateType ();
|
|
field.SetValue ((object) 1, 1, BindingFlags.Public, null,
|
|
CultureInfo.InvariantCulture);
|
|
}
|
|
|
|
[Test]
|
|
public void GetCustomAttributes ()
|
|
{
|
|
FieldBuilder field = _tb.DefineField ("name",
|
|
typeof(string), FieldAttributes.Public);
|
|
|
|
Type attrType = typeof (ObsoleteAttribute);
|
|
ConstructorInfo ctorInfo =
|
|
attrType.GetConstructor (new Type [] { typeof (String) });
|
|
|
|
field.SetCustomAttribute (new CustomAttributeBuilder (ctorInfo, new object [] { "FOO" }));
|
|
|
|
Type t = _tb.CreateType ();
|
|
|
|
// Try the created type
|
|
{
|
|
FieldInfo fi = t.GetField ("name");
|
|
object[] attrs = fi.GetCustomAttributes (true);
|
|
|
|
Assert.AreEqual (1, attrs.Length);
|
|
Assert.IsTrue (attrs [0] is ObsoleteAttribute);
|
|
Assert.AreEqual ("FOO", ((ObsoleteAttribute)attrs [0]).Message);
|
|
}
|
|
|
|
// Try the type builder
|
|
{
|
|
FieldInfo fi = _tb.GetField ("name");
|
|
object[] attrs = fi.GetCustomAttributes (true);
|
|
|
|
Assert.AreEqual (1, attrs.Length);
|
|
Assert.IsTrue (attrs [0] is ObsoleteAttribute);
|
|
Assert.AreEqual ("FOO", ((ObsoleteAttribute)attrs [0]).Message);
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void GetRawConstantValue () {
|
|
EnumBuilder enumBuilder = module.DefineEnum ("gggg",
|
|
TypeAttributes.Public, typeof(int));
|
|
enumBuilder.DefineLiteral ("TF", 4);
|
|
|
|
enumBuilder.CreateType ();
|
|
|
|
var fields = enumBuilder.GetFields (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
|
|
Assert.AreEqual (4, fields[0].GetRawConstantValue ());
|
|
}
|
|
|
|
// Return a unique type name
|
|
private string genTypeName ()
|
|
{
|
|
return "class" + (typeIndexer++);
|
|
}
|
|
}
|
|
}
|