public void RubyHosting_DelegateConversions() {
object lambda = Engine.Execute(@"lambda { |a| a + 1 }");
var result = Engine.Operations.Invoke(lambda, 5);
Assert((int)result == 6);
var func = Engine.Operations.ConvertTo<Func<int, int>>(lambda);
Assert(func(10) == 11);
object method = Engine.Execute(@"def foo(a,b); a + b; end; method(:foo)");
var func2 = Engine.Operations.ConvertTo<Func<int, int, int>>(method);
Assert(func2(1, 2) == 3);
Engine.Runtime.Globals.SetVariable("F1", typeof(Func<int, int>));
var func3 = (Func<int, int>)Engine.Execute(@"F1.to_class.new { |a| a + 3 }");
Assert(func3(1) == 4);
var func4 = (Func<int, int>)Engine.Execute(@"F1.to_class.new lambda { |a| a + 4 }");
Assert(func4(1) == 5);
var func5 = (Func<int, int>)Engine.Execute(@"F1.to_class.new(*[lambda { |a| a + 5 }])");
Assert(func5(1) == 6);
AssertExceptionThrown<ArgumentException>(() => Engine.Execute(@"F1.to_class.new(*[])"));
if (_driver.RunPython) {
var py = Runtime.GetEngine("python");
Engine.Runtime.Globals.SetVariable("F2", typeof(Func<string[], string[], string[]>));
var pyAdd = py.Execute(@"
def py_add(a, b):
return a + b
py_add
");
Engine.Runtime.Globals.SetVariable("PyAdd", pyAdd);
var pyFunc = (Func<string[], string[], string[]>)Engine.Execute(@"F2.to_class.new PyAdd");
Assert(String.Join(";", pyFunc(new[] { "x" }, new[] { "y" })) == "x;y");
}
}