Mercurial > pub > bltoolkit
comparison UnitTests/CS/Aspects/OverloadAspectTest.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f990fcb411a9 |
---|---|
1 using System; | |
2 | |
3 using NUnit.Framework; | |
4 | |
5 using BLToolkit.Aspects; | |
6 using BLToolkit.Reflection; | |
7 using BLToolkit.TypeBuilder; | |
8 | |
9 namespace Aspects | |
10 { | |
11 [TestFixture] | |
12 public class OverloadAspectTest | |
13 { | |
14 public abstract class TestObject<T> | |
15 { | |
16 public T Test(T inVal, out T outVal) | |
17 { | |
18 outVal = inVal; | |
19 return inVal; | |
20 } | |
21 | |
22 public string Test(DateTime dateVal, string inVal) | |
23 { | |
24 return inVal.ToUpper(); | |
25 } | |
26 | |
27 [Overload] abstract public T Test(T inVal); | |
28 [Overload] abstract public T Test(T inVal, out T outVal, ref T refVal); | |
29 [Overload] abstract public T Test(T inVal, DateTime dateVal); | |
30 } | |
31 | |
32 public abstract class TestObject | |
33 { | |
34 public int IntValue; | |
35 public string StrValue; | |
36 public Guid GuidValue; | |
37 | |
38 public void Test(int intVal, Guid guidVal) | |
39 { | |
40 IntValue = intVal; | |
41 GuidValue = guidVal; | |
42 StrValue = "(default)"; | |
43 } | |
44 | |
45 public void Test(int intVal, string strVal) | |
46 { | |
47 IntValue = intVal; | |
48 StrValue = strVal; | |
49 GuidValue = Guid.Empty; | |
50 } | |
51 | |
52 public void OutRefTest(int inVal, out int outVal, ref int refVal) | |
53 { | |
54 outVal = inVal; | |
55 refVal += inVal; | |
56 } | |
57 | |
58 public void OutRefStructTest(int? inVal, out int? outVal, ref int? refVal) | |
59 { | |
60 outVal = inVal; | |
61 refVal += inVal; | |
62 } | |
63 | |
64 protected static int StaticMethod(int intVal, ref Guid guidVal) | |
65 { | |
66 return intVal; | |
67 } | |
68 | |
69 public T Generic<T>(T inVal, out T outVal) | |
70 { | |
71 outVal = inVal; | |
72 return inVal; | |
73 } | |
74 | |
75 // Becomes | |
76 // public override void Test(Guid guidVal) | |
77 // { | |
78 // Test(default(int), guidVal); | |
79 // } | |
80 // | |
81 [Overload] public abstract void Test(Guid guidVal); | |
82 | |
83 // Becomes | |
84 // public override void Test(Guid guidVal, int intVal) | |
85 // { | |
86 // Test(intVal, guidVal); | |
87 // } | |
88 // | |
89 [Overload] public abstract void Test(Guid guidVal, int intVal); | |
90 | |
91 // Becomes | |
92 // public override void Test(string strVal) | |
93 // { | |
94 // Test(default(int), strVal); | |
95 // } | |
96 // | |
97 [Overload] | |
98 public abstract void Test(string strVal); | |
99 | |
100 // Overload method name may be altered. | |
101 // | |
102 [Overload("Test")] | |
103 public abstract void GuidTest(Guid guidVal, DateTime dateVal); | |
104 | |
105 // Parameter types of the method to overload. | |
106 // | |
107 [Overload(typeof(int), typeof(Guid))] | |
108 public abstract void Test(DateTime strVal); | |
109 | |
110 // There may be more or less parameters in the overloaded method. | |
111 // | |
112 [Overload] public abstract void OutRefTest(int inVal, out int outVal, ref int refVal, out string strVal); | |
113 [Overload] public abstract void OutRefTest(int inVal); | |
114 | |
115 // Value types and ref value types also works. | |
116 // | |
117 [Overload] public abstract void OutRefStructTest(int? inVal, out int? outVal, ref int? refVal, out Guid guidVal); | |
118 [Overload] public abstract void OutRefStructTest(int? inVal); | |
119 | |
120 // We can overload static methods. | |
121 // | |
122 [Overload] public abstract int StaticMethod(int intVal); | |
123 | |
124 // We can overload methods declared in a base type. | |
125 // | |
126 [Overload] public abstract string ToString(int intVal); | |
127 | |
128 // A generic method can be overloaded by an other generic method. | |
129 // | |
130 [Overload] public abstract T Generic<T>(T inVal); | |
131 } | |
132 | |
133 [Test] | |
134 public void OverloadTest() | |
135 { | |
136 TestObject o = TypeAccessor<TestObject>.CreateInstance(); | |
137 | |
138 o.Test(12345, "str"); | |
139 | |
140 Assert.AreEqual(12345, o.IntValue); | |
141 Assert.AreEqual("str", o.StrValue); | |
142 Assert.AreEqual(Guid.Empty, o.GuidValue); | |
143 | |
144 o.Test(Guid.NewGuid(), 123); | |
145 | |
146 Assert.AreEqual(123, o.IntValue); | |
147 Assert.AreEqual("(default)", o.StrValue); | |
148 Assert.AreNotEqual(Guid.Empty, o.GuidValue); | |
149 | |
150 o.Test("foo"); | |
151 | |
152 Assert.AreEqual(0, o.IntValue); | |
153 Assert.AreEqual("foo", o.StrValue); | |
154 Assert.AreEqual(Guid.Empty, o.GuidValue); | |
155 | |
156 o.Test(Guid.NewGuid()); | |
157 | |
158 Assert.AreEqual(0, o.IntValue); | |
159 Assert.AreEqual("(default)", o.StrValue); | |
160 Assert.AreNotEqual(Guid.Empty, o.GuidValue); | |
161 | |
162 Assert.AreEqual(1, o.Generic(1)); | |
163 } | |
164 | |
165 [Test] | |
166 public void AnyNameTest() | |
167 { | |
168 TestObject o = TypeAccessor<TestObject>.CreateInstance(); | |
169 | |
170 o.GuidTest(Guid.NewGuid(), DateTime.Now); | |
171 | |
172 Assert.AreEqual(0, o.IntValue); | |
173 Assert.AreEqual("(default)", o.StrValue); | |
174 Assert.AreNotEqual(Guid.Empty, o.GuidValue); | |
175 } | |
176 | |
177 [Test] | |
178 public void ExplicitParameterTypesTest() | |
179 { | |
180 TestObject o = TypeAccessor<TestObject>.CreateInstance(); | |
181 | |
182 o.Test(DateTime.Now); | |
183 | |
184 Assert.AreEqual(0, o.IntValue); | |
185 Assert.AreEqual("(default)", o.StrValue); | |
186 Assert.AreEqual(Guid.Empty, o.GuidValue); | |
187 } | |
188 | |
189 [Test] | |
190 public void StaticMethodTest() | |
191 { | |
192 TestObject o = TypeAccessor<TestObject>.CreateInstance(); | |
193 | |
194 int intVal = o.StaticMethod(123); | |
195 | |
196 Assert.AreEqual(123, intVal); | |
197 } | |
198 | |
199 [Test] | |
200 public void BaseTypeMethodTest() | |
201 { | |
202 TestObject o = TypeAccessor<TestObject>.CreateInstance(); | |
203 | |
204 Assert.AreEqual(o.ToString(), o.ToString(123)); | |
205 } | |
206 | |
207 [Test] | |
208 public void OutRefTest() | |
209 { | |
210 TestObject o = TypeAccessor<TestObject>.CreateInstance(); | |
211 | |
212 const int inVal = 123; | |
213 int refVal = 99; | |
214 int outVal; | |
215 string strVal; | |
216 o.OutRefTest(inVal, out outVal, ref refVal, out strVal); | |
217 | |
218 Assert.AreEqual(inVal, outVal); | |
219 Assert.AreEqual(222, refVal); | |
220 Assert.AreEqual(string.Empty, strVal); | |
221 | |
222 o.OutRefTest(inVal); | |
223 } | |
224 | |
225 [Test] | |
226 public void OutRefStructTest() | |
227 { | |
228 TestObject o = TypeAccessor<TestObject>.CreateInstance(); | |
229 | |
230 int? inVal = 123; | |
231 int? refVal = 99; | |
232 int? outVal; | |
233 Guid guidVal; | |
234 o.OutRefStructTest(inVal, out outVal, ref refVal, out guidVal); | |
235 | |
236 Assert.AreEqual(inVal, outVal); | |
237 Assert.AreEqual(222, refVal); | |
238 Assert.AreEqual(Guid.Empty, guidVal); | |
239 | |
240 o.OutRefStructTest(inVal); | |
241 } | |
242 | |
243 [Test] | |
244 public void GenericTypeTest() | |
245 { | |
246 TestObject<int?> o = TypeAccessor<TestObject<int?>>.CreateInstance(); | |
247 | |
248 int? inVal = 123; | |
249 int? refVal = 99; | |
250 int? outVal; | |
251 o.Test(inVal, out outVal, ref refVal); | |
252 | |
253 Assert.AreEqual(inVal, outVal); | |
254 Assert.AreEqual(refVal, 99); | |
255 | |
256 Assert.AreEqual(inVal, o.Test(inVal)); | |
257 Assert.AreEqual(12, o.Test(12, DateTime.Now)); | |
258 | |
259 TestObject<string> o2 = TypeAccessor<TestObject<string>>.CreateInstance(); | |
260 | |
261 // When T is a string, method Test(DateTime, string) becomes the best match. | |
262 // | |
263 Assert.AreEqual("STR", o2.Test("str", DateTime.Now)); | |
264 } | |
265 | |
266 } | |
267 } |