测试后行之CodeSmith模板

<%@ CodeTemplate Language="VB" TargetLanguage="Text" Description="Template description here." Debug="False" %>
<%@ Assembly Name="System.Design" %>
<%@ Import Namespace="System.Reflection" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.Text" %>

<%@ Property Name="FullClassName" Type="System.String" Category="Template Options" Description="This is the fully qualified name of the class to test." %>
<%@ Property Name="IncludeInheritedMembers" Type="System.Boolean" Category="Template Options" Required="true" default="false" %>
<%@ Property Name="DeclaringTypeToExclude" Type="System.String" Category="Template Options" Required="false" %>
<%@ Property Name="GenerateConstructorClasses" Type="System.Boolean" Category="Constructor Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>
<%@ Property Name="GeneratePropertyClasses" Type="System.Boolean" Category="Property Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>
<%@ Property Name="GenerateMethodClasses" Type="System.Boolean" Category="Method Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>

<% InitTemplate() %>
Imports System
Imports NUnit.Framework
Imports <%= GetNamespaceOnly(FullClassName)%>

Namespace <%= GetTestNamespace(FullClassName) %>

    
<%'/*
    '----------------------------------------------
    '--------------- Constructors -----------------
    '----------------------------------------------
    '*/
    If (GenerateConstructorClasses) Then
    %
>
    
    
#Region "Constructor Tests"
    
    
<TestFixture> _
    
public class ConstructorTesting
    
        
#Region "Test Preparation Methods"
        
        
#Region "TestFixture SetUp and TearDown"
        
        
<TestFixtureSetUp> _
        
Public Sub FixtureInit()
        
        
End Sub
        
        
<TestFixtureTearDown> _ 
        
public Sub FixtureDispose()
        
        
End Sub
        
        
#End Region
        
        
#Region "Test SetUp and TearDown"
        
        
<SetUp> _
        
public Sub TestInit()
        
        
End Sub
        
        
<TearDown> _ 
        
public Sub TestDispose()
        
        
End Sub
        
        
#End Region
        
        
#End Region
        
        
#Region "Test Methods"
        
<%Dim i As Integer%>
        
<%For i = 0 To constructors.Length - 1%>
            
<%If  i = 0  Then%>
            
<%= CreateConstructorTest(GetClassName(FullClassName),constructors(i))%>
            
<%Else%>
            
<%= CreateConstructorTest(GetClassName(FullClassName) + "_Overload" + i.ToString(),constructors(i))%>
            
<%End iF%>
        
<%Next%>
                
        
#End Region
        
    
End Sub

    
#End Region
    
<%End If%>
    
<If (GenerateMethodClasses) Then%>
    
<%'/*
    '----------------------------------------------
    '-------------- Static Methods ----------------
    '----------------------------------------------
    '*/%>
    
    
#Region Static Method Tests
    
    
<TestFixture> _
    
public class StaticMethodTesting
    
        
#Region "Test Preparation Methods"
        
        
#Region "TestFixture Setup and TearDown"
        
        
<TestFixtureSetUp> _
        
public Sub FixtureInit()
        
        
End Sub
        
        
<TestFixtureTearDown> _ 
        
public Sub FixtureDispose()
        
        
End Sub
        
        
#End Region
        
        
#Region "Test SetUp and TearDown"
        
        
<SetUp> _
        
public Sub TestInit()
        
        
End Sub
        
        
<TearDown> _ 
        
public Sub TestDispose()
        
        
End Sub
        
        
#End Region
        
        
#End Region
        
        
#Region Test Methods
        
        
<%Dim i As Integer%>
        
<For i = 0 To methods.Length - 1
            
If (methods(i).IsStatic  _
            
AndAlso (Not methods(i).Name.StartsWith("get_")  _
            
AndAlso (Not methods(i).Name.StartsWith("set_")  _
            
AndAlso ((methods(i).DeclaringType.ToString <> DeclaringTypeToExclude)  _
            
AndAlso (methods(i).DeclaringType.ToString <> "System.Object"))))) Then%>
        
<%= CreateMethodTest(methods(i), staticMethodCount) %>
            
<%End iF%>
        
<%Next%>
                        
        
#End Region
    
End Sub

    
#End Region
    
    
<%'/*
    '----------------------------------------------
    '------------------ Methods -------------------
    '----------------------------------------------
    '*/%>
    
    
#Region Method Tests
    
    
<TestFixture> _
    
public class MethodTesting
    
        
// Variable to hold object to be tested for reuse by init functions
        
<%= FullClassName  %> m_<%= GetCamelCaseName(GetClassName(FullClassName)) %>;
        
        
#Region "Test Preparation Methods"
        
        
#Region "TestFixture SetUp and TearDown"
        
        
<TestFixtureSetUp> _
        
public Sub FixtureInit()
        
        
End Sub
        
        
<TestFixtureTearDown> _ 
        
public Sub FixtureDispose()
        
        
End Sub
        
        
#End Region
        
        
#Region "Test SetUp and TearDown"
        
        
<%= CreateMethodTestInit(FullClassName) %>
        
        
<%= CreateMethodTestDispose(GetClassName(FullClassName)) %>
        
        
#End Region
        
        
#End Region
        
        
#Region Test Methods
        
        
<For i = 0 To properties.Length - 1
            
if (Not methods(i).IsStatic  _
            
AndAlso (Not methods(i).Name.StartsWith("get_")  _
            
AndAlso (Not methods(i).Name.StartsWith("set_")  _
            
AndAlso ((methods(i).DeclaringType.ToString <> DeclaringTypeToExclude)  _
            
AndAlso (methods(i).DeclaringType.ToString <> "System.Object"))))) Then%>
        
<%= CreateMethodTest(methods(i), instanceMethodCount) %>
            
<%End iF%>
        
<%Next%>
                        
        
#End Region
    
End Class

    
#End Region
    
<%End If%>
    
<%If (GeneratePropertyClasses) Then%>
    
<%'/*
    '----------------------------------------------
    '----------------- Properties -----------------
    '----------------------------------------------
    '*/%>
    
    
#Region "Property Tests"
    
    
<TestFixture> _
    
public class PropertyTesting
    
        
// Variable to hold object to be tested for reuse by init functions
        
<%= FullClassName  %> m_<%= GetCamelCaseName(GetClassName(FullClassName)) %>;
        
        
#Region Test Preparation Methods
        
        
#Region TestFixture SetUp and TearDown
        
        
<%= CreatePropertyTestFixtureInit(FullClassName) %>
        
        
<%= CreatePropertyTestFixtureDispose(GetClassName(FullClassName)) %>
        
        
#End Region
        
        
#Region Test SetUp and TearDown
        
        
<SetUp> _
        
