public CompilationDriver(Compiler compiler, SolutionWriteToDiskDriver solutionWriteToDiskDriver, CompilationResultDriver compilationResultDriver) { _compiler = compiler; _solutionWriteToDiskDriver = solutionWriteToDiskDriver; _compilationResultDriver = compilationResultDriver; }
static int Main(string[] args) { // Create a root command with some options var rootCommand = new RootCommand { new Option <DirectoryInfo>( "--out-dir", "The root directory of the code generation output. Default: current directory."), new Option <string>( "--sln-name", "The name of the generated solution (directory and sln file). Default: random string."), new Option <string>( "--specflow-nuget-version", () => DefaultSpecFlowNuGetVersion, $"The SpecFlow NuGet version referenced in the generated project. Default: '{DefaultSpecFlowNuGetVersion}'."), new Option <UnitTestProvider>( "--unit-test-provider", () => DefaultUnitTestProvider, $"The unit test provider used in the generated project. Default: '{DefaultUnitTestProvider}'."), new Option <TargetFramework>( "--target-framework", () => DefaultTargetFramework, $"The target framework of the generated project. Default: '{DefaultTargetFramework}'."), new Option <string>( "--sdk-version", $"The sdk version used in the global.json of the generated project. Default: based on a default mapping from the target framework."), new Option <ProjectFormat>( "--project-format", () => DefaultProjectFormat, $"The project format of the generated project file. Default: '{DefaultProjectFormat}'."), new Option <ConfigurationFormat>( "--configuration-format", () => DefaultConfigurationFormat, $"The format of the generated SpecFlow configuration file. Default: '{DefaultConfigurationFormat}'."), new Option <string>( "--specrun-nuget-version", () => DefaultSpecRunNuGetVersion, $"The SpecRun NuGet version referenced in the generated project (if SpecRun is used as unit test provider). Default: '{DefaultSpecRunNuGetVersion}'."), new Option <int>( "--feature-count", () => 1, $"Number of feature files to generate. Default: 1"), }; rootCommand.Description = "SpecFlow Test Project Generator"; // Note that the parameters of the handler method are matched according to the names of the options rootCommand.Handler = CommandHandler.Create <GenerateSolutionParams>( (generateSolutionParams) => { var services = ConfigureServices(); services.AddSingleton(s => new SolutionConfiguration { OutDir = generateSolutionParams.OutDir, SolutionName = generateSolutionParams.SlnName }); services.AddSingleton(s => new TestRunConfiguration { ProgrammingLanguage = ProgrammingLanguage.CSharp, UnitTestProvider = generateSolutionParams.UnitTestProvider, ConfigurationFormat = generateSolutionParams.ConfigurationFormat, ProjectFormat = generateSolutionParams.ProjectFormat, TargetFramework = generateSolutionParams.TargetFramework, }); Func <string, Version> getRunnerSpecFlowVersion = (string specflowNuGetVersion) => { var m = new Regex("^(\\d+)\\.(\\d+)").Match(specflowNuGetVersion); return(new Version(int.Parse(m.Groups[1].Value), int.Parse(m.Groups[2].Value), 0)); }; services.AddSingleton(s => new CurrentVersionDriver { SpecFlowNuGetVersion = generateSolutionParams.SpecFlowNuGetVersion.ToString(), SpecFlowVersion = getRunnerSpecFlowVersion(generateSolutionParams.SpecFlowNuGetVersion), NuGetVersion = generateSolutionParams.SpecrunNuGetVersion.ToString() }); services.AddSingleton <GenerateSolutionParams>(s => generateSolutionParams); var serviceProvider = services.BuildServiceProvider(); SolutionWriteToDiskDriver d = serviceProvider.GetService <SolutionWriteToDiskDriver>(); //Create test project var pd = serviceProvider.GetService <ProjectsDriver>(); var pb = pd.CreateProject("Proj1", "C#"); var projectContentGenerator = serviceProvider.GetService <IProjectContentGenerator>(); projectContentGenerator.Generate(pb); var sd = serviceProvider.GetService <SolutionDriver>(); //Remove local NuGet source sd.NuGetSources.Clear(); sd.SdkVersion = generateSolutionParams.SdkVersion; d.WriteSolutionToDisk(); }); // Parse the incoming args and invoke the handler return(rootCommand.InvokeAsync(args).Result); }