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)); } }