示例#1
0
        /*/// <summary>
         * /// Handle event related stuff before type generation.
         * /// </summary>
         * /// <param name="typeMember">The type member.</param>
         * /// <param name="eventName">Name of the event.</param>
         * protected override void ComputeCodeMemberEvent(CodeMemberMethod typeMember, string eventName)
         * {
         *  if (typeMember.Name.Contains("add_"))
         *  {
         *      typeMember.Name = typeMember.Name.Replace("add_", "Event");
         *  }
         *  else if (typeMember.Name.Contains("remove_"))
         *  {
         *      typeMember.Name = typeMember.Name.Replace("remove_", "Event");
         *  }
         *
         *  ReplaceTestInTestName(typeMember, "AddAndRemove");
         * }*/

        /// <summary>
        /// Generates additional members of the test class.
        /// </summary>
        /// <param name="context">Contains data specific to SetUp and TearDown test-method generation.</param>
        /// <param name="testObjectName">The name of the object under test.</param>
        /// <param name="testObjectMemberField">The member field of the object under test.</param>
        protected override void GenerateAdditional(
            ISetupAndTearDownCreationContext context,
            string testObjectName,
            CodeMemberField testObjectMemberField)
        {
            this.GenerateSetupAndTearDownAdditional(context, testObjectName, testObjectMemberField);
        }
