zoukankan      html  css  js  c++  java
  • 测试后行之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>

  • 相关阅读:
    正当防卫与互殴的界限在哪里
    [php入门] 5、初学CSS从中记下的一些基础点(For小白)
    [ZigBee] 13、ZigBee基础阶段性回顾与加深理解——用定时器1产生PWM来控制LED亮度(七色灯)
    [ZigBee] 12、ZigBee之看门狗定时器——饿了就咬人的GOOD DOG
    [ZigBee] 11、ZigBee之睡眠定时器二
    [ZigBee] 10、ZigBee之睡眠定时器
    [ZigBee] 9、ZigBee之AD剖析——AD采集CC2530温度串口显示
    [ZigBee] 8、ZigBee之UART剖析·二(串口收发)
    [php入门] 4、HTML基础入门一篇概览
    [ZigBee] 2、 ZigBee开发环境搭建
  • 原文地址:https://www.cnblogs.com/sekihin/p/795219.html
  • Copyright © 2011-2022 走看看
    Creative Commons License 本作品采用 知识共享署名-非商业性使用 2.5 中国大陆许可协议进行许可。