gir_ffi 0.7.8 → 0.7.9

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.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +16 -0
  3. data/README.md +24 -11
  4. data/TODO.md +10 -2
  5. data/gir_ffi.gemspec +2 -2
  6. data/lib/ffi-glib/array.rb +1 -1
  7. data/lib/ffi-glib/hash_table.rb +0 -4
  8. data/lib/ffi-gobject.rb +10 -6
  9. data/lib/ffi-gobject/object.rb +17 -0
  10. data/lib/ffi-gobject/ruby_closure.rb +1 -1
  11. data/lib/ffi-gobject/value.rb +28 -4
  12. data/lib/ffi-gobject_introspection.rb +4 -0
  13. data/lib/ffi-gobject_introspection/g_error.rb +2 -2
  14. data/lib/ffi-gobject_introspection/i_base_info.rb +1 -3
  15. data/lib/ffi-gobject_introspection/i_callable_info.rb +8 -0
  16. data/lib/ffi-gobject_introspection/i_registered_type_info.rb +2 -0
  17. data/lib/ffi-gobject_introspection/i_repository.rb +4 -4
  18. data/lib/ffi-gobject_introspection/lib.rb +57 -32
  19. data/lib/gir_ffi.rb +1 -1
  20. data/lib/gir_ffi/boxed_base.rb +40 -0
  21. data/lib/gir_ffi/builders/argument_builder.rb +11 -3
  22. data/lib/gir_ffi/builders/base_argument_builder.rb +4 -0
  23. data/lib/gir_ffi/builders/boxed_builder.rb +29 -0
  24. data/lib/gir_ffi/builders/callback_builder.rb +3 -1
  25. data/lib/gir_ffi/builders/callback_return_value_builder.rb +9 -1
  26. data/lib/gir_ffi/builders/field_builder.rb +68 -18
  27. data/lib/gir_ffi/builders/function_builder.rb +12 -2
  28. data/lib/gir_ffi/builders/mapping_method_builder.rb +7 -5
  29. data/lib/gir_ffi/builders/marshalling_method_builder.rb +1 -1
  30. data/lib/gir_ffi/builders/module_builder.rb +1 -1
  31. data/lib/gir_ffi/builders/registered_type_builder.rb +0 -9
  32. data/lib/gir_ffi/builders/return_value_builder.rb +0 -1
  33. data/lib/gir_ffi/builders/signal_closure_builder.rb +3 -1
  34. data/lib/gir_ffi/builders/struct_builder.rb +4 -16
  35. data/lib/gir_ffi/builders/union_builder.rb +2 -13
  36. data/lib/gir_ffi/builders/user_defined_builder.rb +6 -6
  37. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +44 -0
  38. data/lib/gir_ffi/builders/vfunc_builder.rb +3 -1
  39. data/lib/gir_ffi/callback_base.rb +5 -2
  40. data/lib/gir_ffi/class_base.rb +6 -7
  41. data/lib/gir_ffi/enum_base.rb +5 -0
  42. data/lib/gir_ffi/ffi_ext/pointer.rb +1 -0
  43. data/lib/gir_ffi/field_argument_info.rb +4 -0
  44. data/lib/gir_ffi/in_out_pointer.rb +1 -1
  45. data/lib/gir_ffi/in_pointer.rb +2 -2
  46. data/lib/gir_ffi/info_ext/i_arg_info.rb +12 -2
  47. data/lib/gir_ffi/info_ext/i_callable_info.rb +1 -1
  48. data/lib/gir_ffi/info_ext/i_callback_info.rb +7 -2
  49. data/lib/gir_ffi/info_ext/i_field_info.rb +1 -1
  50. data/lib/gir_ffi/info_ext/i_function_info.rb +1 -1
  51. data/lib/gir_ffi/info_ext/i_registered_type_info.rb +7 -2
  52. data/lib/gir_ffi/info_ext/i_type_info.rb +21 -9
  53. data/lib/gir_ffi/info_ext/i_unresolved_info.rb +5 -0
  54. data/lib/gir_ffi/interface_base.rb +5 -0
  55. data/lib/gir_ffi/object_base.rb +5 -0
  56. data/lib/gir_ffi/receiver_argument_info.rb +5 -0
  57. data/lib/gir_ffi/registered_type_base.rb +5 -0
  58. data/lib/gir_ffi/return_value_info.rb +3 -1
  59. data/lib/gir_ffi/sized_array.rb +1 -1
  60. data/lib/gir_ffi/struct_base.rb +2 -24
  61. data/lib/gir_ffi/type_map.rb +5 -1
  62. data/lib/gir_ffi/union_base.rb +2 -2
  63. data/lib/gir_ffi/version.rb +1 -1
  64. data/lib/gir_ffi/zero_terminated.rb +1 -1
  65. data/test/base_test_helper.rb +6 -6
  66. data/test/ffi-glib/hash_table_test.rb +7 -7
  67. data/test/ffi-glib/iconv_test.rb +2 -3
  68. data/test/ffi-glib/main_loop_test.rb +2 -2
  69. data/test/ffi-gobject/gobject_test.rb +1 -1
  70. data/test/ffi-gobject/object_test.rb +5 -14
  71. data/test/ffi-gobject/value_test.rb +30 -6
  72. data/test/ffi-gobject_introspection/i_base_info_test.rb +6 -6
  73. data/test/ffi-gobject_introspection/i_repository_test.rb +2 -4
  74. data/test/gir_ffi/arg_helper_test.rb +1 -1
  75. data/test/gir_ffi/builder_test.rb +18 -12
  76. data/test/gir_ffi/builders/argument_builder_test.rb +2 -5
  77. data/test/gir_ffi/builders/callback_builder_test.rb +1 -1
  78. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +11 -10
  79. data/test/gir_ffi/builders/field_builder_test.rb +0 -2
  80. data/test/gir_ffi/builders/function_builder_test.rb +156 -147
  81. data/test/gir_ffi/builders/interface_builder_test.rb +1 -1
  82. data/test/gir_ffi/builders/module_builder_test.rb +2 -2
  83. data/test/gir_ffi/builders/object_builder_test.rb +2 -2
  84. data/test/gir_ffi/builders/property_builder_test.rb +5 -5
  85. data/test/gir_ffi/builders/return_value_builder_test.rb +30 -30
  86. data/test/gir_ffi/builders/struct_builder_test.rb +14 -14
  87. data/test/gir_ffi/builders/user_defined_builder_test.rb +21 -22
  88. data/test/gir_ffi/builders/vfunc_builder_test.rb +57 -0
  89. data/test/gir_ffi/class_base_test.rb +8 -8
  90. data/test/gir_ffi/ffi_ext/pointer_test.rb +4 -4
  91. data/test/gir_ffi/g_type_test.rb +1 -1
  92. data/test/gir_ffi/in_pointer_test.rb +2 -2
  93. data/test/gir_ffi/info_ext/i_callable_info_test.rb +3 -3
  94. data/test/gir_ffi/info_ext/i_callback_info_test.rb +2 -2
  95. data/test/gir_ffi/info_ext/i_field_info_test.rb +8 -8
  96. data/test/gir_ffi/info_ext/i_function_info_test.rb +13 -13
  97. data/test/gir_ffi/info_ext/i_type_info_test.rb +131 -132
  98. data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +2 -2
  99. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +2 -2
  100. data/test/gir_ffi/info_ext/safe_function_name_test.rb +2 -2
  101. data/test/gir_ffi/interface_base_test.rb +3 -3
  102. data/test/gir_ffi/object_base_test.rb +3 -3
  103. data/test/gir_ffi/sized_array_test.rb +2 -2
  104. data/test/gir_ffi/type_map_test.rb +3 -3
  105. data/test/gir_ffi/unintrospectable_type_info_test.rb +14 -14
  106. data/test/gir_ffi/user_defined_property_info_test.rb +1 -1
  107. data/test/gir_ffi/user_defined_type_info_test.rb +25 -12
  108. data/test/gir_ffi/zero_terminated_test.rb +0 -1
  109. data/test/gir_ffi_test.rb +3 -3
  110. data/test/gir_ffi_test_helper.rb +4 -0
  111. data/test/integration/generated_gimarshallingtests_test.rb +31 -25
  112. data/test/integration/generated_gio_test.rb +1 -1
  113. data/test/integration/generated_gobject_test.rb +1 -1
  114. data/test/integration/generated_regress_test.rb +18 -22
  115. metadata +11 -8
