public static SpecFlowProject LoadSpecFlowProjectFromDteProject(Project project)
        {
            string projectFolder = Path.GetDirectoryName(project.FullName);

            SpecFlowProject specFlowProject = new SpecFlowProject();

            specFlowProject.ProjectSettings.ProjectFolder    = projectFolder;
            specFlowProject.ProjectSettings.ProjectName      = Path.GetFileNameWithoutExtension(project.FullName);
            specFlowProject.ProjectSettings.AssemblyName     = project.Properties.Item("AssemblyName").Value as string;
            specFlowProject.ProjectSettings.DefaultNamespace = project.Properties.Item("DefaultNamespace").Value as string;

            foreach (ProjectItem projectItem in GetAllProjectItem(project).Where(IsPhysicalFile))
            {
                var fileName = GetRelativePath(GetFileName(projectItem), projectFolder);

                var extension = Path.GetExtension(fileName);
                if (extension.Equals(".feature", StringComparison.InvariantCultureIgnoreCase))
                {
                    var featureFile = new FeatureFileInput(fileName);
                    var ns          = projectItem.Properties.Item("CustomToolNamespace").Value as string;
                    if (!String.IsNullOrEmpty(ns))
                    {
                        featureFile.CustomNamespace = ns;
                    }
                    specFlowProject.FeatureFiles.Add(featureFile);
                }

                if (Path.GetFileName(fileName).Equals("app.config", StringComparison.InvariantCultureIgnoreCase))
                {
                    GeneratorConfigurationReader.UpdateConfigFromFileContent(specFlowProject.Configuration.GeneratorConfiguration, GetFileContent(projectItem));
                }
            }
            return(specFlowProject);
        }
        protected override void DoExecute()
        {
            if (DebugTask)
            {
                System.Diagnostics.Debugger.Launch();
            }

            ITraceListener traceListener = VerboseOutput ? (ITraceListener) new TextWriterTraceListener(GetMessageWriter(MessageImportance.High), "SpecFlow: ") : new NullListener();

            SpecFlowProject specFlowProject = MsBuildProjectReader.LoadSpecFlowProjectFromMsBuild(ProjectPath);

            BatchGenerator batchGenerator = new MsBuildBatchGenerator(traceListener, new TestGeneratorFactory(), this);

            batchGenerator.OnError +=
                delegate(FeatureFileInput featureFileInput, TestGeneratorResult result)
            {
                foreach (var testGenerationError in result.Errors)
                {
                    RecordError(testGenerationError.Message,
                                featureFileInput.GetFullPath(specFlowProject.ProjectSettings), testGenerationError.Line, testGenerationError.LinePosition);
                }
            };
            batchGenerator.OnSuccess +=
                (featureFileInput, result) => generatedFiles.Add(
                    new TaskItem(featureFileInput.GetGeneratedTestFullPath(specFlowProject.ProjectSettings)));

            batchGenerator.ProcessProject(specFlowProject, ForceGeneration);
        }
Exemple #3
0
        public static SpecFlowProject ReadSpecFlowProject(string projectPath, SourceAssemblyProbe sourceAssemblyProbe, string defaultNameSpace = null)
        {
            var specFlowProject = new SpecFlowProject();

            specFlowProject.ProjectSettings.ProjectFolder = projectPath;
            specFlowProject.ProjectSettings.ProjectName   = sourceAssemblyProbe.AssemblyName;

            var projectSettings = specFlowProject.ProjectSettings;

            projectSettings.AssemblyName     = sourceAssemblyProbe.AssemblyName;
            projectSettings.DefaultNamespace = defaultNameSpace ?? sourceAssemblyProbe.AssemblyName;

            var featureFiles = Directory
                               .GetFiles(projectPath, "*.feature", SearchOption.AllDirectories)
                               .Select(file => new FeatureFileInput(file)
            {
                CustomNamespace = projectSettings.DefaultNamespace +
                                  DirectoryUtils.GetContainingDirectory(file)
                                  .Replace(projectPath, string.Empty)
                                  .Replace(Path.DirectorySeparatorChar, '.')
            });

            specFlowProject.FeatureFiles.AddRange(featureFiles);

            Configure(specFlowProject, sourceAssemblyProbe);
            return(specFlowProject);
        }
Exemple #4
0
        private SpecFlowProject CreateSpecFlowProjectFrom(IProject project)
        {
            var specFlowProject = new SpecFlowProject();

            specFlowProject.ProjectSettings.ProjectFolder    = project.Directory;
            specFlowProject.ProjectSettings.ProjectName      = project.Name;
            specFlowProject.ProjectSettings.AssemblyName     = project.AssemblyName;
            specFlowProject.ProjectSettings.DefaultNamespace = project.RootNamespace;

            var generatorConfig = specFlowProject.Configuration.GeneratorConfiguration;

            foreach (var projectFile in project.Items.OfType <FileProjectItem>().Where(IsFeatureOrAppConfigFile))
            {
                string extension = Path.GetExtension(projectFile.FileName);
                if (extension != null && extension.Equals(".feature", StringComparison.InvariantCultureIgnoreCase))
                {
                    string fileName    = FileUtilities.GetRelativePath(projectFile.FileName, project.Directory);
                    var    featureFile = new FeatureFileInput(fileName);

                    specFlowProject.FeatureFiles.Add(featureFile);
                }

                if (extension != null && extension.Equals(".config", StringComparison.InvariantCultureIgnoreCase))
                {
                    string configContent = File.ReadAllText(projectFile.FileName);
                    GeneratorConfigurationReader.UpdateConfigFromFileContent(generatorConfig, configContent);
                }
            }

            return(specFlowProject);
        }
