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
@@ -22,7 +22,7 @@ describe GirFFI::Builders::ArgumentBuilder do
22
22
  describe 'for :zero_terminated' do
23
23
  let(:arg_info) {
24
24
  get_introspection_data('GIMarshallingTests',
25
- 'array_in_len_zero_terminated').args[0]
25
+ 'array_in_len_zero_terminated').args[0]
26
26
  }
27
27
 
28
28
  it 'has the correct value for #pre_conversion' do
@@ -109,7 +109,6 @@ describe GirFFI::Builders::ArgumentBuilder do
109
109
  end
110
110
 
111
111
  describe 'for :struct' do
112
-
113
112
  describe 'when not allocated by the caller' do
114
113
  let(:arg_info) {
115
114
  get_introspection_data('GIMarshallingTests', 'boxed_struct_out').args[0]
@@ -156,7 +155,6 @@ describe GirFFI::Builders::ArgumentBuilder do
156
155
  end
157
156
 
158
157
  describe 'for :array' do
159
-
160
158
  describe 'when allocated by the callee' do
161
159
  let(:arg_info) {
162
160
  get_introspection_data('GIMarshallingTests', 'garray_utf8_none_out').args[0]
@@ -221,7 +219,6 @@ describe GirFFI::Builders::ArgumentBuilder do
221
219
  end
222
220
 
223
221
  describe 'for :c' do
224
-
225
222
  describe 'with fixed size' do
226
223
  let(:arg_info) {
227
224
  get_introspection_data('GIMarshallingTests', 'array_fixed_out').args[0]
@@ -243,7 +240,7 @@ describe GirFFI::Builders::ArgumentBuilder do
243
240
 
244
241
  let(:length_argument) { Object.new }
245
242
  before do
246
- stub(length_argument).post_converted_name { 'bar' }
243
+ allow(length_argument).to receive(:post_converted_name).and_return 'bar'
247
244
  builder.length_arg = length_argument
248
245
  end
249
246
 
@@ -52,7 +52,7 @@ describe GirFFI::Builders::CallbackBuilder do
52
52
  describe 'for a callback with one out argument' do
53
53
  let(:callback_info) {
54
54
  get_introspection_data('GIMarshallingTests',
55
- 'CallbackOneOutParameter')
55
+ 'CallbackOneOutParameter')
56
56
  }
57
57
  it 'returns a valid mapping method' do
58
58
  expected = <<-CODE.reset_indentation
@@ -2,11 +2,12 @@ require 'gir_ffi_test_helper'
2
2
 
3
3
  describe GirFFI::Builders::CallbackReturnValueBuilder do
4
4
  let(:var_gen) { GirFFI::VariableNameGenerator.new }
5
- let(:return_value_info) { GirFFI::ReturnValueInfo.new(type_info) }
5
+ let(:return_value_info) { GirFFI::ReturnValueInfo.new(type_info, ownership_transfer, false) }
6
6
  let(:type_info) { callback_info.return_type }
7
+ let(:ownership_transfer) { callback_info.caller_owns }
7
8
  let(:builder) {
8
9
  GirFFI::Builders::CallbackReturnValueBuilder.new(var_gen,
9
- return_value_info)
10
+ return_value_info)
10
11
  }
11
12
 
12
13
  before do
@@ -29,7 +30,7 @@ describe GirFFI::Builders::CallbackReturnValueBuilder do
29
30
  describe 'for :void' do
30
31
  let(:callback_info) {
31
32
  get_introspection_data('GIMarshallingTests',
32
- 'CallbackMultipleOutParameters')
33
+ 'CallbackMultipleOutParameters')
33
34
  }
34
35
 
35
36
  it 'has no statements in #post_conversion' do
@@ -45,8 +46,8 @@ describe GirFFI::Builders::CallbackReturnValueBuilder do
45
46
  describe 'for :enum' do
46
47
  let(:callback_info) {
47
48
  get_vfunc_introspection_data('GIMarshallingTests',
48
- 'Object',
49
- 'vfunc_return_enum')
49
+ 'Object',
50
+ 'vfunc_return_enum')
50
51
  }
51
52
 
52
53
  it 'converts the result' do
@@ -61,17 +62,17 @@ describe GirFFI::Builders::CallbackReturnValueBuilder do
61
62
  end
62
63
  end
63
64
 
