gir_ffi 0.7.8 → 0.7.9

Sign up to get free protection for your applications and to get access to all the features.
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