Exemple #5
0
        public void GenerateCode(FileProjectItem item, CustomToolContext context)
        {
            context.RunAsync(
                () => {
                string fileName = item.FileName;
                var projectNode = item.Project;
                SpecFlowProject specFlowProject = CreateSpecFlowProjectFrom(projectNode);
                var specFlowGenerator           = new SpecFlowGenerator(specFlowProject);

                string outputFile = context.GetOutputFileName(item, ".feature");

                var specFlowFeatureFile = specFlowProject.GetOrCreateFeatureFile(fileName);

                var fileContents = File.ReadAllText(fileName);
                string outputFileContents;
                using (var reader = new StringReader(fileContents)) {
                    using (var writer = new StringWriter(new StringBuilder())) {
                        specFlowGenerator.GenerateTestFile(specFlowFeatureFile, projectNode.LanguageProperties.CodeDomProvider, reader, writer);
                        outputFileContents = writer.ToString();
                    }
                }
                File.WriteAllText(outputFile, outputFileContents);

                WorkbenchSingleton.SafeThreadCall(
                    () => context.EnsureOutputFileIsInProject(item, outputFile));
            });
        }
Exemple #6
0
        public void Should_parse_csproj_file_correctly()
        {
            var             directoryName       = Path.GetDirectoryName(this.GetType().Assembly.Location);
            string          projectFilePath     = Path.Combine(directoryName, "Data\\sampleCsProjectfile.csproj");
            SpecFlowProject specflowProjectfile = MsBuildProjectReader.LoadSpecFlowProjectFromMsBuild(projectFilePath);

            specflowProjectfile.FeatureFiles.Count.Should().Be(3);
            specflowProjectfile.FeatureFiles.Single(x => x.ProjectRelativePath == @"Features\Login\SocialLogins.feature").Should().NotBeNull();
            specflowProjectfile.FeatureFiles.Single(x => x.ProjectRelativePath == @"Features\WorkflowDefinition\CreateWorkflowDefinition.feature").Should().NotBeNull();
            specflowProjectfile.FeatureFiles.Single(x => x.ProjectRelativePath == @"Features\WorkflowInstance\WorkflowInstance.feature").Should().NotBeNull();

            specflowProjectfile.ProjectSettings.AssemblyName.Should().Be("Hacapp.Web.Tests.UI");
            specflowProjectfile.ProjectSettings.DefaultNamespace.Should().Be("Hacapp.Web.Tests.UI");
            specflowProjectfile.ProjectSettings.ProjectName.Should().Be("sampleCsProjectfile");

            specflowProjectfile.ProjectSettings.ProjectPlatformSettings.Language.Should().Be("C#");
            specflowProjectfile.ProjectSettings.ProjectPlatformSettings.LanguageVersion.Should().Be(new Version(3, 0));
            specflowProjectfile.ProjectSettings.ProjectPlatformSettings.Platform.Should().Be(".NET");
            specflowProjectfile.ProjectSettings.ProjectPlatformSettings.PlatformVersion.Should().Be(new Version(3, 5));

            specflowProjectfile.Configuration.GeneratorConfiguration.AllowDebugGeneratedFiles.Should().BeFalse();
            specflowProjectfile.Configuration.GeneratorConfiguration.AllowRowTests.Should().BeTrue();
            specflowProjectfile.Configuration.GeneratorConfiguration.GeneratorUnitTestProvider.Should().Be("MSTest");
            specflowProjectfile.Configuration.GeneratorConfiguration.FeatureLanguage.Name.Should().Be("en-US");
        }
