using System; using System.Data; using System.Threading.Tasks; using Util.Data; using Util.Data.Dapper.Metadata; using Util.Generators.Configuration; using Util.Generators.Contexts; using Util.Generators.Logs; using Util.Generators.Tests.Mocks; using Xunit; namespace Util.Generators.Tests.Contexts { /// /// 生成器上下文构建器测试 /// public class GeneratorContextBuilderTest { /// /// 生成器上下文 /// private GeneratorContext _context; /// /// 测试初始化 /// public GeneratorContextBuilderTest() { _context = new GeneratorContextBuilder( NullGeneratorLogger.Instance, new MockGeneratorOptionsBuilder(), new MockMetadataServiceFactory(), new TypeConverterFactory() ).BuildAsync().Result; } /// /// 测试生成器上下文 - 相对路径 /// [Fact] public void TestGeneratorContext_Path_1() { Assert.Equal( $"{AppContext.BaseDirectory}Templates", _context.TemplateRootPath ); Assert.Equal( $"{AppContext.BaseDirectory}Output", _context.OutputRootPath ); } /// /// 测试生成器上下文 - 绝对路径 /// [Fact] public async Task TestGeneratorContext_Path_2() { _context = await new GeneratorContextBuilder( NullGeneratorLogger.Instance, new MockGeneratorOptionsBuilder2(), new MockMetadataServiceFactory(), new TypeConverterFactory() ).BuildAsync(); Assert.Equal( @"c:\Templates", _context.TemplateRootPath ); Assert.Equal( @"d:\Output", _context.OutputRootPath ); } /// /// 测试项目名称 /// [Fact] public void TestProjectContext_Name() { var projectContext = _context.Projects[0]; Assert.Equal( "Test", projectContext.Name ); var projectContext2 = _context.Projects[1]; Assert.Equal( "Test2", projectContext2.Name ); } /// /// 测试项目工作单元名称 /// [Fact] public void TestProjectContext_UnitOfWorkName() { var projectContext = _context.Projects[0]; Assert.Equal( "UnitOfWork", projectContext.UnitOfWorkName ); var projectContext2 = _context.Projects[1]; Assert.Equal( "UnitOfWork2", projectContext2.UnitOfWorkName ); } /// /// 测试项目客户端 /// [Fact] public void TestProjectContext_Client() { var projectContext = _context.Projects[0]; Assert.Equal( "ClientApp", projectContext.Client.AppName ); Assert.Equal( "1", projectContext.Client.Port ); var projectContext2 = _context.Projects[1]; Assert.Equal( "ClientApp2", projectContext2.Client.AppName ); Assert.Equal( "2", projectContext2.Client.Port ); } /// /// 测试项目数据库类型 /// [Fact] public void TestProjectContext_DbType() { var projectContext = _context.Projects[0]; Assert.Equal( DatabaseType.SqlServer, projectContext.DbType ); var projectContext2 = _context.Projects[1]; Assert.Equal( DatabaseType.PgSql, projectContext2.DbType ); } /// /// 测试项目目标数据库类型 /// [Fact] public void TestProjectContext_TargetDbType() { var projectContext = _context.Projects[0]; Assert.Equal( DatabaseType.PgSql, projectContext.TargetDbType ); var projectContext2 = _context.Projects[1]; Assert.Equal( DatabaseType.PgSql, projectContext2.TargetDbType ); } /// /// 测试项目连接字符串 /// [Fact] public void TestProjectContext_ConnectionString() { var projectContext = _context.Projects[0]; Assert.Equal( "TestConnection", projectContext.ConnectionString ); var projectContext2 = _context.Projects[1]; Assert.Equal( "TestConnection2", projectContext2.ConnectionString ); } /// /// 测试项目是否启用 /// [Fact] public void TestProjectContext_Enabled() { var projectContext = _context.Projects[0]; Assert.True( projectContext.Enabled ); var projectContext2 = _context.Projects[1]; Assert.True( projectContext2.Enabled ); var projectContext3 = _context.Projects[2]; Assert.False( projectContext3.Enabled ); } /// /// 测试项目是否启用Utc /// [Fact] public void TestProjectContext_Utc() { var projectContext = _context.Projects[0]; Assert.True( projectContext.Utc ); var projectContext2 = _context.Projects[1]; Assert.True( projectContext2.Utc ); var projectContext3 = _context.Projects[2]; Assert.False( projectContext3.Utc ); } /// /// 测试项目是否启用多语言 /// [Fact] public void TestProjectContext_I18n() { var projectContext = _context.Projects[0]; Assert.True( projectContext.I18n ); var projectContext2 = _context.Projects[1]; Assert.True( projectContext2.I18n ); var projectContext3 = _context.Projects[2]; Assert.False( projectContext3.I18n ); } /// /// 测试项目类型 /// [Fact] public void TestProjectContext_ProjectType() { var projectContext = _context.Projects[0]; Assert.Equal( ProjectType.WebApi, projectContext.ProjectType ); var projectContext2 = _context.Projects[1]; Assert.Equal( ProjectType.Ui, projectContext2.ProjectType ); } /// /// 测试Web Api项目端口 /// [Fact] public void TestProjectContext_ApiPort() { var projectContext = _context.Projects[0]; Assert.Equal( "123", projectContext.ApiPort ); var projectContext2 = _context.Projects[1]; Assert.Equal( "456", projectContext2.ApiPort ); } /// /// 测试UI项目端口 /// [Fact] public void TestProjectContext_UiPort() { var projectContext = _context.Projects[0]; Assert.Equal( "666", projectContext.UiPort ); var projectContext2 = _context.Projects[1]; Assert.Equal( "888", projectContext2.UiPort ); } /// /// 测试是否启用架构 /// [Fact] public void TestProjectContext_EnableSchema() { var projectContext = _context.Projects[0]; Assert.True( projectContext.EnableSchema ); var projectContext2 = _context.Projects[1]; Assert.True( projectContext2.EnableSchema ); } /// /// 测试项目扩展 /// [Fact] public void TestProjectContext_Extend() { var projectContext = _context.Projects[0]; Assert.Equal( "Extend1", projectContext.Extend ); var projectContext2 = _context.Projects[1]; Assert.Equal( "Extend2", projectContext2.Extend ); } /// /// 测试项目架构列表 /// [Fact] public void TestProjectContext_Schemas() { var projectContext = _context.Projects[0]; Assert.Equal( 2, projectContext.Schemas.Count ); Assert.Equal( "TestSchema", projectContext.Schemas[0] ); Assert.Equal( "TestSchema2", projectContext.Schemas[1] ); var projectContext2 = _context.Projects[1]; Assert.Equal( 2, projectContext2.Schemas.Count ); } /// /// 测试实体架构 /// [Fact] public void TestEntityContext_Schema() { var projectContext = _context.Projects[0]; Assert.Equal( "TestSchema", projectContext.Entities[0].Schema ); Assert.Equal( "TestSchema2", projectContext.Entities[1].Schema ); var projectContext2 = _context.Projects[1]; Assert.Equal( "TestSchema3", projectContext2.Entities[0].Schema ); Assert.Equal( "TestSchema4", projectContext2.Entities[1].Schema ); } /// /// 测试实体描述 /// [Fact] public void TestEntityContext_Description() { var projectContext = _context.Projects[0]; Assert.Equal( "TestComment", projectContext.Entities[0].Description ); Assert.Equal( "TestComment2", projectContext.Entities[1].Description ); var projectContext2 = _context.Projects[1]; Assert.Equal( "TestComment3", projectContext2.Entities[0].Description ); Assert.Equal( "TestComment4", projectContext2.Entities[1].Description ); } /// /// 测试实体上下文根路径 /// [Fact] public void TestEntityContext_RootPath() { var projectContext = _context.Projects[0]; Assert.Equal( @$"{GetBaseDirectory()}Output/Test", projectContext.Entities[0].Output.RootPath.Replace( "\\", "/" ) ); Assert.Equal( @$"{GetBaseDirectory()}Output/Test", projectContext.Entities[1].Output.RootPath.Replace( "\\", "/" ) ); var projectContext2 = _context.Projects[1]; Assert.Equal( @$"{GetBaseDirectory()}Output/Test2", projectContext2.Entities[0].Output.RootPath.Replace( "\\", "/" ) ); Assert.Equal( @$"{GetBaseDirectory()}Output/Test2", projectContext2.Entities[1].Output.RootPath.Replace( "\\", "/" ) ); } /// /// 获取基路径 /// private string GetBaseDirectory() { return AppContext.BaseDirectory.Replace( "\\", "/" ); } /// /// 测试实体上下文输出文件名 /// [Fact] public void TestEntityContext_FileNameNoExtension() { var projectContext = _context.Projects[0]; Assert.Equal( "TestName", projectContext.Entities[0].Output.FileNameNoExtension ); Assert.Equal( "TestName2", projectContext.Entities[1].Output.FileNameNoExtension ); var projectContext2 = _context.Projects[1]; Assert.Equal( "TestName3", projectContext2.Entities[0].Output.FileNameNoExtension ); Assert.Equal( "TestName4", projectContext2.Entities[1].Output.FileNameNoExtension ); } /// /// 测试实体上下文路径 - 命名约定 /// [Fact] public void TestEntityContext_Path_NamingConvention() { var projectContext = _context.Projects[0]; var entityContext = projectContext.Entities[0]; entityContext.Output.FileNameNoExtension = "testName"; entityContext.Output.Extension = ".ts"; entityContext.Output.NamingConvention = NamingConvention.PascalCase; Assert.Equal( @$"{GetBaseDirectory()}Output/Test/TestName.ts", entityContext.Output.Path.Replace( "\\","/" ) ); var entityContext2 = projectContext.Entities[1]; entityContext2.Output.FileNameNoExtension = "TestName"; entityContext2.Output.Extension = ".ts"; entityContext2.Output.NamingConvention = NamingConvention.CamelCase; Assert.Equal( @$"{GetBaseDirectory()}Output/Test/testName.ts", entityContext2.Output.Path.Replace( "\\", "/" ) ); } /// /// 测试实体上下文属性列表 /// [Fact] public void TestEntityContext_Properties() { var projectContext = _context.Projects[0]; Assert.Equal( 2, projectContext.Entities[0].Properties.Count ); Assert.Equal( 2, projectContext.Entities[1].Properties.Count ); var property = projectContext.Entities[0].Properties[0]; Assert.Equal( "TestColumn", property.Name ); Assert.Equal( "TestComment", property.Description ); } /// /// 测试实体上下文标识列 /// [Fact] public void TestEntityContext_Key() { var projectContext = _context.Projects[0]; var entity = projectContext.Entities[0]; var property = entity.Properties[0]; Assert.Equal( "TestColumn", property.Name ); Assert.False( property.IsKey ); var property2 = entity.Properties[1]; Assert.Equal( "TestColumn2", property2.Name ); Assert.True( property2.IsKey ); Assert.Equal( "TestColumn2", entity.Key.Name ); } /// /// 测试实体上下文自增列 /// [Fact] public void TestEntityContext_IsAutoIncrement() { var projectContext = _context.Projects[0]; var entity = projectContext.Entities[0]; var property = entity.Properties[0]; Assert.Equal( "TestColumn", property.Name ); Assert.False( property.IsAutoIncrement ); var property2 = entity.Properties[1]; Assert.Equal( "TestColumn2", property2.Name ); Assert.True( property2.IsAutoIncrement ); } /// /// 测试属性类型 /// [Fact] public void TestProperty_Type() { var projectContext = _context.Projects[0]; var entity = projectContext.Entities[0]; var property = entity.Properties[0]; Assert.Equal( "TestColumn", property.Name ); Assert.Equal( DbType.String, property.Type ); Assert.Equal( SystemType.String, property.SystemType ); Assert.Equal( "nvarchar", property.NativeType ); var property2 = entity.Properties[1]; Assert.Equal( "TestColumn2", property2.Name ); Assert.Equal( DbType.AnsiString, property2.Type ); Assert.Equal( SystemType.String, property2.SystemType ); Assert.Equal( "varchar", property2.NativeType ); } /// /// 测试属性必填项 /// [Fact] public void TestProperty_IsRequired() { var projectContext = _context.Projects[0]; var entity = projectContext.Entities[1]; var property = entity.Properties[0]; Assert.Equal( "TestColumn3", property.Name ); Assert.False( property.IsRequired ); var property2 = entity.Properties[1]; Assert.Equal( "TestColumn4", property2.Name ); Assert.True( property2.IsRequired ); } /// /// 测试属性最大长度 /// [Fact] public void TestProperty_MaxLength() { var projectContext = _context.Projects[0]; var entity = projectContext.Entities[0]; var property = entity.Properties[0]; Assert.Equal( "TestColumn", property.Name ); Assert.Equal( 200, property.MaxLength ); } /// /// 测试属性精度 /// [Fact] public void TestProperty_Precision() { var projectContext = _context.Projects[0]; var entity = projectContext.Entities[1]; var property = entity.Properties[0]; Assert.Equal( "TestColumn3", property.Name ); Assert.Equal( 5, property.Precision ); Assert.Equal( 2, property.Scale ); } /// /// 测试生成器上下文 - 消息 /// [Fact] public void TestGeneratorContext_Message() { Assert.Equal( "Required_Message", _context.Message.RequiredMessage ); Assert.Equal( "MaxLength_Message", _context.Message.MaxLengthMessage ); } } }