Example #1
0
            public void DoWhileLoopTest()
            {
                var target = new EvaluateVisitor();

                const int totalLoopIteration = 3;
                int       loopIterations     = 0;

                var condition = new Mock <Expression>();

                condition.Setup(c => c.Accept(It.IsAny <IExpressionVisitor <Value, Scope> >(), It.IsAny <Scope>()))
                .Returns <IExpressionVisitor <Value, Scope>, Scope>(
                    (v, s) =>
                {
                    loopIterations++;
                    return(new Value(loopIterations < totalLoopIteration));
                });

                var statement = new Mock <Statement>();

                var expr = new DoWhileStmt(condition.Object, new ScopeBlockStmt(new[] { statement.Object }));

                target.Visit(expr, _scope);

                condition.Verify(c => c.Accept(target, _scope), Times.Exactly(totalLoopIteration));
                statement.Verify(s => s.Accept(target, It.IsAny <Scope>()), Times.Exactly(totalLoopIteration));
            }
Example #2
0
            public void DoWhileLoopConditionIgnoredTest()
            {
                var target = new EvaluateVisitor();

                var conditionExecuted = false;
                var condition         = new Mock <Expression>();

                condition.Setup(c => c.Accept(It.IsAny <IExpressionVisitor <Value, Scope> >(), It.IsAny <Scope>()))
                .Returns <IExpressionVisitor <Value, Scope>, Scope>(
                    (v, s) =>
                {
                    conditionExecuted = true;
                    return(new Value(false));;
                });

                var statement = new Mock <Statement>();

                statement.Setup(c => c.Accept(It.IsAny <IExpressionVisitor <Value, Scope> >(), It.IsAny <Scope>()))
                .Returns <IExpressionVisitor <Value, Scope>, Scope>(
                    (v, s) =>
                {
                    if (conditionExecuted)
                    {
                        throw new Exception("Statement executed after condition evaluated.");
                    }
                    return(new Value(false));
                });

                var expr = new DoWhileStmt(condition.Object, new ScopeBlockStmt(new[] { statement.Object }));

                target.Visit(expr, _scope);

                condition.Verify(c => c.Accept(target, _scope), Times.Once);
                statement.Verify(s => s.Accept(target, It.IsAny <Scope>()), Times.Once);
            }
Example #3
0
            public void FunctionCallCallsVisitOnAllParametersPassedTest()
            {
                var target = new EvaluateVisitor();

                var functionName     = RandomGenerator.String();
                var functionNameExpr = new IdentifierExpr(functionName);

                var parameters = new[]
                {
                    new VarDefinitionStmt(new IdentifierExpr("A"), new IdentifierExpr("INT"), false, new ConstantExpr(1)),
                    new VarDefinitionStmt(new IdentifierExpr("B"), new IdentifierExpr("STRING"), false, new ConstantExpr("TEST")),
                    new VarDefinitionStmt(new IdentifierExpr("C"), new IdentifierExpr("BOOL"), false, new ConstantExpr(true))
                };

                var values = new Expression[]
                {
                    new ConstantExpr(1),
                    new ConstantExpr(RandomGenerator.String()),
                    new ConstantExpr(true)
                };

                var returnValue = values[1];

                var functionDefinition = new FunctionDefinitionExpr(functionNameExpr, parameters,
                                                                    new ScopeBlockStmt(new[] { new ReturnStmt(returnValue) }), new IdentifierExpr("String"));

                var expr = new FunctionCallExpr(functionNameExpr, values);

                _scope.DefineIdentifier(functionName, Value.FromObject(functionDefinition));

                var actual = target.Visit(expr, _scope);

                Assert.AreEqual(((ConstantExpr)returnValue).Value, actual.ToObject());
            }
Example #4
0
            public void EqualsTest(object a, object b, bool expected)
            {
                var target = new EvaluateVisitor();

                var expr = new EqualsExpr(new ConstantExpr(a), new ConstantExpr(b));

                var actual = target.Visit(expr, _scope);

                Assert.AreEqual(expected, actual.ToBoolean());
            }
Example #5
0
            public void AndOrTest()
            {
                var target = new EvaluateVisitor();

                var expr = new AndExpr(new ConstantExpr(true), new OrExpr(new ConstantExpr(true), new ConstantExpr(false)));

                var actual = target.Visit(expr, _scope);

                Assert.AreEqual(true, actual.ToBoolean());
            }
Example #6
0
            public void NegationExpressionTest(object value, object expected)
            {
                var target = new EvaluateVisitor();

                var expr = new NegationExpr(new ConstantExpr(value));

                var actual = target.Visit(expr, _scope);

                Assert.AreEqual(expected, actual.ToObject());
            }