Exemple #7
0
        public void Should_be_able_to_construct_a_test_class()
        {
            const string testProject       = "TestSample.DefaultSettings";
            const string featureFile       = "BrowserRequiredTest.feature";
            var          testProjectFolder = Path.Combine(AssemblyDirectory, @"..\..\..\", testProject);

            var configurationHolder = new SpecFlowConfigurationHolder(AppConfig);
            var projectSettings     = new ProjectSettings
            {
                AssemblyName            = testProject,
                DefaultNamespace        = testProject,
                ProjectName             = testProject,
                ProjectFolder           = testProjectFolder,
                ConfigurationHolder     = configurationHolder,
                ProjectPlatformSettings = new ProjectPlatformSettings()
            };
            var specflowProject = new SpecFlowProject {
                ProjectSettings = projectSettings
            };
            var featurefileInput = specflowProject.GetOrCreateFeatureFile(featureFile);

            var container = GeneratorContainerBuilder.CreateContainer(configurationHolder, projectSettings);
            var generator = container.Resolve <ITestGenerator>();

            var testFile        = generator.GenerateTestFile(featurefileInput, new GenerationSettings());
            var testFileContent = testFile.GeneratedTestCode;

            Console.WriteLine(testFileContent);
            Assert.That(testFile.Success);
        }
Exemple #8
0
        public void ProcessProject(SpecFlowProject specFlowProject, bool forceGenerate)
        {
            traceListener.WriteToolOutput("Processing project: " + specFlowProject.ProjectSettings.ProjectName);
            GenerationSettings generationSettings = GetGenerationSettings(forceGenerate);

            using (var generator = CreateGenerator(specFlowProject))
            {
                foreach (var featureFile in specFlowProject.FeatureFiles)
                {
                    var featureFileInput = CreateFeatureFileInput(featureFile, generator, specFlowProject);
                    var generationResult = GenerateTestFile(generator, featureFileInput, generationSettings);
                    if (!generationResult.Success)
                    {
                        traceListener.WriteToolOutput("{0} -> test generation failed", featureFile.ProjectRelativePath);
                    }
                    else if (generationResult.IsUpToDate)
                    {
                        traceListener.WriteToolOutput("{0} -> test up-to-date", featureFile.ProjectRelativePath);
                    }
                    else
                    {
                        traceListener.WriteToolOutput("{0} -> test updated", featureFile.ProjectRelativePath);
                    }
                }
            }
        }
        private static SpecFlowProject LoadSpecFlowProjectFromDteProjectInternal(Project project)
        {
            string projectFolder = Path.GetDirectoryName(project.FullName);

            SpecFlowProject specFlowProject = new SpecFlowProject();

            specFlowProject.ProjectFolder    = projectFolder;
            specFlowProject.ProjectName      = Path.GetFileNameWithoutExtension(project.FullName);
            specFlowProject.AssemblyName     = project.Properties.Item("AssemblyName").Value as string;
            specFlowProject.DefaultNamespace = project.Properties.Item("DefaultNamespace").Value as string;

            foreach (ProjectItem projectItem in VsxHelper.GetAllPhysicalFileProjectItem(project))
            {
                if (".feature".Equals(Path.GetExtension(projectItem.Name), StringComparison.InvariantCultureIgnoreCase))
                {
                    var featureFile = new SpecFlowFeatureFile(VsxHelper.GetProjectRelativePath(projectItem));
                    var ns          = projectItem.Properties.Item("CustomToolNamespace").Value as string;
                    if (!String.IsNullOrEmpty(ns))
                    {
                        featureFile.CustomNamespace = ns;
                    }
                    specFlowProject.FeatureFiles.Add(featureFile);
                }
            }

            specFlowProject.Configuration = LoadSpecFlowConfigurationFromDteProjectInternal(project);

            return(specFlowProject);
        }
        public SpecFlowProject ReadSpecFlowProject(string projectFilePath)
        {
            Microsoft.Build.Evaluation.Project project = ProjectCollection.GlobalProjectCollection.LoadProject(projectFilePath);

            string projectFolder = Path.GetDirectoryName(projectFilePath);

            var specFlowProject = new SpecFlowProject();
            specFlowProject.ProjectSettings.ProjectFolder = projectFolder;
            specFlowProject.ProjectSettings.ProjectName = Path.GetFileNameWithoutExtension(projectFilePath);
            specFlowProject.ProjectSettings.AssemblyName = project.AllEvaluatedProperties.First(x=>x.Name=="AssemblyName").EvaluatedValue;
            specFlowProject.ProjectSettings.DefaultNamespace =project.AllEvaluatedProperties.First(x=>x.Name=="RootNamespace").EvaluatedValue;

            foreach (ProjectItem item in project.FeatureFiles())
            {
                var featureFile = new FeatureFileInput(item.EvaluatedInclude);
                var ns = item.GetMetadataValue("CustomToolNamespace");
                if (!String.IsNullOrEmpty(ns))
                    featureFile.CustomNamespace = ns;
                specFlowProject.FeatureFiles.Add(featureFile);
                               
            }

            ProjectItem appConfigItem = project.ApplicationConfigurationFile();
            if (appConfigItem != null)
            {
                var configFilePath = Path.Combine(projectFolder, appConfigItem.EvaluatedInclude);
                var configFileContent = File.ReadAllText(configFilePath);
                var configurationHolder = GetConfigurationHolderFromFileContent(configFileContent);
                specFlowProject.ProjectSettings.ConfigurationHolder = configurationHolder;
                specFlowProject.Configuration = configurationLoader.LoadConfiguration(configurationHolder);
            }
            
            return specFlowProject;
        }
Exemple #11
0
        public void ProcessProject(SpecFlowProject specFlowProject, bool forceGenerate)
        {
            traceListener.WriteToolOutput("Processing project: " + specFlowProject.ProjectSettings.ProjectName);
            GenerationSettings generationSettings = GetGenerationSettings(forceGenerate);

            using (var generator = CreateGenerator(specFlowProject))
            {

                foreach (var featureFile in specFlowProject.FeatureFiles)
                {
                    var featureFileInput = CreateFeatureFileInput(featureFile, generator, specFlowProject);
                    var generationResult = GenerateTestFile(generator, featureFileInput, generationSettings);
                    if (!generationResult.Success)
                    {
                        traceListener.WriteToolOutput("{0} -> test generation failed", featureFile.ProjectRelativePath);
                    }
                    else if (generationResult.IsUpToDate)
                    {
                        traceListener.WriteToolOutput("{0} -> test up-to-date", featureFile.ProjectRelativePath);
                    }
                    else
                    {
                        traceListener.WriteToolOutput("{0} -> test updated", featureFile.ProjectRelativePath);
                    }
                }
            }
        }
		private SpecFlowProject CreateSpecFlowProjectFrom(IProject project)
		{
			var specFlowProject = new SpecFlowProject();
			specFlowProject.ProjectSettings.ProjectFolder = project.Directory;
            specFlowProject.ProjectSettings.ProjectName = project.Name;
            specFlowProject.ProjectSettings.AssemblyName = project.AssemblyName;
            specFlowProject.ProjectSettings.DefaultNamespace = project.RootNamespace;

            var generatorConfig = specFlowProject.Configuration.GeneratorConfiguration;
			
			foreach (var projectFile in project.Items.OfType<FileProjectItem>().Where(IsFeatureOrAppConfigFile))
			{
				string extension = Path.GetExtension(projectFile.FileName);
				if (extension != null && extension.Equals(".feature", StringComparison.InvariantCultureIgnoreCase))
				{
					string fileName = FileUtilities.GetRelativePath(projectFile.FileName, project.Directory);
                    var featureFile = new FeatureFileInput(fileName);
					
					specFlowProject.FeatureFiles.Add(featureFile);
				}

                if (extension != null && extension.Equals(".config", StringComparison.InvariantCultureIgnoreCase))
				{
					string configContent = File.ReadAllText(projectFile.FileName);
                    GeneratorConfigurationReader.UpdateConfigFromFileContent(generatorConfig, configContent);
				}
			}
			
			return specFlowProject;
		}
Exemple #13
0
        /// <summary>
        /// Create and return instantiation of a parser represented by RegularExpressionScanner object.
        /// </summary>
        /// <param name="buffer">An <see cref="IVsTextLines"/> represents lines of source to parse.</param>
        /// <returns>Returns a RegularExpressionScanner object</returns>
        public override IScanner GetScanner(IVsTextLines buffer)
        {
            SpecFlowProject specFlowProject = DteProjectReader.LoadSpecFlowProjectFromDteProject(CurrentProject);

            scanner = new RegularExpressionScanner(specFlowProject.Configuration.GeneratorConfiguration.FeatureLanguage);

            return(scanner);
        }
Exemple #14
0
        protected override void DoExecute()
        {
            SpecFlowProject specFlowProject = MsBuildProjectReader.LoadSpecFlowProjectFromMsBuild(ProjectPath);

            ITraceListener traceListener  = VerboseOutput ? (ITraceListener) new TextWriterTraceListener(GetMessageWriter(MessageImportance.High), "SpecFlow: ") : new NullListener();
            BatchGenerator batchGenerator = new MsBuildBatchGenerator(traceListener, new TestGeneratorFactory(), this);

            batchGenerator.ProcessProject(specFlowProject, ForceGeneration);
        }
Exemple #15
0
        protected override void DoExecute()
        {
            SpecFlowProject specFlowProject = MsBuildProjectReader.LoadSpecFlowProjectFromMsBuild(ProjectPath);

            BatchGenerator batchGenerator = new MsBuildBatchGenerator(
                GetMessageWriter(MessageImportance.High), VerboseOutput, this);

            batchGenerator.ProcessProject(specFlowProject, ForceGeneration);
        }
Exemple #16
0
        private static IEnumerable <string> GetStepAssemblies(SpecFlowProject specFlowProject)
        {
            yield return(specFlowProject.ProjectSettings.AssemblyName);

            foreach (var stepAssembly in specFlowProject.Configuration.RuntimeConfiguration.AdditionalStepAssemblies)
            {
                yield return(stepAssembly);
            }
        }
Exemple #17
0
        public static void GenerateAll(
            [Required(Description = "Visual Studio Project File containing features")] string projectFile,
            [Optional(false, "force", "f")] bool forceGeneration,
            [Optional(false, "verbose", "v")] bool verboseOutput)
        {
            SpecFlowProject specFlowProject = MsBuildProjectReader.LoadSpecFlowProjectFromMsBuild(projectFile);
            var             batchGenerator  = new BatchGenerator(Console.Out, verboseOutput);

            batchGenerator.ProcessProject(specFlowProject, forceGeneration);
        }
Exemple #18
0
        public StepDefinitionReportGenerator(StepDefinitionReportParameters reportParameters)
        {
            ReportParameters = reportParameters;

            specFlowProject = MsBuildProjectReader.LoadSpecFlowProjectFromMsBuild(reportParameters.ProjectFile);
            parsedFeatures = ParserHelper.GetParsedFeatures(specFlowProject);

            var basePath = Path.Combine(specFlowProject.ProjectSettings.ProjectFolder, reportParameters.BinFolder);
            bindings = BindingCollector.CollectBindings(specFlowProject, basePath);
        }
Exemple #19
0
        public void InitializeProject(string projectPath, string rootNamespace, IEnumerable <string> generatorPlugins)
        {
            _specFlowProject = MsBuildProjectReader.LoadSpecFlowProjectFromMsBuild(Path.GetFullPath(projectPath), rootNamespace);

            var projectSettings = _specFlowProject.ProjectSettings;

            var testGeneratorFactory = new TestGeneratorFactory();

            _testGenerator = testGeneratorFactory.CreateGenerator(projectSettings, generatorPlugins);
        }
        public StepDefinitionReportGenerator(StepDefinitionReportParameters reportParameters)
        {
            ReportParameters = reportParameters;

            specFlowProject = MsBuildProjectReader.LoadSpecFlowProjectFromMsBuild(reportParameters.ProjectFile);
            parsedSpecFlowDocuments = ParserHelper.GetParsedFeatures(specFlowProject);

            var basePath = Path.Combine(specFlowProject.ProjectSettings.ProjectFolder, reportParameters.BinFolder);
            bindings = BindingCollector.CollectBindings(specFlowProject, basePath);
        }
Exemple #21
0
        public static void GenerateAll(
            [Required(Description = "Visual Studio Project File containing features")] string projectFile,
            [Optional(false, "force", "f")] bool forceGeneration,
            [Optional(false, "verbose", "v")] bool verboseOutput)
        {
            SpecFlowProject specFlowProject = MsBuildProjectReader.LoadSpecFlowProjectFromMsBuild(projectFile);
            ITraceListener  traceListener   = verboseOutput ? (ITraceListener) new TextWriterTraceListener(Console.Out) : new NullListener();
            var             batchGenerator  = new BatchGenerator(traceListener, new TestGeneratorFactory());

            batchGenerator.ProcessProject(specFlowProject, forceGeneration);
        }
        protected virtual ReportElements.NUnitExecutionReport GenerateReport(SpecFlowProject specFlowProject)
        {
            var report = new ReportElements.NUnitExecutionReport();
            report.ProjectName = specFlowProject.ProjectSettings.ProjectName;
            report.GeneratedAt = DateTime.Now.ToString("g", CultureInfo.InvariantCulture);

            XmlDocument xmlTestResult = LoadXmlTestResult();
            report.NUnitXmlTestResult = xmlTestResult.DocumentElement;

            ExtendReport(report);

            return report;
        }
Exemple #23
0
        protected virtual ReportElements.NUnitExecutionReport GenerateReport(SpecFlowProject specFlowProject)
        {
            var report = new ReportElements.NUnitExecutionReport();

            report.ProjectName = specFlowProject.ProjectSettings.ProjectName;
            report.GeneratedAt = DateTime.Now.ToString("g", CultureInfo.InvariantCulture);

            XmlDocument xmlTestResult = LoadXmlTestResult();

            report.NUnitXmlTestResult = xmlTestResult.DocumentElement;

            ExtendReport(report);

            return(report);
        }
        protected override string GenerateCode(string inputFileContent)
        {
            CodeDomProvider provider = GetCodeProvider();

            SpecFlowProject   specFlowProject = DteProjectReader.LoadSpecFlowProjectFromDteProject(CurrentProject);
            SpecFlowGenerator generator       = new SpecFlowGenerator(specFlowProject);

            using (var writer = new StringWriter(new StringBuilder()))
            {
                generator.GenerateTestFile(
                    specFlowProject.GetOrCreateFeatureFile(CodeFilePath),
                    provider, new StringReader(inputFileContent), writer);
                return(writer.ToString());
            }
        }
Exemple #25
0
        public bool ProcessProject(SpecFlowProject specFlowProject, bool forceGenerate)
        {
            traceListener.WriteToolOutput("Processing project: " + specFlowProject.ProjectSettings.ProjectName);
            GenerationSettings generationSettings = GetGenerationSettings(forceGenerate);

            bool success = true;

            using (var generator = CreateGenerator(specFlowProject))
            {
                traceListener.WriteToolOutput("Using Generator: {0}", generator.GetType().FullName);
                foreach (var featureFile in specFlowProject.FeatureFiles)
                {
                    var featureFileInput = CreateFeatureFileInput(featureFile, generator, specFlowProject);
                    var generationResult = GenerateTestFile(generator, featureFileInput, generationSettings);
                    if (!generationResult.Success)
                    {
                        traceListener.WriteToolOutput("{0} -> test generation failed", featureFile.ProjectRelativePath);
                        success = false;
                        if (OnError != null)
                        {
                            OnError(featureFile, generationResult);
                        }
                    }
                    else if (generationResult.IsUpToDate)
                    {
                        traceListener.WriteToolOutput("{0} -> test up-to-date", featureFile.ProjectRelativePath);
                    }
                    else
                    {
                        traceListener.WriteToolOutput("{0} -> test updated", featureFile.ProjectRelativePath);
                        if (OnGenerated != null)
                        {
                            OnGenerated(featureFile, generationResult);
                        }
                    }

                    if (generationResult.Success)
                    {
                        if (OnSuccess != null)
                        {
                            OnSuccess(featureFile, generationResult);
                        }
                    }
                }
            }

            return(success);
        }
        private void TransformReport(ReportElements.NUnitExecutionReport report, SpecFlowProject specFlowProject)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(ReportElements.NUnitExecutionReport), 
                                                         ReportElements.NUnitExecutionReport.XmlNamespace);

            if (XsltHelper.IsXmlOutput(ReportParameters.OutputFile))
            {
                XsltHelper.TransformXml(serializer, report, ReportParameters.OutputFile);
            }
            else
            {
                XsltHelper.TransformHtml(serializer, report, ReportType, 
                                         ReportParameters.OutputFile, specFlowProject.Configuration.GeneratorConfiguration, 
                                         ReportParameters.XsltFile);
            }
        }
