diff --git a/FreeSql.Tests/FreeSql.Tests/QuestDb/Crud/QuestDbTestInsertAndUpdate.cs b/FreeSql.Tests/FreeSql.Tests/QuestDb/Crud/QuestDbTestInsertAndUpdate.cs new file mode 100644 index 00000000..f0b5883b --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/QuestDb/Crud/QuestDbTestInsertAndUpdate.cs @@ -0,0 +1,213 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FreeSql.Tests.QuestDb.QuestDbTestModel; +using FreeSql.Tests.QuestDb.Utils; +using Xunit; +using static FreeSql.Tests.QuestDb.QuestDbTest; + +namespace FreeSql.Tests.QuestDb.Crud +{ + [TestCaseOrderer("FreeSql.Tests.QuestDb.Utils.TestOrders", "FreeSql.Tests")] + public class QuestDbTestInsertAndUpdate + { + [Fact,Order(1)] + public async Task TestInsertAsync() + { + var result = await fsql.Insert(new QuestDb_Model_Test01() + { + Primarys = Guid.NewGuid().ToString(), + CreateTime = DateTime.Now, + Activos = 100.21, + Id = "IdAsync", + IsCompra = true, + NameInsert = "NameInsert", + NameUpdate = "NameUpdate" + }).ExecuteAffrowsAsync(); + Assert.True(result > 0); + } + + [Fact, Order(2)] + public async Task TestInsertBatchAsync() + { + var list = new List() + { + new QuestDb_Model_Test01() + { + Primarys = Guid.NewGuid().ToString(), + CreateTime = DateTime.Now, + Activos = 100.21, + Id = "1", + IsCompra = true, + NameInsert = "NameInsertAsync", + NameUpdate = "NameUpdate" + }, + new QuestDb_Model_Test01() + { + Primarys = Guid.NewGuid().ToString(), + CreateTime = DateTime.Now, + Activos = 100.21, + Id = "2", + IsCompra = true, + NameInsert = "NameInsertAsync", + NameUpdate = "NameUpdate" + }, + new QuestDb_Model_Test01() + { + Primarys = Guid.NewGuid().ToString(), + CreateTime = DateTime.Now, + Activos = 100.21, + Id = "3", + IsCompra = true, + NameInsert = "NameInsertAsync", + NameUpdate = "NameUpdate" + }, + }; + var result = await fsql.Insert(list).ExecuteAffrowsAsync(); + Assert.True(result > 0); + } + + [Fact, Order(3)] + public async Task TestInsertInsertColumnsAsync() + { + var list = new List() + { + new QuestDb_Model_Test01() + { + Primarys = Guid.NewGuid().ToString(), + CreateTime = DateTime.Now, + Activos = 100.21, + Id = "1", + IsCompra = true, + NameInsert = "NameInsert", + NameUpdate = "NameUpdate" + }, + new QuestDb_Model_Test01() + { + Primarys = Guid.NewGuid().ToString(), + CreateTime = DateTime.Now, + Activos = 100.21, + Id = "2", + IsCompra = true, + NameInsert = "NameInsert", + NameUpdate = "NameUpdate" + }, + new QuestDb_Model_Test01() + { + Primarys = Guid.NewGuid().ToString(), + CreateTime = DateTime.Now, + Activos = 100.21, + Id = "3", + IsCompra = true, + NameInsert = "NameInsert", + NameUpdate = "NameUpdate" + }, + }; + var result = await fsql.Insert(list).IgnoreColumns(q => q.NameInsert).ExecuteAffrowsAsync(); + Assert.True(result > 0); + } + + [Fact, Order(4)] + public void TestNormalUpdate() + { + var updateTime = DateTime.Now; + var updateObj = fsql.Update() + .Set(q => q.NameUpdate, "UpdateNow") + // .Set(q => q.CreateTime, DateTime.Now) 分表的时间不可以随便改 + .Where(q => q.Id == "1"); + var updateSql = updateObj.ToSql(); + Debug.WriteLine(updateSql); + var sql = + $@"UPDATE ""QuestDb_Model_Test01"" SET ""NameUpdate"" = 'UpdateNow' +WHERE (""Id"" = '1')"; + Debug.WriteLine(sql); + Assert.Equal(updateSql, sql); + var result = updateObj.ExecuteAffrows(); + Assert.True(result > 0); + } + + [Fact, Order(5)] + public void TestUpdateByModel() + { + var primary = Guid.NewGuid().ToString(); + //先插入 + fsql.Insert(new QuestDb_Model_Test01() + { + Primarys = primary, + CreateTime = DateTime.Now, + Activos = 100.21, + Id = primary, + IsCompra = true, + NameInsert = "NameInsert", + NameUpdate = "NameUpdate" + }).ExecuteAffrows(); + var updateModel = new QuestDb_Model_Test01 + { + Primarys = primary, + Id = primary, + Activos = 12.65, + }; + var updateObj = fsql.Update().SetSourceIgnore(updateModel, o => o == null); + var sql = updateObj.ToSql(); + Debug.WriteLine(sql); + var result = updateObj.ExecuteAffrows(); + var resultAsync = fsql.Update().SetSourceIgnore(updateModel, o => o == null) + .ExecuteAffrows(); + Assert.True(result > 0); + Assert.True(resultAsync > 0); + Assert.Equal( + @$"UPDATE ""QuestDb_Model_Test01"" SET ""Primarys"" = '{primary}', ""NameInsert"" = 'NameDefault', ""Activos"" = 12.65 +WHERE (""Id"" = '{primary}')", sql); + } + + [Fact, Order(6)] + public async Task TestUpdateIgnoreColumnsAsync() + { + var primary = Guid.NewGuid().ToString(); + var updateTime = DateTime.Now; + //先插入 + fsql.Insert(new QuestDb_Model_Test01() + { + Primarys = primary, + CreateTime = DateTime.Now, + Activos = 100.21, + Id = primary, + IsCompra = true, + NameInsert = "NameInsert", + NameUpdate = "NameUpdate" + }).ExecuteAffrows(); + var updateModel = new QuestDb_Model_Test01 + { + Id = primary, + Activos = 12.65, + IsCompra = true, + CreateTime = DateTime.Now + }; + var updateObj = fsql.Update().SetSource(updateModel) + .IgnoreColumns(q => new { q.Id, q.CreateTime }); + var sql = updateObj.ToSql(); + Debug.WriteLine(sql); + var result = updateObj.ExecuteAffrows(); + var resultAsync = await fsql.Update().SetSource(updateModel) + .IgnoreColumns(q => new { q.Id, q.CreateTime }).ExecuteAffrowsAsync(); + Assert.True(result > 0); + Assert.True(resultAsync > 0); + Assert.Equal( + $@"UPDATE ""QuestDb_Model_Test01"" SET ""Primarys"" = NULL, ""NameUpdate"" = NULL, ""NameInsert"" = 'NameDefault', ""Activos"" = 12.65, ""UpdateTime"" = NULL, ""IsCompra"" = True +WHERE (""Id"" = '{primary}')", sql); + } + + [Fact, Order(7)] + public async Task TestUpdateToUpdateAsync() + { + //官网demo有问题,暂时放弃此功能 + var result = await fsql.Select().Where(q => q.Id == "IdAsync" && q.NameInsert == null) + .ToUpdate() + .Set(q => q.UpdateTime, DateTime.Now) + .ExecuteAffrowsAsync(); + } + } +} \ No newline at end of file diff --git a/FreeSql.Tests/FreeSql.Tests/QuestDb/Crud/QuestDbTestSelect.cs b/FreeSql.Tests/FreeSql.Tests/QuestDb/Crud/QuestDbTestSelect.cs new file mode 100644 index 00000000..3334f0ab --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/QuestDb/Crud/QuestDbTestSelect.cs @@ -0,0 +1,184 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FreeSql.DataAnnotations; +using FreeSql.Tests.QuestDb.QuestDbTestModel; +using NetTopologySuite.Operation.Valid; +using Xunit; +using static FreeSql.Tests.QuestDb.QuestDbTest; + +namespace FreeSql.Tests.QuestDb.Crud +{ + public class QuestDbTestSelect + { + [Fact] + public void TestNormal() + { + var sql = fsql.Select().ToSql(); + Debug.WriteLine(sql); + Assert.Equal( + @"SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra"" +FROM ""QuestDb_Model_Test01"" a", sql); + + var sqlWhere = fsql.Select().Where(q => + q.UpdateTime.Value.BetweenEnd(DateTime.Parse("2023-02-17 09:35:00"), + DateTime.Parse("2023-02-17 10:20:00"))).ToSql(); + Debug.WriteLine(sqlWhere); + Assert.Equal( + @"SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra"" +FROM ""QuestDb_Model_Test01"" a +WHERE (a.""UpdateTime"" >= '2023-02-17 09:35:00.000000' and a.""UpdateTime"" < '2023-02-17 10:20:00.000000')", + sqlWhere); + } + + [Theory] + [InlineData(1)] + [InlineData(2)] + [InlineData(3)] + public void TestPageAndCount(int page) + { + var pageSize = 5; + var select = fsql.Select().Count(out var total).Page(page, pageSize); + var sql = select.ToSql(); + Debug.WriteLine(sql); + switch (page) + { + case 1: + Assert.Equal( + @"SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra"" +FROM ""QuestDb_Model_Test01"" a +limit 5", sql); + break; + case 2: + Assert.Equal( + @"SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra"" +FROM ""QuestDb_Model_Test01"" a +limit 5,10", sql); + break; + case 3: + Assert.Equal( + @"SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra"" +FROM ""QuestDb_Model_Test01"" a +limit 10,15", sql); + break; + } + } + + [Fact] + public void TestNavigation() + { + var select = fsql.Select() + .LeftJoin(a => a.Category.Id == a.CategoryId) + .LeftJoin(a => a.Category.Parent.Id == a.Category.ParentId) + .Where(a => a.Category.Parent.Id > 0); + var sql = select.ToSql(); + select.ToList(); + Debug.WriteLine(sql); + Assert.Equal( + @"SELECT a.""Id"", a.""Title"", a.""Clicks"", a.""CreateTime"", a.""CategoryId"", a__Category.""Id"" as6, a__Category.""Name"", a__Category.""ParentId"" +FROM ""Topic"" a +LEFT JOIN ""Category"" a__Category ON a__Category.""Id"" = a.""CategoryId"" +LEFT JOIN ""CategoryType"" a__Category__Parent ON a__Category__Parent.""Id"" = a__Category.""ParentId"" +WHERE (a__Category__Parent.""Id"" > 0)", sql); + } + + [Fact] + public void TestComplexJoin() + { + var select = fsql.Select() + .LeftJoin(w => w.t1.CategoryId == w.t2.Id) + .LeftJoin(w => w.t2.ParentId == w.t3.Id) + .Where(w => w.t3.Id > 0); + var sql = select.ToSql(w => new { w.t1, w.t2, w.t3 }); + Debug.WriteLine(sql); + select.ToList(w => new { w.t1, w.t2, w.t3 }); + Assert.Equal( + @"SELECT a.""Id"" as1, a.""Title"" as2, a.""Clicks"" as3, a.""CreateTime"" as4, a.""CategoryId"" as5, b.""Id"" as6, b.""Name"" as7, b.""ParentId"" as8, c.""Id"" as9, c.""Name"" as10 +FROM ""Topic"" a +LEFT JOIN ""Category"" b ON a.""CategoryId"" = b.""Id"" +LEFT JOIN ""CategoryType"" c ON b.""ParentId"" = c.""Id"" +WHERE (c.""Id"" > 0)", sql); + } + + [Fact] + public void TestUnionAll() + { + var select = fsql.Select().Where(a => a.IsCompra == true) + .UnionAll( + fsql.Select().Where(a => a.IsCompra == true), + fsql.Select().Where(a => a.IsCompra == true) + ) + .Where(a => a.IsCompra == true); + var sql = select.ToSql(); + Debug.WriteLine(sql); + select.ToList(); + Assert.Equal( + @"SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra"" +FROM ( SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra"" + FROM ""QuestDb_Model_Test01"" a + WHERE (a.""IsCompra"" = True) + UNION ALL + SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra"" + FROM ""QuestDb_Model_Test01"" a + WHERE (a.""IsCompra"" = True) + UNION ALL + SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra"" + FROM ""QuestDb_Model_Test01"" a + WHERE (a.""IsCompra"" = True) ) a +WHERE (a.""IsCompra"" = True)", sql); + } + + [Fact] + public void TestSampleBy() + { + var selectSql = fsql.Select() + .SampleBy(1, SampleUnits.d) + .WithTempQuery(q => new { q.Id, q.Activos, count = SqlExt.Count(q.Id).ToValue() }) + .Where(q => q.Id != "1") + .ToSql(); + Debug.WriteLine(selectSql); + var sql = @"SELECT * +FROM ( + SELECT a.""Id"", a.""Activos"", count(a.""Id"") ""count"" + FROM ""QuestDb_Model_Test01"" a +SAMPLE BY 1d + ) a +WHERE (a.""Id"" <> '1')"; + Assert.Equal(selectSql, sql); + } + + [Fact] + public void TestLatestOn() + { + var selectSql = fsql.Select() + .LatestOn(q => q.CreateTime, q => new { q.Id, q.NameUpdate }) + .ToSql(); + Debug.WriteLine(selectSql); + var sql = + @"SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra"" +FROM ""QuestDb_Model_Test01"" a +LATEST ON CreateTime PARTITION BY Id,NameUpdate "; + Assert.Equal(selectSql, sql); + } + + [Fact] + public void TestGroup() + { + //QUEDTDB的GroupBy PostgrSql有所不同 + var selectSql = fsql.Select() + .WithTempQuery(q => new { q.Id, q.Activos, count = SqlExt.Count(q.Id).ToValue() }) + .Where(q => q.Id != "1" && q.count > 1) + .ToSql(); + Debug.WriteLine(selectSql); + var sql = @"SELECT * +FROM ( + SELECT a.""Id"", a.""Activos"", count(a.""Id"") ""count"" + FROM ""QuestDb_Model_Test01"" a ) a +WHERE (a.""Id"" <> '1' AND a.""count"" > 1)"; + Assert.Equal(selectSql, sql); + } + } +} \ No newline at end of file diff --git a/FreeSql.Tests/FreeSql.Tests/QuestDb/Crud/QuestDbTestUpdate.cs b/FreeSql.Tests/FreeSql.Tests/QuestDb/Crud/QuestDbTestUpdate.cs new file mode 100644 index 00000000..c70c30e2 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/QuestDb/Crud/QuestDbTestUpdate.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FreeSql.Tests.QuestDb.QuestDbTestModel; +using FreeSql.Tests.QuestDb.Utils; +using Xunit; +using static FreeSql.Tests.QuestDb.QuestDbTest; + +namespace FreeSql.Tests.QuestDb.Crud +{ + [TestCaseOrderer("FreeSql.Tests.QuestDb.Utils.TestOrders", "FreeSql.Tests")] + public class QuestDbTestUpdate + { + //多线程以及questdb问题转移至 insert中测试 + } +} \ No newline at end of file diff --git a/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbCodeFirstTest.cs new file mode 100644 index 00000000..56e63072 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbCodeFirstTest.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FreeSql.DataAnnotations; +using FreeSql.Provider.QuestDb.Subtable; +using FreeSql.Tests.QuestDb.QuestDbTestModel; +using Xunit; +using static FreeSql.Tests.QuestDb.QuestDbTest; + +namespace FreeSql.Tests.QuestDb +{ + public class QuestDbCodeFirstTest + { + [Fact] + public void Test_SyncStructure() + { + fsql.CodeFirst.SyncStructure(); + fsql.CodeFirst.SyncStructure(typeof(Topic)); + fsql.CodeFirst.SyncStructure(typeof(Category)); + fsql.CodeFirst.SyncStructure(typeof(CategoryType)); + } + + [Fact] + public void Test_SyncStructure_Type() + { + fsql.CodeFirst.SyncStructure(); + var result = fsql.Insert(new QuestDb_Model_Type01() + { + TestBool = false, + TestDecimal = (decimal?)153.02, + TestDouble = 152.61, + TestInt = 1, + TestLong = 1569212, + TestShort = 2, + TestString = "string", + TestTime = DateTime.Now + }).ExecuteAffrows(); + Assert.Equal(1, result); + } + } +} \ No newline at end of file diff --git a/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbDbFirstTest.cs new file mode 100644 index 00000000..7e2bb11e --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbDbFirstTest.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FreeSql.Tests.QuestDb.QuestDbTestModel; +using Xunit; + +namespace FreeSql.Tests.QuestDb +{ + public class QuestDbDbFirstTest + { + [Fact] + public void Test_ExistsTable() + { + var existsTable = QuestDbTest.fsql.DbFirst.ExistsTable(nameof(QuestDb_Model_Test01)); + } + + [Fact] + public void Test_GetTablesByDatabase() + { + var tablesByDatabase = QuestDbTest.fsql.DbFirst.GetTablesByDatabase(""); + tablesByDatabase.ForEach(d => + { + Debug.WriteLine(d.Name); + }); + } + + } +} diff --git a/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbTest.cs b/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbTest.cs new file mode 100644 index 00000000..59441ad2 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbTest.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FreeSql.Tests.QuestDb +{ + public class QuestDbTest + { + public static IFreeSql fsql = new FreeSql.FreeSqlBuilder() + .UseConnectionString(FreeSql.DataType.QuestDb, + @"host=192.168.0.36;port=8812;username=admin;password=quest;database=qdb;ServerCompatibilityMode=NoTypeLoading;") + .UseMonitorCommand(cmd => Debug.WriteLine($"Sql:{cmd.CommandText}")) //监听SQL语句 + .UseNoneCommandParameter(true) + .Build(); + } +} \ No newline at end of file diff --git a/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbTestModel/QuestDb_Model_SelectTest.cs b/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbTestModel/QuestDb_Model_SelectTest.cs new file mode 100644 index 00000000..6c067dd6 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbTestModel/QuestDb_Model_SelectTest.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FreeSql.DataAnnotations; + +namespace FreeSql.Tests.QuestDb.QuestDbTestModel +{ + public class Topic + { + [Column(IsIdentity = true)] public int Id { get; set; } + public string Title { get; set; } + public int Clicks { get; set; } + public DateTime CreateTime { get; set; } + + public int CategoryId { get; set; } + public Category Category { get; set; } + } + + public class Category + { + [Column(IsIdentity = true)] public int Id { get; set; } + public string Name { get; set; } + + public int ParentId { get; set; } + public CategoryType Parent { get; set; } + public List Topics { get; set; } + } + + public class CategoryType + { + public int Id { get; set; } + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbTestModel/QuestDb_Model_Test01.cs b/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbTestModel/QuestDb_Model_Test01.cs new file mode 100644 index 00000000..491f35ea --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbTestModel/QuestDb_Model_Test01.cs @@ -0,0 +1,31 @@ +using FreeSql.Provider.QuestDb.Subtable; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FreeSql.DataAnnotations; + +namespace FreeSql.Tests.QuestDb.QuestDbTestModel +{ + [Index("Id_Index", nameof(Id), false)] + class QuestDb_Model_Test01 + { + public string Primarys { get; set; } + + [Column(DbType = "symbol",IsPrimary = true)] public string Id { get; set; } + + [Column(OldName = "Name")] public string NameUpdate { get; set; } + + public string NameInsert { get; set; } = "NameDefault"; + + public double? Activos { get; set; } + + [AutoSubtable(SubtableType.Day)] public DateTime? CreateTime { get; set; } + + public DateTime? UpdateTime { get; set; } + + public bool? IsCompra { get; set; } + } +} \ No newline at end of file diff --git a/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbTestModel/QuestDb_Model_Type01.cs b/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbTestModel/QuestDb_Model_Type01.cs new file mode 100644 index 00000000..944cbaef --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/QuestDb/QuestDbTestModel/QuestDb_Model_Type01.cs @@ -0,0 +1,31 @@ +using FreeSql.Provider.QuestDb.Subtable; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FreeSql.DataAnnotations; + +namespace FreeSql.Tests.QuestDb.QuestDbTestModel +{ + class QuestDb_Model_Type01 + { + public string TestString { get; set; } + + public decimal? TestDecimal { get; set; } + + public short TestShort { get; set; } + + public int TestInt { get; set; } + + public long TestLong { get; set; } + + public double TestDouble { get; set; } + + [AutoSubtable(SubtableType.Day)] + public DateTime? TestTime { get; set; } + + public bool? TestBool { get; set; } + } +} \ No newline at end of file diff --git a/FreeSql.Tests/FreeSql.Tests/QuestDb/Utils/OrderAttribute.cs b/FreeSql.Tests/FreeSql.Tests/QuestDb/Utils/OrderAttribute.cs new file mode 100644 index 00000000..0ca23a66 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/QuestDb/Utils/OrderAttribute.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FreeSql.Tests.QuestDb.Utils +{ + /// + /// 测试方法的执行顺序 + /// + [AttributeUsage(AttributeTargets.Method)] + public class OrderAttribute : Attribute + { + /// + /// 顺序 + /// + public int Sort + { + get; set; + } + public OrderAttribute(int sort) + { + this.Sort = sort; + } + } +} diff --git a/FreeSql.Tests/FreeSql.Tests/QuestDb/Utils/TestOrders.cs b/FreeSql.Tests/FreeSql.Tests/QuestDb/Utils/TestOrders.cs new file mode 100644 index 00000000..41dfd8e8 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/QuestDb/Utils/TestOrders.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit.Abstractions; +using Xunit.Sdk; + +namespace FreeSql.Tests.QuestDb.Utils +{ + /// + /// 单元测试的排序策略 + /// + public class TestOrders : ITestCaseOrderer + { + /// + /// 执行顺序 + /// + /// + /// + /// + public IEnumerable OrderTestCases(IEnumerable testCases) where TTestCase : ITestCase + { + string typeName = typeof(OrderAttribute).AssemblyQualifiedName; + var result = testCases.ToList(); + result.Sort((x, y) => + { + var xOrder = x.TestMethod.Method.GetCustomAttributes(typeName)?.FirstOrDefault(); + if (xOrder == null) + { + return 0; + } + var yOrder = y.TestMethod.Method.GetCustomAttributes(typeName)?.FirstOrDefault(); + if (yOrder == null) + { + return 0; + } + var sortX = xOrder.GetNamedArgument("Sort"); + var sortY = yOrder.GetNamedArgument("Sort"); + //按照Order标签上的Sort属性,从小到大的顺序执行 + return sortX - sortY; + }); + return result; + } + } +}