Mercurial > pub > bltoolkit
diff UnitTests/CS/TypeBuilder/GenerateAtributeTest.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/UnitTests/CS/TypeBuilder/GenerateAtributeTest.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,166 @@ +using System; +using System.Reflection; + +using NUnit.Framework; + +using BLToolkit.Reflection; +using BLToolkit.TypeBuilder; + +namespace TypeBuilder +{ + [TestFixture] + public class GenerateAttributeTest + { + [AttributeUsage(AttributeTargets.All, Inherited = false)] + public class NonInheritedAttribute: Attribute + { + public NonInheritedAttribute() + { + } + + public NonInheritedAttribute(Type type, string str) + { + _type = type; + } + + public NonInheritedAttribute(Type type, string str, int i, AttributeTargets e): + this(type, str) + { + } + + private string _namedArgument; + public string NamedArgument + { + get { return _namedArgument; } + set { _namedArgument = value; } + } + + private Type _type; + public Type Type + { + get { return _type; } + set { _type = value; } + } + } + + public abstract class TestObject + { + [NonInherited] + public abstract void Method1(); + + [GenerateAttribute(typeof (NonInheritedAttribute))] + public abstract void Method2(); + + [GenerateAttribute(typeof (NonInheritedAttribute), typeof(TestObject), "str", 123, AttributeTargets.Field)] + public abstract void Method3(); + + [GenerateAttribute(typeof (NonInheritedAttribute))] + public virtual void Method4(){} + + [GenerateAttribute(typeof(NonInheritedAttribute), + NamedArgumentNames = new string[] { "NamedArgument"}, + NamedArgumentValues = new object[] { "SomeValue"})] + public virtual void Method5() { } + + public abstract int Prop1 + { + [GenerateAttribute(typeof(NonInheritedAttribute))] get; + [GenerateAttribute(typeof(NonInheritedAttribute))] set; + } + + private int _prop2; + public virtual int Prop2 + { + [GenerateAttribute(typeof(NonInheritedAttribute))] get { return _prop2; } + [GenerateAttribute(typeof(NonInheritedAttribute))] set { _prop2 = value; } + } + + // This affects the underlying field, not the property itself. + // + [GenerateAttribute(typeof(NonInheritedAttribute))] + public abstract int Prop3 { get; set; } + } + + [Test] + public void MainTest() + { + TestObject o = (TestObject)TypeAccessor.CreateInstance(typeof(TestObject)); + Type type = o.GetType(); + + Assert.IsNull (Attribute.GetCustomAttribute(type.GetMethod("Method1"), typeof(NonInheritedAttribute))); + + Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetMethod("Method2"), typeof(NonInheritedAttribute))); + Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetMethod("Method3"), typeof(NonInheritedAttribute))); + Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetMethod("Method4"), typeof(NonInheritedAttribute))); + + Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetProperty("Prop1").GetGetMethod(), typeof(NonInheritedAttribute))); + Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetProperty("Prop1").GetSetMethod(), typeof(NonInheritedAttribute))); + Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetProperty("Prop2").GetGetMethod(), typeof(NonInheritedAttribute))); + Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetProperty("Prop2").GetSetMethod(), typeof(NonInheritedAttribute))); + + Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetField("_prop3", BindingFlags.Instance | BindingFlags.NonPublic), typeof(NonInheritedAttribute))); + + NonInheritedAttribute attribute = (NonInheritedAttribute) + Attribute.GetCustomAttribute(type.GetMethod("Method5"), typeof(NonInheritedAttribute)); + + Assert.IsNotNull(attribute); + Assert.AreEqual("SomeValue", attribute.NamedArgument); + } + + public abstract class BadObject + { + [GenerateAttribute(typeof (NonInheritedAttribute), "str")] + public abstract void Method(); + } + + [Test, ExpectedException(typeof(TypeBuilderException))] + public void MismatchedAgsTest() + { + TypeAccessor.CreateInstance(typeof(BadObject)); + } + + // In FW1.1 an attribute argument may not be null, as stated in 17.2: + // "An attribute argument must be a constant expression, + // typeof expression or one-dimensional array creation expression." + + public abstract class NullArgObject + { + [GenerateAttribute(typeof(NonInheritedAttribute), null, null)] + public abstract void Method(); + } + + [Test] + public void NullArgTest() + { + TypeAccessor.CreateInstance(typeof(NullArgObject)); + } + + public class CustomGenerateAttribute: GenerateAttributeAttribute + { + public CustomGenerateAttribute(): base(typeof(NonInheritedAttribute)) + { + this["NamedArgument"] = "NamedValue"; + this["Type"] = Type.GetType("System.Int32"); + } + } + + [CustomGenerate] + public abstract class CustomObject + { + } + + [Test] + public void CustomGenerateTest() + { + CustomObject o = TypeAccessor<CustomObject>.CreateInstanceEx(); + Type type = o.GetType(); + + NonInheritedAttribute attr = (NonInheritedAttribute) + Attribute.GetCustomAttribute(type, typeof(NonInheritedAttribute)); + + Assert.That(attr, Is.Not.Null); + Assert.That(attr.Type, Is.EqualTo(typeof(int))); + Assert.That(attr.NamedArgument, Is.EqualTo("NamedValue")); + } + } +}