Exemple #27
0
        public static void GenerateAll(GenerateAllOptions parameters)
        {
            if (parameters.RequestDebuggerToAttach)
            {
                Debugger.Launch();
            }

            ITraceListener traceListener = parameters.VerboseOutput ? (ITraceListener) new TextWriterTraceListener(Console.Out) : new NullListener();

            SpecFlowProject specFlowProject = MsBuildProjectReader.LoadSpecFlowProjectFromMsBuild(Path.GetFullPath(parameters.ProjectFile));
            var             batchGenerator  = new BatchGenerator(traceListener, new TestGeneratorFactory());

            batchGenerator.OnError += BatchGenerator_OnError;

            batchGenerator.ProcessProject(specFlowProject, parameters.ForceGeneration);
        }
Exemple #28
0
        private void TransformReport(ReportElements.NUnitExecutionReport report, SpecFlowProject specFlowProject)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(ReportElements.NUnitExecutionReport),
                                                         ReportElements.NUnitExecutionReport.XmlNamespace);

            if (XsltHelper.IsXmlOutput(ReportParameters.OutputFile))
            {
                XsltHelper.TransformXml(serializer, report, ReportParameters.OutputFile);
            }
            else
            {
                XsltHelper.TransformHtml(serializer, report, ReportType,
                                         ReportParameters.OutputFile, specFlowProject.Configuration.SpecFlowConfiguration,
                                         ReportParameters.XsltFile);
            }
        }
