public void ObjectOperations1() {
var cls = Engine.Execute(@"
class C
def foo *a
p a
end
self
end
");
var obj = Engine.Operations.CreateInstance(cls) as RubyObject;
Assert(obj != null && obj.ImmediateClass.Name == "C");
obj = Engine.Operations.InvokeMember(cls, "new") as RubyObject;
Assert(obj != null && obj.ImmediateClass.Name == "C");
var foo = Engine.Operations.GetMember(obj, "foo") as RubyMethod;
Assert(foo != null && foo.Name == "foo" && foo.Target == obj);
AssertOutput(() => Engine.Operations.Invoke(foo, 1, 2), "[1, 2]");
AssertOutput(() => Engine.Operations.InvokeMember(obj, "foo", 1, 2), "[1, 2]");
var str = Engine.Operations.ConvertTo<string>(MutableString.CreateAscii("foo"));
Assert(str == "foo");
str = Engine.Operations.ConvertTo<string>(Engine.Execute<object>("class C; def to_str; 'bar'; end; new; end"));
Assert(str == "bar");
var b = Engine.Operations.ConvertTo<byte>(Engine.Execute<object>("class C; def to_int; 123; end; new; end"));
Assert(b == 123);
var lambda = Engine.Operations.ConvertTo<Func<int, int>>(Engine.Execute<object>("lambda { |x| x * 2 }"));
Assert(lambda(10) == 20);
Assert((int)Engine.CreateOperations().InvokeMember(null, "to_i") == 0);
}