64
- describe 'for :object' do
65
+ describe 'for :object with full transfer' do
65
66
  let(:callback_info) {
66
67
  get_vfunc_introspection_data('GIMarshallingTests',
67
- 'Object',
68
- 'vfunc_return_object_transfer_full')
68
+ 'Object',
69
+ 'vfunc_return_object_transfer_full')
69
70
  }
70
71
 
71
- it 'converts the result to a pointer' do
72
+ it 'increases the refcount of the result and converts it to a pointer' do
72
73
  # Ensure variable names are generated in order
73
74
  builder.capture_variable_name.must_equal '_v1'
74
- builder.post_conversion.must_equal ['_v2 = GObject::Object.from(_v1).to_ptr']
75
+ builder.post_conversion.must_equal ['_v2 = GObject::Object.from(_v1.ref).to_ptr']
75
76
  end
76
77
 
77
78
  it 'returns the result of the conversion' do
@@ -11,7 +11,6 @@ describe GirFFI::Builders::FieldBuilder do
11
11
  _v1 = @struct.to_ptr + #{field_info.offset}
12
12
  _v2 = GirFFI::InOutPointer.new(:gint8, _v1)
13
13
  _v3 = _v2.to_value
14
-
15
14
  _v3
16
15
  end
17
16
  CODE
@@ -55,7 +54,6 @@ describe GirFFI::Builders::FieldBuilder do
55
54
  _v1 = @struct.to_ptr + #{field_info.offset}
56
55
  _v2 = GirFFI::InOutPointer.new(Regress::TestEnum, _v1)
57
56
  _v3 = _v2.to_value
58
-
59
57
  _v3
60
58
  end
61
59
  CODE
@@ -1,170 +1,144 @@
1
1
  require 'gir_ffi_test_helper'
2
2
 
3
3
  describe GirFFI::Builders::FunctionBuilder do
4
- it 'builds a correct definition of Regress:test_array_fixed_out_objects' do
5
- go = get_introspection_data 'Regress', 'test_array_fixed_out_objects'
6
- skip unless go
7
- fbuilder = GirFFI::Builders::FunctionBuilder.new go
8
- code = fbuilder.generate
9
-
10
- expected = <<-CODE
11
- def self.test_array_fixed_out_objects
12
- _v1 = GirFFI::InOutPointer.for [:pointer, :c]
13
- Regress::Lib.regress_test_array_fixed_out_objects _v1
14
- _v2 = GirFFI::SizedArray.wrap([:pointer, Regress::TestObj], 2, _v1.to_value)
15
- return _v2
16
- end
17
- CODE
18
-
19
- assert_equal expected.reset_indentation, code
20
- end
4
+ describe '#generate' do
5
+ let(:builder) { GirFFI::Builders::FunctionBuilder.new function_info }
6
+ let(:code) { builder.generate }
21
7
 
22
- it 'builds a correct definition for functions having a linked length argument' do
23
- go = get_introspection_data 'Regress', 'test_array_gint16_in'
24
- fbuilder = GirFFI::Builders::FunctionBuilder.new go
25
- code = fbuilder.generate
26
-
27
- expected = <<-CODE
28
- def self.test_array_gint16_in(ints)
29
- n_ints = ints.nil? ? 0 : ints.length
30
- _v1 = n_ints
31
- _v2 = GirFFI::SizedArray.from(:gint16, -1, ints)
32
- _v3 = Regress::Lib.regress_test_array_gint16_in _v1, _v2
33
- return _v3
8
+ describe 'for Regress:test_array_fixed_out_objects' do
9
+ let(:function_info) { get_introspection_data 'Regress', 'test_array_fixed_out_objects' }
10
+ it 'builds a correct definition' do
11
+ skip unless function_info
12
+ code.must_equal <<-CODE.reset_indentation
13
+ def self.test_array_fixed_out_objects
14
+ _v1 = GirFFI::InOutPointer.for [:pointer, :c]
15
+ Regress::Lib.regress_test_array_fixed_out_objects _v1
16
+ _v2 = GirFFI::SizedArray.wrap([:pointer, Regress::TestObj], 2, _v1.to_value)
17
+ return _v2
18
+ end
19
+ CODE
34
20
  end
35
- CODE
36
-
37
- assert_equal expected.reset_indentation, code
38
- end
21
+ end
39
22
 