Example #7
0
            public void VisitConditionMustBeBooleanType(object condition)
            {
                var target = new EvaluateVisitor();

                var conditionExpression = new ConstantExpr(condition);

                var expr = new ConditionalExpr(conditionExpression, new ConstantExpr(0), new ConstantExpr(0));

                target.Visit(expr, _scope);
            }
Example #8
0
            public void VisitBooleanConstantExpr(bool value)
            {
                var target = new EvaluateVisitor();

                var expression = new ConstantExpr(value);

                var actual = target.Visit(expression, _scope);

                Assert.AreEqual(value.ToString(), actual.ToString());
            }
Example #9
0
            public void VisitFloatConstantExpr()
            {
                var target = new EvaluateVisitor();

                var expression = new ConstantExpr(12.34);

                var actual = target.Visit(expression, _scope);

                Assert.AreEqual("12.34", actual.ToString());
            }
Example #10
0
            public void FunctionCallWithEmptyScopeTest()
            {
                var target = new EvaluateVisitor();

                var functionName           = RandomGenerator.String();
                var calledFunctionNameExpr = new IdentifierExpr(functionName);

                var expr = new FunctionCallExpr(calledFunctionNameExpr, new Expression[0]);

                target.Visit(expr, _scope);
            }
            public void EvaluateExpression(string source, object expected)
            {
                var expression = CreateExpression(source);

                var evaluator = new EvaluateVisitor();
                var scope     = new Scope();

                var result = expression.Accept(evaluator, scope);

                Assert.AreEqual(expected, result.ToObject());
            }
Example #12
0
            public void VisitBooleanNotExpr(bool a, bool expected)
            {
                var target = new EvaluateVisitor();

                var aExpression = new ConstantExpr(a);
                var expr        = new NotExpr(aExpression);

                var actual = target.Visit(expr, _scope);

                Assert.AreEqual(expected, actual.ToBoolean());
            }
Example #13
0
            public void FunctionCallOnNonFunctionTest()
            {
                var target = new EvaluateVisitor();

                var functionNameExpr = new IdentifierExpr(RandomGenerator.String());

                var expr = new FunctionCallExpr(functionNameExpr, new Expression[0]);

                _scope.DefineIdentifier(functionNameExpr.Name, Value.FromObject(RandomGenerator.String()));

                target.Visit(expr, _scope);
            }
Example #14
0
            public void VisitDivExpr()
            {
                var target = new EvaluateVisitor();

                var lhs        = new ConstantExpr(10);
                var rhs        = new ConstantExpr(2);
                var expression = new DivExpr(lhs, rhs);

                var actual = target.Visit(expression, _scope);

                Assert.AreEqual("5", actual.ToString());
            }
Example #15
0
        /// <summary>
        /// Loads a part of the query results into a buffer
        /// </summary>
        /// <param name="index">Starting index to load from</param>
        /// <param name="data">Buffer to load the items into</param>
        protected override void Load(int index, ILogItem[] data)
        {
            var evaluator = new EvaluateVisitor(_log.Read(_index.Skip(index).Take(data.Length)).AsParallel().AsOrdered());

            _tree.Accept(evaluator);

            var i = 0;

            foreach (var item in evaluator.Items)
            {
                data[i++] = item;
            }
        }
Example #16
0
            public void VisitConditionalExpr(bool condition, int thenValue, int elseValue, int expected)
            {
                var target = new EvaluateVisitor();

                var conditionExpression = new ConstantExpr(condition);
                var thenExpression      = new ConstantExpr(thenValue);
                var elseExpression      = new ConstantExpr(elseValue);

                var expr = new ConditionalExpr(conditionExpression, thenExpression, elseExpression);

                var actual = target.Visit(expr, _scope);

                Assert.AreEqual(expected, actual.ToObject());
            }
Example #17
0
            public void FunctionCallWithNoReturnStatementTest()
            {
                var target = new EvaluateVisitor();

                var functionName       = RandomGenerator.String();
                var functionNameExpr   = new IdentifierExpr(functionName);
                var returnValue        = RandomGenerator.String();
                var functionDefinition = new FunctionDefinitionExpr(functionNameExpr, new VarDefinitionStmt[0], new ScopeBlockStmt(new[] { new NoOpStatement() }), new IdentifierExpr("String"));

                var expr = new FunctionCallExpr(functionNameExpr, new Expression[0]);

                _scope.DefineIdentifier(functionName, Value.FromObject(functionDefinition));

                target.Visit(expr, _scope);
            }
