void test_bind_with_string_returned() { Pointer* name = Pointer::create(state, (void*)dummy_string); Array* args = Array::create(state, 1); args->set(state, 0, Fixnum::from(RBX_FFI_TYPE_STRING)); Object* ret = Fixnum::from(RBX_FFI_TYPE_STRING); NativeFunction *func = NativeFunction::generate(state, name, state->symbol("ffi"), args, ret); TS_ASSERT(!func->nil_p()); Array* input = Array::create(state, 1); input->set(state, 0, String::create(state, "whatever")); Arguments args_obj(input); Object* out = func->call(state, args_obj, NULL); TS_ASSERT(kind_of<String>(out)); TS_ASSERT_EQUALS(as<String>(out)->c_str(), std::string("whatever")); input = Array::create(state, 1); input->set(state, 0, Qnil); Arguments args_obj2(input); out = func->call(state, args_obj2, NULL); TS_ASSERT_EQUALS(out, Qnil); }
void test_bind_with_object() { Pointer* name = Pointer::create(state, (void*)dummy_ptr); Array* args = Array::create(state, 1); args->set(state, 0, Fixnum::from(RBX_FFI_TYPE_OBJECT)); Object* ret = Fixnum::from(RBX_FFI_TYPE_OBJECT); NativeFunction *func = NativeFunction::generate(state, name, state->symbol("ffi"), args, ret); TS_ASSERT(!func->nil_p()); Array* input = Array::create(state, 1); Object* obj = state->new_object<Object>(G(object)); input->set(state, 0, obj); Arguments args_obj(input); Object* out = func->call(state, args_obj, NULL); TS_ASSERT(kind_of<Object>(out)); TS_ASSERT_EQUALS(out, obj); input = Array::create(state, 1); input->set(state, 0, Qnil); Arguments args_obj2(input); out = func->call(state, args_obj2, NULL); TS_ASSERT_EQUALS(out, Qnil); }
void test_bind_with_unsigned_long_long() { Pointer* name = Pointer::create(state, (void*)dummy_unsigned_long_long); Array* args = Array::create(state, 1); args->set(state, 0, Fixnum::from(RBX_FFI_TYPE_ULONG_LONG)); Object* ret = Fixnum::from(RBX_FFI_TYPE_ULONG_LONG); NativeFunction *func = NativeFunction::generate(state, name, state->symbol("ffi"), args, ret); TS_ASSERT(!func->nil_p()); Array* input = Array::create(state, 1); input->set(state, 0, Fixnum::from(13)); Arguments args_obj(input); Object* out = func->call(state, args_obj, NULL); TS_ASSERT(kind_of<Integer>(out)); TS_ASSERT_EQUALS(as<Integer>(out)->to_native(), (native_int)13); input = Array::create(state, 1); input->set(state, 0, Integer::from(state, 9223372036854775808ULL)); Arguments args_obj2(input); out = func->call(state, args_obj2, NULL); TS_ASSERT(kind_of<Bignum>(out)); TS_ASSERT_EQUALS(as<Bignum>(out)->to_ulong_long(), 9223372036854775808ULL); }
void test_bind_with_ptr() { Pointer* name = Pointer::create(state, (void*)dummy_ptr); Array* args = Array::create(state, 1); args->set(state, 0, Fixnum::from(RBX_FFI_TYPE_PTR)); Object* ret = Fixnum::from(RBX_FFI_TYPE_PTR); NativeFunction *func = NativeFunction::generate(state, name, state->symbol("ffi"), args, ret); TS_ASSERT(!func->nil_p()); char buffer[1]; buffer[0] = 0; Pointer* ptr = Pointer::create(state, buffer); Array* input = Array::create(state, 1); input->set(state, 0, ptr); Arguments args_obj(input); Object* out = func->call(state, args_obj, NULL); TS_ASSERT(kind_of<Pointer>(out)); TS_ASSERT_EQUALS(as<Pointer>(out)->pointer, ptr->pointer); input = Array::create(state, 1); input->set(state, 0, Qnil); Arguments args_obj2(input); out = func->call(state, args_obj2, NULL); TS_ASSERT_EQUALS(out, Qnil); }
void test_bind_with_unsigned_short() { Pointer* name = Pointer::create(state, (void*)dummy_unsigned_short); Array* args = Array::create(state, 1); args->set(state, 0, Fixnum::from(RBX_FFI_TYPE_USHORT)); Object* ret = Fixnum::from(RBX_FFI_TYPE_USHORT); NativeFunction *func = NativeFunction::generate(state, name, state->symbol("ffi"), args, ret); TS_ASSERT(!func->nil_p()); Array* input = Array::create(state, 2); input->set(state, 0, Fixnum::from(0)); Arguments args_obj(input); Object* out = func->call(state, args_obj, NULL); TS_ASSERT(kind_of<Fixnum>(out)); input = Array::create(state, 2); input->set(state, 0, out); Arguments args_obj2(input); out = func->call(state, args_obj2, NULL); TS_ASSERT(kind_of<Fixnum>(out)); TS_ASSERT_EQUALS(out, Fixnum::from(0)); }
void test_bind_with_int() { Pointer* name = Pointer::create(state, (void*)dummy_int); Array* args = Array::create(state, 1); args->set(state, 0, Fixnum::from(RBX_FFI_TYPE_INT)); Object* ret = Fixnum::from(RBX_FFI_TYPE_INT); NativeFunction *func = NativeFunction::generate(state, name, state->symbol("ffi"), args, ret); TS_ASSERT(!func->nil_p()); Array* input = Array::create(state, 1); input->set(state, 0, Fixnum::from(13)); Arguments args_obj(input); Object* out = func->call(state, args_obj, NULL); TS_ASSERT(kind_of<Integer>(out)); TS_ASSERT_EQUALS(as<Integer>(out)->to_native(), (native_int)13); input = Array::create(state, 1); input->set(state, 0, Integer::from(state, (int)2147483647)); Arguments args_obj2(input); out = func->call(state, args_obj2, NULL); TS_ASSERT(kind_of<Integer>(out)); TS_ASSERT_EQUALS(as<Integer>(out)->to_native(), (native_int)2147483647); }
void test_bind_with_object() { String* name = String::create(state, "dummy_ptr"); Array* args = Array::create(state, 1); args->set(state, 0, Fixnum::from(RBX_FFI_TYPE_OBJECT)); Object* ret = Fixnum::from(RBX_FFI_TYPE_OBJECT); NativeFunction *func = NativeFunction::bind(state, Qnil, name, args, ret); TS_ASSERT(!func->nil_p()); Array* input = Array::create(state, 1); Object* obj = state->new_object<Object>(G(object)); input->set(state, 0, obj); Arguments args_obj(input); Object* out = func->call(state, args_obj, NULL); TS_ASSERT(kind_of<Object>(out)); TS_ASSERT_EQUALS(out, obj); input = Array::create(state, 1); input->set(state, 0, Qnil); Arguments args_obj2(input); out = func->call(state, args_obj2, NULL); TS_ASSERT_EQUALS(out, Qnil); }
void test_bind_with_ptr() { String* name = String::create(state, "dummy_ptr"); Array* args = Array::create(state, 1); args->set(state, 0, Fixnum::from(RBX_FFI_TYPE_PTR)); Object* ret = Fixnum::from(RBX_FFI_TYPE_PTR); NativeFunction *func = NativeFunction::bind(state, Qnil, name, args, ret); TS_ASSERT(!func->nil_p()); char buffer[1]; buffer[0] = 0; MemoryPointer* ptr = MemoryPointer::create(state, buffer); Array* input = Array::create(state, 1); input->set(state, 0, ptr); Arguments args_obj(input); Object* out = func->call(state, args_obj, NULL); TS_ASSERT(kind_of<MemoryPointer>(out)); TS_ASSERT_EQUALS(as<MemoryPointer>(out)->pointer, ptr->pointer); input = Array::create(state, 1); input->set(state, 0, Qnil); Arguments args_obj2(input); out = func->call(state, args_obj2, NULL); TS_ASSERT_EQUALS(out, Qnil); }
void test_bind_with_long_long() { String* name = String::create(state, "dummy_long_long"); Array* args = Array::create(state, 1); args->set(state, 0, Fixnum::from(RBX_FFI_TYPE_LONG_LONG)); Object* ret = Fixnum::from(RBX_FFI_TYPE_LONG_LONG); NativeFunction *func = NativeFunction::bind(state, Qnil, name, args, ret); TS_ASSERT(!func->nil_p()); Array* input = Array::create(state, 1); input->set(state, 0, Fixnum::from(13)); Arguments args_obj(input); Object* out = func->call(state, args_obj, NULL); TS_ASSERT(kind_of<Integer>(out)); TS_ASSERT_EQUALS(as<Integer>(out)->to_native(), (native_int)13); input = Array::create(state, 1); input->set(state, 0, Integer::from(state, 9223372036854775807LL)); Arguments args_obj2(input); out = func->call(state, args_obj2, NULL); TS_ASSERT(kind_of<Bignum>(out)); TS_ASSERT_EQUALS(as<Bignum>(out)->to_long_long(), 9223372036854775807LL); }
void test_bind_with_unsigned_int() { String* name = String::create(state, "dummy_unsigned_int"); Array* args = Array::create(state, 1); args->set(state, 0, Fixnum::from(RBX_FFI_TYPE_UINT)); Object* ret = Fixnum::from(RBX_FFI_TYPE_UINT); NativeFunction *func = NativeFunction::bind(state, Qnil, name, args, ret); TS_ASSERT(!func->nil_p()); Array* input = Array::create(state, 1); input->set(state, 0, Fixnum::from(13)); Arguments args_obj(input); Object* out = func->call(state, args_obj, NULL); TS_ASSERT(kind_of<Integer>(out)); TS_ASSERT_EQUALS(as<Integer>(out)->to_native(), (native_int)13); input = Array::create(state, 1); input->set(state, 0, Integer::from(state, (unsigned int)2147483647)); Arguments args_obj2(input); out = func->call(state, args_obj2, NULL); TS_ASSERT(kind_of<Integer>(out)); TS_ASSERT_EQUALS(as<Integer>(out)->to_native(), (native_int)2147483647); }
void test_bind_with_unsigned_short() { String* name = String::create(state, "dummy_unsigned_short"); Array* args = Array::create(state, 1); args->set(state, 0, Fixnum::from(RBX_FFI_TYPE_USHORT)); Object* ret = Fixnum::from(RBX_FFI_TYPE_USHORT); NativeFunction *func = NativeFunction::bind(state, Qnil, name, args, ret); TS_ASSERT(!func->nil_p()); Array* input = Array::create(state, 2); input->set(state, 0, Fixnum::from(0)); Arguments args_obj(input); Object* out = func->call(state, args_obj, NULL); TS_ASSERT(kind_of<Fixnum>(out)); input = Array::create(state, 2); input->set(state, 0, out); Arguments args_obj2(input); out = func->call(state, args_obj2, NULL); TS_ASSERT(kind_of<Fixnum>(out)); TS_ASSERT_EQUALS(out, Fixnum::from(0)); }