From: <jer...@us...> - 2008-09-24 22:34:16
|
Revision: 154 http://structuremap.svn.sourceforge.net/structuremap/?rev=154&view=rev Author: jeremydmiller Date: 2008-09-24 21:47:17 +0000 (Wed, 24 Sep 2008) Log Message: ----------- mostly fixes for RhinoAutoMocker Modified Paths: -------------- trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/IContainer.cs trunk/Source/StructureMap/IInstanceFactory.cs trunk/Source/StructureMap/InstanceFactory.cs trunk/Source/StructureMap/ObjectFactory.cs trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs trunk/Source/StructureMap/PipelineGraph.cs trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/BuildSession.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -8,8 +8,17 @@ namespace StructureMap { - public class BuildSession + public interface IContext { + T GetInstance<T>(); + + + BuildStack BuildStack { get; } + Type ParentType { get; } + } + + public class BuildSession : IContext + { private readonly InterceptorLibrary _interceptorLibrary; private readonly PipelineGraph _pipelineGraph; private readonly InstanceCache _cache = new InstanceCache(); @@ -134,5 +143,10 @@ { return _pipelineGraph.ForType(pluginType); } + + T IContext.GetInstance<T>() + { + return (T) CreateInstance(typeof (T)); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -33,6 +33,11 @@ return returnInstance(new SmartInstance<PLUGGEDTYPE>()); } + public ConfiguredInstance OfConcreteType(Type type) + { + return returnInstance(new ConfiguredInstance(type)); + } + public LiteralInstance Object(T theObject) { return returnInstance(new LiteralInstance(theObject)); @@ -58,7 +63,7 @@ return returnInstance(new ConstructorInstance<T>(func)); } - public ConstructorInstance<T> ConstructedBy(Func<BuildSession, T> func) + public ConstructorInstance<T> ConstructedBy(Func<IContext, T> func) { return returnInstance(new ConstructorInstance<T>(func)); } Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/Container.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -277,11 +277,11 @@ return forType(type).GetAllInstances(withNewSession()); } - public void Configure(Action<Registry> configure) + public void Configure(Action<ConfigurationExpression> configure) { lock (this) { - Registry registry = new Registry(); + ConfigurationExpression registry = new ConfigurationExpression(); configure(registry); PluginGraph graph = registry.Build(); @@ -335,5 +335,9 @@ return _pipelineGraph.ForType(type); } + public void EjectAllInstancesOf<T>() + { + _pipelineGraph.EjectAllInstancesOf<T>(); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/IContainer.cs =================================================================== --- trunk/Source/StructureMap/IContainer.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/IContainer.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -21,7 +21,7 @@ IList GetAllInstances(Type type); - void Configure(Action<Registry> configure); + void Configure(Action<ConfigurationExpression> configure); void Inject<PLUGINTYPE>(PLUGINTYPE instance); void Inject(Type pluginType, object stub); void Inject<T>(string name, T instance); Modified: trunk/Source/StructureMap/IInstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/IInstanceFactory.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/IInstanceFactory.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -22,5 +22,6 @@ void ForEachInstance(Action<Instance> action); void ImportFrom(PluginFamily family); void AcceptVisitor(IPipelineGraphVisitor visitor, Instance defaultInstance); + void EjectAllInstances(); } } \ No newline at end of file Modified: trunk/Source/StructureMap/InstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/InstanceFactory.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/InstanceFactory.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -135,5 +135,10 @@ visitor.PluginType(PluginType, defaultInstance, _policy); ForEachInstance(i => visitor.Instance(PluginType, i)); } + + public void EjectAllInstances() + { + _instances.Clear(); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/ObjectFactory.cs =================================================================== --- trunk/Source/StructureMap/ObjectFactory.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/ObjectFactory.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -176,7 +176,7 @@ _container = container; } - public static void Configure(Action<Registry> configure) + public static void Configure(Action<ConfigurationExpression> configure) { container.Configure(configure); } Modified: trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -6,9 +6,9 @@ public class ConstructorInstance<T> : ExpressedInstance<ConstructorInstance<T>> { - private readonly Func<BuildSession, T> _builder; + private readonly Func<IContext, T> _builder; - public ConstructorInstance(Func<BuildSession, T> builder) + public ConstructorInstance(Func<IContext, T> builder) { _builder = builder; } Modified: trunk/Source/StructureMap/PipelineGraph.cs =================================================================== --- trunk/Source/StructureMap/PipelineGraph.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/PipelineGraph.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -191,5 +191,10 @@ ForType(typeof (PLUGINTYPE)).AddInstance(literalInstance); SetDefault(typeof (PLUGINTYPE), literalInstance); } + + public void EjectAllInstancesOf<T>() + { + ForType(typeof (T)).EjectAllInstances(); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs =================================================================== --- trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -8,6 +8,10 @@ { private readonly ServiceLocator _locator; + public AutoMockedContainer() : this(new RhinoMocksServiceLocator()) + { + } + public AutoMockedContainer(ServiceLocator locator) { _locator = locator; @@ -19,13 +23,21 @@ return null; } - object service = _locator.Service(pluginType); InstanceFactory factory = new InstanceFactory(new PluginFamily(pluginType)); - LiteralInstance instance = new LiteralInstance(service); + try + { + object service = _locator.Service(pluginType); - profileManager.SetDefault(pluginType, instance); + LiteralInstance instance = new LiteralInstance(service); + profileManager.SetDefault(pluginType, instance); + } + catch (Exception) + { + // ignore errors + } + return factory; }; } Modified: trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs =================================================================== --- trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -60,8 +60,23 @@ foreach (ParameterInfo parameterInfo in ctor.GetParameters()) { Type dependencyType = parameterInfo.ParameterType; - object dependency = _container.GetInstance(dependencyType); - list.Add(dependency); + + if (dependencyType.IsArray) + { + var values = _container.GetAllInstances(dependencyType.GetElementType()); + var array = Array.CreateInstance(dependencyType.GetElementType(), values.Count); + values.CopyTo(array, 0); + + list.Add(array); + + } + else + { + object dependency = _container.GetInstance(dependencyType); + list.Add(dependency); + } + + } return list.ToArray(); @@ -85,6 +100,19 @@ _container.Inject(pluginType, stub); } + public void Inject<T>(T target) + { + _container.Inject<T>(target); + } + + public T AddAdditionalMockFor<T>() + { + T mock = DynamicMock<T>(); + _container.Configure(r => r.InstanceOf<T>().Is.Object(mock)); + + return mock; + } + // So that Aaron Jensen can use his concrete HubService object // Construct whatever T is with all mocks, and make sure that the // ClassUnderTest gets built with a concrete T @@ -93,5 +121,36 @@ T concreteClass = _container.FillDependencies<T>(); _container.Inject(concreteClass); } + + public AutoMockedContainer Container + { + get { return _container; } + } + + public T[] CreateMockArrayFor<T>(int count) + { + T[] returnValue = new T[count]; + + for (int i = 0; i < returnValue.Length; i++) + { + returnValue[i] = DynamicMock<T>(); + } + + InjectArray<T>(returnValue); + + return returnValue; + } + + public void InjectArray<T>(T[] stubs) + { + _container.EjectAllInstancesOf<T>(); + _container.Configure(x => + { + foreach (var t in stubs) + { + x.InstanceOf<T>().Is.Object(t); + } + }); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -3,6 +3,8 @@ using Rhino.Mocks; using Rhino.Mocks.Interfaces; using StructureMap.AutoMocking; +using StructureMap.Graph; +using StructureMap.Testing.Widget3; namespace StructureMap.Testing.AutoMocking { @@ -14,6 +16,8 @@ [SetUp] public void SetUp() { + PluginCache.ResetAll(); + _mocks = new MockRepository(); _locator = new RhinoMocksServiceLocator(_mocks); _container = new AutoMockedContainer(_locator); @@ -129,7 +133,70 @@ #endregion } + public class ClassWithArray + { + private IMockedService[] _services; + + public ClassWithArray(IMockedService[] services) + { + _services = services; + } + + public IMockedService[] Services + { + get { return _services; } + } + } + [Test] + public void CanInjectAnArrayOfMockServices1() + { + var mocker = new RhinoAutoMocker<ClassWithArray>(); + + IMockedService[] services = mocker.CreateMockArrayFor<IMockedService>(3); + ClassWithArray theClass = mocker.ClassUnderTest; + + theClass.Services.Length.ShouldEqual(3); + } + + [Test] + public void CanInjectAnArrayOfMockServices2() + { + var mocker = new RhinoAutoMocker<ClassWithArray>(); + + ClassWithArray theClass = mocker.ClassUnderTest; + + theClass.Services.Length.ShouldEqual(0); + } + + + [Test] + public void CanInjectAnArrayOfMockServices3() + { + var mocker = new RhinoAutoMocker<ClassWithArray>(); + + IMockedService[] services = mocker.CreateMockArrayFor<IMockedService>(3); + + mocker.PartialMockTheClassUnderTest(); + ClassWithArray theClass = mocker.ClassUnderTest; + + theClass.Services.Length.ShouldEqual(3); + } + + [Test] + public void CanInjectAnArrayOfMockServices4() + { + var mocker = new RhinoAutoMocker<ClassWithArray>(); + + mocker.PartialMockTheClassUnderTest(); + ClassWithArray theClass = mocker.ClassUnderTest; + + theClass.Services.Length.ShouldEqual(0); + } + + + + [Test] public void AutoFillAConcreteClassWithMocks() { IMockedService service = _container.GetInstance<IMockedService>(); Modified: trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -223,7 +223,7 @@ container.GetInstance<ClassWithDependency>().Rule.ShouldBeOfType(typeof(ColorRule)); } - private static Logger createLogger(BuildSession session) + private static Logger createLogger(IContext session) { return new Logger(session.ParentType); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |