public void IsSupportedStandardExpression_False()
        {
            var extensionExpression = new TestExtensionExpression(Expression.Constant(0));

            Assert.That(ExpressionTreeVisitor.IsSupportedStandardExpression(extensionExpression), Is.False);

            var unknownExpression = new UnknownExpression(typeof(int));

            Assert.That(ExpressionTreeVisitor.IsSupportedStandardExpression(unknownExpression), Is.False);

            var querySourceReferenceExpression = new QuerySourceReferenceExpression(ExpressionHelper.CreateMainFromClause_Int());

            Assert.That(ExpressionTreeVisitor.IsSupportedStandardExpression(querySourceReferenceExpression), Is.False);

            var subQueryExpression = new SubQueryExpression(ExpressionHelper.CreateQueryModel <Cook>());

            Assert.That(ExpressionTreeVisitor.IsSupportedStandardExpression(subQueryExpression), Is.False);
        }
        public void IsSupportedStandardExpression_True()
        {
            var supportedExpressionTypeValues =
                new[]
            {
                ExpressionType.ArrayLength, ExpressionType.Convert, ExpressionType.ConvertChecked, ExpressionType.Negate, ExpressionType.NegateChecked,
                ExpressionType.Not, ExpressionType.Quote, ExpressionType.TypeAs, ExpressionType.UnaryPlus, ExpressionType.Add, ExpressionType.AddChecked,
                ExpressionType.Divide, ExpressionType.Modulo, ExpressionType.Multiply, ExpressionType.MultiplyChecked, ExpressionType.Power,
                ExpressionType.Subtract, ExpressionType.SubtractChecked, ExpressionType.And, ExpressionType.Or, ExpressionType.ExclusiveOr,
                ExpressionType.LeftShift, ExpressionType.RightShift, ExpressionType.AndAlso, ExpressionType.OrElse, ExpressionType.Equal,
                ExpressionType.NotEqual, ExpressionType.GreaterThanOrEqual, ExpressionType.GreaterThan, ExpressionType.LessThan,
                ExpressionType.LessThanOrEqual, ExpressionType.Coalesce, ExpressionType.ArrayIndex, ExpressionType.Conditional, ExpressionType.Constant,
                ExpressionType.Invoke, ExpressionType.Lambda, ExpressionType.MemberAccess, ExpressionType.Call, ExpressionType.New,
                ExpressionType.NewArrayBounds, ExpressionType.NewArrayInit, ExpressionType.MemberInit, ExpressionType.ListInit, ExpressionType.Parameter,
                ExpressionType.TypeIs,
            };

            var visitMethodExpressionTypes = new HashSet <Type> (
                from m in typeof(ExpressionTreeVisitor).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
                where m.Name.StartsWith("Visit")
                let parameters = m.GetParameters()
                                 where parameters.Length == 1
                                 let expressionType = parameters.Single().ParameterType
                                                      where expressionType != typeof(Expression)
                                                      select expressionType);

            Assert.That(visitMethodExpressionTypes.Count > 0);

            foreach (var expressionType in supportedExpressionTypeValues)
            {
                var expressionInstance = ExpressionInstanceCreator.GetExpressionInstance(expressionType);
                Assert.That(
                    visitMethodExpressionTypes.Any(t => t.IsAssignableFrom(expressionInstance.GetType())),
                    Is.True,
                    "Visit method for {0}",
                    expressionInstance.GetType());
                Assert.That(ExpressionTreeVisitor.IsSupportedStandardExpression(expressionInstance), Is.True);
            }
        }