@@ -3,7 +3,7 @@ require 'gir_ffi_test_helper'
3
3
  describe GirFFI::Builders::InterfaceBuilder do
4
4
  let(:interface_builder) {
5
5
  GirFFI::Builders::InterfaceBuilder.new(
6
- get_introspection_data('Regress', 'TestInterface'))
6
+ get_introspection_data('Regress', 'TestInterface'))
7
7
  }
8
8
 
9
9
  describe '#build_class' do
@@ -4,11 +4,11 @@ describe GirFFI::Builders::ModuleBuilder do
4
4
  describe '#build_namespaced_class' do
5
5
  it 'raises a clear error if the named class does not exist' do
6
6
  gir = GObjectIntrospection::IRepository.default
7
- stub(gir).require('Foo', nil) {}
7
+ allow(gir).to receive(:require).with('Foo', nil)
8
8
 
9
9
  builder = GirFFI::Builders::ModuleBuilder.new 'Foo'
10
10
 
11
- mock(gir).find_by_name('Foo', 'Bar') { nil }
11
+ expect(gir).to receive(:find_by_name).with('Foo', 'Bar').and_return nil
12
12
 
13
13
  assert_raises NameError do
14
14
  builder.build_namespaced_class :Bar
@@ -3,11 +3,11 @@ require 'gir_ffi_test_helper'
3
3
  describe GirFFI::Builders::ObjectBuilder do
