public void ModelFuncExpressionVisitor_Property()
        {
            Expression <Func <Route, bool> > test = r => r.Entry != null && r.Entry.Signal == Signal.GO;

            var visitor = new ModelFuncExpressionVisitor();
            var visited = visitor.Visit(test.Body);

            Assert.AreEqual(0, visitor.ExtractParameters.Count);
            ParameterAssertions.AssertOnlyParameters(visited, test.Parameters[0]);
        }
        public void ModelFuncExpressionVisitor_NonModelProperty()
        {
            Expression <Func <Route, int> > test = r => r.AbsoluteUri.AbsoluteUri.Length;

            var visitor = new ModelFuncExpressionVisitor();
            var visited = visitor.Visit(test.Body);

            Assert.AreEqual(0, visitor.ExtractParameters.Count);
            ParameterAssertions.AssertOnlyParameters(visited, test.Parameters[0]);
        }
        public void ModelFuncExpressionVisitor_ModelMethod()
        {
            Expression<Func<Route, bool>> test = r => GetEntry(r) != null && GetEntry(r).Signal == Signal.GO;

            var visitor = new ModelFuncExpressionVisitor();
            var visited = visitor.Visit(test.Body);

            Assert.AreSame(test.Body, visited);
            Assert.AreEqual(0, visitor.ExtractParameters.Count);
            ParameterAssertions.AssertOnlyParameters(visited, test.Parameters[0]);
        }
        public void ModelFuncExpressionVisitor_ModelMethod()
        {
            Expression <Func <Route, bool> > test = r => GetEntry(r) != null && GetEntry(r).Signal == Signal.GO;

            var visitor = new ModelFuncExpressionVisitor();
            var visited = visitor.Visit(test.Body);

            Assert.AreSame(test.Body, visited);
            Assert.AreEqual(0, visitor.ExtractParameters.Count);
            ParameterAssertions.AssertOnlyParameters(visited, test.Parameters[0]);
        }
        public void ModelFuncExpressionVisitor_KeepParameterWhenNeeded()
        {
            Expression<Func<TestTuple, bool>> test = t => t.Route.Entry != null && t.Route.Entry.Signal == Signal.GO && t.Severity > 0;

            var visitor = new ModelFuncExpressionVisitor();
            var visited = visitor.Visit(test.Body);

            Assert.AreNotSame(test.Body, visited);
            Assert.AreEqual(1, visitor.ExtractParameters.Count);
            ParameterAssertions.AssertOnlyParameters(visited, test.Parameters[0], visitor.ExtractParameters.Single().Parameter);

            Assert.AreEqual("t.Route", visitor.ExtractParameters.Single().Value.ToString());
        }
        public void ModelFuncExpressionVisitor_InnerStruct()
        {
            Expression<Func<TestTuple2, bool>> test = t => t.Inner.Route.Entry != null && t.Inner.Route.Entry.Signal == Signal.GO;

            var visitor = new ModelFuncExpressionVisitor();
            var visited = visitor.Visit(test.Body);

            Assert.AreNotSame(test.Body, visited);
            Assert.AreEqual(1, visitor.ExtractParameters.Count);
            ParameterAssertions.AssertOnlyParameters(visited, visitor.ExtractParameters.Single().Parameter);

            Assert.AreEqual("t.Inner.Route", visitor.ExtractParameters.Single().Value.ToString());
        }
        public void ModelFuncExpressionVisitor_KeepParameterWhenNeeded()
        {
            Expression <Func <TestTuple, bool> > test = t => t.Route.Entry != null && t.Route.Entry.Signal == Signal.GO && t.Severity > 0;

            var visitor = new ModelFuncExpressionVisitor();
            var visited = visitor.Visit(test.Body);

            Assert.AreNotSame(test.Body, visited);
            Assert.AreEqual(1, visitor.ExtractParameters.Count);
            ParameterAssertions.AssertOnlyParameters(visited, test.Parameters[0], visitor.ExtractParameters.Single().Parameter);

            Assert.AreEqual("t.Route", visitor.ExtractParameters.Single().Value.ToString());
        }
        public void ModelFuncExpressionVisitor_InnerStruct()
        {
            Expression <Func <TestTuple2, bool> > test = t => t.Inner.Route.Entry != null && t.Inner.Route.Entry.Signal == Signal.GO;

            var visitor = new ModelFuncExpressionVisitor();
            var visited = visitor.Visit(test.Body);

            Assert.AreNotSame(test.Body, visited);
            Assert.AreEqual(1, visitor.ExtractParameters.Count);
            ParameterAssertions.AssertOnlyParameters(visited, visitor.ExtractParameters.Single().Parameter);

            Assert.AreEqual("t.Inner.Route", visitor.ExtractParameters.Single().Value.ToString());
        }
        public void ModelFuncExpressionVisitor_ModelNonModelMethod()
        {
            Expression <Func <TestTuple, bool> > test = t => GetEntry(GetRoute(t)) != null && GetEntry(GetRoute(t)).Signal == Signal.GO;

            var visitor = new ModelFuncExpressionVisitor();
            var visited = visitor.Visit(test.Body);

            Assert.AreNotSame(visited, test.Body);
            Assert.AreEqual(1, visitor.ExtractParameters.Count);
            ParameterAssertions.AssertOnlyParameters(visited, visitor.ExtractParameters.Single().Parameter);

            Assert.AreEqual("GetRoute(t)", visitor.ExtractParameters.Single().Value.ToString());
        }
        public void ModelFuncExpressionVisitor_ModelNonModelMethod()
        {
            Expression<Func<TestTuple, bool>> test = t => GetEntry(GetRoute(t)) != null && GetEntry(GetRoute(t)).Signal == Signal.GO;

            var visitor = new ModelFuncExpressionVisitor();
            var visited = visitor.Visit(test.Body);

            Assert.AreNotSame(visited, test.Body);
            Assert.AreEqual(1, visitor.ExtractParameters.Count);
            ParameterAssertions.AssertOnlyParameters(visited, visitor.ExtractParameters.Single().Parameter);

            Assert.AreEqual("GetRoute(t)", visitor.ExtractParameters.Single().Value.ToString());
        }
        public void ModelFuncExpressionVisitor_Property()
        {
            Expression<Func<Route, bool>> test = r => r.Entry != null && r.Entry.Signal == Signal.GO;

            var visitor = new ModelFuncExpressionVisitor();
            var visited = visitor.Visit(test.Body);

            Assert.AreEqual(0, visitor.ExtractParameters.Count);
            ParameterAssertions.AssertOnlyParameters(visited, test.Parameters[0]);
        }
        public void ModelFuncExpressionVisitor_NonModelProperty()
        {
            Expression<Func<Route, int>> test = r => r.AbsoluteUri.AbsoluteUri.Length;

            var visitor = new ModelFuncExpressionVisitor();
            var visited = visitor.Visit(test.Body);

            Assert.AreEqual(0, visitor.ExtractParameters.Count);
            ParameterAssertions.AssertOnlyParameters(visited, test.Parameters[0]);
        }