public void ComponentGraph()
		{
			IKernel kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey, new NamingPartsSubSystem());

			kernel.AddComponent("common:key1=true", typeof(ICommon), typeof(CommonImpl1));
			kernel.AddComponent("common:secure=true", typeof(ICommon), typeof(CommonImpl2));

			GraphNode[] nodes = kernel.GraphNodes;
			Assert.IsNotNull(nodes);
			Assert.AreEqual(2, nodes.Length);
		}
		public void EmptyDelegateReturnsFirstTypeLoaded()
		{
			IKernel kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey, new KeySearchNamingSubSystem());

			kernel.AddComponent("1.common", typeof(ICommon), typeof(CommonImpl1));
			kernel.AddComponent("2.common", typeof(ICommon), typeof(CommonImpl2));

			ICommon common = kernel[typeof(ICommon)] as ICommon;

			Assert.IsNotNull(common);
			Assert.AreEqual(typeof(CommonImpl1), common.GetType());
		}
		public void GetAssignableHandlers()
		{
			IKernel kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey, new NamingPartsSubSystem());

			kernel.AddComponent("common:key1=true", typeof(ICommon), typeof(CommonImpl1));
			kernel.AddComponent("common:secure=true", typeof(ICommon), typeof(CommonImpl2));

			IHandler[] handlers = kernel.GetAssignableHandlers(typeof(ICommon));

			Assert.IsNotNull(handlers);
			Assert.AreEqual(2, handlers.Length);
		}
        public void ComponentGraph()
        {
            IKernel kernel = new DefaultKernel();

            kernel.AddSubSystem(SubSystemConstants.NamingKey, new NamingPartsSubSystem());

            kernel.AddComponent("common:key1=true", typeof(ICommon), typeof(CommonImpl1));
            kernel.AddComponent("common:secure=true", typeof(ICommon), typeof(CommonImpl2));

            GraphNode[] nodes = kernel.GraphNodes;
            Assert.IsNotNull(nodes);
            Assert.AreEqual(2, nodes.Length);
        }
		public void ServiceLookup()
		{
			IKernel kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey, new NamingPartsSubSystem());

			kernel.AddComponent("common:key1=true", typeof(ICommon), typeof(CommonImpl1));
			kernel.AddComponent("common:secure=true", typeof(ICommon), typeof(CommonImpl2));

			ICommon common = kernel[typeof(ICommon)] as ICommon;

			Assert.IsNotNull(common);
			Assert.AreEqual(typeof(CommonImpl1), common.GetType());
		}
		public void ReturnsFirstMatchingType()
		{
			IKernel kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey,
			                    new KeySearchNamingSubSystem(delegate(string key) { return key.StartsWith("1"); }));

			kernel.AddComponent("1.common", typeof(ICommon), typeof(CommonImpl1));
			kernel.AddComponent("11.common", typeof(ICommon), typeof(CommonImpl2));

			ICommon common = kernel[typeof(ICommon)] as ICommon;

			Assert.IsNotNull(common);
			Assert.AreEqual(typeof(CommonImpl1), common.GetType());
		}
		public void ReturnsFirstTypeWhenNotFound()
		{
			IKernel kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey,
			                    new KeySearchNamingSubSystem(delegate(string key) { return key.StartsWith("3"); }));

			kernel.Register(Component.For(typeof(ICommon)).ImplementedBy(typeof(CommonImpl1)).Named("1.common"));
			kernel.Register(Component.For(typeof(ICommon)).ImplementedBy(typeof(CommonImpl2)).Named("2.common"));

			ICommon common = kernel[typeof(ICommon)] as ICommon;

			Assert.IsNotNull(common);
			Assert.AreEqual(typeof(CommonImpl1), common.GetType());
		}
        public void GetAssignableHandlers()
        {
            IKernel kernel = new DefaultKernel();

            kernel.AddSubSystem(SubSystemConstants.NamingKey, new NamingPartsSubSystem());

            kernel.AddComponent("common:key1=true", typeof(ICommon), typeof(CommonImpl1));
            kernel.AddComponent("common:secure=true", typeof(ICommon), typeof(CommonImpl2));

            IHandler[] handlers = kernel.GetAssignableHandlers(typeof(ICommon));

            Assert.IsNotNull(handlers);
            Assert.AreEqual(2, handlers.Length);
        }
        public void ServiceLookup()
        {
            IKernel kernel = new DefaultKernel();

            kernel.AddSubSystem(SubSystemConstants.NamingKey, new NamingPartsSubSystem());

            kernel.AddComponent("common:key1=true", typeof(ICommon), typeof(CommonImpl1));
            kernel.AddComponent("common:secure=true", typeof(ICommon), typeof(CommonImpl2));

            ICommon common = kernel[typeof(ICommon)] as ICommon;

            Assert.IsNotNull(common);
            Assert.AreEqual(typeof(CommonImpl1), common.GetType());
        }
		public void ReturnsCorrectType()
		{
			IKernel kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey,
			                    new KeySearchNamingSubSystem(
			                    	delegate(string key) { return key.StartsWith("castlestronghold.com"); }));

			kernel.AddComponent("castleproject.org.common", typeof(ICommon), typeof(CommonImpl1));
			kernel.AddComponent("castlestronghold.com.common", typeof(ICommon), typeof(CommonImpl2));

			ICommon common = kernel[typeof(ICommon)] as ICommon;

			Assert.IsNotNull(common);
			Assert.AreEqual(typeof(CommonImpl2), common.GetType());
		}
		public void MultiThreaded_RemoveResolve_Throws_When_LargeRatio_Of_ComponentsToService()
		{
			int threadCount = 1000;
			ArrayList list = ArrayList.Synchronized(new ArrayList());
			Random rand = new Random();
			ManualResetEvent waitEvent = new ManualResetEvent(false);

			IKernel kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey, new KeySearchNamingSubSystem(delegate { return false; }));

			kernel.AddComponent("common", typeof(ICommon), typeof(CommonImpl1));

			WaitCallback resolveThread = delegate
			                             	{
			                             		waitEvent.WaitOne();
			                             		while(threadCount > 0 && list.Count == 0)
			                             		{
			                             			try
			                             			{
			                             				ICommon common = kernel[typeof(ICommon)] as ICommon;
			                             			}
			                             			catch(Exception e)
			                             			{
			                             				list.Add(e);
			                             			}
			                             		}
			                             	};
			ThreadPool.QueueUserWorkItem(resolveThread);

			WaitCallback removeThread = delegate
			                            	{
			                            		waitEvent.WaitOne();
			                            		kernel.RemoveComponent(threadCount + ".common");
			                            		Interlocked.Decrement(ref threadCount);
			                            	};
			for(int i = 0; i < threadCount; i++)
			{
				kernel.AddComponent(i + ".common", typeof(ICommon), typeof(CommonImpl1));
				ThreadPool.QueueUserWorkItem(removeThread);
			}

			waitEvent.Set();
			while(threadCount > 0 && list.Count == 0)
			{
				Thread.Sleep(15);
			}

			if (list.Count > 0)
			{
				throw (Exception) list[0];
			}
		}
		public void MultiThreadedAddResolve()
		{
			int threadCount = 100;
			ArrayList list = ArrayList.Synchronized(new ArrayList());
			Random rand = new Random();
			ManualResetEvent waitEvent = new ManualResetEvent(false);

			IKernel kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey, new KeySearchNamingSubSystem());
			kernel.AddComponent("common", typeof(ICommon), typeof(CommonImpl1));

			WaitCallback resolveThread = delegate
			                             	{
			                             		waitEvent.WaitOne();
			                             		while(threadCount > 0 && list.Count == 0)
			                             		{
			                             			try
			                             			{
			                             				ICommon common = kernel[typeof(ICommon)] as ICommon;
			                             			}
			                             			catch(Exception e)
			                             			{
			                             				list.Add(e.ToString());
			                             			}
			                             		}
			                             	};
			ThreadPool.QueueUserWorkItem(resolveThread);

			WaitCallback addThread = delegate
			                         	{
			                         		waitEvent.WaitOne();
			                         		kernel.AddComponent(rand.Next() + ".common", typeof(ICommon), typeof(CommonImpl1));
			                         		Interlocked.Decrement(ref threadCount);
			                         	};
			for(int i = 0; i < threadCount; i++)
			{
				ThreadPool.QueueUserWorkItem(addThread);
			}

			waitEvent.Set();
			while(threadCount > 0 && list.Count == 0)
			{
				Thread.Sleep(15);
			}

			if (list.Count > 0)
			{
				Assert.Fail(list[0].ToString());
			}
		}
		public void SetUpTests()
		{
			kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey, new NamingPartsSubSystem());
		}
		public void MultiThreadedAddResolve([Values(100)] int threadCount)
		{
			object locker = new object();
			IList<string> list = new List<string>();
			ManualResetEvent waitEvent = new ManualResetEvent(false);

			IKernel kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey, new KeySearchNamingSubSystem());
			kernel.AddComponent("common", typeof(ICommon), typeof(CommonImpl1));

			WaitCallback resolveThread = delegate
			                             	{
			                             		waitEvent.WaitOne();
			                             		while(threadCount > 0 && list.Count == 0)
			                             		{
			                             			try
			                             			{
			                             				ICommon common = kernel[typeof(ICommon)] as ICommon;
			                             			}
			                             			catch(Exception e)
			                             			{
														lock (locker)
														{
															list.Add(e.ToString());
														}
			                             			}
			                             		}
			                             	};
			ThreadPool.QueueUserWorkItem(resolveThread);

			WaitCallback addThread = delegate
			                         	{
			                         		waitEvent.WaitOne();
			                         		kernel.AddComponent(Guid.NewGuid() + ".common", typeof(ICommon), typeof(CommonImpl1));
			                         		Interlocked.Decrement(ref threadCount);
			                         	};
			for(int i = 0; i < threadCount; i++)
			{
				ThreadPool.QueueUserWorkItem(addThread);
			}

			waitEvent.Set();
			while(threadCount > 0 && list.Count == 0)
			{
				Thread.Sleep(15);
			}

			if (list.Count > 0)
			{
				Assert.Fail(list[0].ToString());
			}
		}
		public void ComponentUnregistersProperly()
		{
			IKernel kernel = new DefaultKernel();

			kernel.AddSubSystem(SubSystemConstants.NamingKey,
			                    new KeySearchNamingSubSystem(delegate(string key) { return key.StartsWith("2"); }));

			kernel.AddComponent("1.common", typeof(ICommon), typeof(CommonImpl1));
			kernel.AddComponent("2.common", typeof(ICommon), typeof(CommonImpl2));

			ICommon common = kernel[typeof(ICommon)] as ICommon;

			Assert.IsNotNull(common);
			Assert.AreEqual(typeof(CommonImpl2), common.GetType());

			kernel.RemoveComponent("2.common");

			common = kernel[typeof(ICommon)] as ICommon;

			Assert.IsNotNull(common);
			Assert.AreEqual(typeof(CommonImpl1), common.GetType());

			kernel.RemoveComponent("1.common");
			Assert.AreEqual(0, kernel.GetHandlers(typeof(ICommon)).Length);
		}
		public void MultiThreaded_RemoveResolve_Throws_When_LargeRatio_Of_ComponentsToService()
		{
			var threadCount = 1000;
			var list = new List<Exception>();
			var locker = new object();
			var rand = new Random();
			var waitEvent = new ManualResetEvent(false);

			IKernel kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey, new KeySearchNamingSubSystem(delegate { return false; }));

			kernel.Register(Component.For(typeof(ICommon)).ImplementedBy(typeof(CommonImpl1)).Named("common"));

			WaitCallback resolveThread = delegate
			{
				waitEvent.WaitOne();
				while (threadCount > 0 && list.Count == 0)
				{
					try
					{
						kernel.Resolve<ICommon>();
					}
					catch (Exception e)
					{
						lock (locker)
						{
							list.Add(e);
						}
					}
				}
			};
			ThreadPool.QueueUserWorkItem(resolveThread);

			WaitCallback removeThread = delegate
			{
				waitEvent.WaitOne();
				kernel.RemoveComponent(threadCount + ".common");
				Interlocked.Decrement(ref threadCount);
			};
			for (var i = 0; i < threadCount; i++)
			{
				kernel.Register(Component.For(typeof(ICommon)).ImplementedBy(typeof(CommonImpl1)).Named(i + ".common"));
				ThreadPool.QueueUserWorkItem(removeThread);
			}

			waitEvent.Set();
			while (threadCount > 0 && list.Count == 0)
			{
				Thread.Sleep(15);
			}

			if (list.Count > 0)
			{
				throw list[0];
			}
		}
		public void SingleComponentUnregistersProperly()
		{
			IKernel kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey,
			                    new KeySearchNamingSubSystem(delegate(string key) { return key.StartsWith("1"); }));

			kernel.Register(Component.For(typeof(ICommon)).ImplementedBy(typeof(CommonImpl1)).Named("1.common"));

			ICommon common = kernel[typeof(ICommon)] as ICommon;

			Assert.IsNotNull(common);
			Assert.AreEqual(typeof(CommonImpl1), common.GetType());

			kernel.RemoveComponent("1.common");

			Assert.IsFalse(kernel.HasComponent("1.common"));
			Assert.IsFalse(kernel.HasComponent(typeof(CommonImpl1)));
			common = kernel[typeof(ICommon)] as ICommon;
		}