4
4
  let(:obj_builder) {
5
5
  GirFFI::Builders::ObjectBuilder.new(
6
- get_introspection_data('Regress', 'TestObj'))
6
+ get_introspection_data('Regress', 'TestObj'))
7
7
  }
8
8
  let(:sub_obj_builder) {
9
9
  GirFFI::Builders::ObjectBuilder.new(
10
- get_introspection_data('Regress', 'TestSubObj'))
10
+ get_introspection_data('Regress', 'TestSubObj'))
11
11
  }
12
12
 
13
13
  describe '#find_signal' do
@@ -58,8 +58,8 @@ describe GirFFI::Builders::PropertyBuilder do
58
58
  describe 'for a property of type :strv' do
59
59
  let(:property_info) {
60
60
  get_property_introspection_data('GIMarshallingTests',
61
- 'PropertiesObject',
62
- 'some-strv')
61
+ 'PropertiesObject',
62
+ 'some-strv')
63
63
  }
64
64
  before do
65
65
  skip unless property_info
@@ -115,9 +115,9 @@ describe GirFFI::Builders::PropertyBuilder do
115
115
  let(:container_info) { Object.new }
116
116
 
117
117
  before do
118
- stub(property_info).container { container_info }
119
- stub(property_info).name { 'foo-bar' }
120
- stub(container_info).find_instance_method('foo_bar') { true }
118
+ allow(property_info).to receive(:container).and_return container_info
119
+ allow(property_info).to receive(:name).and_return 'foo-bar'
120
+ allow(container_info).to receive(:find_instance_method).with('foo_bar').and_return true
121
121
  end
122
122
 
123
123
  it 'finds methods with underscores for properties with dashes' do
@@ -2,18 +2,18 @@ require 'gir_ffi_test_helper'
2
2
 
3
3
  describe GirFFI::Builders::ReturnValueBuilder do
