Пример #1
0
        private static string GetTestMethodName(StepsContainer scenario, string variantName, string exampleSetIdentifier)
        {
            var methodName = string.Format(GeneratorConstants.TEST_NAME_FORMAT, scenario.Name.ToIdentifier());

            if (variantName == null)
            {
                return(methodName);
            }

            var variantNameIdentifier = variantName.ToIdentifier().TrimStart('_');

            methodName = string.IsNullOrEmpty(exampleSetIdentifier)
                ? $"{methodName}_{variantNameIdentifier}"
                : $"{methodName}_{exampleSetIdentifier}_{variantNameIdentifier}";

            return(methodName);
        }
        StepsContainer TransformSteps(string currentDocumentSourceFilePath, StepsContainer hasLocation)
        {
            switch (hasLocation)
            {
            case Background background:
            {
                var backgroundDocument = GetBackgroundDocument(currentDocumentSourceFilePath, background.Name ?? "");
                return(backgroundDocument ?? background);
            }

            case Scenario scenario:
            {
                var transformedSteps = scenario.Steps.SelectMany(step =>
                    {
                        var backgroundDocument = GetBackgroundDocument(currentDocumentSourceFilePath, step.Text ?? "");
                        return(backgroundDocument?.Steps ?? new[] { step });
                    });

                if (scenario is ScenarioOutline scenarioOutline)
                {
                    return(new ScenarioOutline(
                               scenarioOutline.Tags.ToArray(),
                               scenarioOutline.Location,
                               scenarioOutline.Keyword,
                               scenarioOutline.Name,
                               scenarioOutline.Description,
                               transformedSteps.ToArray(),
                               scenarioOutline.Examples.ToArray()
                               ));
                }

                return(new Scenario(
                           scenario.Tags.ToArray(),
                           scenario.Location,
                           scenario.Keyword,
                           scenario.Name,
                           scenario.Description,
                           transformedSteps.ToArray(),
                           scenario.Examples.ToArray()
                           ));
            }
            }

            return(hasLocation);
        }
        private int GetScenarioDefinitionLastLine(StepsContainer stepsContainer)
        {
            if (stepsContainer is ScenarioOutline scenarioOutline)
            {
                var lastExamples = scenarioOutline.Examples.LastOrDefault();
                if (lastExamples != null)
                {
                    return(GetExamplesLastLine(lastExamples));
                }
            }

            var lastStep = stepsContainer.Steps.LastOrDefault();

            if (lastStep == null)
            {
                return(stepsContainer.Location.Line);
            }
            return(GetStepLastLine(lastStep));
        }
