From: Griffin C. <gc...@us...> - 2005-04-23 21:53:45
|
Update of /cvsroot/dotnetmock/dotnetmock/DotNetMock/Dynamic/Generate In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3617/DotNetMock/Dynamic/Generate Modified Files: ClassGenerator.cs MockClassBuilder.cs Log Message: - Added overload ImplementMockedMethod to MockClassBuilder - Added Roman's ClassGenerator patches Index: MockClassBuilder.cs =================================================================== RCS file: /cvsroot/dotnetmock/dotnetmock/DotNetMock/Dynamic/Generate/MockClassBuilder.cs,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** MockClassBuilder.cs 8 Apr 2005 03:33:01 -0000 1.2 --- MockClassBuilder.cs 23 Apr 2005 21:53:33 -0000 1.3 *************** *** 129,132 **** --- 129,144 ---- /// <param name="parameterTypes">array of <see cref="Type"/>s in /// the method signature</param> + public void ImplementMockedMethod(string methodName, Type returnType, Type[] parameterTypes ) + { + ImplementMockedMethod(methodName, returnType, parameterTypes, null); + } + /// <summary> + /// Define a mock implementation of a method. + /// </summary> + /// <param name="methodName">name of method to mock</param> + /// <param name="returnType">return <see cref="Type"/> of method + /// to mock</param> + /// <param name="parameterTypes">array of <see cref="Type"/>s in + /// the method signature</param> /// <param name="mi">if not null, used to get extra parameter information</param> public void ImplementMockedMethod(string methodName, Type returnType, Type[] parameterTypes, MethodInfo mi) Index: ClassGenerator.cs =================================================================== RCS file: /cvsroot/dotnetmock/dotnetmock/DotNetMock/Dynamic/Generate/ClassGenerator.cs,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** ClassGenerator.cs 9 Jan 2005 06:48:35 -0000 1.10 --- ClassGenerator.cs 23 Apr 2005 21:53:33 -0000 1.11 *************** *** 2,5 **** --- 2,6 ---- // Copyright (c) 2004 Griffin Caprio & Choy Rim. All rights reserved. #endregion + #region Imports using System; *************** *** 7,11 **** using System.Reflection; using System.Reflection.Emit; - using DotNetMock.Dynamic; #endregion --- 8,11 ---- *************** *** 15,43 **** /// Dynamic Mock object generation engine. Generates the dynamic proxies for dynamic mock objects. /// </summary> ! public class ClassGenerator { ! AssemblyBuilder _assemblyBuilder = null; ! ModuleBuilder _moduleBuilder = null; ! string _assemblyFilename = null; /// <summary> /// Create default instance of mock object generator. /// </summary> ! public ClassGenerator() { ! _assemblyBuilder = newAssemblyBuilder(AssemblyBuilderAccess.Run); ! _moduleBuilder = _assemblyBuilder.DefineDynamicModule("MockModule"); } - /// <summary> /// Create mock object generator that can save. /// </summary> /// <param name="filename">filename to save to</param> ! public ClassGenerator(string filename) { ! _assemblyBuilder = newAssemblyBuilder(AssemblyBuilderAccess.RunAndSave); ! _moduleBuilder = _assemblyBuilder.DefineDynamicModule("MockModule", filename); _assemblyFilename = filename; } /// <summary> /// Generates a mock object for the specified type. --- 15,49 ---- /// Dynamic Mock object generation engine. Generates the dynamic proxies for dynamic mock objects. /// </summary> ! /// <author>Griffin Caprio</author> ! /// <author>Choy Rim</author> ! /// <author>Roman V. Gavrilov</author> ! public class ClassGenerator { ! private AssemblyBuilder _assemblyBuilder; ! private ModuleBuilder _moduleBuilder; ! private string _assemblyFilename; + #region Constructors /// <summary> /// Create default instance of mock object generator. /// </summary> ! public ClassGenerator( ) { ! _assemblyBuilder = newAssemblyBuilder( AssemblyBuilderAccess.Run ); ! _moduleBuilder = _assemblyBuilder.DefineDynamicModule( "MockModule" ); } /// <summary> /// Create mock object generator that can save. /// </summary> /// <param name="filename">filename to save to</param> ! public ClassGenerator( string filename ) { ! _assemblyBuilder = newAssemblyBuilder( AssemblyBuilderAccess.RunAndSave ); ! _moduleBuilder = _assemblyBuilder.DefineDynamicModule( "MockModule", filename ); _assemblyFilename = filename; } + #endregion + + #region Public Methods /// <summary> /// Generates a mock object for the specified type. *************** *** 47,51 **** /// will handle all calls to the generated mock object.</param> /// <returns>proxy mock object for input type.</returns> ! public object Generate(Type type, IMockedCallHandler handler) { string mockClassName = "Mock" + type.Name; --- 53,57 ---- /// will handle all calls to the generated mock object.</param> /// <returns>proxy mock object for input type.</returns> ! public object Generate( Type type, IMockedCallHandler handler ) { string mockClassName = "Mock" + type.Name; *************** *** 62,115 **** interfaces ); ! IList methods = getMethods(type); ! foreach (MethodInfo mi in methods) { ! classBuilder.ImplementMockedMethod(mi); } // create type ! classBuilder.Compile(); object newMockObject = ! Activator.CreateInstance(classBuilder.MockClass); // set handler field ! classBuilder.HandlerField.SetValue(newMockObject, handler); // save if necessary ! if ( _assemblyFilename!=null ) { ! _assemblyBuilder.Save(_assemblyFilename); } return newMockObject; } ! private IList getMethods(Type type) { IList methods; ! if (type.IsInterface) { ! ArrayList list = new ArrayList(); ! getMethodsForInterface(type, list); methods = list; } else { ! methods = type.GetMethods(); } return methods; } ! ! private void getMethodsForInterface(Type type, ArrayList list) { ! list.AddRange(type.GetMethods()); ! foreach (Type interfaceType in type.GetInterfaces()) { ! getMethodsForInterface(interfaceType, list); } } ! private static void determineSuperClassAndInterfaces(Type targetType, out Type superClass, out Type[] interfaces) { ! if (targetType.IsInterface) { superClass = null; ! interfaces = new Type[] { targetType }; } ! else { superClass = targetType; --- 68,155 ---- interfaces ); ! IList methods = getMethods( type ); ! foreach ( MethodInfo mi in methods ) { ! classBuilder.ImplementMockedMethod( mi ); } // create type ! classBuilder.Compile( ); object newMockObject = ! Activator.CreateInstance( classBuilder.MockClass ); // set handler field ! classBuilder.HandlerField.SetValue( newMockObject, handler ); // save if necessary ! if ( _assemblyFilename != null ) { ! _assemblyBuilder.Save( _assemblyFilename ); } return newMockObject; } ! /// <summary> ! /// Generates a mock object with an interface defined by an array of method signatures. ! /// </summary> ! /// <param name="typeName">Name of the type to ganerate.</param> ! /// <param name="methodSignatures">Array of method signatures of methods to be implemented.</param> ! /// <param name="handler">Mocked calls handler.</param> ! /// <returns>Instance of generated class.</returns> ! public object Generate( string typeName, MethodSignature[] methodSignatures, IMockedCallHandler handler ) ! { ! MockClassBuilder classBuilder = new MockClassBuilder( ! _moduleBuilder, ! typeName, ! typeof ( object ), ! Type.EmptyTypes ! ); ! foreach ( MethodSignature ms in methodSignatures ) ! { ! classBuilder.ImplementMockedMethod( ms.MethodName, ms.ReturnType, ms.ParamTypes ); ! } ! // create type ! classBuilder.Compile( ); ! object newMockObject = ! Activator.CreateInstance( classBuilder.MockClass ); ! // set handler field ! classBuilder.HandlerField.SetValue( newMockObject, handler ); ! // save if necessary ! if ( _assemblyFilename != null ) ! { ! _assemblyBuilder.Save( _assemblyFilename ); ! } ! return newMockObject; ! } ! #endregion ! ! #region Private Methods ! private IList getMethods( Type type ) { IList methods; ! if ( type.IsInterface ) { ! ArrayList list = new ArrayList( ); ! getMethodsForInterface( type, list ); methods = list; } else { ! methods = type.GetMethods( ); } return methods; } ! private void getMethodsForInterface( Type type, ArrayList list ) { ! list.AddRange( type.GetMethods( ) ); ! foreach ( Type interfaceType in type.GetInterfaces( ) ) { ! getMethodsForInterface( interfaceType, list ); } } ! private static void determineSuperClassAndInterfaces( Type targetType, out Type superClass, out Type[] interfaces ) { ! if ( targetType.IsInterface ) { superClass = null; ! interfaces = new Type[] {targetType}; } ! else { superClass = targetType; *************** *** 117,129 **** } } ! private static AssemblyBuilder newAssemblyBuilder(AssemblyBuilderAccess access) { AppDomain appDomain = AppDomain.CurrentDomain; ! AssemblyName assemblyName = new AssemblyName(); assemblyName.Name = "DynamicMockAssembly"; return appDomain.DefineDynamicAssembly( assemblyName, access ); } } ! ! ! } --- 157,169 ---- } } ! private static AssemblyBuilder newAssemblyBuilder( AssemblyBuilderAccess access ) { AppDomain appDomain = AppDomain.CurrentDomain; ! AssemblyName assemblyName = new AssemblyName( ); assemblyName.Name = "DynamicMockAssembly"; return appDomain.DefineDynamicAssembly( assemblyName, access ); } + #endregion + } ! } \ No newline at end of file |