using System.Collections.Generic;
using System.Threading.Tasks;
using Moq;
using Util.Generators.Contexts;
using Util.Generators.Logs;
using Util.Generators.Resources;
using Util.Generators.Templates;
using Xunit;
namespace Util.Generators.Tests {
///
/// 生成器测试
///
public class GeneratorTest {
///
/// 生成器
///
private Generators.Generator _generator;
///
/// 模拟生成器上下文构建器
///
private readonly Mock _mockGeneratorContextBuilder;
///
/// 模拟模板查找器
///
private readonly Mock _mockTemplateFinder;
///
/// 模拟静态资源管理器
///
private readonly Mock _mockResourceManager;
///
/// 测试初始化
///
public GeneratorTest() {
_mockGeneratorContextBuilder = new Mock();
_mockTemplateFinder = new Mock();
_mockResourceManager = new Mock();
}
///
/// 测试生成 - 1个项目,1个实体,1个模板
///
[Fact]
public async Task TestGenerate_1() {
var path = "a";
//创建生成器上下文
var generatorContext = new GeneratorContext { TemplateRootPath = path, OutputRootPath = "b" };
var projectContext = new ProjectContext( generatorContext ) { Name = "project", Enabled = true, };
projectContext.Entities.Add( new EntityContext( projectContext, "entity1" ) );
generatorContext.Projects.Add( projectContext );
//设置模拟操作
_mockGeneratorContextBuilder.Setup( t => t.BuildAsync() ).Returns( Task.FromResult(generatorContext) );
var mockTemplate = new Mock();
_mockTemplateFinder.Setup( t => t.Find( path, It.IsAny() ) ).Returns( new List { mockTemplate.Object } );
//执行生成
_generator = new Generators.Generator( NullGeneratorLogger.Instance, _mockGeneratorContextBuilder.Object, _mockTemplateFinder.Object, _mockResourceManager.Object );
await _generator.GenerateAsync();
//验证
mockTemplate.Verify( t => t.RenderAsync( It.IsAny() ), Times.Once );
}
///
/// 测试生成 - 1个项目,1个实体,2个模板
///
[Fact]
public async Task TestGenerate_2() {
var path = "a";
//创建生成器上下文
var generatorContext = new GeneratorContext { TemplateRootPath = path, OutputRootPath = "b" };
var projectContext = new ProjectContext( generatorContext ) { Name = "project", Enabled = true, };
projectContext.Entities.Add( new EntityContext( projectContext, "entity1" ) );
generatorContext.Projects.Add( projectContext );
//设置模拟操作
_mockGeneratorContextBuilder.Setup( t => t.BuildAsync() ).Returns( Task.FromResult( generatorContext ) );
var mockTemplate = new Mock();
var mockTemplate2 = new Mock();
_mockTemplateFinder.Setup( t => t.Find( path, It.IsAny() ) ).Returns( new List { mockTemplate.Object, mockTemplate2.Object } );
//执行生成
_generator = new Generator( NullGeneratorLogger.Instance, _mockGeneratorContextBuilder.Object, _mockTemplateFinder.Object, _mockResourceManager.Object );
await _generator.GenerateAsync();
//验证
mockTemplate.Verify( t => t.RenderAsync( It.IsAny() ), Times.Once );
mockTemplate2.Verify( t => t.RenderAsync( It.IsAny() ), Times.Once );
}
///
/// 测试生成 - 1个项目,2个实体,1个模板 - 执行2次
///
[Fact]
public async Task TestGenerate_3() {
var path = "a";
//创建生成器上下文
var generatorContext = new GeneratorContext { TemplateRootPath = path, OutputRootPath = "b" };
var projectContext = new ProjectContext( generatorContext ) { Name = "project", Enabled = true, };
projectContext.Entities.Add( new EntityContext( projectContext, "entity1" ) );
projectContext.Entities.Add( new EntityContext( projectContext, "entity2" ) );
generatorContext.Projects.Add( projectContext );
//设置模拟操作
_mockGeneratorContextBuilder.Setup( t => t.BuildAsync() ).Returns( Task.FromResult( generatorContext ) );
var mockTemplate = new Mock();
_mockTemplateFinder.Setup( t => t.Find( path, It.IsAny() ) ).Returns( new List { mockTemplate.Object } );
//执行生成
_generator = new Generator( NullGeneratorLogger.Instance, _mockGeneratorContextBuilder.Object, _mockTemplateFinder.Object, _mockResourceManager.Object );
await _generator.GenerateAsync();
//验证
mockTemplate.Verify( t => t.RenderAsync( It.IsAny() ), Times.Exactly( 2 ) );
}
///
/// 测试生成 - 1个项目,2个实体,2个模板 - 每个模板执行2次
///
[Fact]
public async Task TestGenerate_4() {
var path = "a";
//创建生成器上下文
var generatorContext = new GeneratorContext { TemplateRootPath = path, OutputRootPath = "b" };
var projectContext = new ProjectContext( generatorContext ) { Name = "project", Enabled = true, };
projectContext.Entities.Add( new EntityContext( projectContext, "entity1" ) );
projectContext.Entities.Add( new EntityContext( projectContext, "entity2" ) );
generatorContext.Projects.Add( projectContext );
//设置模拟操作
_mockGeneratorContextBuilder.Setup( t => t.BuildAsync() ).Returns( Task.FromResult( generatorContext ) );
var mockTemplate = new Mock();
var mockTemplate2 = new Mock();
_mockTemplateFinder.Setup( t => t.Find( path, It.IsAny() ) ).Returns( new List { mockTemplate.Object, mockTemplate2.Object } );
//执行生成
_generator = new Generator( NullGeneratorLogger.Instance, _mockGeneratorContextBuilder.Object, _mockTemplateFinder.Object, _mockResourceManager.Object );
await _generator.GenerateAsync();
//验证
mockTemplate.Verify( t => t.RenderAsync( It.IsAny() ), Times.Exactly( 2 ) );
mockTemplate2.Verify( t => t.RenderAsync( It.IsAny() ), Times.Exactly( 2 ) );
}
///
/// 测试生成 - 2个项目,4个实体,2个模板 - 每个模板执行4次
///
[Fact]
public async Task TestGenerate_5() {
var path = "a";
//创建生成器上下文
var generatorContext = new GeneratorContext { TemplateRootPath = path, OutputRootPath = "b" };
//创建项目上下文
var projectContext = new ProjectContext( generatorContext ) { Name = "project", Enabled = true, };
projectContext.Entities.Add( new EntityContext( projectContext, "entity1" ) );
projectContext.Entities.Add( new EntityContext( projectContext, "entity2" ) );
generatorContext.Projects.Add( projectContext );
//创建项目上下文2
var projectContext2 = new ProjectContext( generatorContext ) { Name = "project2", Enabled = true, };
projectContext2.Entities.Add( new EntityContext( projectContext2, "entity3" ) );
projectContext2.Entities.Add( new EntityContext( projectContext2, "entity4" ) );
generatorContext.Projects.Add( projectContext2 );
//设置模拟操作
_mockGeneratorContextBuilder.Setup( t => t.BuildAsync() ).Returns( Task.FromResult( generatorContext ) );
var mockTemplate = new Mock();
var mockTemplate2 = new Mock();
_mockTemplateFinder.Setup( t => t.Find( path, It.IsAny() ) ).Returns( new List { mockTemplate.Object, mockTemplate2.Object } );
//执行生成
_generator = new Generator( NullGeneratorLogger.Instance, _mockGeneratorContextBuilder.Object, _mockTemplateFinder.Object, _mockResourceManager.Object );
await _generator.GenerateAsync();
//验证
mockTemplate.Verify( t => t.RenderAsync( It.IsAny() ), Times.Exactly( 4 ) );
mockTemplate2.Verify( t => t.RenderAsync( It.IsAny() ), Times.Exactly( 4 ) );
}
///
/// 测试生成 - 1个项目,项目已禁用,不生成
///
[Fact]
public async Task TestGenerate_6() {
var path = "a";
//创建生成器上下文
var generatorContext = new GeneratorContext { TemplateRootPath = path, OutputRootPath = "b" };
var projectContext = new ProjectContext( generatorContext ) { Name = "project", Enabled = false, };
projectContext.Entities.Add( new EntityContext( projectContext, "entity1" ) );
generatorContext.Projects.Add( projectContext );
//设置模拟操作
_mockGeneratorContextBuilder.Setup( t => t.BuildAsync() ).Returns( Task.FromResult( generatorContext ) );
var mockTemplate = new Mock();
_mockTemplateFinder.Setup( t => t.Find( path, It.IsAny() ) ).Returns( new List { mockTemplate.Object } );
//执行生成
_generator = new Generator( NullGeneratorLogger.Instance, _mockGeneratorContextBuilder.Object, _mockTemplateFinder.Object, _mockResourceManager.Object );
await _generator.GenerateAsync();
//验证
mockTemplate.Verify( t => t.RenderAsync( It.IsAny() ), Times.Never );
}
///
/// 测试生成 - 2个项目,第一个项目已禁用
///
[Fact]
public async Task TestGenerate_7() {
var path = "a";
//创建生成器上下文
var generatorContext = new GeneratorContext { TemplateRootPath = path, OutputRootPath = "b" };
//创建项目上下文
var projectContext = new ProjectContext( generatorContext ) { Name = "project", Enabled = false, };
projectContext.Entities.Add( new EntityContext( projectContext, "entity1" ) );
projectContext.Entities.Add( new EntityContext( projectContext, "entity2" ) );
generatorContext.Projects.Add( projectContext );
//创建项目上下文2
var projectContext2 = new ProjectContext( generatorContext ) { Name = "project2", Enabled = true, };
projectContext2.Entities.Add( new EntityContext( projectContext2, "entity3" ) );
projectContext2.Entities.Add( new EntityContext( projectContext2, "entity4" ) );
generatorContext.Projects.Add( projectContext2 );
//设置模拟操作
_mockGeneratorContextBuilder.Setup( t => t.BuildAsync() ).Returns( Task.FromResult( generatorContext ) );
var mockTemplate = new Mock();
var mockTemplate2 = new Mock();
_mockTemplateFinder.Setup( t => t.Find( path, It.IsAny() ) ).Returns( new List { mockTemplate.Object, mockTemplate2.Object } );
//执行生成
_generator = new Generator( NullGeneratorLogger.Instance, _mockGeneratorContextBuilder.Object, _mockTemplateFinder.Object, _mockResourceManager.Object );
await _generator.GenerateAsync();
//验证
mockTemplate.Verify( t => t.RenderAsync( It.IsAny() ), Times.Exactly( 2 ) );
mockTemplate2.Verify( t => t.RenderAsync( It.IsAny() ), Times.Exactly( 2 ) );
}
///
/// 测试生成 - 导入静态资源
///
[Fact]
public async Task TestGenerate_8() {
var templateRootPath = "a";
var outputRootPath = "b";
var project = "project";
//创建生成器上下文
var generatorContext = new GeneratorContext { TemplateRootPath = templateRootPath, OutputRootPath = outputRootPath };
//创建项目上下文
var projectContext = new ProjectContext( generatorContext ) { Name = project, Enabled = true };
generatorContext.Projects.Add( projectContext );
//设置模拟操作
_mockGeneratorContextBuilder.Setup( t => t.BuildAsync() ).Returns( Task.FromResult( generatorContext ) );
var mockTemplate = new Mock();
_mockTemplateFinder.Setup( t => t.Find( templateRootPath, It.IsAny() ) ).Returns( new List { mockTemplate.Object } );
//执行生成
_generator = new Generator( NullGeneratorLogger.Instance, _mockGeneratorContextBuilder.Object, _mockTemplateFinder.Object, _mockResourceManager.Object );
await _generator.GenerateAsync();
//验证
_mockResourceManager.Verify( t => t.ImportsAsync( templateRootPath, outputRootPath, projectContext ) );
}
}
}