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)); }
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)); }
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)); }
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]")); }
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)); }
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)); }
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")); }
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 }
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 }
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)); }
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\"")); }
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)")); }
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)); }
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)); }
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)); }
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")); }
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 }
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)); }
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)); }
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)); }