Ejemplo n.º 1
0
        public void TestReplaceTwoDimensional()
        {
            var variable = new VariableExpression("variable");
            var key      = new StringConstantExpression("key");
            var value    = new IntegerConstantExpression(99);
            var dict2    = new DictionaryExpression();

            dict2.Entries.Add(new DictionaryExpression.DictionaryEntry {
                Key = key, Value = value
            });
            var dict1 = new DictionaryExpression();

            dict1.Entries.Add(new DictionaryExpression.DictionaryEntry {
                Key = key, Value = dict2
            });
            var expr2 = new IndexedVariableExpression(variable, key);
            var expr  = new IndexedVariableExpression(expr2, key);

            var scope = new InterpreterScope();

            scope.AssignVariable(variable, dict1);

            ExpressionBase result;

            Assert.That(expr.ReplaceVariables(scope, out result), Is.True);
            Assert.That(result, Is.InstanceOf <IntegerConstantExpression>());
            Assert.That(((IntegerConstantExpression)result).Value, Is.EqualTo(99));
        }
Ejemplo n.º 2
0
        public void TestReplaceVariablesIndexFunctionCall()
        {
            var input     = "function func(i) => 6";
            var tokenizer = new PositionalTokenizer(Tokenizer.CreateTokenizer(input));

            tokenizer.Match("function");
            var functionDefinition = (FunctionDefinitionExpression)FunctionDefinitionExpression.Parse(tokenizer);

            var functionCall = new FunctionCallExpression("func", new ExpressionBase[] { new IntegerConstantExpression(2) });
            var value        = new IntegerConstantExpression(98);

            var variable = new VariableExpression("variable");
            var dict     = new DictionaryExpression();

            dict.Entries.Add(new DictionaryExpression.DictionaryEntry {
                Key = new IntegerConstantExpression(6), Value = value
            });

            var scope = new InterpreterScope();

            scope.AssignVariable(variable, dict);
            scope.AddFunction(functionDefinition);

            var expr = new IndexedVariableExpression(variable, functionCall);

            ExpressionBase result;

            Assert.That(expr.ReplaceVariables(scope, out result), Is.True);
            Assert.That(result, Is.InstanceOf <IntegerConstantExpression>());
            Assert.That(((IntegerConstantExpression)result).Value, Is.EqualTo(98));
        }
Ejemplo n.º 3
0
        public void TestReplaceVariablesIndexFunctionCall()
        {
            var functionDefinition = UserFunctionDefinitionExpression.ParseForTest("function func(i) => 6");

            var functionCall = new FunctionCallExpression("func", new ExpressionBase[] { new IntegerConstantExpression(2) });
            var value        = new IntegerConstantExpression(98);

            var variable = new VariableExpression("variable");
            var dict     = new DictionaryExpression();

            dict.Add(new IntegerConstantExpression(6), value);

            var scope = new InterpreterScope();

            scope.AssignVariable(variable, dict);
            scope.AddFunction(functionDefinition);

            var expr = new IndexedVariableExpression(variable, functionCall);

            ExpressionBase result;

            Assert.That(expr.ReplaceVariables(scope, out result), Is.True);
            Assert.That(result, Is.InstanceOf <IntegerConstantExpression>());
            Assert.That(((IntegerConstantExpression)result).Value, Is.EqualTo(98));
        }
Ejemplo n.º 4
0
        public void TestAppendString()
        {
            var expr = new IndexedVariableExpression(new VariableExpression("test"), new IntegerConstantExpression(1));

            var builder = new StringBuilder();

            expr.AppendString(builder);
            Assert.That(builder.ToString(), Is.EqualTo("test[1]"));
        }
Ejemplo n.º 5
0
        public void TestNestedExpressions()
        {
            var variable = new VariableExpression("variable1");
            var index    = new VariableExpression("variable2");
            var expr     = new IndexedVariableExpression(variable, index);

            var nested = ((INestedExpressions)expr).NestedExpressions;

            Assert.That(nested.Count(), Is.EqualTo(2));
            Assert.That(nested.Contains(variable));
            Assert.That(nested.Contains(index));
        }
Ejemplo n.º 6
0
        public void TestGetModifications()
        {
            var variable = new VariableExpression("variable1");
            var index    = new VariableExpression("variable2");
            var expr     = new IndexedVariableExpression(variable, index);

            var modifications = new HashSet <string>();

            ((INestedExpressions)expr).GetModifications(modifications);

            Assert.That(modifications.Count, Is.EqualTo(0));
        }
Ejemplo n.º 7
0
        public void TestGetDependencies()
        {
            var variable = new VariableExpression("variable1");
            var index    = new VariableExpression("variable2");
            var expr     = new IndexedVariableExpression(variable, index);

            var dependencies = new HashSet <string>();

            ((INestedExpressions)expr).GetDependencies(dependencies);

            Assert.That(dependencies.Count, Is.EqualTo(2));
            Assert.That(dependencies.Contains("variable1"));
            Assert.That(dependencies.Contains("variable2"));
        }