40
- it 'builds a correct definition for functions with callbacks' do
41
- go = get_introspection_data 'Regress', 'test_callback_destroy_notify'
42
- fbuilder = GirFFI::Builders::FunctionBuilder.new go
43
- code = fbuilder.generate
44
-
45
- expected = <<-CODE
46
- def self.test_callback_destroy_notify(callback, user_data, notify)
47
- _v1 = Regress::TestCallbackUserData.from(callback)
48
- _v2 = GirFFI::InPointer.from_closure_data(user_data)
49
- _v3 = GLib::DestroyNotify.from(notify)
50
- _v4 = Regress::Lib.regress_test_callback_destroy_notify _v1, _v2, _v3
51
- return _v4
23
+ describe 'for functions having a linked length argument' do
24
+ let(:function_info) { get_introspection_data 'Regress', 'test_array_gint16_in' }
25
+ it 'builds a correct definition' do
26
+ code.must_equal <<-CODE.reset_indentation
27
+ def self.test_array_gint16_in(ints)
28
+ n_ints = ints.nil? ? 0 : ints.length
29
+ _v1 = n_ints
30
+ _v2 = GirFFI::SizedArray.from(:gint16, -1, ints)
31
+ _v3 = Regress::Lib.regress_test_array_gint16_in _v1, _v2
32
+ return _v3
33
+ end
34
+ CODE
52
35
  end
53
- CODE
54
-
55
- assert_equal expected.reset_indentation, code
56
- end
36
+ end
57
37
 
58
- it 'builds correct definition for constructors' do
59
- go = get_method_introspection_data 'Regress', 'TestObj', 'new_from_file'
60
- fbuilder = GirFFI::Builders::FunctionBuilder.new go
61
- code = fbuilder.generate
62
-
63
- expected = <<-CODE
64
- def self.new_from_file(x)
65
- _v1 = GirFFI::InPointer.from(:utf8, x)
66
- _v2 = FFI::MemoryPointer.new(:pointer).write_pointer nil
67
- _v3 = Regress::Lib.regress_test_obj_new_from_file _v1, _v2
68
- GirFFI::ArgHelper.check_error(_v2)
69
- _v4 = self.constructor_wrap(_v3)
70
- return _v4
38
+ describe 'for functions with callbacks' do
39
+ let(:function_info) { get_introspection_data 'Regress', 'test_callback_destroy_notify' }
40
+ it 'builds a correct definition' do
41
+ code.must_equal <<-CODE.reset_indentation
42
+ def self.test_callback_destroy_notify(callback, user_data, notify)
43
+ _v1 = Regress::TestCallbackUserData.from(callback)
44
+ _v2 = GirFFI::InPointer.from_closure_data(user_data)
45
+ _v3 = GLib::DestroyNotify.from(notify)
46
+ _v4 = Regress::Lib.regress_test_callback_destroy_notify _v1, _v2, _v3
47
+ return _v4
48
+ end
49
+ CODE
71
50
  end
72
- CODE
73
-
74
- assert_equal expected.reset_indentation, code
75
- end
76
-
77
- it 'creates a call to GObject::Value#from for functions that take a GValue' do
78
- go = get_introspection_data 'GIMarshallingTests', 'gvalue_in'
79
- fbuilder = GirFFI::Builders::FunctionBuilder.new go
80
- code = fbuilder.generate
51
+ end
81
52
 
82
- expected = <<-CODE
83
- def self.gvalue_in(value)
84
- _v1 = GObject::Value.from(value)
85
- GIMarshallingTests::Lib.gi_marshalling_tests_gvalue_in _v1
53
+ describe 'for constructors' do
54
+ let(:function_info) { get_method_introspection_data 'Regress', 'TestObj', 'new_from_file' }
55
+ it 'builds correct definition' do
56
+ code.must_equal <<-CODE.reset_indentation
57
+ def self.new_from_file(x)
58
+ _v1 = GirFFI::InPointer.from(:utf8, x)
59
+ _v2 = FFI::MemoryPointer.new(:pointer).write_pointer nil
60
+ _v3 = Regress::Lib.regress_test_obj_new_from_file _v1, _v2
61
+ GirFFI::ArgHelper.check_error(_v2)
62
+ _v4 = self.constructor_wrap(_v3)
63
+ return _v4
64
+ end
65
+ CODE
86
66
  end
87
- CODE
88
-
89
- assert_equal expected.reset_indentation, code
90
- end
67
+ end
91
68
 
