public void ShouldBuildFailedWhenExpressionNotFound() { // Arrange var expressions = new Dictionary <int, Expression <Func <Conversation, bool> > >(); expressions.Add(1, t => t.Source == ConversationSource.FacebookMessage); // Act var result = LogicalExpressionBuilder.Build(expressions, "(1 AND 2) OR 3"); // Assert Assert.False(result.IsSuccess); }
public void ShouldBuildFailedWhenLogicalExpressionIsInvalid() { // Arrange var expressions = new Dictionary <int, Expression <Func <Conversation, bool> > >(); expressions.Add(1, t => t.Source == ConversationSource.FacebookMessage); // Act var result = LogicalExpressionBuilder.Build(expressions, "(a AND b) OR c"); // Assert Assert.False(result.IsSuccess); Assert.Equal("Invalid Expression.", result.ErrorMessage); }
public void ShouldBuildSuccessWithOneExpression() { // Arrange var expressions = new Dictionary <int, Expression <Func <Conversation, bool> > >(); expressions.Add(1, t => t.Source == ConversationSource.FacebookMessage); // Act var result = LogicalExpressionBuilder.Build(expressions, "1"); // Assert Assert.True(result.IsSuccess); string expect = "t => (Convert(t.Source) == 1)"; Assert.Equal(expect, result.Expression.ToString()); }
public Expression <Func <Conversation, bool> > Create(Filter filter, ExpressionBuildOptions options) { var expressions = filter.Conditions.Select(t => GetConditionExpression(t, options)).Where(t => t != null).ToList(); if (expressions.Count() == 0) { return(t => true); } if (filter.Type == FilterType.All) { var predicate = PredicateBuilder.New <Conversation>(); foreach (var expression in expressions) { predicate = predicate.And(expression); } return(predicate); } if (filter.Type == FilterType.Any) { var predicate = PredicateBuilder.New <Conversation>(); foreach (var expression in expressions) { predicate = predicate.Or(expression); } return(predicate); } if (filter.Type == FilterType.LogicalExpression) { var predicate = PredicateBuilder.New <Conversation>(); var expressionDic = filter.Conditions.ToDictionary(t => t.Index, t => GetConditionExpression(t, options)); var buildResult = LogicalExpressionBuilder.Build(expressionDic, filter.LogicalExpression); if (buildResult.IsSuccess) { return(predicate.And(buildResult.Expression)); } } return(t => true); }
public void ShouldBuildSuccessWithMultipleExpressions() { // Arrange var expressions = new Dictionary <int, Expression <Func <Conversation, bool> > >(); expressions.Add(1, t => t.Source == ConversationSource.FacebookMessage); expressions.Add(2, t => t.Priority == ConversationPriority.Low); expressions.Add(3, t => t.Status == ConversationStatus.Closed); // Act var result = LogicalExpressionBuilder.Build(expressions, "(1 AND 2) OR 3"); // Assert Assert.True(result.IsSuccess); string expect = "t => (((Convert(t.Source) == 1) AndAlso (Convert(t.Priority) == 0)) OrElse (Convert(t.Status) == 4))"; Assert.Equal(expect, result.Expression.ToString()); }
public void ShouldBuildSuccessWithComplexExpression() { // Arrange var expressions = new Dictionary <int, Expression <Func <Conversation, bool> > >(); expressions.Add(1, t => t.Source == ConversationSource.FacebookMessage); expressions.Add(2, t => t.Priority == ConversationPriority.Low); expressions.Add(3, t => t.Status == ConversationStatus.Closed); expressions.Add(4, t => t.Messages.Any(m => m.Sender.Name.Contains("xxx"))); // Act var result = LogicalExpressionBuilder.Build(expressions, "(1 AND 2) OR (3 AND 4 AND 1 OR 2)"); // Assert Assert.True(result.IsSuccess); string expect = "t => (((Convert(t.Source) == 1) AndAlso (Convert(t.Priority) == 0)) OrElse ((((Convert(t.Status) == 4) AndAlso t.Messages.Any(m => m.Sender.Name.Contains(\"xxx\"))) AndAlso (Convert(t.Source) == 1)) OrElse (Convert(t.Priority) == 0)))"; Assert.Equal(expect, result.Expression.ToString()); }