4
4
  let(:var_gen) { GirFFI::VariableNameGenerator.new }
5
- let(:return_type_info) { GirFFI::ReturnValueInfo.new(type_info) }
5
+ let(:return_type_info) { GirFFI::ReturnValueInfo.new(type_info, :nothing, false) }
6
6
  let(:for_constructor) { false }
7
7
  let(:builder) {
8
8
  GirFFI::Builders::ReturnValueBuilder.new(var_gen,
9
- return_type_info,
10
- for_constructor)
9
+ return_type_info,
10
+ for_constructor)
11
11
  }
12
12
 
13
13
  describe 'for :gint32' do
14
14
  let(:type_info) {
15
15
  get_introspection_data('GIMarshallingTests',
16
- 'int_return_min').return_type
16
+ 'int_return_min').return_type
17
17
  }
18
18
 
19
19
  it 'has no statements in #post_conversion' do
@@ -29,8 +29,8 @@ describe GirFFI::Builders::ReturnValueBuilder do
29
29
  describe 'for :struct' do
30
30
  let(:type_info) {
31
31
  get_method_introspection_data('GIMarshallingTests',
32
- 'BoxedStruct',
33
- 'returnv').return_type
32
+ 'BoxedStruct',
33
+ 'returnv').return_type
34
34
  }
35
35
 
36
36
  it 'wraps the result in #post_conversion' do
@@ -47,8 +47,8 @@ describe GirFFI::Builders::ReturnValueBuilder do
47
47
  describe 'for :union' do
48
48
  let(:type_info) {
49
49
  get_method_introspection_data('GIMarshallingTests',
50
- 'Union',
51
- 'returnv').return_type
50
+ 'Union',
51
+ 'returnv').return_type
52
52
  }
53
53
 
54
54
  it 'wraps the result in #post_conversion' do
@@ -65,8 +65,8 @@ describe GirFFI::Builders::ReturnValueBuilder do
65
65
  describe 'for :interface' do
66
66
  let(:type_info) {
67
67
  get_method_introspection_data('Gio',
68
- 'File',
69
- 'new_for_commandline_arg').return_type
68
+ 'File',
69
+ 'new_for_commandline_arg').return_type
70
70
  }
71
71
 
72
72
  it 'wraps the result in #post_conversion' do
@@ -84,8 +84,8 @@ describe GirFFI::Builders::ReturnValueBuilder do
84
84
  describe 'when the method is not a constructor' do
85
85
  let(:type_info) {
86
86
  get_method_introspection_data('GIMarshallingTests',
87
- 'Object',
88
- 'full_return').return_type
87
+ 'Object',
88
+ 'full_return').return_type
89
89
  }
90
90
  let(:for_constructor) { false }
91
91
 
@@ -103,8 +103,8 @@ describe GirFFI::Builders::ReturnValueBuilder do
103
103
  describe 'when the method is a constructor' do
104
104
  let(:type_info) {
105
105
  get_method_introspection_data('GIMarshallingTests',
106
- 'Object',
107
- 'new').return_type
106
+ 'Object',
107
+ 'new').return_type
108
108
  }
109
109
  let(:for_constructor) { true }
110
110
 
@@ -123,8 +123,8 @@ describe GirFFI::Builders::ReturnValueBuilder do
123
123
  describe 'for :strv' do
124
124
  let(:type_info) {
125
125
  get_method_introspection_data('GLib',
126
- 'KeyFile',
127
- 'get_locale_string_list').return_type
126
+ 'KeyFile',
127
+ 'get_locale_string_list').return_type
128
128
  }
129
129
 
130
130
  it 'wraps the result in #post_conversion' do
@@ -141,8 +141,8 @@ describe GirFFI::Builders::ReturnValueBuilder do
141
141
  describe 'for :zero_terminated' do
142
142
  let(:type_info) {
143
143
  get_method_introspection_data('GLib',
144
- 'Variant',
145
- 'dup_bytestring').return_type
144
+ 'Variant',
145
+ 'dup_bytestring').return_type
146
146
  }