示例#2
0
        /// <summary>
        /// Generates the setup and tear down additional members and fields.
        /// </summary>
        /// <param name="context">Contains data specific to SetUp and TearDown test-method generation.</param>
        /// <param name="testObjectName">Name of the test object.</param>
        /// <param name="testObjectMemberField">The test object member field.</param>
        protected override void GenerateSetupAndTearDownAdditional(
            ISetupAndTearDownCreationContext context, string testObjectName, CodeMemberField testObjectMemberField)
        {
            var assignedMockObjects = this.ComposeTestSetupMockery(
                context, testObjectMemberField, testObjectName);

            if (assignedMockObjects.Count() <= 0)
            {
                return;
            }

            foreach (var mockObject in assignedMockObjects)
            {
                // Todo: maybe use the creator here to add all the stuff
                var creatorParameters = context.TestObjectCreator.TestObjectMemberFieldCreateExpression.Parameters;

                // has the base generator already added a OuT ctor parameter?
                bool alreadyInParameterlist = false;
                var  mockObjectFieldRef     = mockObject.Left as CodeFieldReferenceExpression;
                if (mockObjectFieldRef != null)
                {
                    foreach (CodeFieldReferenceExpression item in creatorParameters)
                    {
                        if (item.FieldName == mockObjectFieldRef.FieldName)
                        {
                            alreadyInParameterlist = true;
                        }
                    }
                }

                if (!alreadyInParameterlist)
                {
                    creatorParameters.Add(mockObject.Left);
                }
            }

            string rhinoImport = typeof(MockRepository).Namespace;

            context.CodeNamespace.Imports.Add(new CodeNamespaceImport(rhinoImport));
        }
        /// <summary>
        /// Generates the setup and tear down additional members and fields.
        /// </summary>
        /// <param name="context">Contains data specific to SetUp and TearDown test-method generation.</param>
        /// <param name="testObjectName">Name of the test object.</param>
        /// <param name="testObjectMemberField">The test object member field.</param>
        protected override void GenerateSetupAndTearDownAdditional(
            ISetupAndTearDownCreationContext context, string testObjectName, CodeMemberField testObjectMemberField)
        {
            var assignedMockObjects = this.ComposeTestSetupMockery(
                context, testObjectMemberField, testObjectName);
            if (assignedMockObjects.Count() <= 0)
            {
                return;
            }

            foreach (var mockObject in assignedMockObjects)
            {
                // Todo: maybe use the creator here to add all the stuff
                var creatorParameters = context.TestObjectCreator.TestObjectMemberFieldCreateExpression.Parameters;

                // has the base generator already added a OuT ctor parameter?
                bool alreadyInParameterlist = false;
                var mockObjectFieldRef = mockObject.Left as CodeFieldReferenceExpression;
                if (mockObjectFieldRef != null)
                {
                    foreach (CodeFieldReferenceExpression item in creatorParameters)
                    {
                        if (item.FieldName == mockObjectFieldRef.FieldName)
                        {
                            alreadyInParameterlist = true;
                        }
                    }
                }

                if (!alreadyInParameterlist)
                {
                    creatorParameters.Add(mockObject.Left);
                }
            }

            string rhinoImport = typeof(MockRepository).Namespace;
            context.CodeNamespace.Imports.Add(new CodeNamespaceImport(rhinoImport));
        }
        /*/// <summary>
        /// Compose additional items of the test setup method.
        /// </summary>
        /// <param name="setUpMethod">The test setup method.</param>
        /// <param name="testObjectMemberField">The member field of the object under test.</param>
        /// <param name="testObjectName">The name of the object under test.</param>
        /// <returns>
        /// The initialization expression of the object under test.
        /// Is <c>null</c>, when none is created.
        /// </returns>
        protected override CodeObjectCreateExpression ComposeTestSetupMethod(
            CodeMemberMethod setUpMethod,
            CodeMemberField testObjectMemberField,
            string testObjectName)
        {
            //var invokeExpression = new CodeMethodInvokeExpression(
              //  new CodeTypeReferenceExpression("Assert"),
              //  "AreEqual",
                //new CodePrimitiveExpression("expected")
             //   new CodeFieldReferenceExpression(testObjectMemberField, "bla")
             //   , new CodeVariableReferenceExpression("actual"));
            var fieldRef1 =
                new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), testObjectMemberField.Name);

            var testObjectMemberFieldCreate = new CodeObjectCreateExpression(testObjectName, new CodeExpression[] { });
            var as1 = new CodeAssignStatement(fieldRef1, testObjectMemberFieldCreate);

            // Creates a statement using a code expression.
            // var expressionStatement = new CodeExpressionStatement(fieldRef1);
            setUpMethod.Statements.Add(as1);
            return testObjectMemberFieldCreate;
        }*/
        /// <summary>
        /// Compose additional items of the test setup method.
        /// </summary>
        /// <param name="context">The setup context.</param>
        /// <param name="testObjectMemberField">The member field of the object under test.</param>
        /// <param name="testObjectName">The name of the object under test.</param>
        /// <returns>
        /// The list of assigned mock objects.
        /// </returns>
        protected virtual IEnumerable<CodeAssignStatement> ComposeTestSetupMockery(
            ISetupAndTearDownCreationContext context,
            CodeMemberField testObjectMemberField,
            string testObjectName)
        {
            CodeTypeDeclaration testClassDeclaration = context.TestClassDeclaration;
            CodeMemberMethod setUpMethod = context.SetUpMethod;

            // Todo: only the Type is necs, the CodeTypeDeclaration is too much knowledge.
            var testObjectClassType = (Type)testClassDeclaration.UserData[NStubConstants.UserDataClassTypeKey];

            Type[] parameters = { /*typeof(int)*/ };

            // Get the constructor that takes an integer as a parameter.
            var flags = BindingFlags.Instance;
            var noPrivate = true;
            switch (Configuration.MethodGeneratorLevelOfDetail)
            {
                case MemberVisibility.Public:
                    flags |= BindingFlags.Public;
                    break;
                case MemberVisibility.Internal:
                    flags |= BindingFlags.Public | BindingFlags.NonPublic;
                    break;
                case MemberVisibility.Private:
                    flags |= BindingFlags.Public | BindingFlags.NonPublic;
                    noPrivate = false;
                    break;
                default:
                    break;
            }

            var ctor = testObjectClassType.GetConstructor(flags, Type.DefaultBinder, parameters, null);
            if (ctor == null)
            {
                // outputBlock.Text +=
                // "There is no public constructor of MyClass that takes an integer as a parameter.\n";
            }

            // else
            // {
            // outputBlock.Text +=
            // "The public constructor of MyClass that takes an integer as a parameter is:\n";
            // outputBlock.Text += ctor.ToString() + "\n";
            // }
            var testObjectConstructors = testObjectClassType.GetConstructors(flags);
            bool hasInterfaceInCtorParameters = false;
            var ctorParameterTypes = new List<ParameterInfo>();

            foreach (var constructor in testObjectConstructors)
            {
                if (noPrivate && constructor.IsPrivate)
                {
                    continue;
                }

                var ctorParameters = constructor.GetParameters();
                foreach (var para in ctorParameters)
                {
                    if (para.ParameterType.IsInterface /*&& !para.ParameterType.IsGenericType*/)
                    {
                        hasInterfaceInCtorParameters = true;
                        ctorParameterTypes.Add(para);
                    }
                }
            }

            if (!hasInterfaceInCtorParameters)
            {
                return new CodeAssignStatement[0];
            }

            var testObjectInitializerPosition = setUpMethod.Statements.Count - 1;

            var mockRepositoryMemberField = this.AddMockRepository(
                testClassDeclaration, setUpMethod, "mocks");

            var mockAssignments = new List<CodeAssignStatement>();
            foreach (var paraInfo in ctorParameterTypes)
            {
                IBuilderData data;
                ConstructorAssignment ctorassignment = null;

                if (paraInfo.ParameterType.IsGenericType)
                {
                    var genericTypeDefinition = paraInfo.ParameterType.GetGenericTypeDefinition();
                    if (typeof(IEnumerable<>).IsAssignableFrom(genericTypeDefinition))
                    {
                        // try to find the testobjcomposer assigned sub items for IEnumerable<T>'s.
                        BuildProperties.TryGetValue(
                            "CreateAssignments." + testObjectClassType.FullName + "." + paraInfo.Name,
                            paraInfo.Name + "Item",
                            out data);
                        if (data != null)
                        {
                            ctorassignment = data.GetData() as ConstructorAssignment;
                        }

                        if (testObjectClassType.Name == "DefaultMemberBuilderFactory")
                        {
                        }

                        if (ctorassignment != null)
                        {
                            this.CreateMocker(
                                testClassDeclaration,
                                setUpMethod,
                                mockRepositoryMemberField,
                                mockAssignments,
                                ctorassignment.MemberType,
                                paraInfo.Name,
                                ctorassignment);
                        }

                        continue;
                    }
                }

                BuildProperties.TryGetValue(
                    "Assignments." + testObjectClassType.FullName,
                    paraInfo.Name,
                    out data);
                if (data != null)
                {
                    ctorassignment = data.GetData() as ConstructorAssignment;
                }

                this.CreateMocker(
                    testClassDeclaration,
                    setUpMethod,
                    mockRepositoryMemberField,
                    mockAssignments,
                    paraInfo.ParameterType,
                    paraInfo.Name,
                    ctorassignment);
            }

            // reorder the testObject initializer to the bottom of the SetUp method.
            // var removedTypedec = setUpMethod.Statements[testObjectInitializerPosition];
            // setUpMethod.Statements.RemoveAt(testObjectInitializerPosition);
            // setUpMethod.Statements.Add(removedTypedec);
            return mockAssignments;
        }