Example #18
0
            public void StatementBlockCallsAllStatementsTest()
            {
                var target = new EvaluateVisitor();

                var statement1 = new Mock <Statement>();
                var statement2 = new Mock <Statement>();
                var statement3 = new Mock <Statement>();

                var stmt = new ScopeBlockStmt(new[] { statement1.Object, statement2.Object, statement3.Object });

                target.Visit(stmt, _scope);

                statement1.Verify(s => s.Accept(target, It.IsAny <Scope>()), Times.Once);
                statement2.Verify(s => s.Accept(target, It.IsAny <Scope>()), Times.Once);
                statement3.Verify(s => s.Accept(target, It.IsAny <Scope>()), Times.Once);
            }
Example #19
0
            public void LambdaCallTest()
            {
                var target = new EvaluateVisitor();

                var functionName       = RandomGenerator.String();
                var functionNameExpr   = new IdentifierExpr(functionName);
                var returnValue        = RandomGenerator.String();
                var functionDefinition = new LambdaDefinitionExpr(functionNameExpr, new VarDefinitionStmt[0], new ConstantExpr(returnValue), new IdentifierExpr("String"));

                var expr = new FunctionCallExpr(functionNameExpr, new Expression[0]);

                _scope.DefineIdentifier(functionName, Value.FromObject(functionDefinition));

                var actual = target.Visit(expr, _scope);

                Assert.AreEqual(returnValue, actual.ToObject());
            }
Example #20
0
            public void VisitMathExpressionUsingFloatingPointDivisionTree()
            {
                var target = new EvaluateVisitor();

                var one   = new ConstantExpr(1.0);
                var two   = new ConstantExpr(2);
                var three = new ConstantExpr(3);
                var four  = new ConstantExpr(4);
                var five  = new ConstantExpr(5);
                var six   = new ConstantExpr(6);

                var expr = new DivExpr(new MultExpr(three, six), new MultExpr(new MinusExpr(five, one), new PlusExpr(four, two)));

                var actual = target.Visit(expr, _scope);

                Assert.AreEqual("0.75", actual.ToString());
            }
Example #21
0
            public void StatementBlockAllStatementsAreExecutedInOrderTest()
            {
                var target = new EvaluateVisitor();

                var statement1 = new Mock <Statement>();
                var statement2 = new Mock <Statement>();
                var statement3 = new Mock <Statement>();

                int invocations     = 0;
                var invocationOrder = new int[3];

                statement1.Setup(c => c.Accept(It.IsAny <IExpressionVisitor <Value, Scope> >(), It.IsAny <Scope>()))
                .Returns <IExpressionVisitor <Value, Scope>, Scope>(
                    (v, s) =>
                {
                    invocationOrder[0] = invocations;
                    invocations++;
                    return(Value.Unit);;
                });
                statement2.Setup(c => c.Accept(It.IsAny <IExpressionVisitor <Value, Scope> >(), It.IsAny <Scope>()))
                .Returns <IExpressionVisitor <Value, Scope>, Scope>(
                    (v, s) =>
                {
                    invocationOrder[1] = invocations;
                    invocations++;
                    return(Value.Unit);;
                });
                statement3.Setup(c => c.Accept(It.IsAny <IExpressionVisitor <Value, Scope> >(), It.IsAny <Scope>()))
                .Returns <IExpressionVisitor <Value, Scope>, Scope>(
                    (v, s) =>
                {
                    invocationOrder[2] = invocations;
                    invocations++;
                    return(Value.Unit);;
                });

                var stmt = new ScopeBlockStmt(new[] { statement1.Object, statement2.Object, statement3.Object });

                target.Visit(stmt, _scope);

                for (int i = 0; i < invocationOrder.Length; i++)
                {
                    Assert.AreEqual(i, invocationOrder[i]);
                }
            }
Example #22
0
            public void FunctionCallOnUndefinedFuncTest()
            {
                var target = new EvaluateVisitor();

                var functionName            = RandomGenerator.String();
                var definedFunctionNameExpr = new IdentifierExpr(functionName);
                var calledFunctionNameExpr  = new IdentifierExpr(functionName + "UNDEFINED");
                var returnValue             = RandomGenerator.String();

                var functionDefinition = new FunctionDefinitionExpr(definedFunctionNameExpr, new VarDefinitionStmt[0],
                                                                    new ScopeBlockStmt(new[] { new ReturnStmt(new ConstantExpr(returnValue)) }), new IdentifierExpr("String"));

                var expr = new FunctionCallExpr(calledFunctionNameExpr, new Expression[0]);

                _scope.DefineIdentifier(functionName, Value.FromObject(functionDefinition));

                target.Visit(expr, _scope);
            }