92
- it 'builds correct definition for functions with a nullable input array' do
93
- go = get_introspection_data 'Regress', 'test_array_int_null_in'
94
- fbuilder = GirFFI::Builders::FunctionBuilder.new go
95
- code = fbuilder.generate
96
-
97
- expected = <<-CODE
98
- def self.test_array_int_null_in(arr)
99
- len = arr.nil? ? 0 : arr.length
100
- _v1 = len
101
- _v2 = GirFFI::SizedArray.from(:gint32, -1, arr)
102
- Regress::Lib.regress_test_array_int_null_in _v2, _v1
69
+ describe 'for functions that take a GValue' do
70
+ let(:function_info) { get_introspection_data 'GIMarshallingTests', 'gvalue_in' }
71
+ it 'creates a call to GObject::Value#from' do
72
+ code.must_equal <<-CODE.reset_indentation
73
+ def self.gvalue_in(value)
74
+ _v1 = GObject::Value.from(value)
75
+ GIMarshallingTests::Lib.gi_marshalling_tests_gvalue_in _v1
76
+ end
77
+ CODE
103
78
  end
104
- CODE
105
-
106
- assert_equal expected.reset_indentation, code
107
- end
79
+ end
108
80
 
109
- it 'builds correct definition for functions with a nullable output array' do
110
- go = get_introspection_data 'Regress', 'test_array_int_null_out'
111
- fbuilder = GirFFI::Builders::FunctionBuilder.new go
112
- code = fbuilder.generate
113
-
114
- expected = <<-CODE
115
- def self.test_array_int_null_out
116
- _v1 = GirFFI::InOutPointer.for :gint32
117
- _v2 = GirFFI::InOutPointer.for [:pointer, :c]
118
- Regress::Lib.regress_test_array_int_null_out _v2, _v1
119
- _v3 = _v1.to_value
120
- _v4 = GirFFI::SizedArray.wrap(:gint32, _v3, _v2.to_value)
121
- return _v4
81
+ describe 'for functions with a nullable input array' do
82
+ let(:function_info) { get_introspection_data 'Regress', 'test_array_int_null_in' }
83
+ it 'builds correct definition' do
84
+ code.must_equal <<-CODE.reset_indentation
85
+ def self.test_array_int_null_in(arr)
86
+ len = arr.nil? ? 0 : arr.length
87
+ _v1 = len
88
+ _v2 = GirFFI::SizedArray.from(:gint32, -1, arr)
89
+ Regress::Lib.regress_test_array_int_null_in _v2, _v1
90
+ end
91
+ CODE
122
92
  end
123
- CODE
124
-
125
- assert_equal expected.reset_indentation, code
126
- end
93
+ end
127
94
 
128
- it 'builds the correct definition for a method with an inout array with size argument' do
129
- go = get_method_introspection_data 'GIMarshallingTests', 'Object', 'method_array_inout'
130
- fbuilder = GirFFI::Builders::FunctionBuilder.new go
131
- code = fbuilder.generate
132
-
133
- expected = <<-CODE
134
- def method_array_inout(ints)
135
- length = ints.nil? ? 0 : ints.length
136
- _v1 = GirFFI::InOutPointer.for :gint32
137
- _v1.set_value length
138
- _v2 = GirFFI::InOutPointer.for [:pointer, :c]
139
- _v2.set_value GirFFI::SizedArray.from(:gint32, -1, ints)
140
- GIMarshallingTests::Lib.gi_marshalling_tests_object_method_array_inout self, _v2, _v1
141
- _v3 = _v1.to_value
142
- _v4 = GirFFI::SizedArray.wrap(:gint32, _v3, _v2.to_value)
143
- return _v4
95
+ describe 'for functions with a nullable output array' do
96
+ let(:function_info) { get_introspection_data 'Regress', 'test_array_int_null_out' }
97
+ it 'builds correct definition' do
98
+ code.must_equal <<-CODE.reset_indentation
99
+ def self.test_array_int_null_out
100
+ _v1 = GirFFI::InOutPointer.for :gint32
101
+ _v2 = GirFFI::InOutPointer.for [:pointer, :c]
102
+ Regress::Lib.regress_test_array_int_null_out _v2, _v1
103
+ _v3 = _v1.to_value
104
+ _v4 = GirFFI::SizedArray.wrap(:gint32, _v3, _v2.to_value)
105
+ return _v4
106
+ end
107
+ CODE
144
108
  end
