Beispiel #1
0
        public void ExpressionEqualityComparer_GlobalParameter()
        {
            var comparer = new QueryExpressionEqualityComparer();
            var p1       = Expression.Parameter(typeof(bool));
            var p2       = Expression.Parameter(typeof(bool));

            {
                var lambdaAbstraction1 = new LambdaAbstraction(Expression.Lambda(p1), EmptyReadOnlyCollection <QueryTree> .Instance);
                var lambdaAbstraction2 = new LambdaAbstraction(Expression.Lambda(p2), EmptyReadOnlyCollection <QueryTree> .Instance);

                Assert.IsFalse(comparer.Equals(lambdaAbstraction1, lambdaAbstraction2));
            }

            {
                var lambdaAbstraction1 = new LambdaAbstraction(Expression.Lambda(p1), EmptyReadOnlyCollection <QueryTree> .Instance);
                var lambdaAbstraction2 = new LambdaAbstraction(Expression.Lambda(p1), EmptyReadOnlyCollection <QueryTree> .Instance);

                Assert.IsTrue(comparer.Equals(lambdaAbstraction1, lambdaAbstraction2));
                Assert.AreEqual(comparer.GetHashCode(lambdaAbstraction1), comparer.GetHashCode(lambdaAbstraction2));
            }
        }
        public void QueryVisitor_Simple()
        {
            var type  = typeof(ArgumentException);
            var type2 = typeof(Exception);
            var lambdaAbstraction1 = DefaultQueryExpressionFactory.Instance.LambdaAbstraction(Expression.Lambda(Expression.Empty()));
            var lambdaAbstraction2 = DefaultQueryExpressionFactory.Instance.LambdaAbstraction(Expression.Lambda(Expression.Empty()));
            var monadMember1       = DefaultQueryExpressionFactory.Instance.MonadAbstraction(type, lambdaAbstraction1);
            var monadMember2       = DefaultQueryExpressionFactory.Instance.MonadAbstraction(type, lambdaAbstraction2);

            var cmp = new QueryExpressionEqualityComparer();

            {
                var op        = new FirstOperator(type, monadMember1);
                var rewritten = new ReferenceEqualSubstitutionVisitor(monadMember1, monadMember2).Visit(op);
                Assert.AreNotSame(op, rewritten);
                Assert.IsTrue(cmp.Equals(op, rewritten));
            }

            {
                var op         = new FirstPredicateOperator(type, monadMember1, lambdaAbstraction1);
                var rewritten1 = new ReferenceEqualSubstitutionVisitor(monadMember1, monadMember2).Visit(op);
                Assert.AreNotSame(op, rewritten1);
                Assert.IsTrue(cmp.Equals(op, rewritten1));

                var rewritten2 = new ReferenceEqualSubstitutionVisitor(lambdaAbstraction1, lambdaAbstraction2).Visit(op);
                Assert.AreNotSame(op, rewritten2);
                Assert.IsTrue(cmp.Equals(op, rewritten2));
            }

            {
                var op         = new SelectOperator(type, type2, monadMember1, lambdaAbstraction1);
                var rewritten1 = new ReferenceEqualSubstitutionVisitor(monadMember1, monadMember2).Visit(op);
                Assert.AreNotSame(op, rewritten1);
                Assert.IsTrue(cmp.Equals(op, rewritten1));

                var rewritten2 = new ReferenceEqualSubstitutionVisitor(lambdaAbstraction1, lambdaAbstraction2).Visit(op);
                Assert.AreNotSame(op, rewritten2);
                Assert.IsTrue(cmp.Equals(op, rewritten2));
            }

            {
                var op         = new TakeOperator(type, monadMember1, lambdaAbstraction1);
                var rewritten1 = new ReferenceEqualSubstitutionVisitor(monadMember1, monadMember2).Visit(op);
                Assert.AreNotSame(op, rewritten1);
                Assert.IsTrue(cmp.Equals(op, rewritten1));

                var rewritten2 = new ReferenceEqualSubstitutionVisitor(lambdaAbstraction1, lambdaAbstraction2).Visit(op);
                Assert.AreNotSame(op, rewritten2);
                Assert.IsTrue(cmp.Equals(op, rewritten2));
            }

            {
                var op         = new WhereOperator(type, monadMember1, lambdaAbstraction1);
                var rewritten1 = new ReferenceEqualSubstitutionVisitor(monadMember1, monadMember2).Visit(op);
                Assert.AreNotSame(op, rewritten1);
                Assert.IsTrue(cmp.Equals(op, rewritten1));

                var rewritten2 = new ReferenceEqualSubstitutionVisitor(lambdaAbstraction1, lambdaAbstraction2).Visit(op);
                Assert.AreNotSame(op, rewritten2);
                Assert.IsTrue(cmp.Equals(op, rewritten2));
            }

            {
                var op         = new MonadAbstraction(type, lambdaAbstraction1);
                var rewritten1 = new ReferenceEqualSubstitutionVisitor(lambdaAbstraction1, lambdaAbstraction2).Visit(op);
                Assert.AreNotSame(op, rewritten1);
                Assert.IsTrue(cmp.Equals(op, rewritten1));
            }

            {
                var lambda = Expression.Lambda(Expression.Empty(), Expression.Parameter(type));
                var parameters = new QueryTree[] { monadMember1 }.ToReadOnly();
                var op         = new LambdaAbstraction(lambda, parameters);
                var rewritten1 = new ReferenceEqualSubstitutionVisitor(monadMember1, monadMember2).Visit(op);
                Assert.AreNotSame(op, rewritten1);
                Assert.IsTrue(cmp.Equals(op, rewritten1));
            }
        }
        public void QueryVisitor_Reflection_Identity()
        {
            var type  = typeof(int);
            var type2 = typeof(bool);
            var type3 = typeof(object);
            var lambdaAbstraction1 = DefaultQueryExpressionFactory.Instance.LambdaAbstraction(Expression.Lambda(Expression.Empty()));
            var monadMember1       = DefaultQueryExpressionFactory.Instance.MonadAbstraction(type, lambdaAbstraction1);

            var cmp = new QueryExpressionEqualityComparer();

            {
                var op         = new FirstOperator(type, monadMember1);
                var rewritten1 = new ReferenceEqualTypeSubstitutionVisitor(type, type).Visit(op);
                Assert.AreSame(op, rewritten1);

                var rewritten2 = new ReferenceEqualTypeSubstitutionVisitor(type, type2).Visit(op);
                Assert.IsFalse(cmp.Equals(op, rewritten2));

                var rewritten3 = new ReferenceEqualTypeSubstitutionVisitor(type2, type).Visit(op);
                Assert.IsTrue(cmp.Equals(op, rewritten3));
            }

            {
                var op         = new FirstPredicateOperator(type, monadMember1, lambdaAbstraction1);
                var rewritten1 = new ReferenceEqualTypeSubstitutionVisitor(type, type).Visit(op);
                Assert.AreSame(op, rewritten1);

                var rewritten2 = new ReferenceEqualTypeSubstitutionVisitor(type, type2).Visit(op);
                Assert.IsFalse(cmp.Equals(op, rewritten2));

                var rewritten3 = new ReferenceEqualTypeSubstitutionVisitor(type2, type).Visit(op);
                Assert.IsTrue(cmp.Equals(op, rewritten3));
            }

            {
                var op         = new SelectOperator(type, type3, monadMember1, lambdaAbstraction1);
                var rewritten1 = new ReferenceEqualTypeSubstitutionVisitor(type, type).Visit(op);
                Assert.AreSame(op, rewritten1);

                var rewritten2 = new ReferenceEqualTypeSubstitutionVisitor(type, type2).Visit(op);
                Assert.IsFalse(cmp.Equals(op, rewritten2));

                var rewritten3 = new ReferenceEqualTypeSubstitutionVisitor(type2, type).Visit(op);
                Assert.IsTrue(cmp.Equals(op, rewritten3));
            }

            {
                var op         = new TakeOperator(type, monadMember1, lambdaAbstraction1);
                var rewritten1 = new ReferenceEqualTypeSubstitutionVisitor(type, type).Visit(op);
                Assert.AreSame(op, rewritten1);

                var rewritten2 = new ReferenceEqualTypeSubstitutionVisitor(type, type2).Visit(op);
                Assert.IsFalse(cmp.Equals(op, rewritten2));

                var rewritten3 = new ReferenceEqualTypeSubstitutionVisitor(type2, type).Visit(op);
                Assert.IsTrue(cmp.Equals(op, rewritten3));
            }

            {
                var op         = new WhereOperator(type, monadMember1, lambdaAbstraction1);
                var rewritten1 = new ReferenceEqualTypeSubstitutionVisitor(type, type).Visit(op);
                Assert.AreSame(op, rewritten1);

                var rewritten2 = new ReferenceEqualTypeSubstitutionVisitor(type, type2).Visit(op);
                Assert.IsFalse(cmp.Equals(op, rewritten2));

                var rewritten3 = new ReferenceEqualTypeSubstitutionVisitor(type2, type).Visit(op);
                Assert.IsTrue(cmp.Equals(op, rewritten3));
            }

            {
                var op         = new MonadAbstraction(type, lambdaAbstraction1);
                var rewritten1 = new ReferenceEqualTypeSubstitutionVisitor(type, type).Visit(op);
                Assert.AreSame(op, rewritten1);

                var rewritten2 = new ReferenceEqualTypeSubstitutionVisitor(type, type2).Visit(op);
                Assert.IsFalse(cmp.Equals(op, rewritten2));

                var rewritten3 = new ReferenceEqualTypeSubstitutionVisitor(type2, type).Visit(op);
                Assert.IsTrue(cmp.Equals(op, rewritten3));
            }
        }