|
From: <joe...@us...> - 2003-06-01 09:48:52
|
Update of /cvsroot/nmock/nmock/src/NMock/Dynamic
In directory sc8-pr-cvs1:/tmp/cvs-serv31005/src/NMock/Dynamic
Modified Files:
ClassGenerator.cs
Added Files:
InterfaceLister.cs
Log Message:
Added better support for mocking interface hierarchies (Jeremy Stell-Smith pointed out the brokenness of it all).
--- NEW FILE: InterfaceLister.cs ---
using System;
using System.Collections;
using System.Reflection;
namespace NMock.Dynamic
{
// List all interfaces implemented by an interface (includes classes)
public class InterfaceLister
{
public Type[] List(Type i)
{
ArrayList found = new ArrayList();
walk(found, i);
return (Type[]) found.ToArray(typeof(Type));
}
private void walk(IList found, Type current)
{
if (current == null || current == typeof(Object))
{
return;
}
add(found, current);
foreach(Type superType in current.GetInterfaces())
{
add(found, superType);
}
walk(found, current.BaseType);
}
private void add(IList found, Type item)
{
if (!found.Contains(item))
{
found.Add(item);
}
}
}
}
Index: ClassGenerator.cs
===================================================================
RCS file: /cvsroot/nmock/nmock/src/NMock/Dynamic/ClassGenerator.cs,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** ClassGenerator.cs 27 Feb 2003 22:45:51 -0000 1.9
--- ClassGenerator.cs 1 Jun 2003 09:48:49 -0000 1.10
***************
*** 17,41 ****
}
! public virtual object Generate(Type type, IMock mock, IList methodsToIgnore)
! {
! methodsToIgnore.Add("Equals");
! methodsToIgnore.Add("ToString");
! TypeBuilder typeBuilder = GetTypeBuilder("Mock" + type.Name, type);
! MethodImplementor methodImplementor = new MethodImplementor(typeBuilder);
! foreach ( MethodInfo methodInfo in type.GetMethods(ALL_INSTANCE_METHODS) )
! {
! if (IsOverridable(methodInfo) && !methodsToIgnore.Contains(methodInfo.Name))
! {
! methodImplementor.Implement(methodInfo);
! }
! }
! return CreateProxyInstance(typeBuilder, mock);
! }
! bool IsOverridable(MethodInfo m)
{
! return (m.IsVirtual && ! m.IsFinal);
}
--- 17,47 ----
}
! public virtual object Generate(Type type, IMock mock, IList methodsToIgnore)
! {
! methodsToIgnore.Add("Equals");
! methodsToIgnore.Add("ToString");
! TypeBuilder typeBuilder = GetTypeBuilder("Mock" + type.Name, type);
! MethodImplementor methodImplementor = new MethodImplementor(typeBuilder);
! foreach (Type currentType in new InterfaceLister().List(type))
! {
! foreach ( MethodInfo methodInfo in currentType.GetMethods(ALL_INSTANCE_METHODS) )
! {
! if (ShouldImplement(methodInfo, methodsToIgnore))
! {
! methodImplementor.Implement(methodInfo);
! }
! }
! }
! return CreateProxyInstance(typeBuilder, mock);
! }
! bool ShouldImplement(MethodInfo methodInfo, IList methodsToIgnore)
{
! if (!methodInfo.IsVirtual || methodInfo.IsFinal) {
! methodsToIgnore.Add(methodInfo.Name);
! }
! return !methodsToIgnore.Contains(methodInfo.Name);
}
|