Exemple #29
0
        public static SpecFlowProject CreateSpecFlowProjectFrom(Project project)
        {
            var specFlowProject = new SpecFlowProject();

            specFlowProject.ProjectSettings.ProjectFolder = project.BaseDirectory;
            specFlowProject.ProjectSettings.ProjectName   = project.Name;

            string defaultNamespace = "Namespace";

            if (project is DotNetProject)
            {
                defaultNamespace = ((DotNetProject)project).GetDefaultNamespace(project.Name);
            }

            // No way to get AssemblyName right now, therefore we'll just use DefaultNamespace
            specFlowProject.ProjectSettings.AssemblyName     = defaultNamespace;
            specFlowProject.ProjectSettings.DefaultNamespace = defaultNamespace;

            // TODO: Find out if we really need to add all the feature files everytime we generate
            foreach (ProjectFile projectFile in project.Files.Where(IsFeatureOrAppConfigFile))
            {
                string extension = Path.GetExtension(projectFile.Name);

                if (extension.Equals(".feature", StringComparison.InvariantCultureIgnoreCase))
                {
                    string fileName            = projectFile.FilePath.ToRelative(project.BaseDirectory);
                    var    featureFile         = new FeatureFileInput(fileName);
                    var    customToolNamespace = projectFile.CustomToolNamespace;

                    if (!String.IsNullOrEmpty(customToolNamespace))
                    {
                        featureFile.CustomNamespace = customToolNamespace;
                    }

                    specFlowProject.FeatureFiles.Add(featureFile);
                }

                if (extension.Equals(".config", StringComparison.InvariantCultureIgnoreCase))
                {
                    string configContent = File.ReadAllText(projectFile.FilePath);
                    GeneratorConfigurationReader.UpdateConfigFromFileContent(specFlowProject.Configuration.GeneratorConfiguration, configContent);
                }
            }

            return(specFlowProject);
        }
