public void ExecuteSimpleForWithContinue() { ICommand ifcmd = new IfCommand(new CompareExpression(ComparisonOperator.Equal, new NameExpression("a"), new ConstantExpression(2)), new ContinueCommand()); ICommand setcmd = new SetCommand("b", new BinaryOperatorExpression(new NameExpression("a"), new NameExpression("b"), BinaryOperator.Add)); ICommand body = new CompositeCommand(new ICommand[] { ifcmd, setcmd }); BindingEnvironment environment = new BindingEnvironment(); environment.SetValue("b", 0); ForCommand command = new ForCommand("a", new ConstantExpression(new object[] { 1, 2, 3 }), body); command.Execute(environment); Assert.AreEqual(4, environment.GetValue("b")); }
public void CreateAndEvaluateSimpleWhileCommandWithContinue() { BindingEnvironment environment = new BindingEnvironment(); environment.SetValue("a", 1); IExpression condition = new CompareExpression(ComparisonOperator.Less, new NameExpression("a"), new ConstantExpression(10)); ICommand ifcmd = new IfCommand(new CompareExpression(ComparisonOperator.Equal, new NameExpression("a"), new ConstantExpression(2)), new ContinueCommand()); ICommand setcmd = new SetCommand("a", new BinaryOperatorExpression(new NameExpression("a"), new ConstantExpression(1), BinaryOperator.Add)); ICommand body = new CompositeCommand(new ICommand[] { setcmd, ifcmd, setcmd }); WhileCommand command = new WhileCommand(condition, body); command.Execute(environment); Assert.AreEqual(condition, command.Condition); Assert.AreEqual(body, command.Command); Assert.AreEqual(10, environment.GetValue("a")); }
public void ExecuteCompositeCommand() { SetCommand command1 = new SetCommand("foo", new ConstantExpression("bar")); SetCommand command2 = new SetCommand("one", new ConstantExpression(1)); CompositeCommand command = new CompositeCommand(); command.AddCommand(command1); command.AddCommand(command2); Machine machine = new Machine(); command.Execute(machine.Environment); Assert.AreEqual("bar", machine.Environment.GetValue("foo")); Assert.AreEqual(1, machine.Environment.GetValue("one")); Assert.IsNotNull(command.Commands); }
public void ExecuteCompositeCommandWithReturn() { SetCommand command1 = new SetCommand("foo", new ConstantExpression("bar")); ReturnCommand command2 = new ReturnCommand(new ConstantExpression("spam")); SetCommand command3 = new SetCommand("one", new ConstantExpression(1)); CompositeCommand command = new CompositeCommand(); command.AddCommand(command1); command.AddCommand(command2); command.AddCommand(command3); Machine machine = new Machine(); BindingEnvironment environment = new BindingEnvironment(machine.Environment); command.Execute(environment); Assert.AreEqual("bar", environment.GetValue("foo")); Assert.IsNull(environment.GetValue("one")); Assert.IsTrue(environment.HasReturnValue()); Assert.AreEqual("spam", environment.GetReturnValue()); Assert.IsNotNull(command.Commands); }
public void RaiseWhenOneParameterExpectedAndNoneIsProvided() { IList<Parameter> parameters = new Parameter[] { new Parameter("a", null, false) }; CompositeCommand body = new CompositeCommand(); Machine machine = new Machine(); DefinedFunction func = new DefinedFunction("foo", parameters, body, null); try { func.Apply(machine.Environment, null, null); Assert.Fail("Exception expected"); } catch (Exception ex) { Assert.IsInstanceOfType(ex, typeof(TypeError)); Assert.AreEqual("foo() takes exactly 1 positional argument (0 given)", ex.Message); } }
public void RaiseWhenFewParametersProvided() { IList<Parameter> parameters = new Parameter[] { new Parameter("a", null, false), new Parameter("b", null, false) }; CompositeCommand body = new CompositeCommand(); Machine machine = new Machine(); StringWriter writer = new StringWriter(); machine.Output = writer; DefinedFunction func = new DefinedFunction("foo", parameters, body, null); try { func.Apply(machine.Environment, new object[] { 1 }, null); Assert.Fail("Exception expected"); } catch (Exception ex) { Assert.IsInstanceOfType(ex, typeof(TypeError)); Assert.AreEqual("foo() takes exactly 2 positional arguments (1 given)", ex.Message); } }
public void ExecuteFunctionWithReturn() { IList<Parameter> parameters = new Parameter[] { new Parameter("a", null, false), new Parameter("b", null, false) }; CompositeCommand body = new CompositeCommand(); body.AddCommand(new ReturnCommand(new BinaryOperatorExpression(new NameExpression("a"), new NameExpression("b"), BinaryOperator.Add))); Machine machine = new Machine(); StringWriter writer = new StringWriter(); machine.Output = writer; DefinedFunction func = new DefinedFunction("foo", parameters, body, null); var result = func.Apply(machine.Environment, new object[] { 1, 2 }, null); Assert.IsNotNull(result); Assert.AreEqual(3, result); }
public void ExecuteFunctionWithPrint() { IList<Parameter> parameters = new Parameter[] { new Parameter("a", null, false), new Parameter("b", null, false) }; CompositeCommand body = new CompositeCommand(); body.AddCommand(new ExpressionCommand(new CallExpression(new NameExpression("print"), new IExpression[] { new NameExpression("a") }))); body.AddCommand(new ExpressionCommand(new CallExpression(new NameExpression("print"), new IExpression[] { new NameExpression("b") }))); Machine machine = new Machine(); StringWriter writer = new StringWriter(); machine.Output = writer; DefinedFunction func = new DefinedFunction("foo", parameters, body, machine.Environment); func.Apply(machine.Environment, new object[] { 1, 2 }, null); Assert.AreEqual("1\r\n2\r\n", writer.ToString()); }