-
-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathMethodSignatureFixture.cs
More file actions
260 lines (220 loc) · 8.63 KB
/
MethodSignatureFixture.cs
File metadata and controls
260 lines (220 loc) · 8.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
using System;
using System.Linq;
using System.Reflection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Unity;
using Unity.Interception.Interceptors;
using Unity.Interception.Interceptors.InstanceInterceptors.InterfaceInterception;
using Unity.Interception.PolicyInjection;
using Unity.Interception.PolicyInjection.MatchingRules;
using Unity.Interception.PolicyInjection.Pipeline;
using Unity.Interception.PolicyInjection.Policies;
namespace Microsoft.Practices.Unity.InterceptionExtension.Tests
{
[TestClass]
public class MethodSignatureFixture
{
private IUnityContainer container;
[TestInitialize]
public void SetUp()
{
container = new UnityContainer();
}
[TestMethod]
public void ShouldPassWithNoParameters()
{
ISignatureTestTarget target = GetTarget();
target.MethodWithNoParameters();
}
[TestMethod]
public void ShouldPassWithSimpleInputs()
{
ISignatureTestTarget target = GetTarget();
target.MethodWithSimpleInputs(1, "two");
}
[TestMethod]
public void ShouldPassWithOutParams()
{
ISignatureTestTarget target = GetTarget();
int first;
string second;
target.MethodWithOutParams(out first, out second);
Assert.AreEqual(1, first);
Assert.AreEqual("two", second);
}
[TestMethod]
public void ShouldPassWithInOutRef()
{
ISignatureTestTarget target = GetTarget();
string two;
float three = 1.0f;
target.MethodWithInOutByrefParams(1, out two, ref three, 5.0M);
Assert.AreEqual("owt", two);
Assert.AreEqual(3.0f, three);
}
[TestMethod]
public void ShouldPassWithVarArgs()
{
ISignatureTestTarget target = GetTarget();
target.MethodWithVarArgs(1, "two", "two and a half", "two and three quarters");
}
private ISignatureTestTarget GetTarget()
{
var interceptor = new InterfaceInterceptor();
PolicySet policySet = GetPolicies();
var target = new SignatureTestTarget();
IInterceptingProxy proxy = interceptor.CreateProxy(typeof(ISignatureTestTarget), target);
PipelineManager manager = new PipelineManager();
foreach (MethodImplementationInfo method in interceptor.GetInterceptableMethods(typeof(ISignatureTestTarget), typeof(SignatureTestTarget)))
{
HandlerPipeline pipeline = new HandlerPipeline(
policySet.GetHandlersFor(method, container));
manager.SetPipeline(method.ImplementationMethodInfo, pipeline);
}
proxy.AddInterceptionBehavior(new PolicyInjectionBehavior(manager));
return (ISignatureTestTarget)proxy;
}
private PolicySet GetPolicies()
{
PolicySet policies = new PolicySet();
RuleDrivenPolicy noParamsPolicy
= new RuleDrivenPolicy(
"noParamsPolicy",
new IMatchingRule[] { new MatchByNameRule("MethodWithNoParameters") },
new string[] { "Handler1" });
container.RegisterInstance<ICallHandler>("Handler1", new SignatureCheckingHandler(new Type[] { }));
policies.Add(noParamsPolicy);
RuleDrivenPolicy simpleInputsPolicy
= new RuleDrivenPolicy(
"simpleInputsPolicy",
new IMatchingRule[] { new MatchByNameRule("MethodWithSimpleInputs") },
new string[] { "Handler2" });
container.RegisterInstance<ICallHandler>(
"Handler2",
new SignatureCheckingHandler(new Type[] { typeof(int), typeof(string) }));
policies.Add(simpleInputsPolicy);
RuleDrivenPolicy outParamsPolicy
= new RuleDrivenPolicy(
"outParamsPolicy",
new IMatchingRule[] { new MatchByNameRule("MethodWithOutParams") },
new string[] { "Handler3" });
container.RegisterInstance<ICallHandler>(
"Handler3",
new SignatureCheckingHandler(new Type[] { typeof(int).MakeByRefType(), typeof(string).MakeByRefType() }));
policies.Add(outParamsPolicy);
RuleDrivenPolicy mixedParamsPolicy
= new RuleDrivenPolicy(
"mixedParamsPolicy",
new IMatchingRule[] { new MatchByNameRule("MethodWithInOutByrefParams") },
new string[] { "Handler4" });
container.RegisterInstance<ICallHandler>(
"Handler4",
new SignatureCheckingHandler(
new Type[]
{
typeof(int),
typeof(string).MakeByRefType(),
typeof(float).MakeByRefType(),
typeof(decimal)
}));
policies.Add(mixedParamsPolicy);
RuleDrivenPolicy varargsParamsPolicy
= new RuleDrivenPolicy(
"varargsParamsPolicy",
new IMatchingRule[] { new MatchByNameRule("MethodWithVarArgs") },
new string[] { "Handler5" });
container.RegisterInstance<ICallHandler>(
"Handler5",
new SignatureCheckingHandler(new Type[] { typeof(int), typeof(string).MakeArrayType() }));
policies.Add(varargsParamsPolicy);
return policies;
}
}
public interface ISignatureTestTarget
{
void MethodWithInOutByrefParams(int one,
out string two,
ref float three,
decimal four);
void MethodWithNoParameters();
void MethodWithOutParams(out int first,
out string second);
void MethodWithSimpleInputs(int one,
string two);
void MethodWithVarArgs(int one,
params string[] two);
}
internal class SignatureTestTarget : ISignatureTestTarget
{
public void MethodWithInOutByrefParams(int one,
out string two,
ref float three,
decimal four)
{
two = "owt";
three = 3.0f;
}
public void MethodWithNoParameters() { }
public void MethodWithOutParams(out int first,
out string second)
{
first = 1;
second = "two";
}
public void MethodWithSimpleInputs(int one,
string two) { }
public void MethodWithVarArgs(int one,
params string[] two) { }
}
internal class MatchAllRule : IMatchingRule
{
public bool Matches(MethodBase member)
{
return true;
}
}
internal class MatchByNameRule : IMatchingRule
{
private string name;
public MatchByNameRule(string name)
{
this.name = name;
}
public bool Matches(MethodBase member)
{
return member.Name == name;
}
}
internal class SignatureCheckingHandler : ICallHandler
{
private Type[] expectedSignature;
private int order = 0;
public SignatureCheckingHandler(Type[] expectedSignature)
{
this.expectedSignature = expectedSignature;
}
/// <summary>
/// Gets or sets the order in which the handler will be executed
/// </summary>
public int Order
{
get { return order; }
set { order = value; }
}
public IMethodReturn Invoke(IMethodInvocation input,
GetNextHandlerDelegate getNext)
{
Assert.IsNotNull(expectedSignature);
Type[] messageSignature = input.MethodBase.GetParameters().Select(info => info.ParameterType).ToArray();
Assert.AreEqual(expectedSignature.Length, messageSignature.Length);
for (int i = 0; i < messageSignature.Length; ++i)
{
Assert.AreSame(expectedSignature[i], messageSignature[i],
"Signature for method {0} failed to match for parameter {1}",
input.MethodBase.Name, i);
}
return getNext()(input, getNext);
}
}
}