Пример #4
0
        private void SetupTestMethod(
            TestClassGenerationContext generationContext,
            CodeMemberMethod testMethod,
            StepsContainer scenarioDefinition,
            IEnumerable <Tag> additionalTags,
            string variantName,
            string exampleSetIdentifier,
            bool rowTest = false)
        {
            testMethod.ReturnType = new CodeTypeReference(typeof(Task));
            testMethod.Attributes = MemberAttributes.Public;
            testMethod.Name       = GetTestMethodName(scenarioDefinition, variantName, exampleSetIdentifier);

            _unitTestGeneratorProvider.MarkCodeMemberMethodAsAsync(testMethod);

            var friendlyTestName = scenarioDefinition.Name;

            if (variantName != null)
            {
                friendlyTestName = $"{scenarioDefinition.Name}: {variantName}";
            }

            if (rowTest)
            {
                _unitTestGeneratorProvider.SetRowTest(generationContext, testMethod, friendlyTestName);
            }
            else
            {
                _unitTestGeneratorProvider.SetTestMethod(generationContext, testMethod, friendlyTestName);
            }

            _decoratorRegistry.DecorateTestMethod(generationContext, testMethod, ConcatTags(scenarioDefinition.GetTags(), additionalTags), out var scenarioCategories);

            if (scenarioCategories.Any())
            {
                _unitTestGeneratorProvider.SetTestMethodCategories(generationContext, testMethod, scenarioCategories);
            }
        }
        private void CreateUnitTest(SpecFlowFeature feature, TestClassGenerationContext generationContext, StepsContainer scenarioDefinition)
        {
            if (string.IsNullOrEmpty(scenarioDefinition.Name))
            {
                throw new TestGeneratorException("The scenario must have a title specified.");
            }

            if (scenarioDefinition is ScenarioOutline scenarioOutline)
            {
                GenerateScenarioOutlineTest(generationContext, scenarioOutline, feature);
            }
            else
            {
                GenerateTest(generationContext, (Scenario)scenarioDefinition, feature);
            }
        }
        internal void GenerateScenarioInitializeCall(TestClassGenerationContext generationContext, StepsContainer scenario, CodeMemberMethod testMethod)
        {
            var statements = new List <CodeStatement>();

            using (new SourceLineScope(_specFlowConfiguration, _codeDomHelper, statements, generationContext.Document.SourceFilePath, scenario.Location))
            {
                statements.Add(new CodeExpressionStatement(
                                   new CodeMethodInvokeExpression(
                                       new CodeThisReferenceExpression(),
                                       generationContext.ScenarioInitializeMethod.Name,
                                       new CodeVariableReferenceExpression("scenarioInfo"))));
            }

            testMethod.Statements.AddRange(statements.ToArray());
        }
        internal void GenerateTestMethodBody(TestClassGenerationContext generationContext, StepsContainer scenario, CodeMemberMethod testMethod, ParameterSubstitution paramToIdentifier, SpecFlowFeature feature)
        {
            var statementsWhenScenarioIsIgnored  = new CodeStatement[] { new CodeExpressionStatement(CreateTestRunnerSkipScenarioCall()) };
            var statementsWhenScenarioIsExecuted = new List <CodeStatement>
            {
                new CodeExpressionStatement(
                    new CodeMethodInvokeExpression(
                        new CodeThisReferenceExpression(),
                        generationContext.ScenarioStartMethod.Name))
            };


            if (generationContext.Feature.HasFeatureBackground())
            {
                using (new SourceLineScope(_specFlowConfiguration, _codeDomHelper, statementsWhenScenarioIsExecuted, generationContext.Document.SourceFilePath, generationContext.Feature.Background.Location))
                {
                    statementsWhenScenarioIsExecuted.Add(new CodeExpressionStatement(
                                                             new CodeMethodInvokeExpression(
                                                                 new CodeThisReferenceExpression(),
                                                                 generationContext.FeatureBackgroundMethod.Name)));
                }
            }


            foreach (var scenarioStep in scenario.Steps)
            {
                _scenarioPartHelper.GenerateStep(generationContext, statementsWhenScenarioIsExecuted, scenarioStep, paramToIdentifier);
            }

            var isScenarioIgnoredVariable = new CodeVariableDeclarationStatement(typeof(bool), "isScenarioIgnored", new CodeDefaultValueExpression(new CodeTypeReference(typeof(bool))));
            var isFeatureIgnoredVariable  = new CodeVariableDeclarationStatement(typeof(bool), "isFeatureIgnored", new CodeDefaultValueExpression(new CodeTypeReference(typeof(bool))));

            testMethod.Statements.Add(isScenarioIgnoredVariable);
            testMethod.Statements.Add(isFeatureIgnoredVariable);


            var tagsOfScenarioVariableReferenceExpression    = new CodeVariableReferenceExpression("tagsOfScenario");
            var isScenarioIgnoredVariableReferenceExpression = new CodeVariableReferenceExpression("isScenarioIgnored");
            var featureFileTagFieldReferenceExpression       = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "_featureTags");
            var isFeatureIgnoredVariableReferenceExpression  = new CodeVariableReferenceExpression("isFeatureIgnored");

            var ignoreLinqStatement = "Where(__entry => __entry != null).Where(__entry => String.Equals(__entry, \"ignore\", StringComparison.CurrentCultureIgnoreCase)).Any";

            if (_codeDomHelper.TargetLanguage == CodeDomProviderLanguage.VB)
            {
                ignoreLinqStatement = "Where(Function(__entry) __entry IsNot Nothing).Where(Function(__entry) String.Equals(__entry, \"ignore\", StringComparison.CurrentCultureIgnoreCase)).Any";
            }


            var ifIsNullStatement = new CodeConditionStatement(CreateCheckForNullExpression(tagsOfScenarioVariableReferenceExpression), new CodeAssignStatement(isScenarioIgnoredVariableReferenceExpression,
                                                                                                                                                                new CodeMethodInvokeExpression(tagsOfScenarioVariableReferenceExpression, ignoreLinqStatement)));


            var ifIsFeatureTagsNullStatement = new CodeConditionStatement(CreateCheckForNullExpression(featureFileTagFieldReferenceExpression), new CodeAssignStatement(isFeatureIgnoredVariableReferenceExpression,
                                                                                                                                                                        new CodeMethodInvokeExpression(featureFileTagFieldReferenceExpression, ignoreLinqStatement)));


            testMethod.Statements.Add(ifIsNullStatement);
            testMethod.Statements.Add(ifIsFeatureTagsNullStatement);


            var isScenarioOrFeatureIgnoredExpression = new CodeBinaryOperatorExpression(isScenarioIgnoredVariableReferenceExpression, CodeBinaryOperatorType.BooleanOr, isFeatureIgnoredVariableReferenceExpression);
            var ifIsIgnoredStatement = new CodeConditionStatement(isScenarioOrFeatureIgnoredExpression, statementsWhenScenarioIsIgnored, statementsWhenScenarioIsExecuted.ToArray());

            testMethod.Statements.Add(ifIsIgnoredStatement);
        }
        private void GenerateTestBody(
            TestClassGenerationContext generationContext,
            StepsContainer scenario,
            CodeMemberMethod testMethod,
            SpecFlowFeature feature,
            CodeExpression additionalTagsExpression = null, ParameterSubstitution paramToIdentifier = null)
        {
            //call test setup
            //ScenarioInfo scenarioInfo = new ScenarioInfo("xxxx", tags...);
            CodeExpression tagsExpression;

            if (additionalTagsExpression == null)
            {
                tagsExpression = _scenarioPartHelper.GetStringArrayExpression(scenario.GetTags());
            }
            else if (!scenario.HasTags())
            {
                tagsExpression = additionalTagsExpression;
            }
            else
            {
                // merge tags list
                // var tags = tags1
                // if (tags2 != null)
                //   tags = Enumerable.ToArray(Enumerable.Concat(tags1, tags1));
                testMethod.Statements.Add(
                    new CodeVariableDeclarationStatement(typeof(string[]), "__tags", _scenarioPartHelper.GetStringArrayExpression(scenario.GetTags())));
                tagsExpression = new CodeVariableReferenceExpression("__tags");
                testMethod.Statements.Add(
                    new CodeConditionStatement(
                        new CodeBinaryOperatorExpression(
                            additionalTagsExpression,
                            CodeBinaryOperatorType.IdentityInequality,
                            new CodePrimitiveExpression(null)),
                        new CodeAssignStatement(
                            tagsExpression,
                            new CodeMethodInvokeExpression(
                                new CodeTypeReferenceExpression(typeof(Enumerable)),
                                "ToArray",
                                new CodeMethodInvokeExpression(
                                    new CodeTypeReferenceExpression(typeof(Enumerable)),
                                    "Concat",
                                    tagsExpression,
                                    additionalTagsExpression)))));
            }


            AddVariableForTags(testMethod, tagsExpression);

            testMethod.Statements.Add(
                new CodeVariableDeclarationStatement(typeof(ScenarioInfo), "scenarioInfo",
                                                     new CodeObjectCreateExpression(typeof(ScenarioInfo),
                                                                                    new CodePrimitiveExpression(scenario.Name),
                                                                                    new CodePrimitiveExpression(scenario.Description),
                                                                                    tagsExpression)));

            GenerateScenarioInitializeCall(generationContext, scenario, testMethod);

            GenerateTestMethodBody(generationContext, scenario, testMethod, paramToIdentifier, feature);

            GenerateScenarioCleanupMethodCall(generationContext, testMethod);
        }
