/*/// <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); }
/// <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; }
/// <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) { }
/*/// <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); }
/// <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) { }
/*/// <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); }