示例#5
0
 /// <summary>
 /// Generates the setup and tear down additional members and fields.
 /// </summary>
 /// <param name="context">Contains data specific to SetUp and TearDown test-method generation.</param>
 /// <param name="testObjectName">Name of the test object.</param>
 /// <param name="testObjectMemberField">The test object member field.</param>
 /// <remarks>Override this to customize the behavior of the generator.</remarks>
 protected virtual void GenerateSetupAndTearDownAdditional(ISetupAndTearDownCreationContext context, string testObjectName, CodeMemberField testObjectMemberField)
 {
 }
示例#6
0
        /*/// <summary>
         * /// Compose additional items of the test setup method.
         * /// </summary>
         * /// <param name="setUpMethod">The test setup method.</param>
         * /// <param name="testObjectMemberField">The member field of the object under test.</param>
         * /// <param name="testObjectName">The name of the object under test.</param>
         * /// <returns>
         * /// The initialization expression of the object under test.
         * /// Is <c>null</c>, when none is created.
         * /// </returns>
         * protected override CodeObjectCreateExpression ComposeTestSetupMethod(
         *  CodeMemberMethod setUpMethod,
         *  CodeMemberField testObjectMemberField,
         *  string testObjectName)
         * {
         *  //var invokeExpression = new CodeMethodInvokeExpression(
         *    //  new CodeTypeReferenceExpression("Assert"),
         *    //  "AreEqual",
         *      //new CodePrimitiveExpression("expected")
         *   //   new CodeFieldReferenceExpression(testObjectMemberField, "bla")
         *   //   , new CodeVariableReferenceExpression("actual"));
         *  var fieldRef1 =
         *      new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), testObjectMemberField.Name);
         *
         *  var testObjectMemberFieldCreate = new CodeObjectCreateExpression(testObjectName, new CodeExpression[] { });
         *  var as1 = new CodeAssignStatement(fieldRef1, testObjectMemberFieldCreate);
         *
         *  // Creates a statement using a code expression.
         *  // var expressionStatement = new CodeExpressionStatement(fieldRef1);
         *  setUpMethod.Statements.Add(as1);
         *  return testObjectMemberFieldCreate;
         * }*/

        /// <summary>
        /// Compose additional items of the test setup method.
        /// </summary>
        /// <param name="context">The setup context.</param>
        /// <param name="testObjectMemberField">The member field of the object under test.</param>
        /// <param name="testObjectName">The name of the object under test.</param>
        /// <returns>
        /// The list of assigned mock objects.
        /// </returns>
        protected virtual IEnumerable <CodeAssignStatement> ComposeTestSetupMockery(
            ISetupAndTearDownCreationContext context,
            CodeMemberField testObjectMemberField,
            string testObjectName)
        {
            CodeTypeDeclaration testClassDeclaration = context.TestClassDeclaration;
            CodeMemberMethod    setUpMethod          = context.SetUpMethod;

            // Todo: only the Type is necs, the CodeTypeDeclaration is too much knowledge.
            var testObjectClassType = (Type)testClassDeclaration.UserData[NStubConstants.UserDataClassTypeKey];

            Type[] parameters = { /*typeof(int)*/ };

            // Get the constructor that takes an integer as a parameter.
            var flags     = BindingFlags.Instance;
            var noPrivate = true;

            switch (Configuration.MethodGeneratorLevelOfDetail)
            {
            case MemberVisibility.Public:
                flags |= BindingFlags.Public;
                break;

            case MemberVisibility.Internal:
                flags |= BindingFlags.Public | BindingFlags.NonPublic;
                break;

            case MemberVisibility.Private:
                flags    |= BindingFlags.Public | BindingFlags.NonPublic;
                noPrivate = false;
                break;

            default:
                break;
            }

            var ctor = testObjectClassType.GetConstructor(flags, Type.DefaultBinder, parameters, null);

            if (ctor == null)
            {
                // outputBlock.Text +=
                // "There is no public constructor of MyClass that takes an integer as a parameter.\n";
            }

            // else
            // {
            // outputBlock.Text +=
            // "The public constructor of MyClass that takes an integer as a parameter is:\n";
            // outputBlock.Text += ctor.ToString() + "\n";
            // }
            var  testObjectConstructors       = testObjectClassType.GetConstructors(flags);
            bool hasInterfaceInCtorParameters = false;
            var  ctorParameterTypes           = new List <ParameterInfo>();

            foreach (var constructor in testObjectConstructors)
            {
                if (noPrivate && constructor.IsPrivate)
                {
                    continue;
                }

                var ctorParameters = constructor.GetParameters();
                foreach (var para in ctorParameters)
                {
                    if (para.ParameterType.IsInterface /*&& !para.ParameterType.IsGenericType*/)
                    {
                        hasInterfaceInCtorParameters = true;
                        ctorParameterTypes.Add(para);
                    }
                }
            }

            if (!hasInterfaceInCtorParameters)
            {
                return(new CodeAssignStatement[0]);
            }

            var testObjectInitializerPosition = setUpMethod.Statements.Count - 1;

            var mockRepositoryMemberField = this.AddMockRepository(
                testClassDeclaration, setUpMethod, "mocks");

            var mockAssignments = new List <CodeAssignStatement>();

            foreach (var paraInfo in ctorParameterTypes)
            {
                IBuilderData          data;
                ConstructorAssignment ctorassignment = null;

                if (paraInfo.ParameterType.IsGenericType)
                {
                    var genericTypeDefinition = paraInfo.ParameterType.GetGenericTypeDefinition();
                    if (typeof(IEnumerable <>).IsAssignableFrom(genericTypeDefinition))
                    {
                        // try to find the testobjcomposer assigned sub items for IEnumerable<T>'s.
                        BuildProperties.TryGetValue(
                            "CreateAssignments." + testObjectClassType.FullName + "." + paraInfo.Name,
                            paraInfo.Name + "Item",
                            out data);
                        if (data != null)
                        {
                            ctorassignment = data.GetData() as ConstructorAssignment;
                        }

                        if (testObjectClassType.Name == "DefaultMemberBuilderFactory")
                        {
                        }

                        if (ctorassignment != null)
                        {
                            this.CreateMocker(
                                testClassDeclaration,
                                setUpMethod,
                                mockRepositoryMemberField,
                                mockAssignments,
                                ctorassignment.MemberType,
                                paraInfo.Name,
                                ctorassignment);
                        }

                        continue;
                    }
                }

                BuildProperties.TryGetValue(
                    "Assignments." + testObjectClassType.FullName,
                    paraInfo.Name,
                    out data);
                if (data != null)
                {
                    ctorassignment = data.GetData() as ConstructorAssignment;
                }

                this.CreateMocker(
                    testClassDeclaration,
                    setUpMethod,
                    mockRepositoryMemberField,
                    mockAssignments,
                    paraInfo.ParameterType,
                    paraInfo.Name,
                    ctorassignment);
            }

            // reorder the testObject initializer to the bottom of the SetUp method.
            // var removedTypedec = setUpMethod.Statements[testObjectInitializerPosition];
            // setUpMethod.Statements.RemoveAt(testObjectInitializerPosition);
            // setUpMethod.Statements.Add(removedTypedec);
            return(mockAssignments);
        }