Example #23
0
            public void IfStatementWithNoElseTest(bool conditionValue)
            {
                var target = new EvaluateVisitor();

                var condition = new Mock <Expression>();

                condition.Setup(c => c.Accept(It.IsAny <IExpressionVisitor <Value, Scope> >(), It.IsAny <Scope>()))
                .Returns <IExpressionVisitor <Value, Scope>, Scope>((v, s) => new Value(conditionValue));

                var trueStmt = new Mock <Statement>();

                var expr = new IfStmt(condition.Object, trueStmt.Object, null);

                target.Visit(expr, _scope);

                condition.Verify(c => c.Accept(target, _scope), Times.Once);
                trueStmt.Verify(s => s.Accept(target, _scope), Times.Exactly(conditionValue ? 1 : 0));
            }
Example #24
0
            public void NoneShouldThrowNotImplementedException()
            {
                var visitMethods = from method in typeof(EvaluateVisitor).GetMethods()
                                   where method.Name == "Visit"
                                   select method;

                var target = new EvaluateVisitor();

                var errors = new List <string>();

                foreach (var method in visitMethods)
                {
                    var parameter = (from param in method.GetParameters()
                                     where typeof(Expression).IsAssignableFrom(param.ParameterType)
                                     select param).First();

                    try
                    {
                        method.Invoke(target, new object[] { null, null });
                    }
                    catch (TargetParameterCountException)
                    {
                        Assert.Fail("Parameter Count Error in Reflection Call.");
                    }
                    catch (Exception e)
                    {
                        if (e is NotImplementedException || e.InnerException is NotImplementedException)
                        {
                            // Not implemented! This is unacceptable!
                            errors.Add(string.Format("Unimplemented Visit method for type {0} found.",
                                                     parameter.ParameterType.FullName));
                        }

                        // all other exception types are fine as we are passing null to the methods. We would expect them to throw.
                    }
                }

                if (errors.Any())
                {
                    string message = string.Join("\r\n", errors.ToArray());
                    Assert.Fail(message);
                }
            }
            public void NoneShouldThrowNotImplementedException()
            {
                var visitMethods = from method in typeof(EvaluateVisitor).GetMethods()
                                   where method.Name == "Visit"
                                   select method;

                var target = new EvaluateVisitor();

                var errors = new List<string>();
                foreach (var method in visitMethods)
                {
                    var parameter = (from param in method.GetParameters()
                                     where typeof(Expression).IsAssignableFrom(param.ParameterType)
                                     select param).First();

                    try
                    {
                        method.Invoke(target, new object[] { null, null });
                    }
                    catch (TargetParameterCountException)
                    {
                        Assert.Fail("Parameter Count Error in Reflection Call.");
                    }
                    catch (Exception e)
                    {
                        if (e is NotImplementedException || e.InnerException is NotImplementedException)
                        {
                            // Not implemented! This is unacceptable!
                            errors.Add(string.Format("Unimplemented Visit method for type {0} found.",
                                parameter.ParameterType.FullName));
                        }

                        // all other exception types are fine as we are passing null to the methods. We would expect them to throw.
                    }
                }

                if (errors.Any())
                {
                    string message = string.Join("\r\n", errors.ToArray());
                    Assert.Fail(message);
                }
            }
Example #26
0
            public void EvaluateTest(string source, object expected)
            {
                var expression = CreateExpression(source);

                var evaluator = new EvaluateVisitor();
                var scope     = new Scope();

                Value value = null;

                try
                {
                    value = expression.Accept(evaluator, scope);
                }
                catch (ReturnStatementException ret)
                {
                    value = ret.Value;
                }

                Assert.AreEqual(expected, value.ToObject());
            }
Example #27
0
            public void WhileFalseLoopTest()
            {
                var target = new EvaluateVisitor();

                var condition = new Mock <Expression>();

                condition.Setup(c => c.Accept(It.IsAny <IExpressionVisitor <Value, Scope> >(), It.IsAny <Scope>()))
                .Returns <IExpressionVisitor <Value, Scope>, Scope>(
                    (v, s) =>
                {
                    return(new Value(false));
                });

                var statement = new Mock <Statement>();

                var expr = new WhileStmt(condition.Object, new ScopeBlockStmt(new[] { statement.Object }));

                target.Visit(expr, _scope);

                condition.Verify(c => c.Accept(target, _scope), Times.Exactly(1));
                statement.Verify(s => s.Accept(target, _scope), Times.Never());
            }