147
147
  before do
148
148
  skip unless type_info.zero_terminated?
@@ -162,7 +162,7 @@ describe GirFFI::Builders::ReturnValueBuilder do
162
162
  describe 'for :byte_array' do
163
163
  let(:type_info) {
164
164
  get_introspection_data('GIMarshallingTests',
165
- 'bytearray_full_return').return_type
165
+ 'bytearray_full_return').return_type
166
166
  }
167
167
 
168
168
  it 'wraps the result in #post_conversion' do
@@ -179,7 +179,7 @@ describe GirFFI::Builders::ReturnValueBuilder do
179
179
  describe 'for :ptr_array' do
180
180
  let(:type_info) {
181
181
  get_introspection_data('GIMarshallingTests',
182
- 'gptrarray_utf8_none_return').return_type
182
+ 'gptrarray_utf8_none_return').return_type
183
183
  }
184
184
 
185
185
  it 'wraps the result in #post_conversion' do
@@ -196,7 +196,7 @@ describe GirFFI::Builders::ReturnValueBuilder do
196
196
  describe 'for :glist' do
197
197
  let(:type_info) {
198
198
  get_introspection_data('GIMarshallingTests',
199
- 'glist_int_none_return').return_type
199
+ 'glist_int_none_return').return_type
200
200
  }
201
201
 
202
202
  it 'wraps the result in #post_conversion' do
@@ -213,7 +213,7 @@ describe GirFFI::Builders::ReturnValueBuilder do
213
213
  describe 'for :gslist' do
214
214
  let(:type_info) {
215
215
  get_introspection_data('GIMarshallingTests',
216
- 'gslist_int_none_return').return_type
216
+ 'gslist_int_none_return').return_type
217
217
  }
218
218
 
219
219
  it 'wraps the result in #post_conversion' do
@@ -230,7 +230,7 @@ describe GirFFI::Builders::ReturnValueBuilder do
230
230
  describe 'for :ghash' do
231
231
  let(:type_info) {
232
232
  get_introspection_data('GIMarshallingTests',
233
- 'ghashtable_int_none_return').return_type
233
+ 'ghashtable_int_none_return').return_type
234
234
  }
235
235
 
236
236
  it 'wraps the result in #post_conversion' do
@@ -247,7 +247,7 @@ describe GirFFI::Builders::ReturnValueBuilder do
247
247
  describe 'for :array' do
248
248
  let(:type_info) {
249
249
  get_introspection_data('GIMarshallingTests',
250
- 'garray_int_none_return').return_type
250
+ 'garray_int_none_return').return_type
251
251
  }
252
252
 
253
253
  it 'wraps the result in #post_conversion' do
@@ -264,7 +264,7 @@ describe GirFFI::Builders::ReturnValueBuilder do
264
264
  describe 'for :error' do
265
265
  let(:type_info) {
266
266
  get_introspection_data('GIMarshallingTests',
267
- 'gerror_return').return_type
267
+ 'gerror_return').return_type
268
268
  }
269
269
 
270
270
  it 'wraps the result in #post_conversion' do
@@ -282,7 +282,7 @@ describe GirFFI::Builders::ReturnValueBuilder do
282
282
  describe 'with fixed size' do
283
283
  let(:type_info) {
284
284
  get_introspection_data('GIMarshallingTests',
285
- 'array_fixed_int_return').return_type
285
+ 'array_fixed_int_return').return_type
286
286
  }
287
287
 
288
288
  it 'converts the result in #post_conversion' do
@@ -300,12 +300,12 @@ describe GirFFI::Builders::ReturnValueBuilder do
300
300
  let(:length_argument) { Object.new }
301
301
  let(:type_info) {
302
302
  get_method_introspection_data('GIMarshallingTests',
303
- 'Object',
304
- 'method_array_return').return_type
303
+ 'Object',
304
+ 'method_array_return').return_type
305
305
  }
