Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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());
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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());
        }
Ejemplo n.º 6
0
        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());
        }