BenchPress/Generators/TestGenerator.cs (80 lines of code) (raw):
using Stubble.Core.Builders;
using Generators.LanguageProviders;
namespace Generators;
public class TestGenerator
{
ILanguageProvider LanguageProvider { get; }
public TestGenerator(ILanguageProvider language)
{
LanguageProvider = language;
}
// Generate a test snippet from a test definition and razor template file.
public string Generate(IEnumerable<TestDefinition> definitions, string templateFile)
{
var template = File.ReadAllText(templateFile);
var viewModels = new List<object>();
foreach (var definition in definitions)
{
object viewModel;
switch (definition.Type)
{
case TestType.ResourceExists:
viewModel = GenerateResourceExistsViewModel(definition, template);
break;
default:
throw new Exception($"Unknown test type: {definition.Type}");
}
viewModels.Add(viewModel);
}
var resourceTypes = new List<object>();
foreach (var resourceType in definitions.Select(d => d.Metadata.ResourceType).Distinct())
{
var library = LanguageProvider.Library(resourceType);
resourceTypes.Add(new { Library = library });
}
var stubble = new StubbleBuilder().Build();
var output = stubble.Render(
template,
new { TestCases = viewModels, ResourceTypes = resourceTypes }
);
return output;
}
private TestViewModel GenerateResourceExistsViewModel(
TestDefinition definition,
string template
)
{
var parameters = GetParameters(definition);
return new TestViewModel
{
Parameters = parameters,
Name = LanguageProvider.Escape(
$"Verify that {definition.Metadata.ResourceType.FriendlyName} exists"
),
Description = LanguageProvider.Escape(
$"It should contain a {definition.Metadata.ResourceType.FriendlyName} named {definition.Metadata.ResourceName}"
),
FunctionName = LanguageProvider.SDK(new SDKFunction(definition)),
AssertionDetails = LanguageProvider.AssertionDetails(definition.Type)
};
}
private struct TestViewModel
{
public IEnumerable<KeyValuePair<string, string>> Parameters { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string FunctionName { get; set; }
public string AssertionDetails { get; set; }
}
private IEnumerable<KeyValuePair<string, string>> GetParameters(TestDefinition definition)
{
return definition.Metadata.ResourceType
.GetResourceParameters(definition.Metadata)
.Select(
p =>
new KeyValuePair<string, string>(
LanguageProvider.Parameter(p.Key),
LanguageProvider.Value(p.Value)
)
);
}
}