306
306
 
307
307
  before do
308
- stub(length_argument).post_converted_name { 'bar' }
308
+ allow(length_argument).to receive(:post_converted_name).and_return 'bar'
309
309
  builder.length_arg = length_argument
310
310
  end
311
311
 
@@ -399,7 +399,7 @@ describe GirFFI::Builders::ReturnValueBuilder do
399
399
  let(:type_info) {
400
400
  get_method_introspection_data('Regress', 'TestObj', 'skip_return_val').return_type
401
401
  }
402
- let(:return_type_info) { GirFFI::ReturnValueInfo.new(type_info, true) }
402
+ let(:return_type_info) { GirFFI::ReturnValueInfo.new(type_info, :nothing, true) }
403
403
 
404
404
  it 'has no statements in #post_conversion' do
405
405
  builder.post_conversion.must_equal []
@@ -17,15 +17,15 @@ describe GirFFI::Builders::StructBuilder do
17
17
  @field = Object.new
18
18
 
19
19
  @struct = Object.new
20
- stub(@struct).namespace { 'Foo' }
21
- stub(@struct).safe_name { 'Bar' }
22
- stub(@struct).fields { [@field] }
20
+ allow(@struct).to receive(:namespace).and_return 'Foo'
21
+ allow(@struct).to receive(:safe_name).and_return 'Bar'
22
+ allow(@struct).to receive(:fields).and_return [@field]
23
23
 
24
24
  @builder = GirFFI::Builders::StructBuilder.new @struct
25
25
  end
26
26
 
27
27
  it 'creates the correct layout specification' do
28
- mock(@field).layout_specification { [:bar, :int32, 0] }
28
+ expect(@field).to receive(:layout_specification).and_return [:bar, :int32, 0]
29
29
  spec = @builder.send :layout_specification
30
30
  assert_equal [:bar, :int32, 0], spec
31
31
  end
@@ -33,12 +33,12 @@ describe GirFFI::Builders::StructBuilder do
33
33
 
34
34
  describe 'for a struct with a layout with a complex type' do
35
35
  it 'does not flatten the complex type specification' do
36
- mock(simplefield = Object.new).layout_specification { [:bar, :foo, 0] }
37
- mock(complexfield = Object.new).layout_specification { [:baz, [:qux, 2], 0] }
38
- mock(struct = Object.new).fields { [simplefield, complexfield] }
36
+ expect(simplefield = Object.new).to receive(:layout_specification).and_return [:bar, :foo, 0]
37
+ expect(complexfield = Object.new).to receive(:layout_specification).and_return [:baz, [:qux, 2], 0]
38
+ expect(struct = Object.new).to receive(:fields).and_return [simplefield, complexfield]
39
39
 
40
- stub(struct).safe_name { 'Bar' }
41
- stub(struct).namespace { 'Foo' }
40
+ allow(struct).to receive(:safe_name).and_return 'Bar'
41
+ allow(struct).to receive(:namespace).and_return 'Foo'
42
42
 
43
43
  builder = GirFFI::Builders::StructBuilder.new struct
44
44
  spec = builder.send :layout_specification
@@ -51,11 +51,11 @@ describe GirFFI::Builders::StructBuilder do
51
51
  @gir = GObjectIntrospection::IRepository.default
52
52
  @gir.require 'GObject', nil
53
53
 
54
- stub(info = Object.new).parent { @gir.find_by_name 'GObject', 'Object' }
55
- stub(info).fields { [] }
56
- stub(info).info_type { :object }
57
- stub(info).safe_name { 'Bar' }
58
- stub(info).namespace { 'Foo' }
54
+ allow(info = Object.new).to receive(:parent).and_return @gir.find_by_name 'GObject', 'Object'
55
+ allow(info).to receive(:fields).and_return []
56
+ allow(info).to receive(:info_type).and_return :object
57
+ allow(info).to receive(:safe_name).and_return 'Bar'
58
+ allow(info).to receive(:namespace).and_return 'Foo'
59
59
 
