public void CoalesceImplicitConversion()
        {
            var visitor = new ActiveExpressions.ExpressionEqualityComparisonVisitor((Expression <Func <B> >)(() => new A() ?? new B()));

            visitor.Visit((Expression <Func <B> >)(() => new A() ?? new B()));
            Assert.IsTrue(visitor.IsLastVisitedEqual);
            visitor.Visit((Expression <Func <C> >)(() => new A() ?? new C()));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
        }
        public void New()
        {
            var visitor = new ActiveExpressions.ExpressionEqualityComparisonVisitor((Expression <Func <string> >)(() => new string('a', 4)));

            visitor.Visit((Expression <Func <string> >)(() => new string('a', 4)));
            Assert.IsTrue(visitor.IsLastVisitedEqual);
            visitor.Visit((Expression <Func <string> >)(() => new string(new char[] { 'a', 'a', 'a', 'a' })));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
        }
        public void Coalesce()
        {
            var visitor = new ActiveExpressions.ExpressionEqualityComparisonVisitor((Expression <Func <int> >)(() => (int?)null ?? 3));

            visitor.Visit((Expression <Func <int> >)(() => (int?)null ?? 3));
            Assert.IsTrue(visitor.IsLastVisitedEqual);
            visitor.Visit((Expression <Func <int> >)(() => (int?)null ?? 4));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
        }
        public void MethodCall()
        {
            var visitor = new ActiveExpressions.ExpressionEqualityComparisonVisitor((Expression <Func <Methods, int> >)(x => x.Method1()));

            visitor.Visit((Expression <Func <Methods, int> >)(a => a.Method1()));
            Assert.IsTrue(visitor.IsLastVisitedEqual);
            visitor.Visit((Expression <Func <Methods, int> >)(a => a.Method2()));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
        }
        public void Nulls()
        {
            var visitor = new ActiveExpressions.ExpressionEqualityComparisonVisitor(null);

            visitor.Visit((Expression)null);
            Assert.IsTrue(visitor.IsLastVisitedEqual);
            visitor.Visit((Expression <Func <int> >)(() => 3));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
            visitor = new ActiveExpressions.ExpressionEqualityComparisonVisitor((Expression <Func <int> >)(() => 3));
            visitor.Visit((Expression)null);
            Assert.IsFalse(visitor.IsLastVisitedEqual);
        }
        public void Conditional()
        {
            var visitor = new ActiveExpressions.ExpressionEqualityComparisonVisitor((Expression <Func <int, int, int> >)((x, y) => x > 3 ? x : y));

            visitor.Visit((Expression <Func <int, int, int> >)((a, b) => a > 3 ? a : b));
            Assert.IsTrue(visitor.IsLastVisitedEqual);
            visitor.Visit((Expression <Func <int, int, int> >)((a, b) => a > 3 ? b : a));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
            visitor.Visit((Expression <Func <int, int, int> >)((a, b) => a > 2 ? a : b));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
            visitor.Visit((Expression <Func <int, int, int> >)((a, b) => a < 3 ? a : b));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
        }
        public void Unary()
        {
            var visitor = new ActiveExpressions.ExpressionEqualityComparisonVisitor((Expression <Func <int, int> >)(x => - x));

            visitor.Visit((Expression <Func <int, int> >)(a => - a));
            Assert.IsTrue(visitor.IsLastVisitedEqual);
            visitor.Visit((Expression <Func <int, int> >)(a => + a));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
            var aParam = Expression.Parameter(typeof(int));

            visitor.Visit(Expression.Lambda(Expression.Negate(aParam), aParam));
            Assert.IsTrue(visitor.IsLastVisitedEqual);
            visitor.Visit(Expression.Lambda(Expression.Negate(aParam, typeof(ExpressionEqualityComparisonVisitor).GetMethod(nameof(NegateNumber), BindingFlags.Public | BindingFlags.Static)), aParam));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
        }
        public void Index()
        {
            var stringIndexer = typeof(Dictionary <string, string>).GetProperties().Single(p => p.GetIndexParameters().Any());
            var key           = Expression.Constant("key");
            var xParam        = Expression.Parameter(typeof(Dictionary <string, string>));
            var visitor       = new ActiveExpressions.ExpressionEqualityComparisonVisitor(Expression.Lambda(Expression.MakeIndex(xParam, stringIndexer, new Expression[] { key }), xParam));
            var aParam        = Expression.Parameter(typeof(Dictionary <string, string>));

            visitor.Visit(Expression.Lambda(Expression.MakeIndex(aParam, stringIndexer, new Expression[] { key }), aParam));
            Assert.IsTrue(visitor.IsLastVisitedEqual);
            var bread = Expression.Constant("bread");

            visitor.Visit(Expression.Lambda(Expression.MakeIndex(aParam, stringIndexer, new Expression[] { bread }), aParam));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
            var intIndexer = typeof(Dictionary <int, string>).GetProperties().Single(p => p.GetIndexParameters().Any());
            var two        = Expression.Constant(2);
            var dict       = Expression.Constant(new Dictionary <int, string>());

            visitor.Visit(Expression.Lambda(Expression.MakeIndex(dict, intIndexer, new Expression[] { two }), aParam));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
        }
        public void Binary()
        {
            var visitor = new ActiveExpressions.ExpressionEqualityComparisonVisitor((Expression <Func <int, int, int> >)((x, y) => x + y));

            visitor.Visit((Expression <Func <int, int, int> >)((a, b) => a + b));
            Assert.IsTrue(visitor.IsLastVisitedEqual);
            visitor.Visit((Expression <Func <int, int, int> >)((a, b) => a - b));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
            visitor.Visit((Expression <Func <int, int, int> >)((a, b) => b + a));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
            visitor.Visit((Expression <Func <int, int, int> >)((a, b) => a));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
            visitor.Visit((Expression <Func <int, int, int> >)((a, b) => a + b + a));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
            visitor = new ActiveExpressions.ExpressionEqualityComparisonVisitor((Expression <Func <int, int, int> >)((x, y) => x + y));
            var aParam = Expression.Parameter(typeof(int));
            var bParam = Expression.Parameter(typeof(int));

            visitor.Visit(Expression.Lambda(Expression.Add(aParam, bParam), aParam, bParam));
            Assert.IsTrue(visitor.IsLastVisitedEqual);
            visitor.Visit(Expression.Lambda(Expression.Add(aParam, bParam, typeof(ExpressionEqualityComparisonVisitor).GetMethod(nameof(AddNumbers), BindingFlags.Public | BindingFlags.Static)), aParam, bParam));
            Assert.IsFalse(visitor.IsLastVisitedEqual);
        }