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)); }
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 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 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 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()); }
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 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()); }
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 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 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()); }
/// <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; } }
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 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 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 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 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 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 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 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)); }
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); } }
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()); }
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()); }
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 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 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 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); }
/// <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"); }