BenchPress/Generators/Program.cs (82 lines of code) (raw):

using Generators; using Generators.LanguageProviders; using Generators.ResourceTypes; using System.CommandLine; using System.Linq; var importFileOption = new Option<FileInfo?>( name: "--import", description: "The bicep file to import and scaffold tests for" ); var outputFolderOption = new Option<DirectoryInfo?>( name: "--output", description: "Path that output will be saved" ); var languageProviderOption = new Option<LanguageProviderOptions>( name: "--provider", description: "Language provider that will be used to generate test files" ); var rootCommand = new RootCommand("Test Generator for Bicep and ARM Templates"); rootCommand.AddOption(importFileOption); rootCommand.AddOption(languageProviderOption); rootCommand.AddOption(outputFolderOption); rootCommand.SetHandler( (fileInfo, outputFolder, languageProvider) => { if (fileInfo is null) return; if (languageProvider == LanguageProviderOptions.Undefined) return; var testFilePath = outputFolder?.FullName ?? Path.GetFullPath("output"); if (!Directory.Exists(testFilePath)) { Directory.CreateDirectory(testFilePath); } ILanguageProvider provider = languageProvider switch { LanguageProviderOptions.Powershell => new PowershellLanguageProvider(), _ => throw new NotImplementedException(), }; var generator = new TestGenerator(provider); var metadataList = AzureDeploymentImporter.Import(fileInfo, testFilePath); var testList = new List<TestDefinition>(); var testGroups = new List<IEnumerable<TestDefinition>>(); foreach (var metadata in metadataList) { foreach (var supportedTestType in metadata.ResourceType.GetSupportedTestTypes()) { testList.Add(new TestDefinition(metadata, supportedTestType)); } } AppDomain.CurrentDomain .GetAssemblies() .SelectMany(domainAssembly => domainAssembly.GetTypes()) .Where(type => typeof(ResourceType).IsAssignableFrom(type) && !type.IsAbstract) .ToList() .ForEach(type => { testGroups.Add(testList.Where(t => t.Metadata.ResourceType.GetType() == type)); }); testGroups.Add( testList.Where(t => t.Metadata.ResourceType.GetType() == typeof(ResourceGroup)) ); foreach (var group in testGroups) { if (!group.Any()) continue; var testsOutput = generator.Generate(group, provider.GetTemplateFileName()); var testFileName = group.First().Metadata.ResourceType.Prefix + ".Tests.ps1"; var testFileFullName = Path.Join(testFilePath, testFileName); File.WriteAllText(testFileFullName, testsOutput); } }, importFileOption, outputFolderOption, languageProviderOption ); await rootCommand.InvokeAsync(args); public enum LanguageProviderOptions { Undefined, Powershell, NodeJs, }