Ejemplo n.º 8
0
        public void TestGetDependenciesIndexed()
        {
            var variable = new VariableExpression("variable1");
            var value    = new VariableExpression("variable2");
            var indexed  = new IndexedVariableExpression(variable, value);
            var expr     = new AssignmentExpression(indexed, value);

            var dependencies = new HashSet <string>();

            ((INestedExpressions)expr).GetDependencies(dependencies);

            Assert.That(dependencies.Count, Is.EqualTo(1));
            Assert.That(dependencies.Contains("variable1"), Is.False); // variable1 is updated
            Assert.That(dependencies.Contains("variable2"));           // variable2 is needed to get the index
        }
Ejemplo n.º 9
0
        public void TestGetModificationsIndexed()
        {
            var variable = new VariableExpression("variable1");
            var index    = new VariableExpression("variable2");
            var indexed  = new IndexedVariableExpression(variable, index);
            var value    = new IntegerConstantExpression(1);
            var expr     = new AssignmentExpression(indexed, value);

            var modifications = new HashSet <string>();

            ((INestedExpressions)expr).GetModifications(modifications);

            Assert.That(modifications.Count, Is.EqualTo(1));
            Assert.That(modifications.Contains("variable1"));           // variable1 is updated
            Assert.That(modifications.Contains("variable2"), Is.False); // index variable is not updated
        }
Ejemplo n.º 10
0
        public void TestAssignVariableIndexed()
        {
            var variable = new VariableExpression("test");
            var value    = new IntegerConstantExpression(99);
            var dict     = new DictionaryExpression();
            var key      = new IntegerConstantExpression(6);
            var scope    = new InterpreterScope();

            scope.AssignVariable(variable, dict);

            var index = new IndexedVariableExpression(variable, key);

            scope.AssignVariable(index, value);

            Assert.That(dict.Count, Is.EqualTo(1));
            Assert.That(dict[0].Value, Is.SameAs(value));
        }
Ejemplo n.º 11
0
        public void TestReplaceVariablesInvalidKey()
        {
            var variable = new VariableExpression("variable");
            var key      = new StringConstantExpression("key");
            var dict     = new DictionaryExpression();
            var expr     = new IndexedVariableExpression(variable, key);

            var scope = new InterpreterScope();

            scope.AssignVariable(variable, dict);

            ExpressionBase result;

            Assert.That(expr.ReplaceVariables(scope, out result), Is.False);
            Assert.That(result, Is.InstanceOf <ParseErrorExpression>());
            Assert.That(((ParseErrorExpression)result).Message, Is.EqualTo("No entry in dictionary for key: \"key\""));
        }
Ejemplo n.º 12
0
        public void TestReplaceVariablesNonDictionary()
        {
            var variable = new VariableExpression("variable");
            var key      = new StringConstantExpression("key");
            var value    = new IntegerConstantExpression(99);
            var expr     = new IndexedVariableExpression(variable, key);

            var scope = new InterpreterScope();

            scope.AssignVariable(variable, value);

            ExpressionBase result;

            Assert.That(expr.ReplaceVariables(scope, out result), Is.False);
            Assert.That(result, Is.InstanceOf <ParseErrorExpression>());
            Assert.That(((ParseErrorExpression)result).Message, Is.EqualTo("Cannot index: variable (IntegerConstant)"));
        }
Ejemplo n.º 13
0
        public void TestAssignVariableIndexedArrayOutOfRange()
        {
            var variable = new VariableExpression("test");
            var value    = new IntegerConstantExpression(99);
            var value2   = new IntegerConstantExpression(98);
            var array    = new ArrayExpression();
            var key      = new IntegerConstantExpression(1);

            array.Entries.Add(value);
            var scope = new InterpreterScope();

            scope.AssignVariable(variable, array);

            var index = new IndexedVariableExpression(variable, key);

            scope.AssignVariable(index, value2); // silently does nothing, TODO: make error

            Assert.That(array.Entries[0], Is.SameAs(value));
        }
Ejemplo n.º 14
0
        public void TestAssignVariableIndexedArrayUpdate()
        {
            var variable = new VariableExpression("test");
            var value    = new IntegerConstantExpression(99);
            var value2   = new IntegerConstantExpression(98);
            var array    = new ArrayExpression();
            var key      = new IntegerConstantExpression(0);

            array.Entries.Add(value);
            var scope = new InterpreterScope();

            scope.AssignVariable(variable, array);

            var index = new IndexedVariableExpression(variable, key);

            scope.AssignVariable(index, value2);

            Assert.That(array.Entries[0], Is.SameAs(value2));
        }
