using System;
using System.Linq.Expressions;
using System.Text;
using Util.Datas.Queries;
using Util.Datas.Queries.Criterias;
using Util.Properties;
using Util.Tests.Samples;
using Util.Tests.XUnitHelpers;
using Xunit;
namespace Util.Tests.Datas.Queries {
///
/// 查询对象测试
///
public class QueryTest {
///
/// 测试初始化
///
public QueryTest() {
_query = new Query();
}
///
/// 查询对象
///
private IQuery _query;
///
/// 测试获取分页
///
[Fact]
public void TestGetPager() {
QueryParameterSample sample = new QueryParameterSample() {
Order = "A",
Page = 2,
PageSize = 30,
TotalCount = 40
};
_query = new Query( sample );
_query.OrderBy( "B", true );
var pager = _query.GetPager();
Assert.Equal( 2, pager.Page );
Assert.Equal( 30, pager.PageSize );
Assert.Equal( 40, pager.TotalCount );
Assert.Equal( "A,B desc", pager.Order );
}
///
/// 测试添加查询条件- 当值为空时,不会被忽略
///
[Fact]
public void TestWhere() {
_query.Where( t => t.Name == "A" );
Assert.Equal( "t => (t.Name == \"A\")", _query.GetPredicate().SafeString() );
_query.Where( t => t.Tel == 1 );
Assert.Equal( "t => ((t.Name == \"A\") AndAlso (t.Tel == 1))", _query.GetPredicate().SafeString() );
_query = new Query();
_query.Where( t => t.Name == "A" && t.Tel == 1 );
Assert.Equal( "t => ((t.Name == \"A\") AndAlso (t.Tel == 1))", _query.GetPredicate().SafeString() );
_query = new Query();
_query.Where( t => t.Name == "" );
Assert.NotNull( _query.GetPredicate() );
}
///
/// 测试添加查询条件 - 添加规约对象,当值为空时,不会被忽略
///
[Fact]
public void TestWhere_Criteria() {
_query.Where( new CriteriaSample() );
Assert.Equal( "t => ((t.Name == \"A\") AndAlso (t.Tel == 1))", _query.GetPredicate().ToString() );
_query = new Query();
_query.Where( new DefaultCriteria( t => t.Name == null ) );
Assert.NotNull( _query.GetPredicate() );
}
///
/// 测试添加查询条件 - 当第二个参数为false表示不添加条件
///
[Fact]
public void TestWhereIf_False() {
_query.WhereIf( t => t.Name == "A", false );
Assert.Null( _query.GetPredicate() );
_query.WhereIf( t => t.Name == "A", true );
Assert.Equal( "t => (t.Name == \"A\")", _query.GetPredicate().SafeString() );
}
///
/// 测试添加查询条件
///
[Fact]
public void TestWhereIfNotEmpty() {
_query.WhereIfNotEmpty( t => t.Name == "" );
Assert.Null( _query.GetPredicate() );
_query.WhereIfNotEmpty( t => t.Name == null );
Assert.Null( _query.GetPredicate() );
_query.WhereIfNotEmpty( t => t.Name == "A" );
Assert.Equal( "t => (t.Name == \"A\")", _query.GetPredicate().ToString() );
_query.WhereIfNotEmpty( d => d.Tel == 1 );
Assert.Equal( "t => ((t.Name == \"A\") AndAlso (t.Tel == 1))", _query.GetPredicate().ToString() );
}
///
/// 测试添加查询条件 - 同时添加2个查询条件,抛出异常
///
[Fact]
public void TestWhereIfNotEmpty_2Condition_Throw() {
AssertHelper.Throws( () => {
_query.WhereIfNotEmpty( t => t.Name == "A" && t.Tel == 1 );
}, string.Format( LibraryResource.OnlyOnePredicate, "t => ((t.Name == \"A\") AndAlso (t.Tel == 1))" ) );
}
///
/// 添加范围查询条件 - 整型
///
[Fact]
public void TestBetween_Int() {
_query.Between( t => t.Tel, 1, 10, Boundary.Left );
Assert.Equal( "t => ((t.Tel >= 1) AndAlso (t.Tel < 10))", _query.GetPredicate().ToString() );
}
///
/// 添加范围查询条件 - double
///
[Fact]
public void TestBetween_Double() {
_query.Between( t => t.DoubleValue, 1.1, 10.1, Boundary.Right );
Assert.Equal( "t => ((t.DoubleValue > 1.1) AndAlso (t.DoubleValue <= 10.1))", _query.GetPredicate().ToString() );
}
///
/// 添加范围查询条件 - decimal
///
[Fact]
public void TestBetween_Decimal() {
_query.Between( t => t.DecimalValue, 1.1M, 10.1M, Boundary.Neither );
Assert.Equal( "t => ((t.DecimalValue > 1.1) AndAlso (t.DecimalValue < 10.1))", _query.GetPredicate().ToString() );
}
///
/// 添加范围查询条件 - 日期 - 不包含时间
///
[Fact]
public void TestBetween_Date() {
var min = DateTime.Parse( "2000-1-1 10:10:10" );
var max = DateTime.Parse( "2000-1-2 10:10:10" );
var result = new StringBuilder();
result.Append( "t => ((t.DateValue >= Convert(Parse(\"2000/1/1 0:00:00\"), DateTime))" );
result.Append( " AndAlso (t.DateValue < Convert(Parse(\"2000/1/3 0:00:00\"), DateTime)))" );
_query.Between( t => t.DateValue, min, max, false );
Assert.Equal( result.ToString(), _query.GetPredicate().ToString() );
}
///
/// 添加范围查询条件 - 日期 - 包含时间
///
[Fact]
public void TestBetween_DateTime() {
var min = DateTime.Parse( "2000-1-1 10:10:10" );
var max = DateTime.Parse( "2000-1-2 10:10:10" );
var result = new StringBuilder();
result.Append( "t => ((t.DateValue >= Convert(Parse(\"2000/1/1 10:10:10\"), DateTime))" );
result.Append( " AndAlso (t.DateValue <= Convert(Parse(\"2000/1/2 10:10:10\"), DateTime)))" );
_query.Between( t => t.DateValue, min, max );
Assert.Equal( result.ToString(), _query.GetPredicate().ToString() );
}
///
/// 测试排序
///
[Fact]
public void TestOrderBy() {
QueryParameterSample sample = new QueryParameterSample { Order = "Name" };
_query = new Query( sample );
Assert.Equal( "Name", _query.GetOrder() );
_query.OrderBy( "Age", true );
Assert.Equal( "Name,Age desc", _query.GetOrder() );
_query.OrderBy( t => t.Tel, true );
Assert.Equal( "Name,Age desc,Tel desc", _query.GetOrder() );
}
///
/// 测试与连接
///
[Fact]
public void TestAnd() {
Expression> expression = null;
_query.And( expression );
_query.And( t => t.Name == "A" );
Assert.Equal( "t => (t.Name == \"A\")", _query.GetPredicate().ToString() );
_query.And( t => t.Tel == 1 );
Assert.Equal( "t => ((t.Name == \"A\") AndAlso (t.Tel == 1))", _query.GetPredicate().ToString() );
}
///
/// 测试与连接 - 连接查询对象
///
[Fact]
public void TestAnd_Query() {
var query = new Query();
query.Where( t => t.Name == "A" );
query.OrderBy( t => t.Name );
_query.And( query );
Assert.Equal( "t => (t.Name == \"A\")", _query.GetPredicate().ToString() );
Assert.Equal( "Name", _query.GetOrder() );
query = new Query();
query.Where( t => t.Tel == 1 );
query.OrderBy( t => t.Tel, true );
_query.And( query );
Assert.Equal( "t => ((t.Name == \"A\") AndAlso (t.Tel == 1))", _query.GetPredicate().ToString() );
Assert.Equal( "Name,Tel desc", _query.GetOrder() );
}
///
/// 测试或连接
///
[Fact]
public void TestOr() {
Expression> expression = null;
_query.Or( expression );
_query.Where( t => t.Name == "A" );
var query = new Query();
query.Where( t => t.Tel == 1 );
_query.Or( query );
Assert.Equal( "t => ((t.Name == \"A\") OrElse (t.Tel == 1))", _query.GetPredicate().ToString() );
}
///
/// 测试或连接
///
[Fact]
public void TestOr_2() {
_query.Or( t => t.Name == "A", t => t.Name == "", t => t.Tel == 1 );
Assert.Equal( "t => ((t.Name == \"A\") OrElse (t.Tel == 1))", _query.GetPredicate().ToString() );
}
///
/// 测试或连接 - 连接查询对象
///
[Fact]
public void TestOr_Query() {
_query.OrderBy( t => t.Name );
_query.Where( t => t.Name == "A" );
_query.Where( t => t.EnglishName == "A" );
var query2 = new Query();
query2.OrderBy( t => t.Age, true );
query2.Where( t => t.Name == "B" );
query2.Where( t => t.Age == 1 );
_query.Or( query2 );
var query3 = new Query();
query3.OrderBy( t => t.Tel );
query3.Where( t => t.Name == "C" );
query3.Where( t => t.Age > 10 );
_query.And( query3 );
Expression> expected = t => ( ( t.Name == "A" && t.EnglishName == "A" )
|| ( t.Name == "B" && t.Age == 1 ) ) && ( t.Name == "C" && t.Age > 10 );
Assert.Equal( expected.ToString(), _query.GetPredicate().ToString() );
Assert.Equal( "Name,Age desc,Tel", _query.GetOrder() );
}
}
}