public Sub TestInit()
        
        
End Sub
        
        
<TearDown> _ 
        
public Sub TestDispose()
        
        
        
End Sub
        
        
#End Region
        
        
#End Region
        
        
#Region Test Methods
        
        
<%Dim i As Integer%>
        
<For i = 0 To properties.Length - 1
             
If (properties(i).DeclaringType.ToString() <> DeclaringTypeToExclude) Then%>
        
<%= CreatePropertyTest(properties(i))%>
            
<%End iF%>
        
<%Next%>
        
        
#End Region
    
End Sub

    
#End Region
    
<%End If%>

End Namespace

<script runat="template">
    
Dim constructors() As ConstructorInfo = Nothing
    
Dim methods() As MethodInfo = Nothing
    
Dim properties() As PropertyInfo = Nothing
    
Dim staticMethodCount As Hashtable = New Hashtable
    
Dim instanceMethodCount As Hashtable = New Hashtable
    
Dim instanceConstructorCount As Hashtable = New Hashtable

    
Private _assemblyPath As String
    
    
<Editor(GetType(System.Windows.Forms.Design.FileNameEditor), GetType(System.Drawing.Design.UITypeEditor)),  _
     CodeTemplateProperty(CodeTemplatePropertyOption.Required),  _
     Category(
"Template Options"),  _
     Description(
"This is the full path, including the assembly name, of the assembly which contains the class to test."& _ 
    
"")>  _
    
Public Property AssemblyPath As String
        
Get
            
Return _assemblyPath
        
End Get
        
Set
            _assemblyPath 
= value
        
End Set
    
End Property


    
Public Sub InitTemplate()
        
'Debugger.Break();
        ' Reflect object properties
        constructors = ReflectClassConstructors(AssemblyPath, FullClassName)
        methods 
= ReflectClassMethods(AssemblyPath, FullClassName)
        properties 
= ReflectClassProperties(AssemblyPath, FullClassName)
    