145
- CODE
146
-
147
- assert_equal expected.reset_indentation, code
148
- end
149
-
150
- it 'builds a correct definition for a simple method' do
151
- go = get_method_introspection_data 'Regress', 'TestObj', 'instance_method'
152
- fbuilder = GirFFI::Builders::FunctionBuilder.new go
153
- code = fbuilder.generate
109
+ end
154
110
 
155
- expected = <<-CODE
156
- def instance_method
157
- _v1 = Regress::Lib.regress_test_obj_instance_method self
158
- return _v1
111
+ describe 'for a method with an inout array with size argument' do
112
+ let(:function_info) { get_method_introspection_data 'GIMarshallingTests', 'Object', 'method_array_inout' }
113
+ it 'builds the correct definition' do
114
+ code.must_equal <<-CODE.reset_indentation
115
+ def method_array_inout(ints)
116
+ length = ints.nil? ? 0 : ints.length
117
+ _v1 = GirFFI::InOutPointer.for :gint32
118
+ _v1.set_value length
119
+ _v2 = GirFFI::InOutPointer.for [:pointer, :c]
120
+ _v2.set_value GirFFI::SizedArray.from(:gint32, -1, ints)
121
+ GIMarshallingTests::Lib.gi_marshalling_tests_object_method_array_inout self, _v2, _v1
122
+ _v3 = _v1.to_value
123
+ _v4 = GirFFI::SizedArray.wrap(:gint32, _v3, _v2.to_value)
124
+ return _v4
125
+ end
126
+ CODE
159
127
  end
160
- CODE
128
+ end
161
129
 
162
- assert_equal expected.reset_indentation, code
163
- end
130
+ describe 'for a simple method' do
131
+ let(:function_info) { get_method_introspection_data 'Regress', 'TestObj', 'instance_method' }
164
132
 
165
- describe '#generate' do
166
- let(:builder) { GirFFI::Builders::FunctionBuilder.new function_info }
167
- let(:code) { builder.generate }
133
+ it 'builds a correct definition' do
134
+ code.must_equal <<-CODE.reset_indentation
135
+ def instance_method
136
+ _v1 = Regress::Lib.regress_test_obj_instance_method self
137
+ return _v1
138
+ end
139
+ CODE
140
+ end
141
+ end
168
142
 
169
143
  describe 'for GLib::Variant.get_strv' do
170
144
  let(:function_info) { get_method_introspection_data 'GLib', 'Variant', 'get_strv' }
@@ -197,7 +171,7 @@ describe GirFFI::Builders::FunctionBuilder do
197
171
  end
198
172
  end
199
173
 
200
- describe 'for GIMarshallingTests::Object.method_int8_arg_and_out_callee' do
174
+ describe 'for GIMarshallingTests::Object#method_int8_arg_and_out_callee' do
201
175
  let(:function_info) {
202
176
  get_method_introspection_data('GIMarshallingTests', 'Object',
203
177
  'method_int8_arg_and_out_callee')
@@ -216,5 +190,40 @@ describe GirFFI::Builders::FunctionBuilder do
216
190
  CODE
217
191
  end
218
192
  end
193
+
194
+ describe 'for GIMarshallingTests::Object.full_inout' do
195
+ let(:function_info) {
196
+ get_method_introspection_data('GIMarshallingTests', 'Object',
197
+ 'full_inout')
198
+ }
199
+
200
+ it 'builds a correct definition' do
201
+ code.must_equal <<-CODE.reset_indentation
202
+ def self.full_inout(object)
203
+ _v1 = GirFFI::InOutPointer.for [:pointer, GIMarshallingTests::Object]
204
+ _v1.set_value GIMarshallingTests::Object.from(object.ref)
205
+ GIMarshallingTests::Lib.gi_marshalling_tests_object_full_inout _v1
206
+ _v2 = GIMarshallingTests::Object.wrap(_v1.to_value)
207
+ return _v2
208
+ end
209
+ CODE
210
+ end
211
+ end
212
+
213
+ describe 'for Regress::TestObj#instance_method_full' do
214
+ let(:function_info) {
215
+ get_method_introspection_data('Regress', 'TestObj',
216
+ 'instance_method_full')
217
+ }
218
+
219
+ it 'builds a correct definition including self.ref' do
220
+ skip unless function_info
221
+ code.must_equal <<-CODE.reset_indentation
222
+ def instance_method_full
223
+ Regress::Lib.regress_test_obj_instance_method_full self.ref
224
+ end
225
+ CODE
226
+ end
227
+ end
219
228
  end
220
229
  end