Пример #9
0
        private void SetupTestMethod(TestClassGenerationContext generationContext, CodeMemberMethod testMethod, StepsContainer scenarioDefinition, IEnumerable <Tag> additionalTags,
                                     string variantName, string exampleSetIdentifier, bool rowTest = false)
        {
            testMethod.Attributes = MemberAttributes.Public;
            testMethod.Name       = GetTestMethodName(scenarioDefinition, variantName, exampleSetIdentifier);
            var friendlyTestName = scenarioDefinition.Name;

            if (variantName != null)
            {
                friendlyTestName = string.Format("{0}: {1}", scenarioDefinition.Name, variantName);
            }

            if (rowTest)
            {
                testGeneratorProvider.SetRowTest(generationContext, testMethod, friendlyTestName);
            }
            else
            {
                testGeneratorProvider.SetTestMethod(generationContext, testMethod, friendlyTestName);
            }

            List <string> scenarioCategories;

            decoratorRegistry.DecorateTestMethod(generationContext, testMethod, ConcatTags(scenarioDefinition.GetTags(), additionalTags), out scenarioCategories);

            if (scenarioCategories.Any())
            {
                testGeneratorProvider.SetTestMethodCategories(generationContext, testMethod, scenarioCategories);
            }
        }
Пример #10
0
        private CodeMemberMethod CreateTestMethod(TestClassGenerationContext generationContext, StepsContainer scenario, IEnumerable <Tag> additionalTags, string variantName = null,
                                                  string exampleSetIdentifier = null)
        {
            CodeMemberMethod testMethod = CreateMethod(generationContext.TestClass);

            SetupTestMethod(generationContext, testMethod, scenario, additionalTags, variantName, exampleSetIdentifier);

            return(testMethod);
        }
