gir_ffi 0.6.7 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/{History.txt → Changelog.md} +93 -61
- data/{DESIGN.rdoc → DESIGN.md} +7 -7
- data/README.md +5 -7
- data/TODO.md +90 -0
- data/lib/ffi-glib.rb +0 -1
- data/lib/ffi-glib/array.rb +13 -29
- data/lib/ffi-glib/array_methods.rb +13 -0
- data/lib/ffi-glib/container_class_methods.rb +6 -1
- data/lib/ffi-glib/hash_table.rb +3 -2
- data/lib/ffi-glib/list.rb +3 -17
- data/lib/ffi-glib/list_methods.rb +22 -3
- data/lib/ffi-glib/ptr_array.rb +19 -19
- data/lib/ffi-glib/s_list.rb +3 -17
- data/lib/ffi-gobject.rb +10 -17
- data/lib/ffi-gobject/object.rb +19 -9
- data/lib/ffi-gobject/object_class.rb +14 -0
- data/lib/ffi-gobject/ruby_closure.rb +4 -5
- data/lib/ffi-gobject/value.rb +7 -5
- data/lib/ffi-gobject_introspection/i_vfunc_info.rb +1 -1
- data/lib/gir_ffi-base.rb +0 -2
- data/lib/gir_ffi-base/gobject.rb +1 -0
- data/lib/gir_ffi-base/gobject/lib.rb +1 -1
- data/lib/gir_ffi.rb +2 -0
- data/lib/gir_ffi/arg_helper.rb +18 -8
- data/lib/gir_ffi/builders/argument_builder.rb +62 -55
- data/lib/gir_ffi/builders/base_argument_builder.rb +52 -106
- data/lib/gir_ffi/builders/base_type_builder.rb +3 -3
- data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +34 -0
- data/lib/gir_ffi/builders/callback_argument_builder.rb +73 -0
- data/lib/gir_ffi/builders/callback_builder.rb +19 -9
- data/lib/gir_ffi/builders/callback_return_value_builder.rb +54 -0
- data/lib/gir_ffi/builders/closure_convertor.rb +9 -0
- data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +9 -0
- data/lib/gir_ffi/builders/constructor_result_convertor.rb +9 -0
- data/lib/gir_ffi/builders/enum_builder.rb +16 -16
- data/lib/gir_ffi/builders/field_builder.rb +36 -15
- data/lib/gir_ffi/builders/function_builder.rb +32 -27
- data/lib/gir_ffi/builders/interface_builder.rb +14 -4
- data/lib/gir_ffi/builders/mapping_method_builder.rb +95 -43
- data/lib/gir_ffi/builders/module_builder.rb +22 -35
- data/lib/gir_ffi/builders/null_convertor.rb +9 -0
- data/lib/gir_ffi/builders/object_builder.rb +11 -14
- data/lib/gir_ffi/builders/property_builder.rb +107 -9
- data/lib/gir_ffi/builders/registered_type_builder.rb +2 -2
- data/lib/gir_ffi/builders/return_value_builder.rb +42 -33
- data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +15 -0
- data/lib/gir_ffi/builders/signal_builder.rb +18 -58
- data/lib/gir_ffi/builders/struct_builder.rb +1 -2
- data/lib/gir_ffi/builders/type_builder.rb +1 -0
- data/lib/gir_ffi/builders/unintrospectable_builder.rb +4 -4
- data/lib/gir_ffi/builders/user_defined_builder.rb +151 -26
- data/lib/gir_ffi/builders/vfunc_builder.rb +57 -0
- data/lib/gir_ffi/builders/with_layout.rb +10 -8
- data/lib/gir_ffi/builders/with_methods.rb +1 -1
- data/lib/gir_ffi/callback_base.rb +42 -8
- data/lib/gir_ffi/class_base.rb +1 -2
- data/lib/gir_ffi/enum_base.rb +26 -4
- data/lib/gir_ffi/error_argument_info.rb +21 -0
- data/lib/gir_ffi/{setter_argument_info.rb → field_argument_info.rb} +2 -1
- data/lib/gir_ffi/g_type.rb +25 -0
- data/lib/gir_ffi/in_out_pointer.rb +3 -14
- data/lib/gir_ffi/in_pointer.rb +20 -21
- data/lib/gir_ffi/info_ext.rb +2 -0
- data/lib/gir_ffi/info_ext/i_callable_info.rb +0 -9
- data/lib/gir_ffi/info_ext/i_callback_info.rb +17 -0
- data/lib/gir_ffi/info_ext/i_function_info.rb +4 -0
- data/lib/gir_ffi/info_ext/i_property_info.rb +4 -0
- data/lib/gir_ffi/info_ext/i_registered_type_info.rb +1 -0
- data/lib/gir_ffi/info_ext/i_signal_info.rb +14 -16
- data/lib/gir_ffi/info_ext/i_type_info.rb +72 -34
- data/lib/gir_ffi/info_ext/i_vfunc_info.rb +12 -0
- data/lib/gir_ffi/info_ext/safe_constant_name.rb +3 -2
- data/lib/gir_ffi/interface_base.rb +8 -3
- data/lib/gir_ffi/module_base.rb +3 -5
- data/lib/gir_ffi/object_base.rb +8 -0
- data/lib/gir_ffi/receiver_argument_info.rb +21 -0
- data/lib/gir_ffi/receiver_type_info.rb +27 -0
- data/lib/gir_ffi/return_value_info.rb +23 -0
- data/lib/gir_ffi/signal_base.rb +1 -1
- data/lib/{ffi-glib → gir_ffi}/sized_array.rb +10 -6
- data/lib/gir_ffi/struct_base.rb +10 -9
- data/lib/gir_ffi/type_base.rb +1 -0
- data/lib/gir_ffi/type_map.rb +3 -0
- data/lib/gir_ffi/unintrospectable_type_info.rb +4 -1
- data/lib/gir_ffi/union_base.rb +4 -21
- data/lib/gir_ffi/user_data_argument_info.rb +21 -0
- data/lib/gir_ffi/user_data_type_info.rb +17 -0
- data/lib/gir_ffi/user_defined_type_info.rb +18 -4
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi/vfunc_base.rb +8 -0
- data/lib/gir_ffi/vfunc_implementation.rb +11 -0
- data/lib/gir_ffi/zero_terminated.rb +18 -24
- data/test/base_test_helper.rb +2 -3
- data/test/ffi-glib/array_test.rb +3 -3
- data/test/ffi-glib/ruby_closure_test.rb +3 -3
- data/test/ffi-gobject/value_test.rb +15 -1
- data/test/ffi-gobject_test.rb +2 -1
- data/test/gir_ffi/arg_helper_test.rb +21 -2
- data/test/gir_ffi/builders/argument_builder_test.rb +213 -287
- data/test/gir_ffi/builders/base_argument_builder_test.rb +1 -1
- data/test/gir_ffi/builders/callback_builder_test.rb +26 -8
- data/test/gir_ffi/builders/field_builder_test.rb +18 -3
- data/test/gir_ffi/builders/function_builder_test.rb +30 -12
- data/test/gir_ffi/builders/interface_builder_test.rb +9 -0
- data/test/gir_ffi/builders/module_builder_test.rb +0 -39
- data/test/gir_ffi/builders/object_builder_test.rb +27 -27
- data/test/gir_ffi/builders/property_builder_test.rb +110 -0
- data/test/gir_ffi/builders/return_value_builder_test.rb +168 -200
- data/test/gir_ffi/builders/signal_builder_test.rb +58 -14
- data/test/gir_ffi/builders/struct_builder_test.rb +2 -41
- data/test/gir_ffi/builders/user_defined_builder_test.rb +88 -20
- data/test/gir_ffi/builders/vfunc_builder_test.rb +44 -0
- data/test/gir_ffi/g_type_test.rb +29 -0
- data/test/gir_ffi/in_pointer_test.rb +28 -9
- data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -9
- data/test/gir_ffi/info_ext/i_callback_info_test.rb +19 -0
- data/test/gir_ffi/info_ext/i_function_info_test.rb +9 -0
- data/test/gir_ffi/info_ext/i_signal_info_test.rb +8 -11
- data/test/gir_ffi/info_ext/i_type_info_test.rb +140 -16
- data/test/gir_ffi/interface_base_test.rb +9 -3
- data/test/gir_ffi/object_base_test.rb +1 -2
- data/test/{ffi-glib → gir_ffi}/sized_array_test.rb +28 -28
- data/test/gir_ffi/type_map_test.rb +1 -1
- data/test/gir_ffi/user_defined_type_info_test.rb +36 -4
- data/test/gir_ffi_test.rb +5 -5
- data/test/gir_ffi_test_helper.rb +4 -0
- data/test/integration/generated_gimarshallingtests_test.rb +163 -59
- data/test/integration/generated_gobject_test.rb +21 -8
- data/test/integration/generated_pango_test.rb +2 -2
- data/test/integration/generated_regress_test.rb +361 -101
- data/test/lib/autogen.sh +5 -1
- metadata +51 -35
- data/TODO.rdoc +0 -63
- data/lib/gir_ffi-base/gir_ffi/library.rb +0 -17
- data/lib/gir_ffi-base/gir_ffi/struct.rb +0 -27
@@ -10,10 +10,10 @@ describe GirFFI::Builders::SignalBuilder do
|
|
10
10
|
|
11
11
|
it "returns a valid mapping method including receiver and user data" do
|
12
12
|
expected = <<-CODE.reset_indentation
|
13
|
-
def self.call_with_argument_mapping(_proc,
|
14
|
-
|
15
|
-
|
16
|
-
_proc.call(
|
13
|
+
def self.call_with_argument_mapping(_proc, _instance, _user_data)
|
14
|
+
_v1 = Regress::TestObj.wrap(_instance)
|
15
|
+
_v2 = GirFFI::ArgHelper::OBJECT_STORE[_user_data.address]
|
16
|
+
_proc.call(_v1, _v2)
|
17
17
|
end
|
18
18
|
CODE
|
19
19
|
|
@@ -29,11 +29,12 @@ describe GirFFI::Builders::SignalBuilder do
|
|
29
29
|
skip unless signal_info
|
30
30
|
|
31
31
|
expected = <<-CODE.reset_indentation
|
32
|
-
def self.call_with_argument_mapping(_proc,
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
32
|
+
def self.call_with_argument_mapping(_proc, _instance, i, _user_data)
|
33
|
+
_v1 = Regress::TestObj.wrap(_instance)
|
34
|
+
_v2 = i
|
35
|
+
_v3 = GirFFI::ArgHelper::OBJECT_STORE[_user_data.address]
|
36
|
+
_v4 = _proc.call(_v1, _v2, _v3)
|
37
|
+
return _v4
|
37
38
|
end
|
38
39
|
CODE
|
39
40
|
|
@@ -47,11 +48,54 @@ describe GirFFI::Builders::SignalBuilder do
|
|
47
48
|
|
48
49
|
it "returns a valid mapping method" do
|
49
50
|
expected = <<-CODE.reset_indentation
|
50
|
-
def self.call_with_argument_mapping(_proc,
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
_proc.call(
|
51
|
+
def self.call_with_argument_mapping(_proc, _instance, result, _user_data)
|
52
|
+
_v1 = Gio::MountOperation.wrap(_instance)
|
53
|
+
_v2 = Gio::MountOperationResult.wrap(result)
|
54
|
+
_v3 = GirFFI::ArgHelper::OBJECT_STORE[_user_data.address]
|
55
|
+
_proc.call(_v1, _v2, _v3)
|
56
|
+
end
|
57
|
+
CODE
|
58
|
+
|
59
|
+
builder.mapping_method_definition.must_equal expected
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "for a signal with a array plus length arguments" do
|
64
|
+
let(:signal_info) {
|
65
|
+
get_signal_introspection_data "Regress", "TestObj", "sig-with-array-len-prop" }
|
66
|
+
|
67
|
+
it "returns a valid mapping method" do
|
68
|
+
skip unless signal_info
|
69
|
+
|
70
|
+
expected = <<-CODE.reset_indentation
|
71
|
+
def self.call_with_argument_mapping(_proc, _instance, arr, len, _user_data)
|
72
|
+
_v1 = Regress::TestObj.wrap(_instance)
|
73
|
+
_v2 = GirFFI::ArgHelper::OBJECT_STORE[_user_data.address]
|
74
|
+
_v3 = len
|
75
|
+
_v4 = GirFFI::SizedArray.wrap(:guint32, _v3, arr)
|
76
|
+
_proc.call(_v1, _v4, _v2)
|
77
|
+
end
|
78
|
+
CODE
|
79
|
+
|
80
|
+
builder.mapping_method_definition.must_equal expected
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "for a signal returning an array of integers" do
|
85
|
+
let(:signal_info) {
|
86
|
+
get_signal_introspection_data "Regress", "TestObj", "sig-with-intarray-ret" }
|
87
|
+
|
88
|
+
it "returns a valid mapping method" do
|
89
|
+
skip unless signal_info
|
90
|
+
|
91
|
+
expected = <<-CODE.reset_indentation
|
92
|
+
def self.call_with_argument_mapping(_proc, _instance, i, _user_data)
|
93
|
+
_v1 = Regress::TestObj.wrap(_instance)
|
94
|
+
_v2 = i
|
95
|
+
_v3 = GirFFI::ArgHelper::OBJECT_STORE[_user_data.address]
|
96
|
+
_v4 = _proc.call(_v1, _v2, _v3)
|
97
|
+
_v5 = GLib::Array.from(:gint32, _v4)
|
98
|
+
return _v5
|
55
99
|
end
|
56
100
|
CODE
|
57
101
|
|
@@ -8,28 +8,17 @@ describe GirFFI::Builders::StructBuilder do
|
|
8
8
|
builder.layout_specification.must_equal [:some_int, :int32, 0,
|
9
9
|
:some_int8, :int8, 4,
|
10
10
|
:some_double, :double, 8,
|
11
|
-
:some_enum, Regress::TestEnum
|
11
|
+
:some_enum, Regress::TestEnum, 16]
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
describe "for a struct with a simple layout" do
|
16
16
|
before do
|
17
|
-
module Foo
|
18
|
-
class Bar
|
19
|
-
class Struct
|
20
|
-
|
21
|
-
end
|
22
|
-
end
|
23
|
-
module Lib
|
24
|
-
|
25
|
-
end
|
26
|
-
end
|
27
17
|
@field = Object.new
|
28
18
|
|
29
19
|
@struct = Object.new
|
30
|
-
stub(@struct).safe_name { 'Bar' }
|
31
20
|
stub(@struct).namespace { 'Foo' }
|
32
|
-
stub(@struct).
|
21
|
+
stub(@struct).safe_name { 'Bar' }
|
33
22
|
stub(@struct).fields { [ @field ] }
|
34
23
|
|
35
24
|
@builder = GirFFI::Builders::StructBuilder.new @struct
|
@@ -40,34 +29,6 @@ describe GirFFI::Builders::StructBuilder do
|
|
40
29
|
spec = @builder.send :layout_specification
|
41
30
|
assert_equal [:bar, :int32, 0], spec
|
42
31
|
end
|
43
|
-
|
44
|
-
it "creates getter and setter methods" do
|
45
|
-
# FIXME: Loads of stubs.
|
46
|
-
|
47
|
-
stub(type = Object.new).pointer? { false }
|
48
|
-
stub(type).tag { :gint32 }
|
49
|
-
stub(type).flattened_tag { :gint32 }
|
50
|
-
stub(type).tag_or_class { :gint32 }
|
51
|
-
stub(type).extra_conversion_arguments { [] }
|
52
|
-
|
53
|
-
stub(@field).field_type { type }
|
54
|
-
stub(@field).name { "bar" }
|
55
|
-
stub(@field).writable? { true }
|
56
|
-
stub(@field).offset { 4 }
|
57
|
-
stub(@field).container { @struct }
|
58
|
-
|
59
|
-
stub(@struct).find_instance_method { }
|
60
|
-
|
61
|
-
stub(GirFFI::Builder).build_module('Foo') { Foo }
|
62
|
-
|
63
|
-
refute Foo::Bar.method_defined?(:bar)
|
64
|
-
refute Foo::Bar.method_defined?(:bar=)
|
65
|
-
|
66
|
-
@builder.send :setup_field_accessors
|
67
|
-
|
68
|
-
assert Foo::Bar.method_defined?(:bar)
|
69
|
-
assert Foo::Bar.method_defined?(:bar=)
|
70
|
-
end
|
71
32
|
end
|
72
33
|
|
73
34
|
describe "for a struct with a layout with a complex type" do
|
@@ -3,36 +3,104 @@ require 'gir_ffi_test_helper'
|
|
3
3
|
GirFFI.setup :GIMarshallingTests
|
4
4
|
|
5
5
|
describe GirFFI::Builders::UserDefinedBuilder do
|
6
|
-
|
6
|
+
let(:klass) { Object.const_set("DerivedClass#{Sequence.next}",
|
7
|
+
Class.new(GIMarshallingTests::Object)) }
|
8
|
+
let(:builder) { GirFFI::Builders::UserDefinedBuilder.new info }
|
9
|
+
let(:info) { GirFFI::UserDefinedTypeInfo.new klass }
|
10
|
+
|
11
|
+
describe "#build_class" do
|
7
12
|
before do
|
8
|
-
|
9
|
-
|
13
|
+
builder.build_class
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "with type info containing one property" do
|
17
|
+
let(:info) { GirFFI::UserDefinedTypeInfo.new klass do |info|
|
18
|
+
info.install_property GObject.param_spec_int("foo", "foo bar",
|
19
|
+
"The Foo Bar Property",
|
20
|
+
10, 20, 15,
|
21
|
+
3)
|
22
|
+
end }
|
10
23
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
3)
|
24
|
+
it "registers a type that is bigger than the parent" do
|
25
|
+
gtype = klass.get_gtype
|
26
|
+
q = GObject.type_query gtype
|
27
|
+
q.instance_size.must_be :>, GIMarshallingTests::Object::Struct.size
|
16
28
|
end
|
17
29
|
|
18
|
-
|
19
|
-
|
30
|
+
it "gives the types Struct the fields :parent and :foo" do
|
31
|
+
klass::Struct.members.must_equal [:parent, :foo]
|
32
|
+
end
|
33
|
+
|
34
|
+
it "creates accessor functions for the property" do
|
35
|
+
obj = klass.new
|
36
|
+
obj.foo = 13
|
37
|
+
obj.foo.must_equal 13
|
38
|
+
end
|
39
|
+
|
40
|
+
it "makes the property retrievable using #get_property" do
|
41
|
+
obj = klass.new
|
42
|
+
obj.foo = 13
|
43
|
+
obj.get_property("foo").get_value.must_equal 13
|
44
|
+
end
|
45
|
+
|
46
|
+
it "makes the property settable using #set_property" do
|
47
|
+
obj = klass.new
|
48
|
+
obj.set_property("foo", 20)
|
49
|
+
obj.foo.must_equal 20
|
50
|
+
end
|
20
51
|
end
|
21
52
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
53
|
+
describe "with type info containing an overridden g_name" do
|
54
|
+
let(:info) { GirFFI::UserDefinedTypeInfo.new klass do |info|
|
55
|
+
info.g_name = "OtherName#{Sequence.next}"
|
56
|
+
end }
|
57
|
+
|
58
|
+
it "registers a type under the overridden name" do
|
59
|
+
registered_name = GObject.type_name(klass.get_gtype)
|
60
|
+
registered_name.must_equal info.g_name
|
61
|
+
registered_name.wont_equal klass.name
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "with type info containing a vfunc" do
|
66
|
+
let(:info) { GirFFI::UserDefinedTypeInfo.new klass do |info|
|
67
|
+
info.install_vfunc_implementation :method_int8_in, proc {|instance, in_|
|
68
|
+
instance.int = in_ }
|
69
|
+
end }
|
70
|
+
|
71
|
+
it "allows the vfunc to be called through its invoker" do
|
72
|
+
obj = klass.new
|
73
|
+
obj.method_int8_in 12
|
74
|
+
obj.int.must_equal 12
|
75
|
+
end
|
26
76
|
end
|
27
77
|
|
28
|
-
|
29
|
-
|
78
|
+
describe "with type info containing a vfunc from an included Interface" do
|
79
|
+
let(:info) do
|
80
|
+
klass.class_eval { include GIMarshallingTests::Interface }
|
81
|
+
GirFFI::UserDefinedTypeInfo.new klass do |info|
|
82
|
+
info.install_vfunc_implementation :test_int8_in,
|
83
|
+
proc {|instance, in_| instance.int = in_ }
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
it "marks the type as conforming to the included Interface" do
|
88
|
+
iface_gtype = GIMarshallingTests::Interface.get_gtype
|
89
|
+
GObject.type_interfaces(klass.get_gtype).to_a.must_equal [iface_gtype]
|
90
|
+
end
|
91
|
+
|
92
|
+
it "allows the vfunc to be called through its invoker" do
|
93
|
+
obj = klass.new
|
94
|
+
obj.test_int8_in 12
|
95
|
+
obj.int.must_equal 12
|
96
|
+
end
|
30
97
|
end
|
31
98
|
|
32
|
-
it "
|
33
|
-
|
34
|
-
|
35
|
-
|
99
|
+
it "does not attempt to register a registered class" do
|
100
|
+
gtype = klass.get_gtype
|
101
|
+
other_builder = GirFFI::Builders::UserDefinedBuilder.new info
|
102
|
+
other_builder.build_class
|
103
|
+
other_builder.gtype.must_equal gtype
|
36
104
|
end
|
37
105
|
end
|
38
106
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'gir_ffi_test_helper'
|
2
|
+
|
3
|
+
describe GirFFI::Builders::VFuncBuilder do
|
4
|
+
let(:builder) { GirFFI::Builders::VFuncBuilder.new vfunc_info }
|
5
|
+
|
6
|
+
describe "#mapping_method_definition" do
|
7
|
+
describe "for a vfunc with only one argument" do
|
8
|
+
let(:vfunc_info) {
|
9
|
+
get_vfunc_introspection_data "GIMarshallingTests", "Object", "method_int8_in" }
|
10
|
+
|
11
|
+
it "returns a valid mapping method including receiver" do
|
12
|
+
expected = <<-CODE.reset_indentation
|
13
|
+
def self.call_with_argument_mapping(_proc, _instance, in_)
|
14
|
+
_v1 = GIMarshallingTests::Object.wrap(_instance)
|
15
|
+
_v2 = in_
|
16
|
+
_proc.call(_v1, _v2)
|
17
|
+
end
|
18
|
+
CODE
|
19
|
+
|
20
|
+
builder.mapping_method_definition.must_equal expected
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "for a vfunc returning an enum" do
|
25
|
+
let(:vfunc_info) {
|
26
|
+
get_vfunc_introspection_data "GIMarshallingTests", "Object", "vfunc_return_enum" }
|
27
|
+
|
28
|
+
it "returns a valid mapping method including receiver" do
|
29
|
+
skip unless vfunc_info
|
30
|
+
expected = <<-CODE.reset_indentation
|
31
|
+
def self.call_with_argument_mapping(_proc, _instance)
|
32
|
+
_v1 = GIMarshallingTests::Object.wrap(_instance)
|
33
|
+
_v2 = _proc.call(_v1)
|
34
|
+
_v3 = GIMarshallingTests::Enum.from(_v2)
|
35
|
+
return _v3
|
36
|
+
end
|
37
|
+
CODE
|
38
|
+
|
39
|
+
builder.mapping_method_definition.must_equal expected
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'gir_ffi_test_helper'
|
2
|
+
|
3
|
+
require 'gir_ffi/g_type'
|
4
|
+
|
5
|
+
describe GirFFI::GType do
|
6
|
+
let(:gobject_gtype) { GObject::Object.get_gtype }
|
7
|
+
let(:gobject_type_query) { GObject.type_query gobject_gtype }
|
8
|
+
|
9
|
+
describe "#to_i" do
|
10
|
+
it "returns the integer gtype" do
|
11
|
+
gt = GirFFI::GType.new(gobject_gtype)
|
12
|
+
gt.to_i.must_equal gobject_gtype
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#class_size" do
|
17
|
+
it "returns the class size for object types" do
|
18
|
+
gt = GirFFI::GType.new(gobject_gtype)
|
19
|
+
gt.class_size.must_equal gobject_type_query.class_size
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#instance_size" do
|
24
|
+
it "returns the instance size for object types" do
|
25
|
+
gt = GirFFI::GType.new(gobject_gtype)
|
26
|
+
gt.instance_size.must_equal gobject_type_query.instance_size
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -24,7 +24,7 @@ describe GirFFI::InPointer do
|
|
24
24
|
|
25
25
|
it "handles struct types" do
|
26
26
|
e = Class.new(GirFFI::StructBase) do
|
27
|
-
self::Struct = Class.new(
|
27
|
+
self::Struct = Class.new(FFI::Struct) do
|
28
28
|
layout :foo, :int32, :bar, :int32
|
29
29
|
end
|
30
30
|
end
|
@@ -42,10 +42,16 @@ describe GirFFI::InPointer do
|
|
42
42
|
p1 = GirFFI::InPointer.from :gint32, 42
|
43
43
|
p2 = GirFFI::InPointer.from :gint32, 24
|
44
44
|
|
45
|
-
ptr = GirFFI::InPointer.from_array [:pointer, :
|
45
|
+
ptr = GirFFI::InPointer.from_array [:pointer, :gint32], [p1, p2]
|
46
46
|
|
47
47
|
ptr.read_array_of_pointer(2).must_equal [p1, p2]
|
48
48
|
end
|
49
|
+
|
50
|
+
it "handles pointer casting" do
|
51
|
+
ptr = GirFFI::InPointer.from_array [:pointer, :gint32], [42, 24]
|
52
|
+
|
53
|
+
ptr.read_array_of_pointer(2).map(&:address).must_equal [42, 24]
|
54
|
+
end
|
49
55
|
end
|
50
56
|
|
51
57
|
describe "an instance created with .from_array :gint32" do
|
@@ -148,27 +154,40 @@ describe GirFFI::InPointer do
|
|
148
154
|
ptr = GirFFI::InPointer.from e, :bar
|
149
155
|
ptr.address.must_equal 1
|
150
156
|
end
|
151
|
-
end
|
152
157
|
|
153
|
-
|
154
|
-
describe "when called with an object implementing to_ptr" do
|
158
|
+
describe "for type :void" do
|
155
159
|
it "returns the result of to_ptr" do
|
156
160
|
obj = Object.new
|
157
161
|
def obj.to_ptr; :test_value; end
|
158
|
-
GirFFI::InPointer.
|
162
|
+
GirFFI::InPointer.from(:void, obj).must_equal :test_value
|
163
|
+
end
|
164
|
+
|
165
|
+
it "returns nil when passed nil" do
|
166
|
+
GirFFI::InPointer.from(:void, nil).must_equal nil
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
describe "for types that are classes" do
|
171
|
+
it "returns the result of to_ptr" do
|
172
|
+
klass = Class.new
|
173
|
+
obj = klass.new
|
174
|
+
def obj.to_ptr; :test_value; end
|
175
|
+
GirFFI::InPointer.from(klass, obj).must_equal :test_value
|
159
176
|
end
|
160
177
|
end
|
178
|
+
end
|
161
179
|
|
180
|
+
describe ".from_closure_data" do
|
162
181
|
describe "when called with nil" do
|
163
|
-
it "returns nil" do
|
164
|
-
GirFFI::InPointer.
|
182
|
+
it "returns a pointer pointing to nil.object_id" do
|
183
|
+
GirFFI::InPointer.from_closure_data(nil).address.must_equal nil.object_id
|
165
184
|
end
|
166
185
|
end
|
167
186
|
|
168
187
|
describe "when called with a string" do
|
169
188
|
it "stores the string in GirFFI::ArgHelper::OBJECT_STORE" do
|
170
189
|
str = "Foo"
|
171
|
-
ptr = GirFFI::InPointer.
|
190
|
+
ptr = GirFFI::InPointer.from_closure_data(str)
|
172
191
|
result = GirFFI::ArgHelper::OBJECT_STORE[ptr.address]
|
173
192
|
result.must_equal str
|
174
193
|
end
|
@@ -19,14 +19,5 @@ describe GirFFI::InfoExt::ICallableInfo do
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
23
|
-
describe "#return_ffi_type" do
|
24
|
-
it "returns the ffi type of the return type" do
|
25
|
-
stub(return_type_info = Object.new).to_ffitype { :some_type }
|
26
|
-
stub(callable_info).return_type { return_type_info }
|
27
|
-
|
28
|
-
callable_info.return_ffi_type.must_equal :some_type
|
29
|
-
end
|
30
|
-
end
|
31
22
|
end
|
32
23
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'gir_ffi_test_helper'
|
2
|
+
|
3
|
+
describe GirFFI::InfoExt::ICallbackInfo do
|
4
|
+
let(:klass) { Class.new do
|
5
|
+
include GirFFI::InfoExt::ICallbackInfo
|
6
|
+
end }
|
7
|
+
let(:callback_info) { klass.new }
|
8
|
+
|
9
|
+
describe "#return_ffi_type" do
|
10
|
+
it "returns the callback ffi type of the return type" do
|
11
|
+
stub(return_type_info = Object.new).to_callback_ffitype { :some_type }
|
12
|
+
stub(callback_info).return_type { return_type_info }
|
13
|
+
|
14
|
+
callback_info.return_ffi_type.must_equal :some_type
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
|