60
60
  @classbuilder = GirFFI::Builders::ObjectBuilder.new info
61
61
 
@@ -5,7 +5,7 @@ GirFFI.setup :GIMarshallingTests
5
5
  describe GirFFI::Builders::UserDefinedBuilder do
6
6
  let(:klass) {
7
7
  Object.const_set("DerivedClass#{Sequence.next}",
8
- Class.new(GIMarshallingTests::Object))
8
+ Class.new(GIMarshallingTests::Object))
9
9
  }
10
10
  let(:builder) { GirFFI::Builders::UserDefinedBuilder.new info }
11
11
  let(:info) { GirFFI::UserDefinedTypeInfo.new klass }
@@ -17,16 +17,16 @@ describe GirFFI::Builders::UserDefinedBuilder do
17
17
 
18
18
  describe 'with type info containing one property' do
19
19
  let(:info) {
20
- GirFFI::UserDefinedTypeInfo.new klass do |info|
21
- info.install_property GObject.param_spec_int('foo', 'foo bar',
22
- 'The Foo Bar Property',
23
- 10, 20, 15,
24
- 3)
20
+ GirFFI::UserDefinedTypeInfo.new klass do |it|
21
+ it.install_property GObject.param_spec_int('foo', 'foo bar',
22
+ 'The Foo Bar Property',
23
+ 10, 20, 15,
24
+ 3)
25
25
  end
26
26
  }
27
27
 
28
28
  it 'registers a type that is bigger than the parent' do
29
- gtype = klass.get_gtype
29
+ gtype = klass.gtype
30
30
  q = GObject.type_query gtype
31
31
  q.instance_size.must_be :>, GIMarshallingTests::Object::Struct.size
32
32
  end
@@ -56,13 +56,13 @@ describe GirFFI::Builders::UserDefinedBuilder do
56
56
 
57
57
  describe 'with type info containing an overridden g_name' do
58
58
  let(:info) {
59
- GirFFI::UserDefinedTypeInfo.new klass do |info|
60
- info.g_name = "OtherName#{Sequence.next}"
59
+ GirFFI::UserDefinedTypeInfo.new klass do |it|
60
+ it.g_name = "OtherName#{Sequence.next}"
61
61
  end
62
62
  }
63
63
 
64
64
  it 'registers a type under the overridden name' do
65
- registered_name = GObject.type_name(klass.get_gtype)
65
+ registered_name = GObject.type_name(klass.gtype)
66
66
  registered_name.must_equal info.g_name
67
67
  registered_name.wont_equal klass.name
68
68
  end
@@ -70,8 +70,8 @@ describe GirFFI::Builders::UserDefinedBuilder do
70
70
 
71
71
  describe 'with type info containing a vfunc' do