Пример #11
0
        private void AddScenarioDefinitionBlockTag(ITextSnapshot fileSnapshot, ProjectBindingRegistry bindingRegistry,
                                                   StepsContainer scenarioDefinition, DeveroomTag parentTag)
        {
            var scenarioDefinitionTag = CreateDefinitionBlockTag(scenarioDefinition,
                                                                 DeveroomTagTypes.ScenarioDefinitionBlock, fileSnapshot,
                                                                 GetScenarioDefinitionLastLine(scenarioDefinition), parentTag);

            foreach (var step in scenarioDefinition.Steps)
            {
                var stepTag = scenarioDefinitionTag.AddChild(new DeveroomTag(DeveroomTagTypes.StepBlock,
                                                                             GetBlockSpan(fileSnapshot, step.Location, GetStepLastLine(step)), step));

                stepTag.AddChild(
                    new DeveroomTag(DeveroomTagTypes.StepKeyword,
                                    GetTextSpan(fileSnapshot, step.Location, step.Keyword),
                                    step.Keyword));

                if (step.Argument is DataTable dataTable)
                {
                    var dataTableBlockTag = new DeveroomTag(DeveroomTagTypes.DataTable,
                                                            GetBlockSpan(fileSnapshot, dataTable.Rows.First().Location,
                                                                         dataTable.Rows.Last().Location.Line),
                                                            dataTable);
                    stepTag.AddChild(dataTableBlockTag);
                    var dataTableHeader = dataTable.Rows.FirstOrDefault();
                    if (dataTableHeader != null)
                    {
                        TagRowCells(fileSnapshot, dataTableHeader, dataTableBlockTag, DeveroomTagTypes.DataTableHeader);
                    }
                }
                else if (step.Argument is DocString docString)
                {
                    stepTag.AddChild(
                        new DeveroomTag(DeveroomTagTypes.DocString,
                                        GetBlockSpan(fileSnapshot, docString.Location,
                                                     GetStepLastLine(step)),
                                        docString));
                }

                if (scenarioDefinition is ScenarioOutline)
                {
                    AddPlaceholderTags(fileSnapshot, stepTag, step);
                }

                var match = bindingRegistry?.MatchStep(step, scenarioDefinitionTag);
                if (match != null)
                {
                    if (match.HasDefined || match.HasAmbiguous)
                    {
                        stepTag.AddChild(new DeveroomTag(DeveroomTagTypes.DefinedStep,
                                                         GetTextSpan(fileSnapshot, step.Location, step.Text, offset: step.Keyword.Length),
                                                         match));
                        if (!(scenarioDefinition is ScenarioOutline) || !step.Text.Contains("<"))
                        {
                            var parameterMatch = match.Items.FirstOrDefault(m => m.ParameterMatch != null)
                                                 ?.ParameterMatch;
                            AddParameterTags(fileSnapshot, parameterMatch, stepTag, step);
                        }
                    }

                    if (match.HasUndefined)
                    {
                        stepTag.AddChild(new DeveroomTag(DeveroomTagTypes.UndefinedStep,
                                                         GetTextSpan(fileSnapshot, step.Location, step.Text, offset: step.Keyword.Length),
                                                         match));
                    }

                    if (match.HasErrors)
                    {
                        stepTag.AddChild(new DeveroomTag(DeveroomTagTypes.BindingError,
                                                         GetTextSpan(fileSnapshot, step.Location, step.Text, offset: step.Keyword.Length),
                                                         match.GetErrorMessage()));
                    }
                }
            }

            if (scenarioDefinition is ScenarioOutline scenarioOutline)
            {
                foreach (var scenarioOutlineExample in scenarioOutline.Examples)
                {
                    var examplesBlockTag = CreateDefinitionBlockTag(scenarioOutlineExample,
                                                                    DeveroomTagTypes.ExamplesBlock, fileSnapshot,
                                                                    GetExamplesLastLine(scenarioOutlineExample), scenarioDefinitionTag);
                    if (scenarioOutlineExample.TableHeader != null)
                    {
                        TagRowCells(fileSnapshot, scenarioOutlineExample.TableHeader, examplesBlockTag,
                                    DeveroomTagTypes.ScenarioOutlinePlaceholder);
                    }
                }
            }
        }
