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"));
 }
示例#5
0
        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;
 }