End Sub
    
    
Public Function GetCamelCaseName(ByVal value As StringAs String
        
Return (value.Substring(01).ToLower + value.Substring(1))
    
End Function
    
    
Public Function GetCaseName(ByVal value As StringAs String
        
Return (value.Substring(01).ToUpper + value.Substring(1))
    
End Function
    
    
' Returns just the class name given a fully qualified class name; i.e. BHCS.Portal.McCoy.Engine.Entities.Module
    Public Function GetClassName(ByVal fullClassName As StringAs String
        
Return fullClassName.Substring((fullClassName.LastIndexOf("."+ 1))
    
End Function
    
    
Public Function GetNamespaceOnly(ByVal fullClassName As StringAs String
        
Return fullClassName.Substring(0, fullClassName.LastIndexOf("."))
    
End Function
    
    
Public Function GetTestNamespace(ByVal fullClassName As StringAs String
        
Return (GetNamespaceOnly(fullClassName) + (".Test." + GetClassName(fullClassName)))
    
End Function
    
     
Public Function CreateConstructorTestBody(ByVal constructor As ConstructorInfo) As String
        
Dim sb As StringBuilder = New StringBuilder
        sb.Append(
"// Declare variables to pass to constructor call" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "//TODO: Set values for variables" & vbLf)
        
Dim parameters() As ParameterInfo = constructor.GetParameters
        
Dim c As Integer = 0
        
Do While (c < parameters.Length)
            sb.Append(
"" & vbTab & vbTab & vbTab)
            sb.Append(parameters(c).ParameterType.ToString)
            sb.Append(
" _")
            sb.Append(parameters(c).Name)
            sb.Append(
" = ")
            sb.Append(GetTypeDefaultValue(parameters(c).ParameterType.ToString))
            sb.Append(
";" & vbLf)
            c 
= (c + 1)
        
Loop
        sb.Append(
"" & vbTab & vbTab & vbTab & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "// Declare return type to hold constructor result" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab)
        sb.Append(FullClassName)
        sb.Append(
" _returnValue;" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "// Instantiate object" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "_returnValue = new ")
        sb.Append(FullClassName)
        sb.Append(
"(")
        
        
Do While (c < parameters.Length)
            sb.Append(
" _")
            sb.Append(parameters(c).Name)
            sb.Append(
"")
            c 
= (c + 1)
        
Loop
        
If (parameters.Length > 0Then
            sb.Remove((sb.Length 
- 2), 2)
        
End If
        sb.Append(
");" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "// Perform Assert Tests" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "//TODO: Write Assert Tests for object instance" & vbLf)
        
Return sb.ToString
    
End Function
    
    
' Creates the constructor test method
    Public Function CreateConstructorTest(ByVal constructorName As StringByVal constructor As ConstructorInfo) As String
        
Dim sb As StringBuilder = New StringBuilder
        sb.Append(
"<Test, Ignore(\""Setup ")
        sb.Append(FullClassName)
        sb.Append(
" parameter value and Assert tests for the constructor\"")> _" & vbLf)
        sb.Append(
"" & vbTab & vbTab & "public Sub ")
        sb.Append(constructorName)
        sb.Append(
"()" & vbLf)
        sb.Append(
"" & vbTab & vbTab & "" & vbLf & vbTab & vbTab & vbTab)
        sb.Append(CreateConstructorTestBody(constructor))
        sb.Append(
"" & vbLf & vbTab & vbTab & "End Sub")
        
Return sb.ToString
    
End Function

    
Public Function ReflectClassConstructors(ByVal assemblyPath As StringByVal fullyQualifiedClassName As StringAs ConstructorInfo()
        
' Retrieve the type of the class
        Dim type As System.Type = GetClassType(assemblyPath, fullyQualifiedClassName)
        
' Return the list of properties
        If IncludeInheritedMembers Then
            
Return type.GetConstructors((BindingFlags.Public Or BindingFlags.Instance))
        
Else
            
Return type.GetConstructors((BindingFlags.Public _
                            
Or (BindingFlags.Instance Or BindingFlags.DeclaredOnly)))
        
End If
    
End Function
    
    
Public Function CreatePropertyTestFixtureInit(ByVal fullClassName As StringAs String
        
Dim sb As StringBuilder = New StringBuilder
        sb.Append(
"<TestFixtureSetUp> _" & vbLf)
        sb.Append(
"" & vbTab & vbTab & "public Sub FixtureInit()" & vbLf)
        sb.Append(
"" & vbTab & vbTab & "" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "//TODO: Initialize the ")
        sb.Append(fullClassName)
        sb.Append(
" for the test suite with the desired constructor and variables" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab)
        sb.Append(
"m_")
        sb.Append(GetCamelCaseName(GetClassName(fullClassName)))
        sb.Append(
" = new ")
        sb.Append(fullClassName)
        sb.Append(
"();" & vbLf)
        sb.Append(
"" & vbTab & vbTab & "End Sub")
        
Return sb.ToString
    
End Function
    
    
Public Function CreatePropertyTestFixtureDispose(ByVal className As StringAs String
        
Dim sb As StringBuilder = New StringBuilder
        sb.Append(
"<TestFixtureTearDown> _" & vbLf)
        sb.Append(
"" & vbTab & vbTab & "public Sub FixtureDispose()" & vbLf)
        sb.Append(
"" & vbTab & vbTab & "" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "m_")
        sb.Append(GetCamelCaseName(className))
        sb.Append(
" = null;" & vbLf)
        sb.Append(
"" & vbTab & vbTab & "End Sub")
        
Return sb.ToString
    
End Function
    
    
' Create the body of the _property test
    Public Function Create_propertyTestBody(ByVal _property As propertyInfo) As String
        
Dim sb As StringBuilder = New StringBuilder
        
If _property.CanRead Then
            sb.Append(
"" & vbTab & vbTab & vbTab & "// Declare return variable to hold _property get method" & vbLf)
            sb.Append(
"" & vbTab & vbTab & vbTab)
            sb.Append(_property.propertyType.ToString)
            sb.Append(
" _getValue = ")
            sb.Append(GetTypeDefaultValue(_property.propertyType.ToString))
            sb.Append(
";" & vbLf)
            sb.Append(
"" & vbLf & vbTab & vbTab & vbTab & "// Test get method" & vbLf)
            sb.Append(
"" & vbTab & vbTab & vbTab & "_getValue = ")
            
If _property.GetAccessors()(0).IsStatic Then
                sb.Append(FullClassName)
            
Else
                sb.Append(
"m_")
                sb.Append(GetCamelCaseName(GetClassName(FullClassName)))
            
End If
            sb.Append(
".")
            sb.Append(_property.Name)
            sb.Append(
";" & vbLf)
        
End If
        
If _property.CanWrite Then
            sb.Append(
"" & vbLf)
            sb.Append(
"" & vbTab & vbTab & vbTab & "// Declare variable to hold _property set method" & vbLf)
            sb.Append(
"" & vbTab & vbTab & vbTab)
            sb.Append(_property.propertyType.ToString)
            sb.Append(
" _setValue = ")
            sb.Append(GetTypeDefaultValue(_property.propertyType.ToString))
            sb.Append(
";" & vbLf)
            sb.Append(
"" & vbLf & vbTab & vbTab & vbTab & "// Test set method" & vbLf)
            
If _property.GetAccessors()(0).IsStatic Then
                sb.Append(
"" & vbTab & vbTab & vbTab)
                sb.Append(FullClassName)
            
Else
                sb.Append(
"" & vbTab & vbTab & vbTab & "m_")
                sb.Append(GetCamelCaseName(GetClassName(FullClassName)))
            
End If
            sb.Append(
".")
            sb.Append(_property.Name)
            sb.Append(
" = _setValue")
            sb.Append(
";" & vbLf)
        
End If
        sb.Append(
"" & vbTab & vbTab & vbTab & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "// Perform Assert Tests" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "//TODO: Write Assert Tests for ")
        sb.Append(_property.Name)
        sb.Append(
"()" & vbLf)
        
Return sb.ToString
    
End Function
    
    
' Create the body of the _property test
    Public Function CreatePropertyTestBody(ByVal _property As PropertyInfo) As String
        
Dim sb As StringBuilder = New StringBuilder
        
If _property.CanRead Then
            sb.Append(
"" & vbTab & vbTab & vbTab & "// Declare return variable to hold _property get method" & vbLf)
            sb.Append(
"" & vbTab & vbTab & vbTab)
            sb.Append(_property.PropertyType.ToString)
            sb.Append(
" _getValue = ")
            sb.Append(GetTypeDefaultValue(_property.PropertyType.ToString))
            sb.Append(
";" & vbLf)
            sb.Append(
"" & vbLf & vbTab & vbTab & vbTab & "// Test get method" & vbLf)
            sb.Append(
"" & vbTab & vbTab & vbTab & "_getValue = ")
            
If _property.GetAccessors()(0).IsStatic Then
                sb.Append(FullClassName)
            
Else
                sb.Append(
"m_")
                sb.Append(GetCamelCaseName(GetClassName(FullClassName)))
            
End If
            sb.Append(
".")
            sb.Append(_property.Name)
            sb.Append(
";" & vbLf)
        
End If
        
If _property.CanWrite Then
            sb.Append(
"" & vbLf)
            sb.Append(
"" & vbTab & vbTab & vbTab & "// Declare variable to hold _property set method" & vbLf)
            sb.Append(
"" & vbTab & vbTab & vbTab)
            sb.Append(_property.PropertyType.ToString)
            sb.Append(
" _setValue = ")
            sb.Append(GetTypeDefaultValue(_property.PropertyType.ToString))
            sb.Append(
";" & vbLf)
            sb.Append(
"" & vbLf & vbTab & vbTab & vbTab & "// Test set method" & vbLf)
            
If _property.GetAccessors()(0).IsStatic Then
                sb.Append(
"" & vbTab & vbTab & vbTab)
                sb.Append(FullClassName)
            
Else
                sb.Append(
"" & vbTab & vbTab & vbTab & "m_")
                sb.Append(GetCamelCaseName(GetClassName(FullClassName)))
            
End If
            sb.Append(
".")
            sb.Append(_property.Name)
            sb.Append(
" = _setValue")
            sb.Append(
";" & vbLf)
        
End If
        sb.Append(
"" & vbTab & vbTab & vbTab & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "// Perform Assert Tests" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "//TODO: Write Assert Tests for ")
        sb.Append(_property.Name)
        sb.Append(
"()" & vbLf)
        
Return sb.ToString
    
End Function
    
    
' Creates the property test method
    Public Function CreatePropertyTest(ByVal _property As PropertyInfo) As String
        
Dim sb As StringBuilder = New StringBuilder
        sb.Append(
"<Test, Ignore(\""Setup ")
        sb.Append(
"Assert tests for the property ")
        sb.Append(GetCaseName(_property.Name))
        sb.Append(
"\"")> _" & vbLf & vbTab & vbTab & "public Sub ")
        sb.Append(GetCaseName(_property.Name))
        sb.Append(
"()" & vbLf)
        sb.Append(
"" & vbTab & vbTab & "" & vbLf)
        sb.Append(CreatePropertyTestBody(_property))
        sb.Append(
"" & vbTab & vbTab & "End Sub")
        
Return sb.ToString
    
End Function
    
    
Public Function ReflectClassProperties(ByVal assemblyPath As StringByVal fullyQualifiedClassName As StringAs PropertyInfo()
        
' Retrieve the type of the class
        Dim type As System.Type = GetClassType(assemblyPath, fullyQualifiedClassName)
        
' Return the list of properties
        If IncludeInheritedMembers Then
            
Return type.GetProperties((BindingFlags.Public  _
                            
Or (BindingFlags.Static Or BindingFlags.Instance)))
        
Else
            
Return type.GetProperties((BindingFlags.Public  _
                            
Or (BindingFlags.Static  _
                            
Or (BindingFlags.Instance Or BindingFlags.DeclaredOnly))))
        
End If
    
End Function
    
       
Public Function CreateMethodTestInit(ByVal fullClassName As StringAs String
        
Dim sb As StringBuilder = New StringBuilder
        sb.Append(
"<SetUp> _" & vbLf)
        sb.Append(
"" & vbTab & vbTab & "public Sub TestInit()" & vbLf)
        sb.Append(
"" & vbTab & vbTab & "" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "//TODO: Initialize the ")
        sb.Append(fullClassName)
        sb.Append(
" for each test with the desired constructor and variables" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab)
        sb.Append(
"m_")
        sb.Append(GetCamelCaseName(GetClassName(fullClassName)))
        sb.Append(
" = new ")
        sb.Append(fullClassName)
        sb.Append(
"();" & vbLf)
        sb.Append(
"" & vbTab & vbTab & "End Sub")
        
Return sb.ToString
    
End Function

    
Public Function CreateMethodTestDispose(ByVal className As StringAs String
        
Dim sb As StringBuilder = New StringBuilder
        sb.Append(
"<TearDown> _" & vbLf)
        sb.Append(
"" & vbTab & vbTab & "public Sub TestDispose()" & vbLf)
        sb.Append(
"" & vbTab & vbTab & "" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "m_")
        sb.Append(GetCamelCaseName(className))
        sb.Append(
" = null;" & vbLf)
        sb.Append(
"" & vbTab & vbTab & "End Sub")
        
Return sb.ToString
    
End Function

    
Public Function CreateMethodTestBody(ByVal method As MethodInfo) As String
        
Dim sb As StringBuilder = New StringBuilder
        sb.Append(
"" & vbTab & vbTab & vbTab & "// Declare variables to pass to method call" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "//TODO: Set values for variables" & vbLf)
        
Dim parameters() As ParameterInfo = method.GetParameters
        
Dim c As Integer = 0
        
Do While (c < parameters.Length)
            sb.Append(
"" & vbTab & vbTab & vbTab)
            sb.Append(parameters(c).ParameterType.ToString)
            sb.Append(
" _")
            sb.Append(parameters(c).Name)
            sb.Append(
" = ")
            sb.Append(GetTypeDefaultValue(parameters(c).ParameterType.ToString))
            sb.Append(
";" & vbLf)
            c 
= (c + 1)
        
Loop
        sb.Append(
"" & vbTab & vbTab & vbTab & vbLf)
        
If (method.ReturnType.ToString <> "System.Sub"Then
            sb.Append(
"" & vbTab & vbTab & vbTab & "// Declare return type to hold method result" & vbLf)
            sb.Append(
"" & vbTab & vbTab & vbTab)
            sb.Append(method.ReturnType.ToString)
            sb.Append(
" _returnValue;" & vbLf)
            sb.Append(
"" & vbTab & vbTab & vbTab & vbLf)
            sb.Append(
"" & vbTab & vbTab & vbTab & "// Make method call" & vbLf)
            sb.Append(
"" & vbTab & vbTab & vbTab & "_returnValue = ")
        
Else
            sb.Append(
"" & vbTab & vbTab & vbTab & "// Make method call" & vbLf)
            sb.Append(
"" & vbTab & vbTab & vbTab)
        
End If
        
If method.IsStatic Then
            sb.Append(FullClassName)
        
Else
            sb.Append(
"m_")
            sb.Append(GetCamelCaseName(GetClassName(FullClassName)))
        
End If
        sb.Append(
".")
        sb.Append(method.Name)
        sb.Append(
"(")
        
        
Do While (c < parameters.Length)
            sb.Append(
" _")
            sb.Append(parameters(c).Name)
            sb.Append(
"")
            c 
= (c + 1)
        
Loop
        
If (parameters.Length > 0Then
            sb.Remove((sb.Length 
- 2), 2)
        
End If
        sb.Append(
");" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "// Perform Assert Tests" & vbLf)
        sb.Append(
"" & vbTab & vbTab & vbTab & "//TODO: Write Assert Tests for ")
        sb.Append(method.Name)
        sb.Append(
"()" & vbLf)
        
Return sb.ToString
    
End Function

    
' Creates the method test method
    Public Function CreateMethodTest(ByVal method As MethodInfo, ByVal methodCount As Hashtable) As String
        
Dim sb As StringBuilder = New StringBuilder
        
Dim currentOverloadCount As Integer = MethodOverloadCount(method.Name, methodCount)
        sb.Append(
"<Test, Ignore(\""Setup ")
        sb.Append(
" parameter value(s) and Assert tests for the method ")
        sb.Append(GetCaseName(method.Name))
        sb.Append(
"\"")> _" & vbLf & vbTab & vbTab & "public Sub ")
        sb.Append(GetCaseName(method.Name))
        
If (currentOverloadCount > 1Then
            sb.Append(
"_Overload")
            sb.Append(currentOverloadCount.ToString)
        
End If
        sb.Append(
"()" & vbLf)
        sb.Append(
"" & vbTab & vbTab & "" & vbLf)
        sb.Append(CreateMethodTestBody(method))
        sb.Append(
"" & vbTab & vbTab & "End Sub")
        
Return sb.ToString
    
End Function
    
    
' Returns the current number of overloads for a given method name
    Public Function MethodOverloadCount(ByVal methodName As StringByVal methodCount As Hashtable) As Integer
        
Dim currentCount As Integer = 0
        
If methodCount.ContainsKey(methodName) Then
            currentCount 
= CType(methodCount(methodName),Integer)
        
End If
        
Dim i As Integer = 0
        
For i = 0 To methods.Length - 1
            
If (methods(i).Name = methodName) Then
                currentCount 
= (currentCount + 1)
                
If methodCount.ContainsKey(methodName) Then
                    
If (currentCount > CType(methodCount(methodName),Integer)) Then
                        methodCount(methodName) 
= (CType(methodCount(methodName),Integer+ 1)
                    
End If
                
Else
                    methodCount.Add(methodName, 
1)
                
End If
                
If (currentCount = CType(methodCount(methodName),Integer)) Then
                    
Exit For
                
End If
            
End If
        
Next
        
Return CType(methodCount(methodName),Integer)
    
End Function
    
    
Public Function ReflectClassMethods(ByVal assemblyPath As StringByVal fullyQualifiedClassName As StringAs MethodInfo()
        
' Retrieve the type of the class
        Dim type As System.Type = GetClassType(assemblyPath, fullyQualifiedClassName)
        
' Return the list of properties
        If IncludeInheritedMembers Then
            
Return type.GetMethods((BindingFlags.Public  _
                            
Or (BindingFlags.Static Or BindingFlags.Instance)))
        
Else
            
Return type.GetMethods((BindingFlags.Public  _
                            
Or (BindingFlags.Static  _
                            
Or (BindingFlags.Instance Or BindingFlags.DeclaredOnly))))
        
End If
    
End Function
    
    
Public Function GetClassType(ByVal assemblyPath As StringByVal fullyQualifiedClassName As StringAs System.Type
        
' Load the assembly which contains the class to reflect
        Dim assembly As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile(assemblyPath)
        
' Retrieve the type of the class
        Dim type As System.Type = assembly.GetType(fullyQualifiedClassName)
        
' Release the assembly
        assembly = Nothing
        
Return type
    
End Function

    
Public Function GetTypeDefaultValue(ByVal typeName As StringAs String
        
' init the variable value
        Dim variableValue As String = string.Empty
        
' determine the default variable value from the variable type
        Select Case (typeName)
            
Case "System.Binary""System.Byte""System.Int16""System.Int32""System.Int64"
                variableValue 
= "0"
                
Exit Select
            
Case "System.String"
                variableValue 
= "String.Empty"
                
Exit Select
            
Case "System.Boolean"
                variableValue 
= "false"
                
Exit Select
            
Case "System.Guid"
                variableValue 
= "Guid.NewGuid()"
                
Exit Select
            
Case "System.DateTime"
                variableValue 
= "DateTime.MinValue"
                
Exit Select
            
Case Else
                variableValue 
= "null"
                
Exit Select
        
End Select
        
Return variableValue
    
End Function
</script>

C#版
<%@ CodeTemplate Language="C#" TargetLanguage="Text" Description="Template description here." Debug="False" %>
<%@ Assembly Name="System.Design" %>
<%@ Import Namespace="System.Reflection" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.Text" %>

<%@ Property Name="FullClassName" Type="System.String" Category="Template Options" Description="This is the fully qualified name of the class to test." %>
<%@ Property Name="IncludeInheritedMembers" Type="System.Boolean" Category="Template Options" Required="true" default="false" %>
<%@ Property Name="DeclaringTypeToExclude" Type="System.String" Category="Template Options" Required="false" %>
<%@ Property Name="GenerateConstructorClasses" Type="System.Boolean" Category="Constructor Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>
<%@ Property Name="GeneratePropertyClasses" Type="System.Boolean" Category="Property Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>
<%@ Property Name="GenerateMethodClasses" Type="System.Boolean" Category="Method Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>

<% InitTemplate(); %>
using System;
using NUnit.Framework;
using <%= GetNamespaceOnly(FullClassName)%>;

namespace <%= GetTestNamespace(FullClassName) %>
{
    
<%/*
    ----------------------------------------------
    --------------- Constructors -----------------
    ----------------------------------------------
    
*/
    
if(GenerateConstructorClasses){
    
%>
    
    
#region Constructor Tests
    
    [TestFixture]
    
public class ConstructorTesting
    {
        
#region Test Preparation Methods
        
        
#region TestFixture SetUp and TearDown
        
        [TestFixtureSetUp]
        
public void FixtureInit()
        {
        
        }
        
        [TestFixtureTearDown] 
        
public void FixtureDispose()
        {
        
        }
        
        
#endregion
        
        
#region Test SetUp and TearDown
        
        [SetUp]
        
public void TestInit()
        {
        
        }
        
        [TearDown] 
        
public void TestDispose()
        {
        
        }
        
        
#endregion
        
        
#endregion
        
        
#region Test Methods
        
        
<% for(int i = 0; i < constructors.Length; i++){ %>
        
<% if( i == 0) {%>
        
<%= CreateConstructorTest(GetClassName(FullClassName),constructors[i])%>
        
<%}else{%>
        
<%= CreateConstructorTest(GetClassName(FullClassName) + "_Overload" + i.ToString(),constructors[i])%>
        
<%}}%>
                
        
#endregion
        
    }

    
#endregion
    
<%}%>
    
<% if(GenerateMethodClasses) {%>
    
<%/*
    ----------------------------------------------
    -------------- Static Methods ----------------
    ----------------------------------------------
    
*/%>
    
    
#region Static Method Tests
    
    [TestFixture]
    
public class StaticMethodTesting
    {
        
#region Test Preparation Methods
        
        
#region TestFixture Setup and TearDown
        
        [TestFixtureSetUp]
        
public void FixtureInit()
        {
        
        }
        
        [TestFixtureTearDown] 
        
public void FixtureDispose()
        {
        
        }
        
        
#endregion
        
        
#region Test SetUp and TearDown
        
        [SetUp]
        
public void TestInit()
        {
        
        }
        
        [TearDown] 
        
public void TestDispose()
        {
        
        }
        
        
#endregion
        
        
#endregion
        
        
#region Test Methods
        
        
<% for(int i = 0; i < methods.Length; i++){ 
            
if(methods[i].IsStatic && !methods[i].Name.StartsWith("get_"&& !methods[i].Name.StartsWith("set_"&& methods[i].DeclaringType.ToString() != DeclaringTypeToExclude && methods[i].DeclaringType.ToString() != "System.Object"){%>
        
<%= CreateMethodTest(methods[i], staticMethodCount) %>
        
<%}}%>
                        
        
#endregion
    }

    
#endregion
    
    
<%/*
    ----------------------------------------------
    ------------------ Methods -------------------
    ----------------------------------------------
    
*/%>
    
    
#region Method Tests
    
    [TestFixture]
    
public class MethodTesting
    {
        
// Variable to hold object to be tested for reuse by init functions
        <%= FullClassName  %> m_<%= GetCamelCaseName(GetClassName(FullClassName)) %>;
        
        
#region Test Preparation Methods
        
        
#region TestFixture SetUp and TearDown
        
        [TestFixtureSetUp]
        
public void FixtureInit()
        {
        
        }
        
        [TestFixtureTearDown] 
        
public void FixtureDispose()
        {
        
        }
        
        
#endregion
        
        
#region Test SetUp and TearDown
        
        
<%= CreateMethodTestInit(FullClassName) %>
        
        
<%= CreateMethodTestDispose(GetClassName(FullClassName)) %>
        
        
#endregion
        
        
#endregion
        
        
#region Test Methods
        
        
<% for(int i = 0; i < methods.Length; i++){ 
            
if(!methods[i].IsStatic && !methods[i].Name.StartsWith("get_"&& !methods[i].Name.StartsWith("set_"&& methods[i].DeclaringType.ToString() != DeclaringTypeToExclude && methods[i].DeclaringType.ToString() != "System.Object"){%>
        
<%= CreateMethodTest(methods[i], instanceMethodCount) %>
        
<%}}%>
                        
        
#endregion
    }

    
#endregion
    
<%}%>
    
<% if(GeneratePropertyClasses) {%>
    
<%/*
    ----------------------------------------------
    ----------------- Properties -----------------
    ----------------------------------------------
    
*/%>
    
    
#region Property Tests
    
    [TestFixture]
    
public class PropertyTesting
    {
        
// Variable to hold object to be tested for reuse by init functions
        <%= FullClassName  %> m_<%= GetCamelCaseName(GetClassName(FullClassName)) %>;
        
        
#region Test Preparation Methods
        
        
#region TestFixture SetUp and TearDown
        
        
<%= CreatePropertyTestFixtureInit(FullClassName) %>
        
        
<%= CreatePropertyTestFixtureDispose(GetClassName(FullClassName)) %>
        
        
#endregion
        
        
#region Test SetUp and TearDown
        
        [SetUp]
        
public void TestInit()
        {
        
        }
        
        [TearDown] 
        
public void TestDispose()
        {
        
        }
        
        
#endregion
        
        
#endregion
        
        
#region Test Methods
        
        
<% for(int i = 0; i < properties.Length; i++){ 
            
if(properties[i].DeclaringType.ToString() != DeclaringTypeToExclude){%>
        
<%= CreatePropertyTest(properties[i])%>
        
<%}}%>
        
        
#endregion
    }

    
#endregion
    
<%}%>

}

<script runat="template">
    ConstructorInfo[] constructors 
= null;
    MethodInfo[] methods 
= null;
    PropertyInfo[] properties 
= null;
    
// Hashtables used to identify overloads for methods and constructors
    Hashtable staticMethodCount = new Hashtable();
    Hashtable instanceMethodCount 
= new Hashtable();
    Hashtable instanceConstructorCount 
= new Hashtable();
    
    [Editor(
typeof(System.Windows.Forms.Design.FileNameEditor), typeof(System.Drawing.Design.UITypeEditor))] 
    [CodeTemplateProperty(CodeTemplatePropertyOption.Required)]
    [Category(
"Template Options")]
    [Description(
"This is the full path, including the assembly name, of the assembly which contains the class to test.")]
    
public string AssemblyPath
    {
        
get    { return assemblyPath; }
        
set { assemblyPath = value; }
    }
    
private string assemblyPath;


    
public void InitTemplate()
    {
        
//Debugger.Break();
        
// Reflect object properties
        constructors = ReflectClassConstructors(AssemblyPath, FullClassName);
        methods 
= ReflectClassMethods(AssemblyPath, FullClassName);
        properties 
= ReflectClassProperties(AssemblyPath, FullClassName);
    }
    
    
public string GetCamelCaseName(string value)
    {
        
return value.Substring(01).ToLower() + value.Substring(1);
    }
    
    
public string GetCaseName(string value)
    {
        
return value.Substring(01).ToUpper() + value.Substring(1);
    }
    
    
// Returns just the class name given a fully qualified class name; i.e. BHCS.Portal.McCoy.Engine.Entities.Module
    public string GetClassName(string fullClassName)
    {
        
return fullClassName.Substring(fullClassName.LastIndexOf("."+ 1);
    }
    
    
public string GetNamespaceOnly(string fullClassName)
    {
        
return fullClassName.Substring(0,fullClassName.LastIndexOf("."));
    }
    
    
public string GetTestNamespace(string fullClassName)
    {
        
return GetNamespaceOnly(fullClassName) + ".Test." + GetClassName(fullClassName);
    }
    
    
public string CreateConstructorTestBody(ConstructorInfo constructor)
    {
        StringBuilder sb 
= new StringBuilder();
        
        sb.Append(
"// Declare variables to pass to constructor call\n");
        sb.Append(
"\t\t\t//TODO: Set values for variables\n");
        
        ParameterInfo[] parameters 
= constructor.GetParameters();
        
for(int c = 0; c < parameters.Length; c++)
        {
            sb.Append(
"\t\t\t");
            sb.Append(parameters[c].ParameterType.ToString());
            sb.Append(
" _");
            sb.Append(parameters[c].Name);
            sb.Append(
" = ");
            sb.Append(GetTypeDefaultValue(parameters[c].ParameterType.ToString()));
            sb.Append(
";\n");    
        }
                
        sb.Append(
"\t\t\t\n");
        sb.Append(
"\t\t\t// Declare return type to hold constructor result\n");
        
        sb.Append(
"\t\t\t");
        sb.Append(FullClassName);
        sb.Append(
" _returnValue;\n");
                
        sb.Append(
"\t\t\t\n");
        sb.Append(
"\t\t\t// Instantiate object\n");
        sb.Append(
"\t\t\t_returnValue = new ");
        
        sb.Append(FullClassName);
        sb.Append(
"(");
        
for(int c = 0; c < parameters.Length; c++)
        {
            sb.Append(
" _");
            sb.Append(parameters[c].Name);
            sb.Append(
"");
        }
        
if(parameters.Length > 0)
            sb.Remove(sb.Length 
-2 ,2);
        sb.Append(
");\n");
        
        sb.Append(
"\t\t\t\n");
        sb.Append(
"\t\t\t// Perform Assert Tests\n");
        sb.Append(
"\t\t\t//TODO: Write Assert Tests for object instance\n");
        
        
return sb.ToString();
    }
    
    
// Creates the constructor test method
    public string CreateConstructorTest(string constructorName, ConstructorInfo constructor)
    {
        StringBuilder sb 
= new StringBuilder();
        
        sb.Append(
"[Test, Ignore(\"Setup ");
        sb.Append(FullClassName);
        sb.Append(
" parameter value and Assert tests for the constructor\")]\n");
        sb.Append("\t\tpublic void ");
        sb.Append(constructorName);
        sb.Append(
"()\n");
        sb.Append(
"\t\t{\n\t\t\t");
        sb.Append(CreateConstructorTestBody(constructor));
        sb.Append(
"\n\t\t}");
        
        
return sb.ToString();
    }
    
public ConstructorInfo[] ReflectClassConstructors(string assemblyPath, string fullyQualifiedClassName)
    {
        
// Retrieve the type of the class
        System.Type type = GetClassType(assemblyPath, fullyQualifiedClassName);
        
// Return the list of properties
        if(IncludeInheritedMembers)
            
return type.GetConstructors(BindingFlags.Public|BindingFlags.Instance);
        
else
            
return type.GetConstructors(BindingFlags.Public|BindingFlags.Instance|BindingFlags.DeclaredOnly);
    }
    
    
public string CreatePropertyTestFixtureInit(string fullClassName)
    {
        StringBuilder sb 
= new StringBuilder();
        
        sb.Append(
"[TestFixtureSetUp]\n");
        sb.Append(
"\t\tpublic void FixtureInit()\n");
        sb.Append(
"\t\t{\n");
        sb.Append(
"\t\t\t//TODO: Initialize the ");
        sb.Append(fullClassName);
        sb.Append(
" for the test suite with the desired constructor and variables\n");
        sb.Append(
"\t\t\t");
        sb.Append(
"m_");
        sb.Append(GetCamelCaseName(GetClassName(fullClassName)));
        sb.Append(
" = new ");
        sb.Append(fullClassName);
        sb.Append(
"();\n");
        sb.Append(
"\t\t}");
        
        
return sb.ToString();
    }
    
    
public string CreatePropertyTestFixtureDispose(string className)
    {
        StringBuilder sb 
= new StringBuilder();
        
        sb.Append(
"[TestFixtureTearDown]\n");
        sb.Append(
"\t\tpublic void FixtureDispose()\n");
        sb.Append(
"\t\t{\n");
        sb.Append(
"\t\t\tm_");
        sb.Append(GetCamelCaseName(className));
        sb.Append(
" = null;\n");
        sb.Append(
"\t\t}");
        
        
return sb.ToString();
    }
    
    
// Create the body of the property test
    public string CreatePropertyTestBody(PropertyInfo property)
    {
        StringBuilder sb 
= new StringBuilder();            

        
if(property.CanRead)
        {
            sb.Append(
"\t\t\t// Declare return variable to hold property get method\n");
            sb.Append(
"\t\t\t");
            sb.Append(property.PropertyType.ToString());
            sb.Append(
" _getValue = ");
            sb.Append(GetTypeDefaultValue(property.PropertyType.ToString()));
            sb.Append(
";\n");
            sb.Append(
"\n\t\t\t// Test get method\n");
            sb.Append(
"\t\t\t_getValue = ");
            
if(property.GetAccessors()[0].IsStatic)
            {
                sb.Append(FullClassName);
            }
            
else
            {
                sb.Append(
"m_");
                sb.Append(GetCamelCaseName(GetClassName(FullClassName)));
            }
            sb.Append(
".");
            sb.Append(property.Name);
            sb.Append(
";\n");
        }
        
        
if(property.CanWrite)
        {
            sb.Append(
"\n");
            sb.Append(
"\t\t\t// Declare variable to hold property set method\n");
            sb.Append(
"\t\t\t");
            sb.Append(property.PropertyType.ToString());
            sb.Append(
" _setValue = ");
            sb.Append(GetTypeDefaultValue(property.PropertyType.ToString()));
            sb.Append(
";\n");
            sb.Append(
"\n\t\t\t// Test set method\n");
            
if(property.GetAccessors()[0].IsStatic)
            {
                sb.Append(
"\t\t\t");
                sb.Append(FullClassName);
            }
            
else
            {
                sb.Append(
"\t\t\tm_");
                sb.Append(GetCamelCaseName(GetClassName(FullClassName)));
            }
            sb.Append(
".");
            sb.Append(property.Name);
            sb.Append(
" = _setValue");
            sb.Append(
";\n");
        }
        sb.Append(
"\t\t\t\n");
        sb.Append(
"\t\t\t// Perform Assert Tests\n");
        sb.Append(
"\t\t\t//TODO: Write Assert Tests for ");
        sb.Append(property.Name);
        sb.Append(
"()\n");
        
        
return sb.ToString();
        
    }
    
    
// Creates the property test method
    public string CreatePropertyTest(PropertyInfo property)
    {
        StringBuilder sb 
= new StringBuilder();
        
        sb.Append(
"[Test, Ignore(\"Setup ");
        sb.Append("Assert tests for the property ");
        sb.Append(GetCaseName(property.Name));
        sb.Append(
"\")]\n\t\tpublic void ");
        sb.Append(GetCaseName(property.Name));
        sb.Append(
"()\n");
        sb.Append(
"\t\t{\n");
        sb.Append(CreatePropertyTestBody(property));
        sb.Append(
"\t\t}");
        
        
return sb.ToString();
    }
    
public PropertyInfo[] ReflectClassProperties(string assemblyPath, string fullyQualifiedClassName)
    {
        
// Retrieve the type of the class
        System.Type type = GetClassType(assemblyPath, fullyQualifiedClassName);
        
// Return the list of properties
        if(IncludeInheritedMembers)
            
return type.GetProperties(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance);
        
else
            
return type.GetProperties(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance|BindingFlags.DeclaredOnly);
    }
    
    
public string CreateMethodTestInit(string fullClassName)
    {
        StringBuilder sb 
= new StringBuilder();
        
        sb.Append(
"[SetUp]\n");
        sb.Append(
"\t\tpublic void TestInit()\n");
        sb.Append(
"\t\t{\n");
        sb.Append(
"\t\t\t//TODO: Initialize the ");
        sb.Append(fullClassName);
        sb.Append(
" for each test with the desired constructor and variables\n");
        sb.Append(
"\t\t\t");
        sb.Append(
"m_");
        sb.Append(GetCamelCaseName(GetClassName(fullClassName)));
        sb.Append(
" = new ");
        sb.Append(fullClassName);
        sb.Append(
"();\n");
        sb.Append(
"\t\t}");
        
        
return sb.ToString();
    }
    
    
public string CreateMethodTestDispose(string className)
    {
        StringBuilder sb 
= new StringBuilder();
        
        sb.Append(
"[TearDown]\n");
        sb.Append(
"\t\tpublic void TestDispose()\n");
        sb.Append(
"\t\t{\n");
        sb.Append(
"\t\t\tm_");
        sb.Append(GetCamelCaseName(className));
        sb.Append(
" = null;\n");
        sb.Append(
"\t\t}");
        
        
return sb.ToString();
    }
    
    
public string CreateMethodTestBody(MethodInfo method)
    {
        StringBuilder sb 
= new StringBuilder();
        
        sb.Append(
"\t\t\t// Declare variables to pass to method call\n");
        sb.Append(
"\t\t\t//TODO: Set values for variables\n");
        
        ParameterInfo[] parameters 
= method.GetParameters();
        
for(int c = 0; c < parameters.Length; c++)
        {
            sb.Append(
"\t\t\t");
            sb.Append(parameters[c].ParameterType.ToString());
            sb.Append(
" _");
            sb.Append(parameters[c].Name);
            sb.Append(
" = ");
            sb.Append(GetTypeDefaultValue(parameters[c].ParameterType.ToString()));
            sb.Append(
";\n");    
        }
                
        sb.Append(
"\t\t\t\n");
        
        
if(method.ReturnType.ToString() != "System.Void")
        {
            sb.Append(
"\t\t\t// Declare return type to hold method result\n");
            
            sb.Append(
"\t\t\t");
            sb.Append(method.ReturnType.ToString());
            sb.Append(
" _returnValue;\n");
                    
            sb.Append(
"\t\t\t\n");
            sb.Append(
"\t\t\t// Make method call\n");
            sb.Append(
"\t\t\t_returnValue = ");
        }
        
else
        {
            sb.Append(
"\t\t\t// Make method call\n");
            sb.Append(
"\t\t\t");
        }
        
        
if(method.IsStatic)
        {
            sb.Append(FullClassName);
        }
        
else
        {
            sb.Append(
"m_");
            sb.Append(GetCamelCaseName(GetClassName(FullClassName)));
        }
        sb.Append(
".");
        sb.Append(method.Name);
        sb.Append(
"(");
        
for(int c = 0; c < parameters.Length; c++)
        {
            sb.Append(
" _");
            sb.Append(parameters[c].Name);
            sb.Append(
"");
        }
        
if(parameters.Length > 0)
            sb.Remove(sb.Length 
-2 ,2);
        sb.Append(
");\n");
        
        sb.Append(
"\t\t\t\n");
        sb.Append(
"\t\t\t// Perform Assert Tests\n");
        sb.Append(
"\t\t\t//TODO: Write Assert Tests for ");
        sb.Append(method.Name);
        sb.Append(
"()\n");
        
        
return sb.ToString();
    }
    
    
// Creates the method test method
    public string CreateMethodTest(MethodInfo method, Hashtable methodCount)
    {
        StringBuilder sb 
= new StringBuilder();
        
int currentOverloadCount = MethodOverloadCount(method.Name, methodCount);
        
        sb.Append(
"[Test, Ignore(\"Setup ");
        sb.Append(" parameter value(s) and Assert tests for the method ");
        sb.Append(GetCaseName(method.Name));
        sb.Append(
"\")]\n\t\tpublic void ");
        sb.Append(GetCaseName(method.Name));
        
if(currentOverloadCount > 1)
        {
            sb.Append(
"_Overload");
            sb.Append(currentOverloadCount.ToString());
        }        
        sb.Append(
"()\n");
        sb.Append(
"\t\t{\n");
        sb.Append(CreateMethodTestBody(method));
        sb.Append(
"\t\t}");
        
        
return sb.ToString();
    }
    
    
// Returns the current number of overloads for a given method name
    public int MethodOverloadCount(string methodName, Hashtable methodCount)
    {
        
int currentCount = 0;
        
if(methodCount.ContainsKey(methodName))
        {
            currentCount 
= (int)methodCount[methodName];
        }
        
for(int i = 0; i < methods.Length; i++)
        {
            
if(methods[i].Name == methodName)
            {
                currentCount
++;
                
if(methodCount.ContainsKey(methodName))
                {
                    
if(currentCount > (int)methodCount[methodName])
                        methodCount[methodName] 
= (int)methodCount[methodName] + 1;
                }
                
else
                    methodCount.Add(methodName,
1);
            
                
if(currentCount == (int)methodCount[methodName])
                    
break;
            }
        }
        
        
return ((int)methodCount[methodName]);
                
    }
    
    
public MethodInfo[] ReflectClassMethods(string assemblyPath, string fullyQualifiedClassName)
    {
        
// Retrieve the type of the class
        System.Type type = GetClassType(assemblyPath, fullyQualifiedClassName);
        
// Return the list of properties
        if(IncludeInheritedMembers)
            
return type.GetMethods(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance);
        
else
            
return type.GetMethods(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance|BindingFlags.DeclaredOnly);
    }
    
    
public System.Type GetClassType(string assemblyPath, string fullyQualifiedClassName)
    {
        
// Load the assembly which contains the class to reflect
        System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFile(assemblyPath);
        
// Retrieve the type of the class
        System.Type type = assembly.GetType(fullyQualifiedClassName);
        
// Release the assembly
        assembly = null;
        
return type;
    }

    
public string GetTypeDefaultValue(string typeName)
    {
        
// init the variable value
        string variableValue = string.Empty;
        
// determine the default variable value from the variable type
        switch(typeName)
        {
            
case "System.Binary":
            
case "System.Byte":
            
case "System.Int16":
            
case "System.Int32":
            
case "System.Int64":
            {
                variableValue 
= "0";
                
break;
            }
            
case "System.String":
            {
                variableValue 
= "String.Empty";
                
break;
            }
            
case "System.Boolean":
            {
                variableValue 
= "false";
                
break;
            }
            
case "System.Guid":
            {
                variableValue 
= "Guid.NewGuid()";
                
break;
            }
            
case "System.DateTime":
            {
                variableValue 
= "DateTime.MinValue";
                
break;
            }
            
default:
            {
                variableValue 
= "null";
                
break;
            }
        }
        
return variableValue;
    }

</script>