Exemple #30
0
        private FilePath GenerateFeatureCodeFileFor(ProjectFile featureFile)
        {
            // TODO: We only support C# for now, later we'll add support to grab the provider based on the project
            CodeDomProvider codeProvider      = new CSharpCodeProvider();
            FilePath        outputFile        = featureFile.FilePath.ChangeExtension(".feature." + codeProvider.FileExtension);
            SpecFlowProject specFlowProject   = MonoDevelopProjectReader.CreateSpecFlowProjectFrom(featureFile.Project);
            var             specFlowGenerator = new SpecFlowGenerator(specFlowProject);

            using (var writer = new StringWriter(new StringBuilder()))
                using (var reader = new StringReader(File.ReadAllText(featureFile.FilePath)))
                {
                    SpecFlowFeatureFile specFlowFeatureFile = specFlowProject.GetOrCreateFeatureFile(featureFile.FilePath);
                    specFlowGenerator.GenerateTestFile(specFlowFeatureFile, codeProvider, reader, writer);
                    File.WriteAllText(outputFile, writer.ToString());
                }

            return(outputFile);
        }
        public SpecFlowProject ReadSpecFlowProject(IProjectReference projectReference)
        {
            var projectFilePath = FileProjectReference.AssertFileProjectReference(projectReference).ProjectFilePath;

            var project = Engine.GlobalEngine.GetLoadedProject(projectFilePath);
            if (project == null)
            {
                project = new Microsoft.Build.BuildEngine.Project();
                project.Load(projectFilePath, ProjectLoadSettings.IgnoreMissingImports);
            }

            string projectFolder = Path.GetDirectoryName(projectFilePath);

            SpecFlowProject specFlowProject = new SpecFlowProject();
            specFlowProject.ProjectSettings.ProjectFolder = projectFolder;
            specFlowProject.ProjectSettings.ProjectName = Path.GetFileNameWithoutExtension(projectFilePath);
            specFlowProject.ProjectSettings.AssemblyName = project.GetEvaluatedProperty("AssemblyName");
            specFlowProject.ProjectSettings.DefaultNamespace = project.GetEvaluatedProperty("RootNamespace");

            var items = project.GetEvaluatedItemsByName("None").Cast<BuildItem>()
                .Concat(project.GetEvaluatedItemsByName("Content").Cast<BuildItem>());
            foreach (BuildItem item in items)
            {
                var extension = Path.GetExtension(item.FinalItemSpec);
                if (extension.Equals(".feature", StringComparison.InvariantCultureIgnoreCase))
                {
                    var featureFile = new FeatureFileInput(item.FinalItemSpec);
                    var ns = item.GetEvaluatedMetadata("CustomToolNamespace");
                    if (!String.IsNullOrEmpty(ns))
                        featureFile.CustomNamespace = ns;
                    specFlowProject.FeatureFiles.Add(featureFile);
                }

                if (Path.GetFileName(item.FinalItemSpec).Equals("app.config", StringComparison.InvariantCultureIgnoreCase))
                {
                    var configFilePath = Path.Combine(projectFolder, item.FinalItemSpec);
                    var configFileContent = File.ReadAllText(configFilePath);
                    var configurationHolder = GetConfigurationHolderFromFileContent(configFileContent);
                    specFlowProject.ProjectSettings.ConfigurationHolder = configurationHolder;
                    specFlowProject.Configuration = configurationLoader.LoadConfiguration(configurationHolder, projectReference);
                }
            }
            return specFlowProject;
        }
Exemple #32
0
        public static void GenerateAll(
            [Required(Description = "Visual Studio Project File containing features")] string projectFile,
            [Optional(false, "force", "f")] bool forceGeneration,
            [Optional(false, "verbose", "v")] bool verboseOutput,
            [Optional(false, "debug", Description = "Used for tool integration")] bool requestDebuggerToAttach)
        {
            if (requestDebuggerToAttach)
            {
                Debugger.Launch();
            }

            SpecFlowProject specFlowProject = MsBuildProjectReader.LoadSpecFlowProjectFromMsBuild(Path.GetFullPath(projectFile));
            ITraceListener  traceListener   = verboseOutput ? (ITraceListener) new TextWriterTraceListener(Console.Out) : new NullListener();
            var             batchGenerator  = new BatchGenerator(traceListener, new TestGeneratorFactory());

            batchGenerator.OnError += batchGenerator_OnError;

            batchGenerator.ProcessProject(specFlowProject, forceGeneration);
        }
		public static SpecFlowProject CreateSpecFlowProjectFrom(Project project)
		{
			var specFlowProject = new SpecFlowProject();
			specFlowProject.ProjectSettings.ProjectFolder = project.BaseDirectory;
            specFlowProject.ProjectSettings.ProjectName = project.Name;
			
			string defaultNamespace = "Namespace";
			if (project is DotNetProject)
			{
				defaultNamespace = ((DotNetProject)project).GetDefaultNamespace(project.Name);
			}
			
			// No way to get AssemblyName right now, therefore we'll just use DefaultNamespace
            specFlowProject.ProjectSettings.AssemblyName = defaultNamespace;
			specFlowProject.ProjectSettings.DefaultNamespace = defaultNamespace;
			
			// TODO: Find out if we really need to add all the feature files everytime we generate
			foreach (ProjectFile projectFile in project.Files.Where(IsFeatureOrAppConfigFile))
			{
				string extension = Path.GetExtension(projectFile.Name);
				
				if (extension.Equals(".feature", StringComparison.InvariantCultureIgnoreCase))
				{
					string fileName = projectFile.FilePath.ToRelative(project.BaseDirectory);
                    var featureFile = new FeatureFileInput(fileName);
					var customToolNamespace = projectFile.CustomToolNamespace;
					
					if (!String.IsNullOrEmpty(customToolNamespace))
						featureFile.CustomNamespace = customToolNamespace;
					
					specFlowProject.FeatureFiles.Add(featureFile);
				}
				
				if (extension.Equals(".config", StringComparison.InvariantCultureIgnoreCase))
				{
					string configContent = File.ReadAllText(projectFile.FilePath);
                    GeneratorConfigurationReader.UpdateConfigFromFileContent(specFlowProject.Configuration.GeneratorConfiguration, configContent);
				}
			}
			
			return specFlowProject;
		}