72
72
  let(:info) {
73
- GirFFI::UserDefinedTypeInfo.new klass do |info|
74
- info.install_vfunc_implementation :method_int8_in, proc {|instance, in_|
73
+ GirFFI::UserDefinedTypeInfo.new klass do |it|
74
+ it.install_vfunc_implementation :method_int8_in, proc {|instance, in_|
75
75
  instance.int = in_
76
76
  }
77
77
  end
@@ -87,15 +87,15 @@ describe GirFFI::Builders::UserDefinedBuilder do
87
87
  describe 'with type info containing a vfunc from an included Interface' do
88
88
  let(:info) do
89
89
  klass.class_eval { include GIMarshallingTests::Interface }
90
- GirFFI::UserDefinedTypeInfo.new klass do |info|
91
- info.install_vfunc_implementation :test_int8_in,
92
- proc { |instance, in_| instance.int = in_ }
90
+ GirFFI::UserDefinedTypeInfo.new klass do |it|
91
+ it.install_vfunc_implementation :test_int8_in,
92
+ proc { |instance, in_| instance.int = in_ }
93
93
  end
94
94
  end
95
95
 
96
96
  it 'marks the type as conforming to the included Interface' do
97
- iface_gtype = GIMarshallingTests::Interface.get_gtype
98
- GObject.type_interfaces(klass.get_gtype).to_a.must_equal [iface_gtype]
97
+ iface_gtype = GIMarshallingTests::Interface.gtype
98
+ GObject.type_interfaces(klass.gtype).to_a.must_equal [iface_gtype]
99
99
  end
100
100
 
101
101
  it 'allows the vfunc to be called through its invoker' do
@@ -105,12 +105,11 @@ describe GirFFI::Builders::UserDefinedBuilder do
105
105
  end
106
106
  end
107
107
 
108
- it 'does not attempt to register a registered class' do
109
- gtype = klass.get_gtype
108
+ it 'keeps the gtype for an already registered class' do
109
+ gtype = klass.gtype
110
110
  other_builder = GirFFI::Builders::UserDefinedBuilder.new info
111
- other_builder.build_class
112
- # FIXME: Does not really test what we want to test: other_builder might lie!
113
- other_builder.target_gtype.must_equal gtype
111
+ other_klass = other_builder.build_class
112
+ other_klass.gtype.must_equal gtype
114
113
  end
115
114
  end
116
115
  end
@@ -132,6 +132,63 @@ describe GirFFI::Builders::VFuncBuilder do
132
132
  result.must_equal expected
133
133
  end
134
134
  end
135
+
136
+ describe 'for a vfunc with a full-transfer return value' do
137
+ let(:vfunc_info) {
138
+ get_vfunc_introspection_data 'GIMarshallingTests', 'Object', 'vfunc_return_object_transfer_full'
139
+ }
140
+
141
+ it 'returns a valid mapping method' do
142
+ expected = <<-CODE.reset_indentation
143
+ def self.call_with_argument_mapping(_proc, _instance)
144
+ _v1 = GIMarshallingTests::Object.wrap(_instance)
145
+ _v2 = _proc.call(_v1)
146
+ _v3 = GObject::Object.from(_v2.ref).to_ptr
147
+ return _v3
148
+ end
149
+ CODE
150
+
151
+ result.must_equal expected
152
+ end
153
+ end
154
+
155
+ describe 'for a vfunc with a transfer-none in argument' do
156
+ let(:vfunc_info) {
157
+ get_vfunc_introspection_data 'GIMarshallingTests', 'Object', 'vfunc_in_object_transfer_none'
158
+ }
159
+
160
+ it 'returns a valid mapping method' do
161
+ expected = <<-CODE.reset_indentation
162
+ def self.call_with_argument_mapping(_proc, _instance, object)
163
+ _v1 = GIMarshallingTests::Object.wrap(_instance)
164
+ _v2 = GObject::Object.wrap(object)
165
+ _v2.ref
166
+ _proc.call(_v1, _v2)
167
+ end
168
+ CODE
169
+
170
+ result.must_equal expected
171
+ end
172
+ end
173
+
174
+ describe 'for a vfunc with a full-transfer outgoing argument' do
175
+ let(:vfunc_info) {
176
+ get_vfunc_introspection_data 'GIMarshallingTests', 'Object', 'vfunc_out_object_transfer_full'
177
+ }
178
+
179
+ it 'returns a valid mapping method' do
180
+ expected = <<-CODE.reset_indentation
181
+ def self.call_with_argument_mapping(_proc, _instance, object)
182
+ _v1 = GIMarshallingTests::Object.wrap(_instance)
183
+ _v2 = GirFFI::InOutPointer.new([:pointer, GObject::Object], object)
184
+ _v3 = _proc.call(_v1)
185
+ _v2.set_value GObject::Object.from(_v3.ref)
186
+ end
187
+ CODE
188
+
189
+ result.must_equal expected
190
+ end
191
+ end
135
192
  end
136
193
 
137
194
  describe '#argument_ffi_types' do