Пример #12
0
        internal void GenerateMethodBodyForNotSkippedScenarios(TestClassGenerationContext generationContext, StepsContainer scenario, CodeMemberMethod testMethod, ParameterSubstitution paramToIdentifier)
        {
            if (HasFeatureBackground(generationContext.Feature))
            {
                AddLineDirective(testMethod.Statements, generationContext.Feature.Background);
                testMethod.Statements.Add(
                    new CodeMethodInvokeExpression(
                        new CodeThisReferenceExpression(),
                        generationContext.FeatureBackgroundMethod.Name));
            }

            foreach (var scenarioStep in scenario.Steps)
            {
                GenerateStep(testMethod, scenarioStep, paramToIdentifier);
            }
        }
Пример #13
0
 internal void GenerateScenarioInitializeCall(TestClassGenerationContext generationContext, StepsContainer scenario, CodeMemberMethod testMethod)
 {
     AddLineDirective(testMethod.Statements, scenario);
     testMethod.Statements.Add(
         new CodeMethodInvokeExpression(
             new CodeThisReferenceExpression(),
             generationContext.ScenarioInitializeMethod.Name,
             new CodeVariableReferenceExpression("scenarioInfo")));
 }
Пример #14
0
 internal bool IsIgnoredStepsContainer(StepsContainer stepsContainer)
 {
     return(stepsContainer.GetTags().Any(t => string.Equals(t.Name, IGNORE_TAG, StringComparison.InvariantCultureIgnoreCase)));
 }
Пример #15
0
 internal void GenerateTestMethodBody(TestClassGenerationContext generationContext, StepsContainer scenario, CodeMemberMethod testMethod, ParameterSubstitution paramToIdentifier, SpecFlowFeature feature)
 {
     if (IsIgnoredFeature(feature) || IsIgnoredStepsContainer(scenario))
     {
         GenerateMethodBodyForSkippedScenario(testMethod);
     }
     else
     {
         GenerateScenarioStartMethodCall(generationContext, testMethod);
         GenerateMethodBodyForNotSkippedScenarios(generationContext, scenario, testMethod, paramToIdentifier);
     }
 }
 public List <string> GetScenarioVariantTagValues(StepsContainer scenario) // CHANGED FOM ScenarioDefinition
 {
     return(scenario.GetTags()?.Where(a => a.Name.StartsWith($"@{VariantKey}"))?.Select(a => a.Name.Split(':')[1]).ToList());
 }
Пример #17
0
 public static void AddLineDirective(this CodeDomHelper codeDomHelper, StepsContainer scenarioDefinition, CodeStatementCollection statements, SpecFlowConfiguration specFlowConfiguration) // CHANGED FROM ScenarioDefinitio to StepsContainter
 {
     AddLineDirective(statements, scenarioDefinition.Location, specFlowConfiguration, codeDomHelper);
 }