Example #28
0
            public void ReturnStatementVisitTest()
            {
                var target = new EvaluateVisitor();

                var returnValue = RandomGenerator.String();
                var returnStmt  = new ReturnStmt(new ConstantExpr(returnValue));

                try
                {
                    target.Visit(returnStmt, _scope);

                    Assert.Fail("No exception thrown");
                }
                catch (ReturnStatementException rse)
                {
                    Assert.AreEqual(returnValue, rse.Value.ToObject());
                }
                catch (Exception)
                {
                    Assert.Fail("Incorrect exception type caught");
                }
            }
            public void StatementBlockAllStatementsAreExecutedInOrderTest()
            {
                var target = new EvaluateVisitor();

                var statement1 = new Mock<Statement>();
                var statement2 = new Mock<Statement>();
                var statement3 = new Mock<Statement>();

                int invocations = 0;
                var invocationOrder = new int[3];

                statement1.Setup(c => c.Accept(It.IsAny<IExpressionVisitor<Value, Scope>>(), It.IsAny<Scope>()))
                    .Returns<IExpressionVisitor<Value, Scope>, Scope>(
                        (v, s) =>
                        {
                            invocationOrder[0] = invocations;
                            invocations++;
                            return Value.Unit;;
                        });
                statement2.Setup(c => c.Accept(It.IsAny<IExpressionVisitor<Value, Scope>>(), It.IsAny<Scope>()))
                    .Returns<IExpressionVisitor<Value, Scope>, Scope>(
                        (v, s) =>
                        {
                            invocationOrder[1] = invocations;
                            invocations++;
                            return Value.Unit;;
                        });
                statement3.Setup(c => c.Accept(It.IsAny<IExpressionVisitor<Value, Scope>>(), It.IsAny<Scope>()))
                    .Returns<IExpressionVisitor<Value, Scope>, Scope>(
                        (v, s) =>
                        {
                            invocationOrder[2] = invocations;
                            invocations++;
                            return Value.Unit;;
                        });

                var stmt = new ScopeBlockStmt(new[] { statement1.Object, statement2.Object, statement3.Object });

                target.Visit(stmt, _scope);

                for (int i = 0; i < invocationOrder.Length; i++)
                {
                    Assert.AreEqual(i, invocationOrder[i]);
                }
            }
            public void StatementBlockCallsAllStatementsTest()
            {
                var target = new EvaluateVisitor();

                var statement1 = new Mock<Statement>();
                var statement2 = new Mock<Statement>();
                var statement3 = new Mock<Statement>();

                var stmt = new ScopeBlockStmt(new[] { statement1.Object, statement2.Object, statement3.Object });

                target.Visit(stmt, _scope);

                statement1.Verify(s => s.Accept(target, It.IsAny<Scope>()), Times.Once);
                statement2.Verify(s => s.Accept(target, It.IsAny<Scope>()), Times.Once);
                statement3.Verify(s => s.Accept(target, It.IsAny<Scope>()), Times.Once);
            }
            public void EqualsTest(object a, object b, bool expected)
            {
                var target = new EvaluateVisitor();

                var expr = new EqualsExpr( new ConstantExpr(a), new ConstantExpr(b));

                var actual = target.Visit(expr, _scope);

                Assert.AreEqual(expected, actual.ToBoolean());
            }
            public void AndOrTest()
            {
                var target = new EvaluateVisitor();

                var expr = new AndExpr(new ConstantExpr(true), new OrExpr(new ConstantExpr(true), new ConstantExpr(false)));

                var actual = target.Visit(expr, _scope);

                Assert.AreEqual(true, actual.ToBoolean());
            }
            public void NegationExpressionTest(object value, object expected)
            {
                var target = new EvaluateVisitor();

                var expr = new NegationExpr(new ConstantExpr(value));

                var actual = target.Visit(expr, _scope);

                Assert.AreEqual(expected, actual.ToObject());
            }
            public void DoWhileLoopConditionIgnoredTest()
            {
                var target = new EvaluateVisitor();

                var conditionExecuted = false;
                var condition = new Mock<Expression>();
                condition.Setup(c => c.Accept(It.IsAny<IExpressionVisitor<Value, Scope>>(), It.IsAny<Scope>()))
                    .Returns<IExpressionVisitor<Value, Scope>, Scope>(
                        (v, s) =>
                        {
                            conditionExecuted = true;
                            return new Value(false); ;
                        });

                var statement = new Mock<Statement>();
                statement.Setup(c => c.Accept(It.IsAny<IExpressionVisitor<Value, Scope>>(), It.IsAny<Scope>()))
                    .Returns<IExpressionVisitor<Value, Scope>, Scope>(
                        (v, s) =>
                        {
                            if (conditionExecuted)
                                throw new Exception("Statement executed after condition evaluated.");
                            return new Value(false);
                        });

                var expr = new DoWhileStmt(condition.Object, new ScopeBlockStmt(new[] { statement.Object }));

                target.Visit(expr, _scope);

                condition.Verify(c => c.Accept(target, _scope), Times.Once);
                statement.Verify(s => s.Accept(target, It.IsAny<Scope>()), Times.Once);
            }
            public void FunctionCallWithNoReturnStatementTest()
            {
                var target = new EvaluateVisitor();

                var functionName = RandomGenerator.String();
                var functionNameExpr = new IdentifierExpr(functionName);
                var returnValue = RandomGenerator.String();
                var functionDefinition = new FunctionDefinitionExpr(functionNameExpr, new VarDefinitionStmt[0], new ScopeBlockStmt(new[] { new NoOpStatement()  }), new IdentifierExpr("String"));

                var expr = new FunctionCallExpr(functionNameExpr, new Expression[0]);

                _scope.DefineIdentifier(functionName, Value.FromObject(functionDefinition));

                target.Visit(expr, _scope);
            }
            public void FunctionCallOnNonFunctionTest()
            {
                var target = new EvaluateVisitor();

                var functionNameExpr = new IdentifierExpr(RandomGenerator.String());

                var expr = new FunctionCallExpr(functionNameExpr, new Expression[0]);

                _scope.DefineIdentifier(functionNameExpr.Name, Value.FromObject(RandomGenerator.String()));

                target.Visit(expr, _scope);
            }
            public void FunctionCallCallsVisitOnAllParametersPassedTest()
            {
                var target = new EvaluateVisitor();

                var functionName = RandomGenerator.String();
                var functionNameExpr = new IdentifierExpr(functionName);

                var parameters = new[]
                {
                    new VarDefinitionStmt(new IdentifierExpr("A"), new IdentifierExpr("INT"), false, new ConstantExpr(1)),
                    new VarDefinitionStmt(new IdentifierExpr("B"), new IdentifierExpr("STRING"), false, new ConstantExpr("TEST")),
                    new VarDefinitionStmt(new IdentifierExpr("C"), new IdentifierExpr("BOOL"), false, new ConstantExpr(true))
                };

                var values = new Expression[]
                {
                    new ConstantExpr(1),
                    new ConstantExpr(RandomGenerator.String()),
                    new ConstantExpr(true)
                };

                var returnValue = values[1];

                var functionDefinition = new FunctionDefinitionExpr(functionNameExpr, parameters,
                    new ScopeBlockStmt(new[] { new ReturnStmt(returnValue) }), new IdentifierExpr("String"));

                var expr = new FunctionCallExpr(functionNameExpr, values);

                _scope.DefineIdentifier(functionName, Value.FromObject(functionDefinition));

                var actual = target.Visit(expr, _scope);

                Assert.AreEqual(((ConstantExpr)returnValue).Value, actual.ToObject());
            }
            public void IfStatementWithElseTest(bool conditionValue)
            {
                var target = new EvaluateVisitor();

                var condition = new Mock<Expression>();
                condition.Setup(c => c.Accept(It.IsAny<IExpressionVisitor<Value, Scope>>(), It.IsAny<Scope>()))
                    .Returns<IExpressionVisitor<Value, Scope>, Scope>((v, s) => new Value(conditionValue));

                var trueStmt = new Mock<Statement>();
                var falseStmt = new Mock<Statement>();

                var expr = new IfStmt(condition.Object, trueStmt.Object, falseStmt.Object);

                target.Visit(expr, _scope);

                condition.Verify(c => c.Accept(target, _scope), Times.Once);
                trueStmt.Verify(s => s.Accept(target, _scope), Times.Exactly(conditionValue ? 1 : 0));
                falseStmt.Verify(s => s.Accept(target, _scope), Times.Exactly(!conditionValue ? 1 : 0));
            }
            public void VisitFloatConstantExpr()
            {
                var target = new EvaluateVisitor();

                var expression = new ConstantExpr(12.34);

                var actual = target.Visit(expression, _scope);

                Assert.AreEqual("12.34", actual.ToString());
            }
            public void WhileLoopTest()
            {
                var target = new EvaluateVisitor();

                const int totalLoopIteration = 3;
                int loopIterations = 0;

                var condition = new Mock<Expression>();
                condition.Setup(c => c.Accept(It.IsAny<IExpressionVisitor<Value, Scope>>(), It.IsAny<Scope>()))
                    .Returns<IExpressionVisitor<Value, Scope>, Scope>(
                        (v, s) =>
                        {
                            loopIterations++;
                            return new Value(loopIterations <= totalLoopIteration);
                        });

                var statement = new Mock<Statement>();

                var expr = new WhileStmt(condition.Object, new ScopeBlockStmt(new[] { statement.Object }));

                target.Visit(expr, _scope);

                condition.Verify(c => c.Accept(target, _scope), Times.Exactly(totalLoopIteration + 1));
                statement.Verify( s => s.Accept(target, It.IsAny<Scope>()), Times.Exactly(totalLoopIteration) );
            }
            public void DoWhileFalseLoopTest()
            {
                var target = new EvaluateVisitor();

                var condition = new Mock<Expression>();
                condition.Setup(c => c.Accept(It.IsAny<IExpressionVisitor<Value, Scope>>(), It.IsAny<Scope>()))
                    .Returns<IExpressionVisitor<Value, Scope>, Scope>(
                        (v, s) =>
                        {
                            return new Value(false);
                        });

                var statement = new Mock<Statement>();

                var expr = new DoWhileStmt(condition.Object, new ScopeBlockStmt(new[] { statement.Object }));

                target.Visit(expr, _scope);

                condition.Verify(c => c.Accept(target, _scope), Times.Exactly(1));
                statement.Verify(s => s.Accept(target, It.IsAny<Scope>()), Times.Once);
            }
            public void VisitConditionMustBeBooleanType(object condition)
            {
                var target = new EvaluateVisitor();

                var conditionExpression = new ConstantExpr(condition);

                var expr = new ConditionalExpr(conditionExpression, new ConstantExpr(0), new ConstantExpr(0));

                target.Visit(expr, _scope);
            }
            public void VisitBooleanConstantExpr(bool value)
            {
                var target = new EvaluateVisitor();

                var expression = new ConstantExpr(value);

                var actual = target.Visit(expression, _scope);

                Assert.AreEqual(value.ToString(), actual.ToString());
            }
