public void InjectionConstructorInsertsChooserForConstructorWithParameters() { string expectedString = "Hello"; int expectedInt = 12; var ctor = new InjectionConstructor(expectedString, expectedInt); var context = new MockBuilderContext { BuildKey = new NamedTypeBuildKey(typeof(GuineaPig)) }; IPolicyList policies = context.PersistentPolicies; ctor.AddPolicies(typeof(GuineaPig), policies); var selector = policies.Get<IConstructorSelectorPolicy>( new NamedTypeBuildKey(typeof(GuineaPig))); SelectedConstructor selected = selector.SelectConstructor(context, policies); var resolvers = selected.GetParameterResolvers(); Assert.Equal(typeof(GuineaPig).GetMatchingConstructor(Sequence.Collect(typeof(string), typeof(int))), selected.Constructor); Assert.Equal(2, resolvers.Length); Assert.Equal(expectedString, (string)resolvers[0].Resolve(null)); Assert.Equal(expectedInt, (int)resolvers[1].Resolve(null)); }
private static MockBuilderContext GetContext() { var context = new MockBuilderContext(); context.Strategies.Add(new ThrowingStrategy()); return context; }
public void BuildIgnoresClassWithoutInterface() { var strategy = new BuilderAwareStrategy(); var context = new MockBuilderContext(); var obj = new Ignorant(); context.Strategies.Add(strategy); context.ExecuteBuildUp(new NamedTypeBuildKey<Ignorant>(), obj); Assert.False(obj.OnBuiltUpWasCalled); Assert.False(obj.OnTearingDownWasCalled); }
public void TearDownCallsClassWithInterface() { var strategy = new BuilderAwareStrategy(); var context = new MockBuilderContext(); var obj = new Aware(); context.Strategies.Add(strategy); context.ExecuteTearDown(obj); Assert.False(obj.OnBuiltUpWasCalled); Assert.True(obj.OnTearingDownWasCalled); }
public void BuildChecksConcreteTypeAndNotRequestedType() { var strategy = new BuilderAwareStrategy(); var context = new MockBuilderContext(); var obj = new Aware(); context.Strategies.Add(strategy); context.ExecuteBuildUp(new NamedTypeBuildKey<Aware>(), obj); Assert.True(obj.OnBuiltUpWasCalled); Assert.False(obj.OnTearingDownWasCalled); }
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 StrategyGetsBuildPlanFromPolicySet() { MockBuilderContext context = new MockBuilderContext(); context.Strategies.Add(new BuildPlanStrategy()); object instance = new object(); ReturnInstanceBuildPlan plan = new ReturnInstanceBuildPlan(instance); context.Policies.Set<IBuildPlanPolicy>(plan, new NamedTypeBuildKey<object>()); object result = context.ExecuteBuildUp(new NamedTypeBuildKey<object>(), null); Assert.True(plan.BuildUpCalled); Assert.Same(instance, result); }
public void BuildCallsClassWithInterface() { var strategy = new BuilderAwareStrategy(); var context = new MockBuilderContext(); var obj = new Aware(); context.Strategies.Add(strategy); context.ExecuteBuildUp(new NamedTypeBuildKey<Aware>(), obj); Assert.True(obj.OnBuiltUpWasCalled); Assert.False(obj.OnTearingDownWasCalled); Assert.Equal(new NamedTypeBuildKey<Aware>(), obj.OnBuiltUpBuildKey); }
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 StrategyCreatesBuildPlanWhenItDoesntExist() { MockBuilderContext context = new MockBuilderContext(); context.Strategies.Add(new BuildPlanStrategy()); MockBuildPlanCreatorPolicy policy = new MockBuildPlanCreatorPolicy(); context.Policies.SetDefault<IBuildPlanCreatorPolicy>(policy); object result = context.ExecuteBuildUp(new NamedTypeBuildKey<object>(), null); Assert.NotNull(result); Assert.True(policy.PolicyWasCreated); IBuildPlanPolicy plan = context.Policies.Get<IBuildPlanPolicy>(new NamedTypeBuildKey(typeof(object))); Assert.NotNull(plan); }
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 InjectionConstructorInsertsChooserForDefaultConstructor() { var ctor = new InjectionConstructor(); var context = new MockBuilderContext { BuildKey = new NamedTypeBuildKey(typeof(GuineaPig)) }; IPolicyList policies = context.PersistentPolicies; ctor.AddPolicies(typeof(GuineaPig), policies); var selector = policies.Get<IConstructorSelectorPolicy>( new NamedTypeBuildKey(typeof(GuineaPig))); SelectedConstructor selected = selector.SelectConstructor(context, policies); Assert.Equal(typeof(GuineaPig).GetMatchingConstructor(new Type[0]), selected.Constructor); Assert.Equal(0, selected.GetParameterResolvers().Length); }
private MockBuilderContext GetContext(Type t) { var context = new MockBuilderContext(); context.BuildKey = new NamedTypeBuildKey(t); return context; }
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); AssertExtensions.IsInstanceOfType(spy.BuildKey, typeof(NamedTypeBuildKey)); Assert.Equal(toKey, spy.BuildKey); }
public void ParameterOverrideMatchesWhenCurrentOperationIsResolvingMatchingParameter() { var context = new MockBuilderContext { CurrentOperation = new ConstructorArgumentResolveOperation(typeof(SimpleTestObject), "int x", "x") }; var overrider = new ParameterOverride("x", 42); var resolver = overrider.GetResolver(context, typeof(int)); Assert.NotNull(resolver); AssertExtensions.IsInstanceOfType(resolver, typeof(LiteralValueDependencyResolverPolicy)); var result = (int)resolver.Resolve(context); Assert.Equal(42, result); }
public void InjectionConstructorThrowsIfNoMatchingConstructor() { InjectionConstructor ctor = new InjectionConstructor(typeof(double)); var context = new MockBuilderContext(); AssertExtensions.AssertException<InvalidOperationException>( () => ctor.AddPolicies(typeof(GuineaPig), context.PersistentPolicies)); }
/// <summary> /// A convenience method to do a new buildup operation on an existing context. This /// overload allows you to specify extra policies which will be in effect for the duration /// of the build. /// </summary> /// <param name="newBuildKey">Key defining what to build up.</param> /// <param name="childCustomizationBlock">A delegate that takes a <see cref="IBuilderContext"/>. This /// is invoked with the new child context before the build up process starts. This gives callers /// the opportunity to customize the context for the build process.</param> /// <returns>Created object.</returns> public object NewBuildUp(NamedTypeBuildKey newBuildKey, Action<IBuilderContext> childCustomizationBlock) { var newContext = new MockBuilderContext { strategies = strategies, persistentPolicies = persistentPolicies, policies = new PolicyList(persistentPolicies), lifetime = lifetime, originalBuildKey = buildKey, buildKey = newBuildKey, existing = null }; newContext.resolverOverrides.Add(resolverOverrides); childCustomizationBlock(newContext); return strategies.ExecuteBuildUp(newContext); }
public IBuilderContext CloneForNewBuild(NamedTypeBuildKey newBuildKey, object newExistingObject) { var newContext = new MockBuilderContext { strategies = strategies, persistentPolicies = persistentPolicies, policies = policies, lifetime = lifetime, originalBuildKey = buildKey, buildKey = newBuildKey, existing = newExistingObject }; newContext.resolverOverrides.Add(resolverOverrides); return newContext; }
public void InjectionConstructorSetsResolverForInterfaceToLookupInContainer() { var ctor = new InjectionConstructor("Logger", typeof(ILogger)); var context = new MockBuilderContext(); context.BuildKey = new NamedTypeBuildKey(typeof(GuineaPig)); IPolicyList policies = context.PersistentPolicies; ctor.AddPolicies(typeof(GuineaPig), policies); var selector = policies.Get<IConstructorSelectorPolicy>( new NamedTypeBuildKey(typeof(GuineaPig))); SelectedConstructor selected = selector.SelectConstructor(context, policies); var resolvers = selected.GetParameterResolvers(); Assert.Equal(typeof(GuineaPig).GetMatchingConstructor(Sequence.Collect(typeof(string), typeof(ILogger))), selected.Constructor); Assert.Equal(2, resolvers.Length); var policy = resolvers[1]; Assert.True(policy is NamedTypeDependencyResolverPolicy); }