annotate UnitTests/CS/TypeBuilder/GenerateAtributeTest.cs @ 3:1ef98bd70424

!bug 100 +3h Исправление проблемы BLToolkit + mono 3.4
author cin
date Fri, 22 Aug 2014 17:34:46 +0400
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using NUnit.Framework;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using BLToolkit.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using BLToolkit.TypeBuilder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 namespace TypeBuilder
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 [TestFixture]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 public class GenerateAttributeTest
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 [AttributeUsage(AttributeTargets.All, Inherited = false)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 public class NonInheritedAttribute: Attribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 public NonInheritedAttribute()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 public NonInheritedAttribute(Type type, string str)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 _type = type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 public NonInheritedAttribute(Type type, string str, int i, AttributeTargets e):
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 this(type, str)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 private string _namedArgument;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 public string NamedArgument
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 get { return _namedArgument; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 set { _namedArgument = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 private Type _type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 public Type Type
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 get { return _type; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 set { _type = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 public abstract class TestObject
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 [NonInherited]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 public abstract void Method1();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 [GenerateAttribute(typeof (NonInheritedAttribute))]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 public abstract void Method2();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 [GenerateAttribute(typeof (NonInheritedAttribute), typeof(TestObject), "str", 123, AttributeTargets.Field)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 public abstract void Method3();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 [GenerateAttribute(typeof (NonInheritedAttribute))]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 public virtual void Method4(){}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 [GenerateAttribute(typeof(NonInheritedAttribute),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 NamedArgumentNames = new string[] { "NamedArgument"},
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 NamedArgumentValues = new object[] { "SomeValue"})]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 public virtual void Method5() { }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 public abstract int Prop1
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 [GenerateAttribute(typeof(NonInheritedAttribute))] get;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 [GenerateAttribute(typeof(NonInheritedAttribute))] set;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 private int _prop2;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 public virtual int Prop2
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 [GenerateAttribute(typeof(NonInheritedAttribute))] get { return _prop2; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 [GenerateAttribute(typeof(NonInheritedAttribute))] set { _prop2 = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 // This affects the underlying field, not the property itself.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 [GenerateAttribute(typeof(NonInheritedAttribute))]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 public abstract int Prop3 { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 public void MainTest()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 TestObject o = (TestObject)TypeAccessor.CreateInstance(typeof(TestObject));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 Type type = o.GetType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 Assert.IsNull (Attribute.GetCustomAttribute(type.GetMethod("Method1"), typeof(NonInheritedAttribute)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetMethod("Method2"), typeof(NonInheritedAttribute)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetMethod("Method3"), typeof(NonInheritedAttribute)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetMethod("Method4"), typeof(NonInheritedAttribute)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetProperty("Prop1").GetGetMethod(), typeof(NonInheritedAttribute)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetProperty("Prop1").GetSetMethod(), typeof(NonInheritedAttribute)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetProperty("Prop2").GetGetMethod(), typeof(NonInheritedAttribute)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetProperty("Prop2").GetSetMethod(), typeof(NonInheritedAttribute)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetField("_prop3", BindingFlags.Instance | BindingFlags.NonPublic), typeof(NonInheritedAttribute)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 NonInheritedAttribute attribute = (NonInheritedAttribute)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 Attribute.GetCustomAttribute(type.GetMethod("Method5"), typeof(NonInheritedAttribute));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 Assert.IsNotNull(attribute);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 Assert.AreEqual("SomeValue", attribute.NamedArgument);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 public abstract class BadObject
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 [GenerateAttribute(typeof (NonInheritedAttribute), "str")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 public abstract void Method();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 [Test, ExpectedException(typeof(TypeBuilderException))]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 public void MismatchedAgsTest()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 TypeAccessor.CreateInstance(typeof(BadObject));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 // In FW1.1 an attribute argument may not be null, as stated in 17.2:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 // "An attribute argument must be a constant expression,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 // typeof expression or one-dimensional array creation expression."
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 public abstract class NullArgObject
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 [GenerateAttribute(typeof(NonInheritedAttribute), null, null)]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 public abstract void Method();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 public void NullArgTest()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 TypeAccessor.CreateInstance(typeof(NullArgObject));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 public class CustomGenerateAttribute: GenerateAttributeAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 public CustomGenerateAttribute(): base(typeof(NonInheritedAttribute))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 this["NamedArgument"] = "NamedValue";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 this["Type"] = Type.GetType("System.Int32");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 [CustomGenerate]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 public abstract class CustomObject
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 public void CustomGenerateTest()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 CustomObject o = TypeAccessor<CustomObject>.CreateInstanceEx();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 Type type = o.GetType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 NonInheritedAttribute attr = (NonInheritedAttribute)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 Attribute.GetCustomAttribute(type, typeof(NonInheritedAttribute));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 Assert.That(attr, Is.Not.Null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 Assert.That(attr.Type, Is.EqualTo(typeof(int)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 Assert.That(attr.NamedArgument, Is.EqualTo("NamedValue"));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 }