Example #44
0
        /// <summary>
        /// Updates the query results
        /// </summary>
        public void Update(Action <double> progress, CancellationToken cancellation)
        {
            // stop here if the log is empty
            if (_log.Count == 0)
            {
                _logger.Debug($"Evaluation canceled by empty log");
                _mode = EvaluationMode.Aggregate;
                Reset(0);
                return;
            }

            // start timers for performance measurement
            var sw  = Stopwatch.StartNew();
            var sw2 = Stopwatch.StartNew();

            // generate the raw index
            var indexVisitor = new IndexVisitor(_log);

            _tree.Accept(indexVisitor);

            // create an enumerator for the index
            var index = indexVisitor.Index;

            _mode = indexVisitor.Mode;

            // refine the index by evaluating log items
            IEnumerable <LogItem>     items         = null;
            Dictionary <string, Type> dynamicFields = null;

            if (_mode == EvaluationMode.Evaluate || _mode == EvaluationMode.Aggregate)
            {
                long progressTotal = 0;

                // build a parallel query for reading the log
                var rawItems = index
                               .AsParallel()
                               .AsOrdered()
                               .WithCancellation(cancellation)
                               .GroupBy(i => i.File + i.Member)
                               .SelectMany(f => _log.Read(f, (step, total) => progress?.Invoke((Interlocked.Add(ref progressTotal, step) * 98.0) / total), cancellation));

                // apply the query to the log
                var evaluateVisitor = new EvaluateVisitor(rawItems);
                _tree.Accept(evaluateVisitor);
                items = evaluateVisitor.Items;

                // store dynamic fields
                dynamicFields = evaluateVisitor.Fields;
            }

            // store the result as specified
            if (_mode == EvaluationMode.Aggregate)
            {
                _index = new DirectIndex(Enumerable.Empty <IndexItem>());
                Reset(items);
                _logger.Info($"Evaluation completed in {sw2.ElapsedMilliseconds} ms");
            }
            else if (_mode == EvaluationMode.Evaluate)
            {
                _index = new DirectIndex(items.Select(i => new IndexItem(i.File, i.Member, i.Position, i.Line)));
                Reset(_index.Count);
                _logger.Info($"Evaluation and reindexing completed after {sw2.ElapsedMilliseconds} ms");
            }
            else
            {
                _index = new DirectIndex(index);
                Reset(_index.Count);
                _logger.Info($"Indexing completed after {sw2.ElapsedMilliseconds} ms");
            }

            // generate the dynamic columns
            if (_dynamicColumns != null)
            {
                _dynamicColumns.Clear();
                foreach (var kvp in dynamicFields)
                {
                    _dynamicColumns.Add(kvp.Key, kvp.Value);
                }
            }

            sw.Stop();
            _logger.Info($"Execution completed in {sw.ElapsedMilliseconds} ms");
        }
            public void ReturnStatementVisitTest()
            {
                var target = new EvaluateVisitor();

                var returnValue = RandomGenerator.String();
                var returnStmt = new ReturnStmt(new ConstantExpr(returnValue));

                try
                {
                    target.Visit(returnStmt, _scope);

                    Assert.Fail("No exception thrown");
                }
                catch (ReturnStatementException rse)
                {
                    Assert.AreEqual(returnValue, rse.Value.ToObject());
                }
                catch (Exception)
                {
                    Assert.Fail("Incorrect exception type caught");
                }
            }
            public void VisitDivExpr()
            {
                var target = new EvaluateVisitor();

                var lhs = new ConstantExpr(10);
                var rhs = new ConstantExpr(2);
                var expression = new DivExpr(lhs, rhs);

                var actual = target.Visit(expression, _scope);

                Assert.AreEqual("5", actual.ToString());
            }
            public void FunctionCallOnUndefinedFuncTest()
            {
                var target = new EvaluateVisitor();

                var functionName = RandomGenerator.String();
                var definedFunctionNameExpr = new IdentifierExpr(functionName);
                var calledFunctionNameExpr = new IdentifierExpr(functionName + "UNDEFINED");
                var returnValue = RandomGenerator.String();

                var functionDefinition = new FunctionDefinitionExpr(definedFunctionNameExpr, new VarDefinitionStmt[0],
                    new ScopeBlockStmt(new[] { new ReturnStmt(new ConstantExpr(returnValue)) }), new IdentifierExpr("String"));

                var expr = new FunctionCallExpr(calledFunctionNameExpr, new Expression[0]);

                _scope.DefineIdentifier(functionName, Value.FromObject(functionDefinition));

                target.Visit(expr, _scope);
            }
            public void VisitMathExpressionUsingFloatingPointDivisionTree()
            {
                var target = new EvaluateVisitor();

                var one = new ConstantExpr(1.0);
                var two = new ConstantExpr(2);
                var three = new ConstantExpr(3);
                var four = new ConstantExpr(4);
                var five = new ConstantExpr(5);
                var six = new ConstantExpr(6);

                var expr = new DivExpr(new MultExpr(three, six), new MultExpr(new MinusExpr(five, one), new PlusExpr(four, two)));

                var actual = target.Visit(expr, _scope);

                Assert.AreEqual("0.75", actual.ToString());
            }
            public void FunctionCallWithEmptyScopeTest()
            {
                var target = new EvaluateVisitor();

                var functionName = RandomGenerator.String();
                var calledFunctionNameExpr = new IdentifierExpr(functionName);

                var expr = new FunctionCallExpr(calledFunctionNameExpr, new Expression[0]);

                target.Visit(expr, _scope);
            }
            public void VisitBooleanNotExpr(bool a, bool expected)
            {
                var target = new EvaluateVisitor();

                var aExpression = new ConstantExpr(a);
                var expr = new NotExpr(aExpression);

                var actual = target.Visit(expr, _scope);

                Assert.AreEqual(expected, actual.ToBoolean());
            }
            public void LambdaCallTest()
            {
                var target = new EvaluateVisitor();

                var functionName = RandomGenerator.String();
                var functionNameExpr = new IdentifierExpr(functionName);
                var returnValue = RandomGenerator.String();
                var functionDefinition = new LambdaDefinitionExpr(functionNameExpr, new VarDefinitionStmt[0], new ConstantExpr(returnValue), new IdentifierExpr("String"));

                var expr = new FunctionCallExpr(functionNameExpr, new Expression[0]);

                _scope.DefineIdentifier(functionName, Value.FromObject(functionDefinition));

                var actual = target.Visit(expr, _scope);

                Assert.AreEqual(returnValue, actual.ToObject());
            }
            public void VisitConditionalExpr(bool condition, int thenValue, int elseValue, int expected)
            {
                var target = new EvaluateVisitor();

                var conditionExpression = new ConstantExpr(condition);
                var thenExpression = new ConstantExpr(thenValue);
                var elseExpression = new ConstantExpr(elseValue);

                var expr = new ConditionalExpr(conditionExpression, thenExpression, elseExpression);

                var actual = target.Visit(expr, _scope);

                Assert.AreEqual(expected, actual.ToObject());
            }
            public void EvaluateExpression(string source, object expected)
            {
                var expression = CreateExpression(source);

                var evaluator = new EvaluateVisitor();
                var scope = new Scope();

                var result = expression.Accept(evaluator, scope);

                Assert.AreEqual(expected, result.ToObject());
            }
            public void EvaluateTest(string source, object expected)
            {
                var expression = CreateExpression(source);

                var evaluator = new EvaluateVisitor();
                var scope = new Scope();

                Value value = null;
                try
                {
                    value = expression.Accept(evaluator, scope);
                }
                catch (ReturnStatementException ret)
                {
                    value = ret.Value;
                }

                Assert.AreEqual(expected, value.ToObject());
            }