123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481 |
- using System.Linq;
- using Microsoft.VisualStudio.TestTools.UnitTesting;
- using Vit.Core.Module.Serialization;
- using Vit.Linq.QueryBuilder;
- using Vit.Extensions.Linq_Extensions;
- namespace Vit.Linq.MsTest.QueryBuilder
- {
- [TestClass]
- public class Queryable_QueryBuilder_Test
- {
- IQueryable<ModelA> GetQueryable() => DataSource.GetQueryable();
- [TestMethod]
- public void Test_ToList()
- {
- var query = GetQueryable();
- #region Count ToList ToArray
- {
- int count = query.Count();
- Assert.AreEqual(1000, count);
- var list1 = query.ToList<ModelA>();
- Assert.AreEqual(1000, list1.Count);
- var list2 = query.ToList();
- Assert.AreEqual(1000, list2.Count);
- var array1 = query.ToArray<ModelA>();
- Assert.AreEqual(1000, array1.Length);
- var array2 = query.ToArray();
- Assert.AreEqual(1000, array2.Length);
- }
- #endregion
- }
- [TestMethod]
- public void Test_OperatorMap()
- {
- {
- var query = GetQueryable();
- QueryBuilderService.Instance.AddOperatorMap("Equal", FilterRuleOperator.Equal);
- var strRule = "{'field':'isEven', 'operator': 'eQual', 'value':true }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(result.Count, 500);
- Assert.AreEqual(0, result[0].id);
- }
- }
- #region Test_FilterRule
- [TestMethod]
- public void Test_FilterRule()
- {
- #region #1 [object] IsNull | IsNotNull
- #region ##1 IsNull
- {
- var query = GetQueryable();
- var item = query.Skip(10).FirstOrDefault();
- item.name = null;
- var strRule = "{'field':'name', 'operator': 'IsNull' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1, result.Count);
- Assert.AreEqual(10, result[0].id);
- }
- #endregion
- #region ##2 IsNotNull
- {
- var query = GetQueryable();
- var item = query.Skip(10).FirstOrDefault();
- item.name = null;
- var strRule = "{'field':'name', 'operator': 'IsNotNull' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(999, result.Count);
- }
- #endregion
- #endregion
- #region #2 [number | string | bool] compare
- #region ##1.1 [number] =
- {
- // ###1
- {
- var query = GetQueryable();
- var strRule = "{'field':'id', 'operator': '=', 'value':10 }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1, result.Count);
- Assert.AreEqual(10, result[0].id);
- }
- // ###2
- {
- var query = GetQueryable();
- var strRule = "{'field':'id', 'operator': '=', 'value': '10' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1, result.Count);
- Assert.AreEqual(10, result[0].id);
- }
- // ###3 = null
- {
- var query = GetQueryable();
- var item = query.Skip(10).FirstOrDefault();
- item.pid = null;
- var strRule = "{'field':'pid', 'operator': '=', 'value': null }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).FirstOrDefault();
- Assert.AreEqual(10, result.id);
- }
- }
- #endregion
- #region ##1.2 [bool] =
- {
- // ###1
- {
- var query = GetQueryable();
- var strRule = "{'field':'isEven', 'operator': '=', 'value':true }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(result.Count, 500);
- Assert.AreEqual(0, result[0].id);
- }
- // ###2
- {
- var query = GetQueryable();
- var strRule = "{'field':'isEven', 'operator': '=', 'value': 'false' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(result.Count, 500);
- Assert.AreEqual(1, result[0].id);
- }
- }
- #endregion
- #region ##2.1 [number] !=
- {
- // ###1
- {
- var query = GetQueryable();
- var strRule = "{'field':'id', 'operator': '!=', 'value':10 }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(999, result.Count);
- }
- // ###2 != null
- {
- var query = GetQueryable();
- var item = query.Skip(10).FirstOrDefault();
- item.pid = null;
- var strRule = "{'field':'pid', 'operator': '!=', 'value': null }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(999, result.Count);
- }
- }
- #endregion
- #region ##2.2 [bool] !=
- {
- // ###1
- {
- var query = GetQueryable();
- var strRule = "{'field':'isEven', 'operator': '!=', 'value':true }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(result.Count, 500);
- Assert.AreEqual(1, result[0].id);
- }
- // ###2
- {
- var query = GetQueryable();
- var strRule = "{'field':'isEven', 'operator': '!=', 'value': 'false' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(result.Count, 500);
- Assert.AreEqual(0, result[0].id);
- }
- }
- #endregion
- #region ##3 [number] > <
- {
- {
- var query = GetQueryable();
- var strRule = @"{'condition':'and', 'rules':[
- {'field':'id', 'operator': '>', 'value':10 },
- {'field':'id', 'operator': '<', 'value': '20' }
- ]}".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(9, result.Count);
- Assert.AreEqual(11, result[0].id);
- }
- }
- #endregion
- #region ##4 [number] >= <=
- {
- {
- var query = GetQueryable();
- var strRule = @"{'condition':'and', 'rules':[
- {'field':'id', 'operator': '>=', 'value':10 },
- {'field':'id', 'operator': '<=', 'value': '20' }
- ]}".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(11, result.Count);
- Assert.AreEqual(10, result[0].id);
- }
- }
- #endregion
- #endregion
- #region #3 In | NotIn
- #region ##1 In
- {
- {
- var query = GetQueryable();
- var strRule = "{'field':'id', 'operator': 'In', 'value': [3,4,5] }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(3, result.Count);
- Assert.AreEqual(5, result[2].id);
- }
- {
- var query = GetQueryable();
- var strRule = "{'field':'name', 'operator': 'In', 'value': [ 'name3', 'name4'] }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(2, result.Count);
- Assert.AreEqual("name3", result[0].name);
- }
- {
- var query = GetQueryable();
- query.FirstOrDefault().name = null;
- var strRule = @"{'condition':'or', 'rules':[
- {'field':'name', 'operator': 'IsNull' },
- {'field':'name', 'operator': 'In', 'value': [ 'name3', 'name4'] }
- ]}".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(3, result.Count);
- Assert.AreEqual(null, result[0].name);
- Assert.AreEqual("name4", result[2].name);
- }
- }
- #endregion
- #region ##2 NotIn
- {
- var query = GetQueryable();
- query.FirstOrDefault().name = null;
- var strRule = @"{'condition':'and', 'rules':[
- {'field':'name', 'operator': 'IsNotNull' },
- {'field':'name', 'operator': 'NotIn', 'value': [ 'name3', 'name4'] }
- ]}".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(997, result.Count);
- }
- #endregion
- #endregion
- #region #4 [string] operate
- #region ##1 Contains
- {
- var query = GetQueryable();
- var strRule = "{'field':'name', 'operator': 'Contains', 'value': '987' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1, result.Count);
- Assert.AreEqual(987, result.First().id);
- }
- #endregion
- #region ##2 NotContains
- {
- //###1
- {
- var query = GetQueryable();
- var strRule = "{'field':'name', 'operator': 'NotContains', 'value': '987' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(999, result.Count);
- }
- //###2
- {
- var query = GetQueryable();
- query.Skip(987).FirstOrDefault().name = null;
- var strRule = "{'field':'name', 'operator': 'NotContains', 'value': '987' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1000, result.Count);
- }
- //###3
- {
- var query = GetQueryable();
- query.Skip(987).FirstOrDefault().name = "";
- var strRule = "{'field':'name', 'operator': 'NotContains', 'value': '987' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1000, result.Count);
- }
- }
- #endregion
- #region ##3 StartsWith
- {
- var query = GetQueryable();
- var strRule = "{'field':'name', 'operator': 'StartsWith', 'value': 'name98' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(11, result.Count);
- }
- #endregion
- #region ##4 EndsWith
- {
- var query = GetQueryable();
- var strRule = "{'field':'name', 'operator': 'EndsWith', 'value': '987' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1, result.Count);
- }
- #endregion
- #region ##5 IsNullOrEmpty
- {
- //###1
- {
- var query = GetQueryable();
- query.Skip(10).FirstOrDefault().name = null;
- var strRule = "{'field':'name', 'operator': 'IsNullOrEmpty' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1, result.Count);
- }
- //###2
- {
- var query = GetQueryable();
- query.Skip(10).FirstOrDefault().name = "";
- var strRule = "{'field':'name', 'operator': 'IsNullOrEmpty' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1, result.Count);
- }
- }
- #endregion
- #region ##6 IsNotNullOrEmpty
- {
- //###1
- {
- var query = GetQueryable();
- query.Skip(10).FirstOrDefault().name = null;
- var strRule = "{'field':'name', 'operator': 'IsNotNullOrEmpty' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(999, result.Count);
- }
- //###2
- {
- var query = GetQueryable();
- query.Skip(10).FirstOrDefault().name = "";
- var strRule = "{'field':'name', 'operator': 'IsNotNullOrEmpty' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(999, result.Count);
- }
- }
- #endregion
- #endregion
- #region #5 nested field
- {
- var query = GetQueryable();
- var strRule = "{'field':'b1.name', 'operator': '=', 'value': 'name987_b1' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1, result.Count);
- Assert.AreEqual(987, result[0].id);
- }
- #endregion
- }
- #endregion
- }
- }
|