Ejemplo n.º 15
0
        public void TestReplaceVariables()
        {
            var variable = new VariableExpression("variable");
            var key      = new StringConstantExpression("key");
            var value    = new IntegerConstantExpression(99);
            var dict     = new DictionaryExpression();

            dict.Add(key, value);
            var expr = new IndexedVariableExpression(variable, key);

            var scope = new InterpreterScope();

            scope.AssignVariable(variable, dict);

            ExpressionBase result;

            Assert.That(expr.ReplaceVariables(scope, out result), Is.True);
            Assert.That(result, Is.InstanceOf <IntegerConstantExpression>());
            Assert.That(((IntegerConstantExpression)result).Value, Is.EqualTo(99));
        }
Ejemplo n.º 16
0
        public void TestReplaceVariablesArrayIndexString()
        {
            var variable = new VariableExpression("variable");
            var index    = new StringConstantExpression("str");
            var value    = new IntegerConstantExpression(99);
            var array    = new ArrayExpression();

            array.Entries.Add(value);
            var expr = new IndexedVariableExpression(variable, index);

            var scope = new InterpreterScope();

            scope.AssignVariable(variable, array);

            ExpressionBase result;

            Assert.That(expr.ReplaceVariables(scope, out result), Is.False);
            Assert.That(result, Is.InstanceOf <ParseErrorExpression>());
            Assert.That(((ParseErrorExpression)result).Message, Is.EqualTo("Index does not evaluate to an integer constant"));
        }
Ejemplo n.º 17
0
        public void TestGetDependenciesNestedIndexed()
        {
            // variable1[variable2[variable3]] = 1
            var variable1 = new VariableExpression("variable1");
            var variable2 = new VariableExpression("variable2");
            var variable3 = new VariableExpression("variable3");
            var indexed1  = new IndexedVariableExpression(variable2, variable3);
            var indexed2  = new IndexedVariableExpression(variable1, indexed1);
            var value     = new IntegerConstantExpression(1);
            var expr      = new AssignmentExpression(indexed2, value);

            var dependencies = new HashSet <string>();

            ((INestedExpressions)expr).GetDependencies(dependencies);

            Assert.That(dependencies.Count, Is.EqualTo(2));
            Assert.That(dependencies.Contains("variable1"), Is.False); // variable1 is updated
            Assert.That(dependencies.Contains("variable2"));           // variable2 is needed to get the index
            Assert.That(dependencies.Contains("variable3"));           // variable3 is needed to get the index
        }
Ejemplo n.º 18
0
        public void TestAssignVariableIndexedUpdate()
        {
            var variable = new VariableExpression("test");
            var value    = new IntegerConstantExpression(99);
            var value2   = new IntegerConstantExpression(98);
            var dict     = new DictionaryExpression();
            var key      = new IntegerConstantExpression(6);

            dict.Entries.Add(new DictionaryExpression.DictionaryEntry {
                Key = key, Value = value
            });
            var scope = new InterpreterScope();

            scope.AssignVariable(variable, dict);

            var index = new IndexedVariableExpression(variable, key);

            scope.AssignVariable(index, value2);

            Assert.That(dict.Entries[0].Value, Is.SameAs(value2));
        }
Ejemplo n.º 19
0
        public void TestReplaceVariablesIndexMathematical()
        {
            var variable = new VariableExpression("variable");
            var key      = new IntegerConstantExpression(6);
            var index    = new MathematicExpression(new IntegerConstantExpression(2), MathematicOperation.Add, new IntegerConstantExpression(4));
            var value    = new IntegerConstantExpression(99);
            var dict     = new DictionaryExpression();

            dict.Add(key, value);
            var expr = new IndexedVariableExpression(variable, index);

            var scope = new InterpreterScope();

            scope.AssignVariable(variable, dict);

            ExpressionBase result;

            Assert.That(expr.ReplaceVariables(scope, out result), Is.True);
            Assert.That(result, Is.InstanceOf <IntegerConstantExpression>());
            Assert.That(((IntegerConstantExpression)result).Value, Is.EqualTo(99));
        }
Ejemplo n.º 20
0
        public void TestReplaceVariablesArray()
        {
            var variable      = new VariableExpression("variable");
            var index         = new IntegerConstantExpression(0);
            var indexVariable = new VariableExpression("index");
            var value         = new IntegerConstantExpression(99);
            var array         = new ArrayExpression();

            array.Entries.Add(value);
            var expr = new IndexedVariableExpression(variable, indexVariable);

            var scope = new InterpreterScope();

            scope.AssignVariable(variable, array);
            scope.AssignVariable(indexVariable, index);

            ExpressionBase result;

            Assert.That(expr.ReplaceVariables(scope, out result), Is.True);
            Assert.That(result, Is.InstanceOf <IntegerConstantExpression>());
            Assert.That(((IntegerConstantExpression)result).Value, Is.EqualTo(99));
        }