public void MathExpressionContext_Can_Define_And_Resolve_Expression() { MathExpressionContext context = new MathExpressionContext(); context.Define("x", 5); context.Define("y", MathExpression.Parse("5x")); Assert.AreEqual(25, context.Resolve("y").Evaluate(context)); }
public void MathExpressionContext_Cannot_Define_Variable_That_Implicitly_Refers_To_Itself() { MathExpressionContext context = new MathExpressionContext(); context.Define("x", 5); context.Define("y", MathExpression.Parse("5x")); var exception = Assert.Throws<MathExpressionException>(() => context.Define("x", MathExpression.Parse("y"))); Assert.AreEqual("Variable 'x' is refering to itself recursively.", exception.Message); }
public void MathExpressionContext_Can_Forget_Variable() { MathExpressionContext context = new MathExpressionContext(); context.Define("x", 42); Assert.AreEqual(42, context.Resolve("x").Evaluate(context)); context.Forget("x"); var exception = Assert.Throws<MathExpressionException>(() => context.Resolve("x")); Assert.AreEqual("The variable 'x' has not been defined.", exception.Message); }
public void VariableFinderVisitor_Can_Find_Variable_That_Is_Negated() { // Verifies fix for bug that caused negated expression // to be skipped in expression visitor. var expression = MathExpression.Parse("10+(-x)"); var context = new MathExpressionContext(); var visitor = new VariableFinderVisitor(); Assert.IsTrue(visitor.HasVariableDefined(expression, context, "x")); }
public void VisitMathExpression(MathExpressionContext context) { VisitExpression(context.left); builder.OutputOperation(Operation.OpPush, 0); VisitExpression(context.right); builder.OutputOperation(Operation.OpPop, 1); var symbol = ""; if (context.type != null) { symbol = context.type.Text; } if (context.comparison_operator() != null) { symbol = context.comparison_operator().GetText(); } switch (symbol) { case "+": builder.OutputOperation(Operation.OpAdd); break; case "-": builder.OutputOperation(Operation.OpSub); break; case "*": builder.OutputOperation(Operation.OpMul); break; case "/": builder.OutputOperation(Operation.OpDiv); break; case "&&": builder.OutputOperation(Operation.OpAnd); break; case "||": builder.OutputOperation(Operation.OpOr); break; case "==": builder.OutputOperation(Operation.OpEquals); break; case "<": builder.OutputOperation(Operation.OpLessThan); break; case ">": builder.OutputOperation(Operation.OpGreaterThan); break; case "<=": builder.OutputOperation(Operation.OpLessThanOrEquals); break; case ">=": builder.OutputOperation(Operation.OpGreaterOrEquals); break; default: throw new Exception($"Unhandled math operation {symbol}"); } }
public void MathExpressionParser_Can_Parse_And_Evaluate_Variable() { var input = this.GetPostfixTokenStream("x"); MathExpressionParser parser = new MathExpressionParser(); MathExpression expression = parser.Parse(input); MathExpressionContext context = new MathExpressionContext(); context.Define("x", 42); Assert.AreEqual(42D, expression.Evaluate(context)); }
public VariableFinderContext(MathExpressionContext expressionContext, string variable) { _expressionContext = expressionContext; _variable = variable; _found = false; }
public void MathExpressionContext_Undefined_Variable_Throws() { MathExpressionContext context = new MathExpressionContext(); var exception = Assert.Throws<MathExpressionException>(() => context.Resolve("x")); Assert.AreEqual("The variable 'x' has not been defined.", exception.Message); }
public void MathExpressionContext_Can_Redefine_Variable() { MathExpressionContext context = new MathExpressionContext(); context.Define("x", 42); Assert.AreEqual(42, context.Resolve("x").Evaluate(context)); context.Define("x", 107); Assert.AreEqual(107, context.Resolve("x").Evaluate(context)); }
public void MathExpressionContext_Variable_Declarations_Can_Occur_In_Any_Order() { MathExpression expression = MathExpression.Parse("10+x"); MathExpressionContext context = new MathExpressionContext(); context.Define("x", MathExpression.Parse("5y")); context.Define("y", 3); double result = expression.Evaluate(context); Assert.AreEqual(25, result); }
public void MathExpression_Can_Evaluate_Variable_Expression() { var expression = new VariableExpression("x"); var visitor = new EvaluationVisitor(); var context = new MathExpressionContext(); context.Define("x", 42D); Assert.AreEqual(42, visitor.Evaluate(expression, context)); }
public EvaluationContext(MathExpressionContext context) { _expressionContext = context; _result = 0; }