1 // Copyright 2004-2007 Castle Project - http://www.castleproject.org/
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
7 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
19 namespace Castle
.Windsor
.Tests
23 using Castle
.Core
.Interceptor
;
24 using Castle
.MicroKernel
.Resolvers
;
25 using Castle
.Windsor
.Configuration
.Interpreters
;
26 using Castle
.Windsor
.Tests
.Components
;
27 using NUnit
.Framework
;
30 public class WindsorDotNet2Tests
33 public void UsingResolveGenericMethodOverload()
35 IWindsorContainer container
= new WindsorContainer(new XmlInterpreter(GetFilePath("GenericsConfig.xml")));
36 ICalcService svr
= container
.Resolve
<ICalcService
>();
37 Assert
.IsTrue(typeof (CalculatorService
).IsInstanceOfType(svr
));
41 public void ResolveGenericWithId()
43 IWindsorContainer container
= new WindsorContainer(new XmlInterpreter(GetFilePath("GenericsConfig.xml")));
44 ICalcService svr
= container
.Resolve
<ICalcService
>("calc");
45 Assert
.IsTrue(typeof (CalculatorService
).IsInstanceOfType(svr
));
49 public void GetGenericService()
51 IWindsorContainer container
= new WindsorContainer(new XmlInterpreter(GetFilePath("GenericsConfig.xml")));
52 IRepository
<int> repos
= container
.Resolve
<IRepository
<int>>("int.repos.generic");
53 Assert
.IsNotNull(repos
);
54 Assert
.IsTrue(typeof (DemoRepository
<int>).IsInstanceOfType(repos
));
58 public void GetGenericServiceWithDecorator()
60 IWindsorContainer container
= new WindsorContainer(new XmlInterpreter(GetFilePath("GenericsConfig.xml")));
61 IRepository
<int> repos
= container
.Resolve
<IRepository
<int>>("int.repos");
62 Assert
.IsNotNull(repos
);
63 Assert
.IsTrue(typeof (LoggingRepositoryDecorator
<int>).IsInstanceOfType(repos
));
64 Assert
.IsTrue(typeof (DemoRepository
<int>).IsInstanceOfType(((LoggingRepositoryDecorator
<int>) repos
).inner
));
68 public void WillUseDefaultCtorOnGenericComponentIfTryingToResolveOnSameComponent()
70 IWindsorContainer container
=
71 new WindsorContainer(new XmlInterpreter(GetFilePath("RecursiveDecoratorConfig.xml")));
72 LoggingRepositoryDecorator
<int> resolve
=
73 (LoggingRepositoryDecorator
<int>) container
.Resolve
<IRepository
<int>>();
74 Assert
.IsNull(resolve
.Inner
);
78 public void GetGenericServiceWithDecorator_GenericDecoratorOnTop()
80 IWindsorContainer container
= new WindsorContainer(new XmlInterpreter(GetFilePath("DecoratorConfig.xml")));
81 IRepository
<int> repos
= container
.Resolve
<IRepository
<int>>();
82 Assert
.IsTrue(typeof (LoggingRepositoryDecorator
<int>).IsInstanceOfType(repos
));
84 Assert
.IsTrue(typeof (LoggingRepositoryDecorator
<int>).IsInstanceOfType(repos
));
85 Assert
.IsTrue(typeof (DemoRepository
<int>).IsInstanceOfType(((LoggingRepositoryDecorator
<int>) repos
).inner
));
87 DemoRepository
<int> inner
= ((LoggingRepositoryDecorator
<int>) repos
).inner
as DemoRepository
<int>;
89 Assert
.AreEqual("second", inner
.Name
);
93 public void InferGenericArgumentForComponentFromPassedType()
95 IWindsorContainer container
=
96 new WindsorContainer(new XmlInterpreter(GetFilePath("GenericDecoratorConfig.xml")));
98 IRepository
<string> repos
= container
.Resolve
<IRepository
<string>>();
99 Assert
.IsTrue(typeof (LoggingRepositoryDecorator
<string>).IsInstanceOfType(repos
));
101 DemoRepository
<string> inner
= ((LoggingRepositoryDecorator
<string>) repos
).inner
as DemoRepository
<string>;
103 Assert
.AreEqual("second", inner
.Name
);
107 public void GetSameInstanceFromGenericType()
109 IWindsorContainer container
=
110 new WindsorContainer(new XmlInterpreter(GetFilePath("GenericDecoratorConfig.xml")));
112 IRepository
<string> repos1
= container
.Resolve
<IRepository
<string>>();
113 IRepository
<string> repos2
= container
.Resolve
<IRepository
<string>>();
115 Assert
.AreSame(repos1
, repos2
);
119 public void GetSameInstanceOfGenericFromTwoDifferentGenericTypes()
121 IWindsorContainer container
=
122 new WindsorContainer(new XmlInterpreter(GetFilePath("GenericDecoratorConfig.xml")));
124 IRepository
<string> repos1
= container
.Resolve
<IRepository
<string>>();
125 IRepository
<string> repos2
= container
.Resolve
<IRepository
<string>>();
127 Assert
.AreSame(repos1
, repos2
);
129 IRepository
<int> repos3
= container
.Resolve
<IRepository
<int>>();
130 IRepository
<int> repos4
= container
.Resolve
<IRepository
<int>>();
132 Assert
.AreSame(repos3
, repos4
);
136 public void ComplexGenericConfiguration_GetGenericRepostiory()
138 IWindsorContainer container
=
139 new WindsorContainer(new XmlInterpreter(GetFilePath("ComplexGenericConfig.xml")));
140 IRepository
<IEmployee
> empRepost
= container
[typeof (IRepository
<IEmployee
>)] as IRepository
<IEmployee
>;
141 Assert
.IsNotNull(empRepost
);
142 Assert
.IsTrue(typeof (LoggingRepositoryDecorator
<IEmployee
>).IsInstanceOfType(empRepost
));
143 LoggingRepositoryDecorator
<IEmployee
> log
= empRepost
as LoggingRepositoryDecorator
<IEmployee
>;
144 IRepository
<IEmployee
> inner
= log
.inner
;
145 Assert
.IsNotNull(inner
);
146 Assert
.IsTrue(typeof (DemoRepository
<IEmployee
>).IsInstanceOfType(inner
));
147 DemoRepository
<IEmployee
> demoEmpRepost
= inner
as DemoRepository
<IEmployee
>;
148 Assert
.AreEqual("Generic Repostiory", demoEmpRepost
.Name
);
149 Assert
.IsNotNull(demoEmpRepost
.Cache
);
150 Assert
.IsTrue(typeof (HashTableCache
<IEmployee
>).IsInstanceOfType(demoEmpRepost
.Cache
));
154 public void ComplexGenericConfiguration_GetReviewRepository_BoundAtConfiguration()
156 IWindsorContainer container
=
157 new WindsorContainer(new XmlInterpreter(GetFilePath("ComplexGenericConfig.xml")));
158 IRepository
<IReviewer
> rev
= container
.Resolve
<IRepository
<IReviewer
>>();
160 Assert
.IsTrue(typeof (ReviewerRepository
).IsInstanceOfType(rev
));
161 ReviewerRepository repos
= rev
as ReviewerRepository
;
162 Assert
.AreEqual("Reviewer Repository", repos
.Name
);
163 Assert
.IsNotNull(repos
.Cache
);
164 Assert
.IsTrue(typeof (HashTableCache
<IReviewer
>).IsInstanceOfType(repos
.Cache
));
169 ComplexGenericConfiguration_GetReviewableRepostiory_ShouldResolveToDemoRepostiroyInsideLoggingRepositoryWithNoCaching
172 IWindsorContainer container
=
173 new WindsorContainer(new XmlInterpreter(GetFilePath("ComplexGenericConfig.xml")));
174 IRepository
<IReviewableEmployee
> empRepost
= container
.Resolve
<IRepository
<IReviewableEmployee
>>();
175 Assert
.IsNotNull(empRepost
);
176 Assert
.IsTrue(typeof (LoggingRepositoryDecorator
<IReviewableEmployee
>).IsInstanceOfType(empRepost
));
177 LoggingRepositoryDecorator
<IReviewableEmployee
> log
=
178 empRepost
as LoggingRepositoryDecorator
<IReviewableEmployee
>;
179 IRepository
<IReviewableEmployee
> inner
= log
.inner
;
180 Assert
.IsNotNull(inner
);
181 Assert
.IsTrue(typeof (DemoRepository
<IReviewableEmployee
>).IsInstanceOfType(inner
));
182 DemoRepository
<IReviewableEmployee
> demoEmpRepost
= inner
as DemoRepository
<IReviewableEmployee
>;
183 Assert
.AreEqual("Generic Repostiory With No Cache", demoEmpRepost
.Name
);
184 Assert
.IsNotNull(demoEmpRepost
.Cache
);
185 Assert
.IsTrue(typeof (NullCache
<IReviewableEmployee
>).IsInstanceOfType(demoEmpRepost
.Cache
));
189 public void TestGenericSpecialization()
191 IWindsorContainer container
=
192 new WindsorContainer(new XmlInterpreter(GetFilePath("ComplexGenericConfig.xml")));
193 IRepository
<IReviewer
> repository
= container
.Resolve
<IRepository
<IReviewer
>>();
194 Assert
.IsTrue(typeof (ReviewerRepository
).IsInstanceOfType(repository
), "Not ReviewerRepository!");
198 public void ComplexGenericConfiguration_GetRepositoryByIdAndType()
200 IWindsorContainer container
=
201 new WindsorContainer(new XmlInterpreter(GetFilePath("ComplexGenericConfig.xml")));
202 IRepository
<IReviewer
> repository
= container
.Resolve
<IRepository
<IReviewer
>>("generic.repository");
203 Assert
.IsTrue(typeof (DemoRepository
<IReviewer
>).IsInstanceOfType(repository
), "Not DemoRepository!");
207 public void TestComponentLifestylePerGenericType()
209 IWindsorContainer container
= new WindsorContainer();
211 container
.AddComponent("comp", typeof (IRepository
<>), typeof (TransientRepository
<>));
213 object o1
= container
.Resolve
<IRepository
<Employee
>>();
214 object o2
= container
.Resolve
<IRepository
<Employee
>>();
215 object o3
= container
.Resolve
<IRepository
<Reviewer
>>();
216 object o4
= container
.Resolve
<IRepository
<Reviewer
>>();
218 Assert
.IsFalse(Object
.ReferenceEquals(o1
, o2
));
219 Assert
.IsFalse(Object
.ReferenceEquals(o1
, o3
));
220 Assert
.IsFalse(Object
.ReferenceEquals(o1
, o4
));
224 public void CanCreateANormalTypeWithCtorDependencyOnGenericType()
226 IWindsorContainer container
= new WindsorContainer();
228 container
.AddComponent("comp", typeof (NeedsGenericType
));
229 container
.AddComponent("cache", typeof (ICache
<>), typeof (NullCache
<>));
231 NeedsGenericType needsGenericType
= container
.Resolve
<NeedsGenericType
>();
233 Assert
.IsNotNull(needsGenericType
);
237 public void InterceptGeneric1()
239 WindsorContainer container
= new WindsorContainer();
241 container
.AddFacility("interceptor-facility", new MyInterceptorGreedyFacility());
242 container
.AddComponent("interceptor", typeof (StandardInterceptor
));
243 container
.AddComponent("key", typeof (IRepository
<Employee
>), typeof (DemoRepository
<Employee
>));
245 IRepository
<Employee
> store
= container
.Resolve
<IRepository
<Employee
>>();
247 Assert
.IsFalse(typeof (DemoRepository
<Employee
>).IsInstanceOfType(store
), "This should have been a proxy");
251 public void InterceptGeneric2()
253 WindsorContainer container
= new WindsorContainer();
255 container
.AddFacility("interceptor-facility", new MyInterceptorGreedyFacility2());
256 container
.AddComponent("interceptor", typeof (StandardInterceptor
));
257 container
.AddComponent("key", typeof (IRepository
<>), typeof (DemoRepository
<>));
259 IRepository
<Employee
> store
= container
.Resolve
<IRepository
<Employee
>>();
261 Assert
.IsFalse(typeof (DemoRepository
<Employee
>).IsInstanceOfType(store
), "This should have been a proxy");
265 public void ChainOfResponsability()
267 IWindsorContainer container
=
268 new WindsorContainer(new XmlInterpreter(GetFilePath("chainOfRespnsability.config")));
269 IResultFinder
<int> resolve
= container
.Resolve
<IResultFinder
<int>>();
270 Assert
.IsTrue(resolve
.Finder
is DatabaseResultFinder
<int>);
271 Assert
.IsTrue(resolve
.Finder
.Finder
is WebServiceResultFinder
<int>);
272 Assert
.IsTrue(resolve
.Finder
.Finder
.Finder
is FailedResultFinder
<int>);
273 Assert
.IsTrue(resolve
.Finder
.Finder
.Finder
.Finder
== null);
277 public void ChainOfResponsability_Smart()
279 IWindsorContainer container
=
280 new WindsorContainer(new XmlInterpreter(GetFilePath("chainOfRespnsability_smart.config")));
281 IResultFinder
<int> resolve
= container
.Resolve
<IResultFinder
<int>>();
282 Assert
.IsTrue(resolve
is CacheResultFinder
<int>);
283 Assert
.IsTrue(resolve
.Finder
is DatabaseResultFinder
<int>);
284 Assert
.IsTrue(resolve
.Finder
.Finder
is WebServiceResultFinder
<int>);
285 Assert
.IsNull(resolve
.Finder
.Finder
.Finder
);
287 IResultFinder
<String
> resolve2
= container
.Resolve
<IResultFinder
<String
>>();
288 Assert
.IsTrue(resolve2
is ResultFinderStringDecorator
);
289 Assert
.IsNotNull(resolve2
.Finder
);
292 public string GetFilePath(string fileName
)
294 return Path
.Combine(AppDomain
.CurrentDomain
.BaseDirectory
,
295 ConfigHelper
.ResolveConfigPath("DotNet2Config/" + fileName
));
299 public interface IResultFinder
<T
>
301 T
Process(ISpecification specification
);
302 IResultFinder
<T
> Finder { get; }
305 public class CacheResultFinder
<T
> : IResultFinder
<T
>
307 private IResultFinder
<T
> finder
;
309 public IResultFinder
<T
> Finder
311 get { return finder; }
314 public CacheResultFinder()
318 public CacheResultFinder(IResultFinder
<T
> finder
)
320 this.finder
= finder
;
323 public T
Process(ISpecification specification
)
329 public class DatabaseResultFinder
<T
> : IResultFinder
<T
>
331 private IResultFinder
<T
> finder
;
333 public IResultFinder
<T
> Finder
335 get { return finder; }
338 public DatabaseResultFinder()
342 public DatabaseResultFinder(IResultFinder
<T
> finder
)
344 this.finder
= finder
;
347 public T
Process(ISpecification specification
)
353 public class WebServiceResultFinder
<T
> : IResultFinder
<T
>
355 private IResultFinder
<T
> finder
;
357 public IResultFinder
<T
> Finder
359 get { return finder; }
362 public WebServiceResultFinder()
366 public WebServiceResultFinder(IResultFinder
<T
> finder
)
368 this.finder
= finder
;
371 public T
Process(ISpecification specification
)
377 public class FailedResultFinder
<T
> : IResultFinder
<T
>
379 public IResultFinder
<T
> Finder
384 public T
Process(ISpecification specification
)
390 public class ResultFinderStringDecorator
: IResultFinder
<String
>
392 private IResultFinder
<String
> finder
;
394 public ResultFinderStringDecorator(IResultFinder
<String
> finder
)
396 this.finder
= finder
;
399 public IResultFinder
<String
> Finder
401 get { return finder; }
404 public String
Process(ISpecification specification
)
410 public interface ISpecification