Exemple #34
0
        public bool ProcessProject(SpecFlowProject specFlowProject, bool forceGenerate)
        {
            traceListener.WriteToolOutput("Processing project: " + specFlowProject.ProjectSettings.ProjectName);
            GenerationSettings generationSettings = GetGenerationSettings(forceGenerate);

            bool success = true;

            using (var generator = CreateGenerator(specFlowProject))
            {
                traceListener.WriteToolOutput("Using Generator: {0}", generator.GetType().FullName);
                foreach (var featureFile in specFlowProject.FeatureFiles)
                {
                    var featureFileInput = CreateFeatureFileInput(featureFile, generator, specFlowProject);
                    var generationResult = GenerateTestFile(generator, featureFileInput, generationSettings);
                    if (!generationResult.Success)
                    {
                        traceListener.WriteToolOutput("{0} -> test generation failed", featureFile.ProjectRelativePath);
                        success = false;
                        if (OnError != null)
                            OnError(featureFile, generationResult);
                    }
                    else if (generationResult.IsUpToDate)
                    {
                        traceListener.WriteToolOutput("{0} -> test up-to-date", featureFile.ProjectRelativePath);
                    }
                    else
                    {
                        traceListener.WriteToolOutput("{0} -> test updated", featureFile.ProjectRelativePath);
                        if (OnGenerated != null)
                            OnGenerated(featureFile, generationResult);
                    }

                    if (generationResult.Success)
                    {
                        if (OnSuccess != null)
                            OnSuccess(featureFile, generationResult);
                    }
                }
            }

            return success;
        }
Exemple #35
0
        public static SpecFlowProject LoadSpecFlowProjectFromMsBuild(string projectFile)
        {
            projectFile = Path.GetFullPath(projectFile);
            Project project = new Project();

            project.Load(projectFile, ProjectLoadSettings.IgnoreMissingImports);

            string projectFolder = Path.GetDirectoryName(projectFile);

            SpecFlowProject specFlowProject = new SpecFlowProject();

            specFlowProject.ProjectFolder    = projectFolder;
            specFlowProject.ProjectName      = Path.GetFileNameWithoutExtension(projectFile);
            specFlowProject.AssemblyName     = project.GetEvaluatedProperty("AssemblyName");
            specFlowProject.DefaultNamespace = project.GetEvaluatedProperty("RootNamespace");

            var items = project.GetEvaluatedItemsByName("None").Cast <BuildItem>()
                        .Concat(project.GetEvaluatedItemsByName("Content").Cast <BuildItem>());

            foreach (BuildItem item in items)
            {
                var extension = Path.GetExtension(item.FinalItemSpec);
                if (extension.Equals(".feature", StringComparison.InvariantCultureIgnoreCase))
                {
                    var featureFile = new SpecFlowFeatureFile(item.FinalItemSpec);
                    var ns          = item.GetEvaluatedMetadata("CustomToolNamespace");
                    if (!String.IsNullOrEmpty(ns))
                    {
                        featureFile.CustomNamespace = ns;
                    }
                    specFlowProject.FeatureFiles.Add(featureFile);
                }

                if (Path.GetFileName(item.FinalItemSpec).Equals("app.config", StringComparison.InvariantCultureIgnoreCase))
                {
                    GeneratorConfigurationReader.UpdateConfigFromFile(specFlowProject.GeneratorConfiguration, Path.Combine(projectFolder, item.FinalItemSpec));
                }
            }
            return(specFlowProject);
        }
Exemple #36
0
        internal static List <BindingInfo> CollectBindings(SpecFlowProject specFlowProject, string basePath)
        {
            List <BindingInfo> bindings = new List <BindingInfo>();
            var reportingFolder         = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

            AppDomainSetup appDomainSetup = new AppDomainSetup();

            appDomainSetup.ApplicationBase = reportingFolder;
            AppDomain appDomain = AppDomain.CreateDomain("CollectBindings", null, appDomainSetup);

            AssemblyServices.SubscribeAssemblyResolve(appDomain, basePath);

            BindingCollector bindingCollector =
                (BindingCollector)appDomain.CreateInstanceAndUnwrap(
                    Assembly.GetExecutingAssembly().GetName().FullName,
                    typeof(BindingCollector).FullName);

            bindings.AddRange(bindingCollector.CollectBindings(specFlowProject.AssemblyName));

            AppDomain.Unload(appDomain);
            return(bindings);
        }
