public void CanMapInterfacesToConcreteTypes()
		{
			MockBuilderContext context = new MockBuilderContext();
			context.Policies.Set<IBuildKeyMappingPolicy>(new BuildKeyMappingPolicy(new NamedTypeBuildKey<ConcreteType>()),
                new NamedTypeBuildKey<ITestType>());
			BuildKeyMappingStrategy strategy = new BuildKeyMappingStrategy();
			context.Strategies.Add(strategy);
			SpyStrategy spy = new SpyStrategy();
			context.Strategies.Add(spy);
		    context.BuildKey = new NamedTypeBuildKey<ITestType>();
		    context.Strategies.ExecuteBuildUp(context);

			Assert.AreEqual(new NamedTypeBuildKey(typeof(ConcreteType)), spy.BuildKey);
		}
        public void CanMapGenericsWithIdenticalGenericParameters()
        {
            MockBuilderContext context = new MockBuilderContext();
            context.Policies.Set<IBuildKeyMappingPolicy>(new GenericTypeBuildKeyMappingPolicy(
                new NamedTypeBuildKey(typeof(ConcreteType<>))),
                new NamedTypeBuildKey(typeof(ITestType<>)));
            BuildKeyMappingStrategy strategy = new BuildKeyMappingStrategy();
            context.Strategies.Add(strategy);
            SpyStrategy spy = new SpyStrategy();
            context.Strategies.Add(spy);
            context.BuildKey = new NamedTypeBuildKey<ITestType<int>>();
            context.Strategies.ExecuteBuildUp(context);

            Assert.Equal(new NamedTypeBuildKey(typeof(ConcreteType<int>)), spy.BuildKey);
        }
        public void CanMapInterfacesToConcreteTypes()
        {
            MockBuilderContext context = new MockBuilderContext();

            context.Policies.Set <IBuildKeyMappingPolicy>(new BuildKeyMappingPolicy(typeof(Foo)), typeof(IFoo));
            BuildKeyMappingStrategy strategy = new BuildKeyMappingStrategy();

            context.Strategies.Add(strategy);
            SpyStrategy spy = new SpyStrategy();

            context.Strategies.Add(spy);
            context.BuildKey = typeof(IFoo);
            context.Strategies.ExecuteBuildUp(context);

            Assert.AreEqual <object>(typeof(Foo), spy.BuildKey);
        }
        public void CanMapGenericsWithIdenticalGenericParameters()
        {
            MockBuilderContext context = new MockBuilderContext();

            context.Policies.Set <IBuildKeyMappingPolicy>(new GenericTypeBuildKeyMappingPolicy(typeof(Foo <>)), typeof(IFoo <>));
            BuildKeyMappingStrategy strategy = new BuildKeyMappingStrategy();

            context.Strategies.Add(strategy);
            SpyStrategy spy = new SpyStrategy();

            context.Strategies.Add(spy);
            context.BuildKey = typeof(IFoo <int>);
            context.Strategies.ExecuteBuildUp(context);

            Assert.AreEqual <object>(typeof(Foo <int>), spy.BuildKey);
        }
        public void CanMapInterfacesToConcreteTypes()
        {
            MockBuilderContext context = new MockBuilderContext();

            context.Policies.Set <IBuildKeyMappingPolicy>(new BuildKeyMappingPolicy(new NamedTypeBuildKey <ConcreteType>()),
                                                          new NamedTypeBuildKey <ITestType>());
            BuildKeyMappingStrategy strategy = new BuildKeyMappingStrategy();

            context.Strategies.Add(strategy);
            SpyStrategy spy = new SpyStrategy();

            context.Strategies.Add(spy);
            context.BuildKey = new NamedTypeBuildKey <ITestType>();
            context.Strategies.ExecuteBuildUp(context);

            Assert.True((new NamedTypeBuildKey(typeof(ConcreteType))).Equals(spy.BuildKey));
        }
	    public void MappingStrategyActuallyReturnsTheBuildKeyThePolicySpecifies()
	    {
            MockBuilderContext context = new MockBuilderContext();
	        NamedTypeBuildKey fromKey = new NamedTypeBuildKey(typeof (ConcreteType), "id");
	        NamedTypeBuildKey toKey = new NamedTypeBuildKey(typeof (ITestType), "id");
            context.Policies.Set<IBuildKeyMappingPolicy>(new BuildKeyMappingPolicy(toKey), fromKey);
            BuildKeyMappingStrategy strategy = new BuildKeyMappingStrategy();
            context.Strategies.Add(strategy);
            SpyStrategy spy = new SpyStrategy();
            context.Strategies.Add(spy);
	        context.BuildKey = fromKey;
	        context.Existing = null;
	        context.Strategies.ExecuteBuildUp(context);

	        Assert.IsInstanceOfType(spy.BuildKey, typeof (NamedTypeBuildKey));
            Assert.AreEqual(toKey, spy.BuildKey);
	    }
        public void CanMapGenericsWithANonTypeBuildKey()
        {
            MockBuilderContext context = new MockBuilderContext();
            context.Policies.Set<IBuildKeyMappingPolicy>(
                new GenericTypeBuildKeyMappingPolicy(new NamedTypeBuildKey(typeof(ConcreteType<>), "two")),
                new NamedTypeBuildKey(typeof(ITestType<>), "one"));

            BuildKeyMappingStrategy strategy = new BuildKeyMappingStrategy();
            context.Strategies.Add(strategy);
            SpyStrategy spy = new SpyStrategy();
            context.Strategies.Add(spy);
            context.BuildKey = new NamedTypeBuildKey(typeof(ITestType<int>), "one");
            context.Strategies.ExecuteBuildUp(context);

            AssertExtensions.IsInstanceOfType(spy.BuildKey, typeof(NamedTypeBuildKey));
            Assert.Equal(typeof(ConcreteType<int>), spy.BuildKey.Type);
            Assert.Equal("two", spy.BuildKey.Name);
        }
        public void CanMapGenericsWithIdenticalGenericParameters()
        {
            MockBuilderContext context = new MockBuilderContext();

            context.Policies.Set <IBuildKeyMappingPolicy>(new GenericTypeBuildKeyMappingPolicy(
                                                              new NamedTypeBuildKey(typeof(ConcreteType <>))),
                                                          new NamedTypeBuildKey(typeof(ITestType <>)));
            BuildKeyMappingStrategy strategy = new BuildKeyMappingStrategy();

            context.Strategies.Add(strategy);
            SpyStrategy spy = new SpyStrategy();

            context.Strategies.Add(spy);
            context.BuildKey = new NamedTypeBuildKey <ITestType <int> >();
            context.Strategies.ExecuteBuildUp(context);

            Assert.Equal(new NamedTypeBuildKey(typeof(ConcreteType <int>)), spy.BuildKey);
        }
        public void MappingStrategyActuallyReturnsTheBuildKeyThePolicySpecifies()
        {
            MockBuilderContext context = new MockBuilderContext();
            NamedTypeBuildKey  fromKey = new NamedTypeBuildKey(typeof(Foo), "id");
            NamedTypeBuildKey  toKey   = new NamedTypeBuildKey(typeof(IFoo), "id");

            context.Policies.Set <IBuildKeyMappingPolicy>(new BuildKeyMappingPolicy(toKey), fromKey);
            BuildKeyMappingStrategy strategy = new BuildKeyMappingStrategy();

            context.Strategies.Add(strategy);
            SpyStrategy spy = new SpyStrategy();

            context.Strategies.Add(spy);
            context.BuildKey = fromKey;
            context.Existing = null;
            context.Strategies.ExecuteBuildUp(context);

            Assert.IsInstanceOfType(spy.BuildKey, typeof(NamedTypeBuildKey));
            Assert.AreEqual(toKey, spy.BuildKey);
        }
        public void CanMapGenericsWithANonTypeBuildKey()
        {
            MockBuilderContext context = new MockBuilderContext();

            context.Policies.Set <IBuildKeyMappingPolicy>(
                new GenericTypeBuildKeyMappingPolicy(new NamedTypeBuildKey(typeof(Foo <>), "two")),
                new NamedTypeBuildKey(typeof(IFoo <>), "one"));

            BuildKeyMappingStrategy strategy = new BuildKeyMappingStrategy();

            context.Strategies.Add(strategy);
            SpyStrategy spy = new SpyStrategy();

            context.Strategies.Add(spy);
            context.BuildKey = new NamedTypeBuildKey(typeof(IFoo <int>), "one");
            context.Strategies.ExecuteBuildUp(context);

            Assert.IsInstanceOfType(spy.BuildKey, typeof(NamedTypeBuildKey));
            Assert.AreEqual <object>(typeof(Foo <int>), BuildKey.GetType(spy.BuildKey));
            Assert.AreEqual("two", ((NamedTypeBuildKey)spy.BuildKey).Name);
        }
        public void CanMapGenericsWithANonTypeBuildKey()
        {
            MockBuilderContext context = new MockBuilderContext();

            context.Policies.Set <IBuildKeyMappingPolicy>(
                new GenericTypeBuildKeyMappingPolicy(new NamedTypeBuildKey(typeof(ConcreteType <>), "two")),
                new NamedTypeBuildKey(typeof(ITestType <>), "one"));

            BuildKeyMappingStrategy strategy = new BuildKeyMappingStrategy();

            context.Strategies.Add(strategy);
            SpyStrategy spy = new SpyStrategy();

            context.Strategies.Add(spy);
            context.BuildKey = new NamedTypeBuildKey(typeof(ITestType <int>), "one");
            context.Strategies.ExecuteBuildUp(context);

            AssertExtensions.IsInstanceOfType(spy.BuildKey, typeof(NamedTypeBuildKey));
            Assert.Equal(typeof(ConcreteType <int>), spy.BuildKey.Type);
            Assert.Equal("two", spy.BuildKey.Name);
        }