Updating custom persister in tests to reflect recent changes in NH, will be ignored...
[castle.git] / InversionOfControl / Castle.Windsor.Tests / WindsorDotNet2Tests.cs
blob00fc0aae9efd8a987124d30d53161b5d1213c016
1 // Copyright 2004-2007 Castle Project - http://www.castleproject.org/
2 //
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
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
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.
17 #if !MONO
19 namespace Castle.Windsor.Tests
21 using System;
22 using System.IO;
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;
29 [TestFixture]
30 public class WindsorDotNet2Tests
32 [Test]
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));
40 [Test]
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));
48 [Test]
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));
57 [Test]
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));
67 [Test]
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);
77 [Test]
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);
92 [Test]
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);
106 [Test]
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);
118 [Test]
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);
135 [Test]
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));
153 [Test]
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));
167 [Test]
168 public void
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));
188 [Test]
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!");
197 [Test]
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!");
206 [Test]
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));
223 [Test]
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);
236 [Test]
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");
250 [Test]
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");
264 [Test]
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);
276 [Test]
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)
325 return default(T);
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)
349 return default(T);
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)
373 return default(T);
377 public class FailedResultFinder<T> : IResultFinder<T>
379 public IResultFinder<T> Finder
381 get { return null; }
384 public T Process(ISpecification specification)
386 return default(T);
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)
406 return String.Empty;
410 public interface ISpecification
415 #endif