public void Dlr_Indexable() { var scope = CreateInteropScope(); object indexable = scope.GetVariable("indexable"); AreEqual(MyGetIndexBinder.Invoke(indexable, 2), 2); AreEqual(MySetIndexBinder.Invoke(indexable, 10, 100), 100); AreEqual(MyGetIndexBinder.Invoke(indexable, 10), 100); AreEqual(MyGetIndexBinder.Invoke(indexable, 9), null); }
public void Dlr_MethodMissing() { var scope = CreateInteropScope(); object dynamic_object = scope.GetVariable("dynamic_object"); AreEqual(MyInvokeMemberBinder.Invoke(dynamic_object, "non_existent_method"), "dynamic_non_existent_method"); AreEqual(MySetMemberBinder.Invoke(dynamic_object, "non_existent_member", 100), 100); // Ruby doesn't have "mising_property" so we get a method, not the value: AreEqual(MyInvokeBinder.Invoke(MyGetMemberBinder.Invoke(dynamic_object, "non_existent_member")), 100); AreEqual(MyGetIndexBinder.Invoke(dynamic_object, "non_existent_index"), "dynamic_element_non_existent_index"); AreEqual(MySetIndexBinder.Invoke(dynamic_object, "non_existent_index", 100), 100); AreEqual(MyGetIndexBinder.Invoke(dynamic_object, "non_existent_index"), 100); AreEqual(MyInvokeMemberBinder.Invoke(dynamic_object, "explicit_attribute"), "explicit_attribute"); }
public void Dlr_ClrSubtype() { var scope = CreateInteropScope(); object ruby_array_list = scope.GetVariable("ruby_array_list"); // CLR properties are accessible as methods AreEqual(MyInvokeMemberBinder.Invoke(ruby_array_list, "Count"), "FallbackInvokeMember"); // CLR properties are accessible as members AreEqual(MyGetMemberBinder.Invoke(ruby_array_list, "Count"), "FallbackGetMember"); // Overriden CLR member AreEqual(MyInvokeMemberBinder.Invoke(ruby_array_list, "IndexOf", null), 123456789); // CLR indexer AreEqual(MySetIndexBinder.Invoke(ruby_array_list, 10, 100), "FallbackSetIndex:10100"); AreEqual(MyGetIndexBinder.Invoke(ruby_array_list, 10), "FallbackGetIndex:10"); AreEqual(MyInvokeMemberBinder.Invoke(ruby_array_list, "ruby_method"), "Hi from Ruby"); // CLR properties accessed with Ruby name. AreEqual(MyInvokeMemberBinder.Invoke(ruby_array_list, "count"), "FallbackInvokeMember"); // CLR methods accessed with Ruby name. AreEqual(MyInvokeMemberBinder.Invoke(ruby_array_list, "index_of", null), "FallbackInvokeMember"); AreEqual(MyInvokeMemberBinder.Invoke(ruby_array_list, "non_existent"), "FallbackInvokeMember"); AreEqual(MySetMemberBinder.Invoke(ruby_array_list, "Count", 100000), "FallbackSetMember"); // Ruby attributes are invoked directly via SetMember/GetMember: AreEqual(MySetMemberBinder.Invoke(ruby_array_list, "ruby_attribute", 123), 123); AreEqual(MyGetMemberBinder.Invoke(ruby_array_list, "ruby_attribute"), 123); #if !CLR2 List <object> result = new List <object>(); foreach (object item in (dynamic)ruby_array_list) { result.Add(item); } Assert(result.Count == 2 && (int)result[0] == 100 && (int)result[1] == 200); #endif }