Example #1
0
        private CodeTypeDeclaration GetGeneratedClass(MultiDirectionTestClass testClass)
        {
            CodeTypeDeclaration result = new CodeTypeDeclaration(this.GetGeneratedClassName(testClass));

            result.Attributes = MemberAttributes.Public;
            result.BaseTypes.Add(testClass.ClassType);

            CodeAttributeDeclaration testClassAttribute = new CodeAttributeDeclaration(
                new CodeTypeReference(typeof(TestClassAttribute)));

            result.CustomAttributes.Add(testClassAttribute);

            // Add initialize and cleanup method
            result.Members.Add(this.GetInitCleanupMethod(typeof(ClassInitializeAttribute), testClass));
            result.Members.Add(this.GetInitCleanupMethod(typeof(ClassCleanupAttribute), testClass));

            // No need to generate TestInitialize and TestCleanup Method.
            // Generated class can inherit from base class.

            // Expand multiple direction test case
            foreach (MultiDirectionTestMethod testMethod in testClass.MultiDirectionMethods)
            {
                this.AddGeneratedMethod(result, testMethod);
            }

            return(result);
        }
        private CodeTypeDeclaration GetGeneratedClass(MultiDirectionTestClass testClass)
        {
            CodeTypeDeclaration result = new CodeTypeDeclaration(this.GetGeneratedClassName(testClass));

            result.Attributes = MemberAttributes.Public;
            result.BaseTypes.Add(testClass.ClassType);

            if (FrameworkType.DNetCore == Program.FrameWorkType)
            {
                AddXunitLifecycleCode(testClass.ClassType.Name, result);
            }
            else if (FrameworkType.DNet == Program.FrameWorkType) // Add initialize and cleanup method for MSTest
            {
                CodeAttributeDeclaration testClassAttribute = new CodeAttributeDeclaration(
                    new CodeTypeReference(typeof(MSUnittest.TestClassAttribute)));

                result.CustomAttributes.Add(testClassAttribute);
                result.Members.Add(this.GetInitCleanupMethod(typeof(MSUnittest.ClassInitializeAttribute), testClass));
                result.Members.Add(this.GetInitCleanupMethod(typeof(MSUnittest.ClassCleanupAttribute), testClass));
            }

            // No need to generate TestInitialize and TestCleanup Method.
            // Generated class can inherit from base class.

            // Expand multiple direction test case
            foreach (MultiDirectionTestMethod testMethod in testClass.MultiDirectionMethods)
            {
                this.AddGeneratedMethod(result, testMethod);
            }

            return(result);
        }
        private CodeTypeDeclaration GetGeneratedClass(MultiDirectionTestClass testClass)
        {
            CodeTypeDeclaration result = new CodeTypeDeclaration(this.GetGeneratedClassName(testClass));
            result.Attributes = MemberAttributes.Public;
            result.BaseTypes.Add(testClass.ClassType);

            CodeAttributeDeclaration testClassAttribute = new CodeAttributeDeclaration(
                new CodeTypeReference(typeof(TestClassAttribute)));

            result.CustomAttributes.Add(testClassAttribute);

            // Add initialize and cleanup method
            result.Members.Add(this.GetInitCleanupMethod(typeof(ClassInitializeAttribute), testClass));
            result.Members.Add(this.GetInitCleanupMethod(typeof(ClassCleanupAttribute), testClass));

            // No need to generate TestInitialize and TestCleanup Method.
            // Generated class can inherit from base class.

            // Expand multiple direction test case
            foreach (MultiDirectionTestMethod testMethod in testClass.MultiDirectionMethods)
            {
                this.AddGeneratedMethod(result, testMethod);
            }

            return result;
        }
        private static void GenerateCode(string dllName, string outputFolder)
        {
            SourceCodeGenerator codeGen = new SourceCodeGenerator(outputFolder);

            Assembly assembly = Assembly.LoadFrom(dllName);

            foreach (Type type in assembly.GetTypes())
            {
                if (null != type.GetCustomAttribute(typeof(MultiDirectionTestClassAttribute)))
                {
                    MultiDirectionTestClass testClass = new MultiDirectionTestClass(type);
                    codeGen.GenerateSourceCode(testClass);
                }
            }
        }
        private static void GenerateCode(string dllName, string outputFolder)
        {
            SourceCodeGenerator codeGen = new SourceCodeGenerator(outputFolder);

            Assembly assembly = Assembly.LoadFrom(dllName);

            foreach (Type type in assembly.GetTypes())
            {
                if (null != type.GetCustomAttribute(typeof(MultiDirectionTestClassAttribute)))
                {
                    MultiDirectionTestClass testClass = new MultiDirectionTestClass(type);
                    codeGen.GenerateSourceCode(testClass);
                }
            }
        }
        public void GenerateSourceCode(MultiDirectionTestClass testClass)
        {
            string sourceFileName = this.GetSourceFileName(testClass);

            if (testClass.MultiDirectionMethods.Count == 0)
            {
                Console.WriteLine("{0} has no multiple direction test case. Skip code generating...", testClass.ClassType.Name);
                return;
            }

            Console.WriteLine("Generating code for {0}", testClass.ClassType.Name);

            CodeCompileUnit compileUnit   = new CodeCompileUnit();
            CodeNamespace   rootNameSpace = new CodeNamespace(GodeGeneratorConst.RootNameSpace);

            this.AddImport(rootNameSpace);

            rootNameSpace.Types.Add(GetGeneratedClass(testClass));

            compileUnit.Namespaces.Add(rootNameSpace);

            this.WriteCodeToFile(compileUnit, Path.Combine(this.outputPath, sourceFileName));
        }
        public void GenerateSourceCode(MultiDirectionTestClass testClass)
        {
            string sourceFileName = this.GetSourceFileName(testClass);

            if (testClass.MultiDirectionMethods.Count == 0)
            {
                Console.WriteLine("{0} has no multiple direction test case. Skip code generating...", testClass.ClassType.Name);
                return;
            }

            Console.WriteLine("Generating code for {0}", testClass.ClassType.Name);

            CodeCompileUnit compileUnit = new CodeCompileUnit();
            CodeNamespace rootNameSpace = new CodeNamespace(GodeGeneratorConst.RootNameSpace);

            this.AddImport(rootNameSpace);

            rootNameSpace.Types.Add(GetGeneratedClass(testClass));

            compileUnit.Namespaces.Add(rootNameSpace);

            this.WriteCodeToFile(compileUnit, Path.Combine(this.outputPath, sourceFileName));
        }
 private string GetGeneratedClassName(MultiDirectionTestClass testClass)
 {
     return(testClass.ClassType.Name + GeneratedSuffix);
 }
 private string GetSourceFileName(MultiDirectionTestClass testClass)
 {
     return(this.GetGeneratedClassName(testClass) + SourceFileExtention);
 }
        private CodeMemberMethod GetInitCleanupMethod(Type methodAttributeType, MultiDirectionTestClass testClass)
        {
            bool   isStatic             = false;
            string generatedMetholdName = string.Empty;
            string methodToInvokeName   = string.Empty;
            CodeParameterDeclarationExpression parameterDec = null;
            Type acctualAttributeType = methodAttributeType;

            if (methodAttributeType == typeof(MSUnittest.ClassInitializeAttribute))
            {
                isStatic             = true;
                generatedMetholdName = GodeGeneratorConst.ClassInitMethodName;
                methodToInvokeName   = testClass.ClassInit.Name;
                parameterDec         = new CodeParameterDeclarationExpression(typeof(MSUnittest.TestContext), "testContext");
            }
            else if (methodAttributeType == typeof(MSUnittest.ClassCleanupAttribute))
            {
                isStatic             = true;
                generatedMetholdName = GodeGeneratorConst.ClassCleanupMethodName;
                methodToInvokeName   = testClass.ClassCleanup.Name;
            }
            else
            {
                throw new ArgumentException("methodAttributeType");
            }

            CodeMemberMethod result = new CodeMemberMethod();

            result.Name = generatedMetholdName;

            // Add parameter list if needed
            if (parameterDec != null)
            {
                result.Parameters.Add(parameterDec);
            }

            CodeExpression callBase = null;

            if (isStatic)
            {
                result.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                callBase          = new CodeTypeReferenceExpression(testClass.ClassType.FullName);
            }
            else
            {
                result.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                callBase          = new CodeBaseReferenceExpression();
            }

            // Add methold attribute
            CodeAttributeDeclaration methodAttribute = new CodeAttributeDeclaration(
                new CodeTypeReference(acctualAttributeType));

            result.CustomAttributes.Add(methodAttribute);

            // Add invoke statement
            CodeMethodInvokeExpression invokeExp = null;

            if (parameterDec != null)
            {
                CodeVariableReferenceExpression sourceParameter = new CodeVariableReferenceExpression(parameterDec.Name);
                invokeExp = new CodeMethodInvokeExpression(callBase, methodToInvokeName, sourceParameter);
            }
            else
            {
                invokeExp = new CodeMethodInvokeExpression(callBase, methodToInvokeName);
            }

            result.Statements.Add(invokeExp);

            return(result);
        }
        private CodeMemberMethod GetInitCleanupMethod(Type methodAttributeType, MultiDirectionTestClass testClass)
        {
            bool isStatic = false;
            string generatedMetholdName = string.Empty;
            string methodToInvokeName = string.Empty;
            CodeParameterDeclarationExpression parameterDec = null;

            if (methodAttributeType == typeof(ClassInitializeAttribute))
            {
                isStatic = true;
                generatedMetholdName = GodeGeneratorConst.ClassInitMethodName;
                methodToInvokeName = testClass.ClassInit.Name;
                parameterDec = new CodeParameterDeclarationExpression(typeof(TestContext), "testContext");
            }
            else if (methodAttributeType == typeof(ClassCleanupAttribute))
            {
                isStatic = true;
                generatedMetholdName = GodeGeneratorConst.ClassCleanupMethodName;
                methodToInvokeName = testClass.ClassCleanup.Name;
            }
            else
            {
                throw new ArgumentException("methodAttributeType");
            }

            CodeMemberMethod result = new CodeMemberMethod();
            result.Name = generatedMetholdName;

            // Add parameter list if needed
            if (parameterDec != null)
            {
                result.Parameters.Add(parameterDec);
            }

            CodeExpression callBase = null;
            if (isStatic)
            {
                result.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                callBase = new CodeTypeReferenceExpression(testClass.ClassType.FullName);
            }
            else
            {
                result.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                callBase = new CodeBaseReferenceExpression();
            }

            // Add methold attribute
            CodeAttributeDeclaration methodAttribute = new CodeAttributeDeclaration(
                new CodeTypeReference(methodAttributeType));
            result.CustomAttributes.Add(methodAttribute);

            // Add invoke statement
            CodeMethodInvokeExpression invokeExp = null;
            if (parameterDec != null)
            {
                CodeVariableReferenceExpression sourceParameter = new CodeVariableReferenceExpression(parameterDec.Name);
                invokeExp = new CodeMethodInvokeExpression(callBase, methodToInvokeName, sourceParameter);
            }
            else
            {
                invokeExp = new CodeMethodInvokeExpression(callBase, methodToInvokeName);
            }

            result.Statements.Add(invokeExp);

            return result;
        }
 private string GetGeneratedClassName(MultiDirectionTestClass testClass)
 {
     return testClass.ClassType.Name + GeneratedSuffix;
 }
 private string GetSourceFileName(MultiDirectionTestClass testClass)
 {
     return this.GetGeneratedClassName(testClass) + SourceFileExtention;
 }