示例#7
0
 /// <summary>
 /// Generates the setup and tear down additional members and fields.
 /// </summary>
 /// <param name="context">Contains data specific to SetUp and TearDown test-method generation.</param>
 /// <param name="testObjectName">Name of the test object.</param>
 /// <param name="testObjectMemberField">The test object member field.</param>
 /// <remarks>Override this to customize the behavior of the generator.</remarks>
 protected virtual void GenerateSetupAndTearDownAdditional(ISetupAndTearDownCreationContext context, string testObjectName, CodeMemberField testObjectMemberField)
 {
 }
示例#8
0
        /*/// <summary>
        /// Handle event related stuff before type generation.
        /// </summary>
        /// <param name="typeMember">The type member.</param>
        /// <param name="eventName">Name of the event.</param>
        protected override void ComputeCodeMemberEvent(CodeMemberMethod typeMember, string eventName)
        {
            if (typeMember.Name.Contains("add_"))
            {
                typeMember.Name = typeMember.Name.Replace("add_", "Event");
            }
            else if (typeMember.Name.Contains("remove_"))
            {
                typeMember.Name = typeMember.Name.Replace("remove_", "Event");
            }

            ReplaceTestInTestName(typeMember, "AddAndRemove");
        }*/
        /// <summary>
        /// Generates additional members of the test class.
        /// </summary>
        /// <param name="context">Contains data specific to SetUp and TearDown test-method generation.</param>
        /// <param name="testObjectName">The name of the object under test.</param>
        /// <param name="testObjectMemberField">The member field of the object under test.</param>
        protected override void GenerateAdditional(
            ISetupAndTearDownCreationContext context,
            string testObjectName,
            CodeMemberField testObjectMemberField)
        {
            this.GenerateSetupAndTearDownAdditional(context, testObjectName, testObjectMemberField);
        }