Exemple #37
0
        public void ProcessProject(SpecFlowProject specFlowProject, bool forceGenerate)
        {
            if (verboseOutput)
            {
                traceWriter.WriteLine("Processing project: " + specFlowProject);
            }

            SpecFlowGenerator generator = new SpecFlowGenerator(specFlowProject);

            foreach (var featureFile in specFlowProject.FeatureFiles)
            {
                string featureFileFullPath = featureFile.GetFullPath(specFlowProject);

                string codeFileFullPath = featureFileFullPath + ".cs";

                bool needsProcessing = true;

                if (!forceGenerate && IsUpToDate(generator, featureFileFullPath, codeFileFullPath))
                {
                    needsProcessing = false;
                }

                if (verboseOutput || needsProcessing)
                {
                    traceWriter.WriteLine("Processing file: {0}", featureFileFullPath);
                    if (!needsProcessing)
                    {
                        traceWriter.WriteLine("  up-to-date");
                    }
                }

                if (needsProcessing)
                {
                    GenerateFile(generator, featureFile, codeFileFullPath);
                }
            }
        }
Exemple #38
0
        static void Configure(SpecFlowProject specFlowProject, SourceAssemblyProbe sourceAssemblyProbe)
        {
            const string defaultConfiguration = @"<?xml version=""1.0"" encoding=""utf-8""?>
<configuration>
  <configSections>
    <section name=""specFlow"" type=""TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow"" />
  </configSections>
  <specFlow>
    <unitTestProvider name=""SpecRun"" />
    <plugins>    
      <add name=""SpecRun"" />
    </plugins>
</specFlow>
</configuration>";

            var configurationContent = sourceAssemblyProbe.HasSpecFlowConfigured
                                        ? File.ReadAllText(sourceAssemblyProbe.AssemblyPath + ".config")
                                        : defaultConfiguration;

            var configurationHolderFromFileContent = GetConfigurationHolderFromContent(configurationContent);

            specFlowProject.ProjectSettings.ConfigurationHolder = configurationHolderFromFileContent;
            specFlowProject.Configuration = new GeneratorConfigurationProvider().LoadConfiguration(configurationHolderFromFileContent);
        }
Exemple #39
0
 protected virtual ITestGenerator CreateGenerator(SpecFlowProject specFlowProject)
 {
     return testGeneratorFactory.CreateGenerator(specFlowProject.ProjectSettings);
 }
Exemple #40
0
        internal static List<BindingInfo> CollectBindings(SpecFlowProject specFlowProject, string basePath)
        {
            List<BindingInfo> bindings = new List<BindingInfo>();
            var reportingFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

            AppDomainSetup appDomainSetup = new AppDomainSetup();
            appDomainSetup.ApplicationBase = reportingFolder;
            AppDomain appDomain = AppDomain.CreateDomain("CollectBindings", null, appDomainSetup);

            AssemblyServices.SubscribeAssemblyResolve(appDomain, basePath);
            
            BindingCollector bindingCollector = 
                (BindingCollector)appDomain.CreateInstanceAndUnwrap(
                                      Assembly.GetExecutingAssembly().GetName().FullName,
                                      typeof(BindingCollector).FullName);

            bindings.AddRange(bindingCollector.CollectBindings(specFlowProject.ProjectSettings.AssemblyName));

            AppDomain.Unload(appDomain);
            return bindings;
        }
Exemple #41
0
 public static List<Feature> GetParsedFeatures(SpecFlowProject specFlowProject)
 {
     return GetParsedFeatures(specFlowProject.FeatureFiles.Select(ff => ff.GetFullPath(specFlowProject.ProjectSettings)),
         specFlowProject.Configuration.GeneratorConfiguration.FeatureLanguage);
 }
 protected virtual ReportElements.NUnitExecutionReport GenerateReport(SpecFlowProject specFlowProject)
 {
     return GenerateReport(specFlowProject.ProjectSettings.ProjectName);
 }
        public static SpecFlowProject LoadSpecFlowProjectFromDteProject(Project project)
        {
            string projectFolder = Path.GetDirectoryName(project.FullName);

            SpecFlowProject specFlowProject = new SpecFlowProject();
            specFlowProject.ProjectSettings.ProjectFolder = projectFolder;
            specFlowProject.ProjectSettings.ProjectName = Path.GetFileNameWithoutExtension(project.FullName);
            specFlowProject.ProjectSettings.AssemblyName = project.Properties.Item("AssemblyName").Value as string;
            specFlowProject.ProjectSettings.DefaultNamespace = project.Properties.Item("DefaultNamespace").Value as string;

            foreach (ProjectItem projectItem in GetAllProjectItem(project).Where(IsPhysicalFile))
            {
                var fileName = GetRelativePath(GetFileName(projectItem), projectFolder);

                var extension = Path.GetExtension(fileName);
                if (extension.Equals(".sfeature", StringComparison.InvariantCultureIgnoreCase))
                {
                    var featureFile = new FeatureFileInput(fileName);
                    var ns = projectItem.Properties.Item("CustomToolNamespace").Value as string;
                    if (!String.IsNullOrEmpty(ns))
                        featureFile.CustomNamespace = ns;
                    specFlowProject.FeatureFiles.Add(featureFile);
                }

                if (Path.GetFileName(fileName).Equals("app.config", StringComparison.InvariantCultureIgnoreCase))
                {
                    GeneratorConfigurationReader.UpdateConfigFromFileContent(specFlowProject.Configuration.GeneratorConfiguration, GetFileContent(projectItem));
                }

            }
            return specFlowProject;
        }
 public SpecFlowGenerator(SpecFlowProject project)
 {
     this.project = project;
 }
Exemple #45
0
 protected virtual FeatureFileInput CreateFeatureFileInput(FeatureFileInput featureFile, ITestGenerator generator, SpecFlowProject specFlowProject)
 {
     return(featureFile);
 }
Exemple #46
0
 protected virtual FeatureFileInput CreateFeatureFileInput(FeatureFileInput featureFile, ITestGenerator generator, SpecFlowProject specFlowProject)
 {
     return featureFile;
 }