Пример #18
0
        private void GenerateTestBody(TestClassGenerationContext generationContext, StepsContainer scenario, CodeMemberMethod testMethod, CodeExpression additionalTagsExpression = null,
                                      ParameterSubstitution paramToIdentifier = null)
        {
            //call test setup
            //ScenarioInfo scenarioInfo = new ScenarioInfo("xxxx", tags...);
            CodeExpression tagsExpression;

            if (additionalTagsExpression == null)
            {
                tagsExpression = GetStringArrayExpression(scenario.GetTags());
            }
            else if (!scenario.HasTags())
            {
                tagsExpression = additionalTagsExpression;
            }
            else
            {
                // merge tags list
                // var tags = tags1
                // if (tags2 != null)
                //   tags = Enumerable.ToArray(Enumerable.Concat(tags1, tags1));
                testMethod.Statements.Add(
                    new CodeVariableDeclarationStatement(typeof(string[]), "__tags", GetStringArrayExpression(scenario.GetTags())));
                tagsExpression = new CodeVariableReferenceExpression("__tags");
                testMethod.Statements.Add(
                    new CodeConditionStatement(
                        new CodeBinaryOperatorExpression(
                            additionalTagsExpression,
                            CodeBinaryOperatorType.IdentityInequality,
                            new CodePrimitiveExpression(null)),
                        new CodeAssignStatement(
                            tagsExpression,
                            new CodeMethodInvokeExpression(
                                new CodeTypeReferenceExpression(typeof(Enumerable)),
                                "ToArray",
                                new CodeMethodInvokeExpression(
                                    new CodeTypeReferenceExpression(typeof(Enumerable)),
                                    "Concat",
                                    tagsExpression,
                                    additionalTagsExpression)))));
            }

            testMethod.Statements.Add(
                new CodeVariableDeclarationStatement(typeof(ScenarioInfo), "scenarioInfo",
                                                     new CodeObjectCreateExpression(typeof(ScenarioInfo),
                                                                                    new CodePrimitiveExpression(scenario.Name),
                                                                                    new CodePrimitiveExpression(scenario.Description),
                                                                                    tagsExpression)));

            AddLineDirective(testMethod.Statements, scenario);
            testMethod.Statements.Add(
                new CodeMethodInvokeExpression(
                    new CodeThisReferenceExpression(),
                    generationContext.ScenarioInitializeMethod.Name,
                    new CodeVariableReferenceExpression("scenarioInfo")));

            testMethod.Statements.Add(
                new CodeMethodInvokeExpression(
                    new CodeThisReferenceExpression(),
                    generationContext.ScenarioStartMethod.Name));

            if (HasFeatureBackground(generationContext.Feature))
            {
                AddLineDirective(testMethod.Statements, generationContext.Feature.Background);
                testMethod.Statements.Add(
                    new CodeMethodInvokeExpression(
                        new CodeThisReferenceExpression(),
                        generationContext.FeatureBackgroundMethod.Name));
            }

            foreach (var scenarioStep in scenario.Steps)
            {
                GenerateStep(testMethod, scenarioStep, paramToIdentifier);
            }

            AddLineDirectiveHidden(testMethod.Statements);

            // call scenario cleanup
            testMethod.Statements.Add(
                new CodeMethodInvokeExpression(
                    new CodeThisReferenceExpression(),
                    generationContext.ScenarioCleanupMethod.Name));
        }
