public void TestObjectFilters()
        {
            QueryInjector.RegisterGlobal(
                ib => ib.WhenEncountering <IQueryable <Student> >().ReplaceWith(students => students.Where(student => !student.Deleted))
                );

            var collection = new[]
            {
                new Student {
                    Deleted = false
                },
                new Student {
                    Deleted = true
                },
                new Student {
                    Deleted = false
                },
                new Student {
                    Deleted = true
                },
                new Student {
                    Deleted = false
                },
            }.AsQueryable();

            var actualQuery = collection.AsInjectableQueryable() as IInjectableQueryable;
            var expected    = collection.Where(student => !student.Deleted);

            Assert.NotNull(actualQuery);
            ExpressionEqualityComparer.AssertExpressionsEqual(expected.Expression, actualQuery.GetInjectedExpression());
        }
        public void TestBasicInjectionString()
        {
            Expression <Func <IQueryable <string>, IQueryable <string> > > replaceExpr = s => new[] { "replaced!" }.AsQueryable();

            QueryInjector.RegisterGlobal(
                ib => ib.WhenEncountering <IQueryable <string> >().ReplaceWith(replaceExpr)
                );

            var actualQuery = new[] { "a", "b", "c" }.AsInjectableQueryable() as IInjectableQueryable;

            Assert.NotNull(actualQuery);
            ExpressionEqualityComparer.AssertExpressionsEqual(replaceExpr.Body, actualQuery.GetInjectedExpression());
        }
        public void TestBasicInjectionOnWhereInt()
        {
            QueryInjector.RegisterGlobal(
                ib => ib.WhenEncountering <IQueryable <int> >().ReplaceWith(q => q.Where(i => i % 2 == 0))
                );

            var collection = new[] { 1, 2, 3, 4, 5 }.AsQueryable();
            var actualQuery = collection.Where(i => i > 3).AsInjectableQueryable() as IInjectableQueryable;
            var expected    = collection.Where(i => i % 2 == 0).Where(i => i > 3);

            Assert.NotNull(actualQuery);
            ExpressionEqualityComparer.AssertExpressionsEqual(expected.Expression, actualQuery.GetInjectedExpression());
        }
        public void TestBasicInjectionStringLiteral()
        {
            Expression <Func <string, string> > replaceExpr = s => "rob";

            QueryInjector.RegisterGlobal(
                ib => ib.WhenEncountering <string>().ReplaceWith(replaceExpr)
                );

            var initialCollection = new[] { "a", "b", "c" }.AsQueryable();
            var actualQuery = initialCollection.Where(s => s == "rob").AsInjectableQueryable() as IInjectableQueryable;

            //We need to write it this way, because .Where(s => "rob" == "rob") is optimised into .Where(s => true)
            var expression    = Expression.Lambda <Func <string, bool> >(Expression.Equal(Expression.Constant("rob"), Expression.Constant("rob")), Expression.Parameter(typeof(string), "s"));
            var expectedQuery = initialCollection.Where(expression);

            Assert.NotNull(actualQuery);
            ExpressionEqualityComparer.AssertExpressionsEqual(expectedQuery.Expression, actualQuery.GetInjectedExpression());
        }
        public void TestInjectionParameter()
        {
            var initialCollection = new[] { 1, 2, 3 }.AsQueryable();

            QueryInjector.RegisterGlobal(
                ib => ib.WhenEncountering <IQueryable <int> >().ReplaceWith(collection => collection.Where(c => c == Inject <int> .Value("testKey")))
                );

            var actualQuery =
                initialCollection
                .AsInjectableQueryable()
                .InjectWith("testKey", 5)
                as IInjectableQueryable;

            var expected = initialCollection.Where(c => c == 5);

            Assert.NotNull(actualQuery);
            ExpressionEqualityComparer.AssertExpressionsEqual(expected.Expression, actualQuery.GetInjectedExpression());
        }
 public void Setup()
 {
     QueryInjector.ClearGlobals();
 }