Пример #19
0
        private void GenerateTestBody(TestClassGenerationContext generationContext, StepsContainer scenario, CodeMemberMethod testMethod, CodeExpression additionalTagsExpression = null, ParameterSubstitution paramToIdentifier = null)
        {
            CodeExpression left;

            if (additionalTagsExpression == null)
            {
                left = scenario.GetTags().GetStringArrayExpression();
            }
            else if (!scenario.HasTags())
            {
                left = additionalTagsExpression;
            }
            else
            {
                testMethod.Statements.Add(new CodeVariableDeclarationStatement(typeof(string[]), "__tags", scenario.GetTags().GetStringArrayExpression()));
                left = new CodeVariableReferenceExpression("__tags");
                testMethod.Statements.Add(new CodeConditionStatement(new CodeBinaryOperatorExpression(additionalTagsExpression, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(null)), new CodeStatement[1]
                {
                    new CodeAssignStatement(left, new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(typeof(Enumerable)), "ToArray", new CodeExpression[1]
                    {
                        new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(typeof(Enumerable)), "Concat", new CodeExpression[2]
                        {
                            left,
                            additionalTagsExpression
                        })
                    }))
                }));
            }
            testMethod.Statements.Add(new CodeVariableDeclarationStatement(typeof(ScenarioInfo), "scenarioInfo", new CodeObjectCreateExpression(typeof(ScenarioInfo), new CodeExpression[3]
            {
                new CodePrimitiveExpression(scenario.Name),
                new CodePrimitiveExpression(scenario.Description),
                left
            })));
            //_codeDomHelper.AddLineDirective(scenario, testMethod.Statements, _specFlowConfiguration);
            testMethod.Statements.Add(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), generationContext.ScenarioInitializeMethod.Name, new CodeExpression[1]
            {
                new CodeVariableReferenceExpression("scenarioInfo")
            }));

            //// NEW CODE START
            if (_setVariantToContextForOutlineTest)
            {
                testMethod.Statements.Add(new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodePropertyReferenceExpression(new CodeFieldReferenceExpression(null, generationContext.TestRunnerField.Name), "ScenarioContext"), "Add", null), new CodeExpression[2]
                {
                    new CodePrimitiveExpression(_variantHelper.VariantKey),
                    new CodeVariableReferenceExpression(_variantHelper.VariantKey.ToLowerInvariant())
                }));

                if (!generationContext.GenerateRowTests)
                {
                    testMethod.Parameters.Add(new CodeParameterDeclarationExpression("System.String", _variantHelper.VariantKey.ToLowerInvariant()));
                }
            }
            else if (_setVariantToContextForTest)
            {
                testMethod.Statements.Add(new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodePropertyReferenceExpression(new CodeFieldReferenceExpression(null, generationContext.TestRunnerField.Name), "ScenarioContext"), "Add", null), new CodeExpression[2]
                {
                    new CodePrimitiveExpression(_variantHelper.VariantKey),
                    new CodePrimitiveExpression(_variantValue)
                }));
            }

            _setVariantToContextForOutlineTest = false;
            _setVariantToContextForTest        = false;
            _variantValue = null;
            //// NEW CODE END

            testMethod.Statements.Add(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), generationContext.ScenarioStartMethod.Name, new CodeExpression[0]));
            if (generationContext.Feature.HasFeatureBackground())
            {
                //_codeDomHelper.AddLineDirective(generationContext.Feature.Background, testMethod.Statements, _specFlowConfiguration);
                testMethod.Statements.Add(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), generationContext.FeatureBackgroundMethod.Name, new CodeExpression[0]));
            }
            foreach (var step in scenario.Steps)
            {
                GenerateStep(testMethod, step, paramToIdentifier);
            }
            //_codeDomHelper.AddLineDirectiveHidden(testMethod.Statements, _specFlowConfiguration);
            testMethod.Statements.Add(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), generationContext.ScenarioCleanupMethod.Name, new CodeExpression[0]));
        }
Пример #20
0
 private void AddLineDirective(CodeStatementCollection statements, StepsContainer scenarioDefinition)
 {
     AddLineDirective(statements, scenarioDefinition.Location);
 }
Пример #21
0
        private void SetupTestMethod(TestClassGenerationContext generationContext, CodeMemberMethod testMethod, StepsContainer scenarioDefinition, IEnumerable <Tag> additionalTags, string variantName, string exampleSetIdentifier, bool rowTest = false)
        {
            testMethod.Attributes = MemberAttributes.Public;
            testMethod.Name       = GetTestMethodName(scenarioDefinition, variantName, exampleSetIdentifier);
            var str = scenarioDefinition.Name;

            if (variantName != null)
            {
                if (variantName.IndexOf("_") == 0)
                {
                    variantName = variantName.Remove(0, 1);
                }                                                                              //NEW CODE
                str = $"{scenarioDefinition.Name}: {variantName}";
            }
            if (rowTest)
            {
                _testGeneratorProvider.SetRowTest(generationContext, testMethod, str);
            }
            else
            {
                _testGeneratorProvider.SetTestMethod(generationContext, testMethod, str);
            }
            _decoratorRegistry.DecorateTestMethod(generationContext, testMethod, scenarioDefinition.GetTags().ConcatTags(additionalTags).ConcatTags(_featureVariantTags), out List <string> unprocessedTags);

            if (!unprocessedTags.Any())
            {
                return;
            }

            _testGeneratorProvider.SetTestMethodCategories(generationContext, testMethod, unprocessedTags);
        }