gir_ffi 0.15.1 → 0.15.6

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 (190) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +42 -0
  3. data/README.md +10 -10
  4. data/TODO.md +14 -35
  5. data/docs/Documentation.md +6 -0
  6. data/docs/Subclassing.md +38 -0
  7. data/lib/ffi-glib.rb +8 -3
  8. data/lib/ffi-glib/byte_array.rb +2 -1
  9. data/lib/ffi-glib/container_class_methods.rb +1 -3
  10. data/lib/ffi-glib/destroy_notify.rb +2 -2
  11. data/lib/ffi-glib/hash_table.rb +1 -2
  12. data/lib/ffi-glib/list.rb +11 -5
  13. data/lib/ffi-glib/list_methods.rb +12 -0
  14. data/lib/ffi-glib/s_list.rb +10 -4
  15. data/lib/ffi-gobject.rb +2 -5
  16. data/lib/ffi-gobject/object.rb +102 -92
  17. data/lib/ffi-gobject/object_class.rb +1 -1
  18. data/lib/ffi-gobject/ruby_closure.rb +1 -1
  19. data/lib/ffi-gobject/value.rb +108 -117
  20. data/lib/ffi-gobject_introspection/i_base_info.rb +35 -27
  21. data/lib/ffi-gobject_introspection/lib.rb +1 -1
  22. data/lib/gir_ffi-base/gobject/lib.rb +4 -0
  23. data/lib/gir_ffi/array_element_convertor.rb +2 -3
  24. data/lib/gir_ffi/boxed_base.rb +13 -11
  25. data/lib/gir_ffi/builder.rb +3 -4
  26. data/lib/gir_ffi/builder_helper.rb +10 -2
  27. data/lib/gir_ffi/builders/base_argument_builder.rb +2 -2
  28. data/lib/gir_ffi/builders/base_method_builder.rb +1 -1
  29. data/lib/gir_ffi/builders/base_type_builder.rb +1 -1
  30. data/lib/gir_ffi/builders/callback_argument_builder.rb +2 -0
  31. data/lib/gir_ffi/builders/callback_builder.rb +25 -11
  32. data/lib/gir_ffi/builders/callback_return_value_builder.rb +4 -6
  33. data/lib/gir_ffi/builders/enum_builder.rb +9 -5
  34. data/lib/gir_ffi/builders/field_builder.rb +2 -1
  35. data/lib/gir_ffi/builders/function_builder.rb +1 -1
  36. data/lib/gir_ffi/builders/interface_builder.rb +3 -1
  37. data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
  38. data/lib/gir_ffi/builders/marshalling_method_builder.rb +5 -2
  39. data/lib/gir_ffi/builders/method_template.rb +4 -4
  40. data/lib/gir_ffi/builders/module_builder.rb +4 -2
  41. data/lib/gir_ffi/builders/null_argument_builder.rb +0 -2
  42. data/lib/gir_ffi/builders/null_return_value_builder.rb +0 -2
  43. data/lib/gir_ffi/builders/object_builder.rb +18 -6
  44. data/lib/gir_ffi/builders/property_builder.rb +1 -2
  45. data/lib/gir_ffi/builders/signal_closure_builder.rb +3 -5
  46. data/lib/gir_ffi/builders/struct_builder.rb +34 -7
  47. data/lib/gir_ffi/builders/user_defined_builder.rb +8 -1
  48. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +1 -1
  49. data/lib/gir_ffi/callback_base.rb +7 -8
  50. data/lib/gir_ffi/class_base.rb +1 -0
  51. data/lib/gir_ffi/core.rb +17 -2
  52. data/lib/gir_ffi/glib_error.rb +1 -2
  53. data/lib/gir_ffi/in_pointer.rb +7 -0
  54. data/lib/gir_ffi/object_base.rb +27 -0
  55. data/lib/gir_ffi/return_value_info.rb +1 -2
  56. data/lib/gir_ffi/struct_base.rb +1 -9
  57. data/lib/gir_ffi/struct_like_base.rb +9 -5
  58. data/lib/gir_ffi/type_map.rb +1 -0
  59. data/lib/gir_ffi/unintrospectable_type_info.rb +1 -1
  60. data/lib/gir_ffi/union_base.rb +1 -9
  61. data/lib/gir_ffi/user_defined_object_info.rb +3 -2
  62. data/lib/gir_ffi/version.rb +1 -1
  63. data/lib/gir_ffi/vfunc_implementation.rb +1 -0
  64. metadata +106 -143
  65. data/Gemfile +0 -14
  66. data/Rakefile +0 -9
  67. data/tasks/test.rake +0 -204
  68. data/test/base_test_helper.rb +0 -70
  69. data/test/ffi-glib/array_test.rb +0 -203
  70. data/test/ffi-glib/byte_array_test.rb +0 -28
  71. data/test/ffi-glib/bytes_test.rb +0 -61
  72. data/test/ffi-glib/closure_test.rb +0 -38
  73. data/test/ffi-glib/destroy_notify_test.rb +0 -18
  74. data/test/ffi-glib/hash_table_test.rb +0 -68
  75. data/test/ffi-glib/list_test.rb +0 -86
  76. data/test/ffi-glib/main_loop_test.rb +0 -53
  77. data/test/ffi-glib/ptr_array_test.rb +0 -112
  78. data/test/ffi-glib/ruby_closure_test.rb +0 -62
  79. data/test/ffi-glib/s_list_test.rb +0 -76
  80. data/test/ffi-glib/strv_test.rb +0 -60
  81. data/test/ffi-glib/variant_test.rb +0 -12
  82. data/test/ffi-gobject/gobject_test.rb +0 -76
  83. data/test/ffi-gobject/object_class_test.rb +0 -31
  84. data/test/ffi-gobject/object_test.rb +0 -122
  85. data/test/ffi-gobject/param_spec_test.rb +0 -32
  86. data/test/ffi-gobject/value_test.rb +0 -390
  87. data/test/ffi-gobject_introspection/gobject_type_init_test.rb +0 -26
  88. data/test/ffi-gobject_introspection/i_base_info_test.rb +0 -52
  89. data/test/ffi-gobject_introspection/i_constant_info_test.rb +0 -29
  90. data/test/ffi-gobject_introspection/i_enum_info_test.rb +0 -18
  91. data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -6
  92. data/test/ffi-gobject_introspection/i_interface_info_test.rb +0 -23
  93. data/test/ffi-gobject_introspection/i_object_info_test.rb +0 -49
  94. data/test/ffi-gobject_introspection/i_property_info_test.rb +0 -47
  95. data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +0 -27
  96. data/test/ffi-gobject_introspection/i_repository_test.rb +0 -81
  97. data/test/ffi-gobject_introspection/i_struct_info_test.rb +0 -23
  98. data/test/ffi-gobject_introspection/i_type_info_test.rb +0 -30
  99. data/test/ffi-gobject_introspection/i_union_info_test.rb +0 -17
  100. data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +0 -41
  101. data/test/ffi-gobject_introspection/lib_test.rb +0 -13
  102. data/test/ffi-gobject_introspection/strv_test.rb +0 -46
  103. data/test/ffi-gobject_test.rb +0 -151
  104. data/test/gir_ffi/allocation_helper_test.rb +0 -36
  105. data/test/gir_ffi/arg_helper_test.rb +0 -139
  106. data/test/gir_ffi/boolean_test.rb +0 -43
  107. data/test/gir_ffi/boxed_base_test.rb +0 -65
  108. data/test/gir_ffi/builder_test.rb +0 -322
  109. data/test/gir_ffi/builders/argument_builder_test.rb +0 -651
  110. data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -6
  111. data/test/gir_ffi/builders/callback_argument_builder_test.rb +0 -126
  112. data/test/gir_ffi/builders/callback_builder_test.rb +0 -117
  113. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +0 -81
  114. data/test/gir_ffi/builders/constant_builder_test.rb +0 -6
  115. data/test/gir_ffi/builders/constructor_builder_test.rb +0 -37
  116. data/test/gir_ffi/builders/enum_builder_test.rb +0 -23
  117. data/test/gir_ffi/builders/field_builder_test.rb +0 -134
  118. data/test/gir_ffi/builders/function_builder_test.rb +0 -550
  119. data/test/gir_ffi/builders/initializer_builder_test.rb +0 -54
  120. data/test/gir_ffi/builders/interface_builder_test.rb +0 -32
  121. data/test/gir_ffi/builders/module_builder_test.rb +0 -43
  122. data/test/gir_ffi/builders/object_builder_test.rb +0 -98
  123. data/test/gir_ffi/builders/property_builder_test.rb +0 -158
  124. data/test/gir_ffi/builders/registered_type_builder_test.rb +0 -54
  125. data/test/gir_ffi/builders/return_value_builder_test.rb +0 -433
  126. data/test/gir_ffi/builders/signal_closure_builder_test.rb +0 -197
  127. data/test/gir_ffi/builders/struct_builder_test.rb +0 -93
  128. data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +0 -29
  129. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +0 -84
  130. data/test/gir_ffi/builders/union_builder_test.rb +0 -28
  131. data/test/gir_ffi/builders/user_defined_builder_test.rb +0 -524
  132. data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +0 -101
  133. data/test/gir_ffi/builders/vfunc_builder_test.rb +0 -241
  134. data/test/gir_ffi/callback_base_test.rb +0 -22
  135. data/test/gir_ffi/class_base_test.rb +0 -166
  136. data/test/gir_ffi/core_test.rb +0 -98
  137. data/test/gir_ffi/enum_base_test.rb +0 -43
  138. data/test/gir_ffi/error_type_info_test.rb +0 -50
  139. data/test/gir_ffi/ffi_ext/pointer_test.rb +0 -20
  140. data/test/gir_ffi/g_type_test.rb +0 -31
  141. data/test/gir_ffi/in_pointer_test.rb +0 -203
  142. data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -26
  143. data/test/gir_ffi/info_ext/i_callback_info_test.rb +0 -21
  144. data/test/gir_ffi/info_ext/i_field_info_test.rb +0 -37
  145. data/test/gir_ffi/info_ext/i_function_info_test.rb +0 -74
  146. data/test/gir_ffi/info_ext/i_signal_info_test.rb +0 -32
  147. data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -711
  148. data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +0 -19
  149. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +0 -26
  150. data/test/gir_ffi/info_ext/safe_function_name_test.rb +0 -26
  151. data/test/gir_ffi/interface_base_test.rb +0 -20
  152. data/test/gir_ffi/method_stubber_test.rb +0 -65
  153. data/test/gir_ffi/object_base_test.rb +0 -64
  154. data/test/gir_ffi/object_store_test.rb +0 -41
  155. data/test/gir_ffi/receiver_argument_info_test.rb +0 -33
  156. data/test/gir_ffi/sized_array_test.rb +0 -206
  157. data/test/gir_ffi/struct_base_test.rb +0 -23
  158. data/test/gir_ffi/struct_like_base_test.rb +0 -167
  159. data/test/gir_ffi/type_map_test.rb +0 -17
  160. data/test/gir_ffi/unintrospectable_type_info_test.rb +0 -121
  161. data/test/gir_ffi/union_base_test.rb +0 -23
  162. data/test/gir_ffi/user_defined_object_info_test.rb +0 -119
  163. data/test/gir_ffi/user_defined_property_info_test.rb +0 -39
  164. data/test/gir_ffi/variable_name_generator_test.rb +0 -18
  165. data/test/gir_ffi/version_test.rb +0 -9
  166. data/test/gir_ffi/zero_terminated_test.rb +0 -108
  167. data/test/gir_ffi_test_helper.rb +0 -84
  168. data/test/integration/callback_exceptions_test.rb +0 -59
  169. data/test/integration/derived_classes_test.rb +0 -53
  170. data/test/integration/generated_everything_test.rb +0 -452
  171. data/test/integration/generated_gimarshallingtests_test.rb +0 -3096
  172. data/test/integration/generated_gio_test.rb +0 -116
  173. data/test/integration/generated_glib_test.rb +0 -10
  174. data/test/integration/generated_gobject_test.rb +0 -124
  175. data/test/integration/generated_gst_test.rb +0 -38
  176. data/test/integration/generated_gtk_source_test.rb +0 -32
  177. data/test/integration/generated_gtop_test.rb +0 -22
  178. data/test/integration/generated_pango_ft2_test.rb +0 -17
  179. data/test/integration/generated_pango_test.rb +0 -24
  180. data/test/integration/generated_regress_test.rb +0 -4038
  181. data/test/integration/generated_secret_test.rb +0 -14
  182. data/test/integration/generated_utility_test.rb +0 -174
  183. data/test/integration/generated_warnlib_test.rb +0 -43
  184. data/test/integration/method_lookup_test.rb +0 -34
  185. data/test/introspection_test_helper.rb +0 -93
  186. data/test/lib/Makefile.am +0 -110
  187. data/test/lib/autogen.sh +0 -4
  188. data/test/lib/configure.ac +0 -34
  189. data/test/lib/m4/jhflags.m4 +0 -21
  190. data/test/minitest/stats_plugin.rb +0 -30
@@ -1,651 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GirFFI::Builders::ArgumentBuilder do
6
- let(:var_gen) { GirFFI::VariableNameGenerator.new }
7
- let(:builder) { GirFFI::Builders::ArgumentBuilder.new(var_gen, arg_info) }
8
-
9
- describe "for an argument with direction :in" do
10
- describe "for :c" do
11
- describe "with full ownership transfer" do
12
- let(:arg_info) do
13
- get_introspection_data("GIMarshallingTests", "array_struct_take_in").args[0]
14
- end
15
-
16
- it "has the correct value for #pre_conversion" do
17
- _(builder.pre_conversion)
18
- .must_equal ["_v1 = GirFFI::SizedArray.copy_from([:pointer, GIMarshallingTests::BoxedStruct], -1, structs)"]
19
- end
20
-
21
- it "has the correct value for #post_conversion" do
22
- _(builder.post_conversion).must_equal []
23
- end
24
- end
25
- end
26
-
27
- describe "for :callback" do
28
- let(:arg_info) do
29
- get_introspection_data("Regress", "test_callback_destroy_notify").args[0]
30
- end
31
-
32
- it "has the correct value for #pre_conversion" do
33
- _(builder.pre_conversion).must_equal ["_v1 = Regress::TestCallbackUserData.from(callback)"]
34
- end
35
-
36
- it "has the correct value for #post_conversion" do
37
- _(builder.post_conversion).must_equal []
38
- end
39
- end
40
-
41
- describe "for :zero_terminated" do
42
- let(:arg_info) do
43
- get_introspection_data("GIMarshallingTests",
44
- "array_in_len_zero_terminated").args[0]
45
- end
46
-
47
- it "has the correct value for #pre_conversion" do
48
- _(builder.pre_conversion).must_equal ["_v1 = GirFFI::ZeroTerminated.from(:gint32, ints)"]
49
- end
50
-
51
- it "has the correct value for #post_conversion" do
52
- _(builder.post_conversion).must_equal []
53
- end
54
- end
55
-
56
- describe "for :void" do
57
- let(:arg_info) { get_introspection_data("Regress", "test_callback_user_data").args[1] }
58
-
59
- describe "when it is a regular argument" do
60
- it "has the correct value for method_argument_name" do
61
- _(builder.method_argument_name).must_equal arg_info.name
62
- end
63
-
64
- it "has the correct value for #pre_conversion" do
65
- _(builder.pre_conversion).must_equal ["_v1 = user_data"]
66
- end
67
-
68
- it "has the correct value for #post_conversion" do
69
- _(builder.post_conversion).must_equal []
70
- end
71
- end
72
-
73
- describe "when it is a closure" do
74
- before do
75
- callback = Object.new
76
- allow(callback).to receive(:call_argument_name).and_return "foo"
77
- builder.mark_as_user_data callback
78
- end
79
-
80
- it "has the correct value for method_argument_name" do
81
- _(builder.method_argument_name).must_be_nil
82
- end
83
-
84
- it "has the correct value for #pre_conversion" do
85
- _(builder.pre_conversion).must_equal ["_v1 = GirFFI::ArgHelper.store(foo)"]
86
- end
87
-
88
- it "has the correct value for #post_conversion" do
89
- _(builder.post_conversion).must_equal []
90
- end
91
- end
92
- end
93
- end
94
-
95
- describe "for an argument with direction :out" do
96
- describe "for :enum" do
97
- let(:arg_info) { get_introspection_data("GIMarshallingTests", "genum_out").args[0] }
98
-
99
- it "has the correct value for #pre_conversion" do
100
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new GIMarshallingTests::GEnum"]
101
- end
102
-
103
- it "has the correct value for #post_conversion" do
104
- _(builder.post_conversion).must_equal ["_v2 = GIMarshallingTests::GEnum.get_value_from_pointer(_v1, 0)"]
105
- end
106
- end
107
-
108
- describe "for :flags" do
109
- let(:arg_info) do
110
- get_introspection_data("GIMarshallingTests", "flags_out").args[0]
111
- end
112
-
113
- it "has the correct value for #pre_conversion" do
114
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new GIMarshallingTests::Flags"]
115
- end
116
-
117
- it "has the correct value for #post_conversion" do
118
- _(builder.post_conversion).must_equal ["_v2 = GIMarshallingTests::Flags.get_value_from_pointer(_v1, 0)"]
119
- end
120
- end
121
-
122
- describe "for :object" do
123
- describe "with full ownership transfer" do
124
- let(:arg_info) do
125
- get_method_introspection_data("Regress", "TestObj", "null_out").args[0]
126
- end
127
-
128
- it "has the correct value for #pre_conversion" do
129
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer"]
130
- end
131
-
132
- it "has the correct value for #post_conversion" do
133
- _(builder.post_conversion).must_equal ["_v2 = Regress::TestObj.wrap(_v1.get_pointer(0))"]
134
- end
135
- end
136
-
137
- describe "with no ownership transfer" do
138
- let(:arg_info) do
139
- get_method_introspection_data("GIMarshallingTests", "Object", "none_out").args[0]
140
- end
141
-
142
- it "has the correct value for #pre_conversion" do
143
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer"]
144
- end
145
-
146
- it "has the correct value for #post_conversion" do
147
- _(builder.post_conversion)
148
- .must_equal ["_v2 = GIMarshallingTests::Object.wrap(_v1.get_pointer(0)).tap { |it| it && it.ref }"]
149
- end
150
- end
151
- end
152
-
153
- describe "for :struct" do
154
- describe "when not allocated by the caller" do
155
- let(:arg_info) do
156
- get_introspection_data("GIMarshallingTests", "boxed_struct_out").args[0]
157
- end
158
-
159
- it "has the correct value for #pre_conversion" do
160
- _(builder.pre_conversion).must_equal [
161
- "_v1 = FFI::MemoryPointer.new :pointer"
162
- ]
163
- end
164
-
165
- it "has the correct value for #post_conversion" do
166
- _(builder.post_conversion)
167
- .must_equal ["_v2 = GIMarshallingTests::BoxedStruct.wrap_copy(_v1.get_pointer(0))"]
168
- end
169
- end
170
-
171
- describe "when allocated by the caller" do
172
- let(:arg_info) do
173
- get_method_introspection_data("Regress", "TestStructA", "clone").args[0]
174
- end
175
-
176
- it "has the correct value for #pre_conversion" do
177
- _(builder.pre_conversion).must_equal ["_v1 = Regress::TestStructA.new"]
178
- end
179
-
180
- it "has empty #post_conversion" do
181
- _(builder.post_conversion).must_equal []
182
- end
183
- end
184
- end
185
-
186
- describe "for :strv" do
187
- let(:arg_info) do
188
- get_introspection_data("GIMarshallingTests", "gstrv_out").args[0]
189
- end
190
-
191
- it "has the correct value for #pre_conversion" do
192
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer"]
193
- end
194
-
195
- it "has the correct value for #post_conversion" do
196
- _(builder.post_conversion).must_equal ["_v2 = GLib::Strv.wrap(_v1.get_pointer(0))"]
197
- end
198
- end
199
-
200
- describe "for :array" do
201
- describe "when allocated by the callee" do
202
- let(:arg_info) do
203
- get_introspection_data("GIMarshallingTests", "garray_utf8_none_out").args[0]
204
- end
205
-
206
- it "has the correct value for #pre_conversion" do
207
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer"]
208
- end
209
-
210
- it "has the correct value for #post_conversion" do
211
- _(builder.post_conversion).must_equal ["_v2 = GLib::Array.wrap(:utf8, _v1.get_pointer(0))"]
212
- end
213
- end
214
-
215
- describe "when allocated by the caller" do
216
- let(:function_info) do
217
- get_introspection_data("GIMarshallingTests", "garray_utf8_full_out_caller_allocated")
218
- end
219
-
220
- let(:arg_info) { function_info.args[0] }
221
-
222
- it "has the correct value for #pre_conversion" do
223
- _(builder.pre_conversion).must_equal ["_v1 = GLib::Array.new :utf8"]
224
- end
225
-
226
- it "has empty #post_conversion" do
227
- _(builder.post_conversion).must_equal []
228
- end
229
- end
230
- end
231
-
232
- describe "for :ptr_array" do
233
- let(:arg_info) do
234
- get_introspection_data("GIMarshallingTests", "gptrarray_utf8_none_out").args[0]
235
- end
236
-
237
- it "has the correct value for #pre_conversion" do
238
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer"]
239
- end
240
-
241
- it "has the correct value for #post_conversion" do
242
- _(builder.post_conversion).must_equal ["_v2 = GLib::PtrArray.wrap(:utf8, _v1.get_pointer(0))"]
243
- end
244
- end
245
-
246
- describe "for :error" do
247
- let(:arg_info) do
248
- get_introspection_data("GIMarshallingTests", "gerror_out").args[0]
249
- end
250
-
251
- it "has the correct value for #pre_conversion" do
252
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer"]
253
- end
254
-
255
- it "has the correct value for #post_conversion" do
256
- _(builder.post_conversion).must_equal ["_v2 = GLib::Error.wrap(_v1.get_pointer(0))"]
257
- end
258
- end
259
-
260
- describe "for :c" do
261
- describe "with fixed size" do
262
- let(:arg_info) do
263
- get_introspection_data("GIMarshallingTests", "array_fixed_out").args[0]
264
- end
265
-
266
- it "has the correct value for #pre_conversion" do
267
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer"]
268
- end
269
-
270
- it "has the correct value for #post_conversion" do
271
- _(builder.post_conversion).must_equal ["_v2 = GirFFI::SizedArray.wrap(:gint32, 4, _v1.get_pointer(0))"]
272
- end
273
- end
274
-
275
- describe "with separate size parameter" do
276
- let(:arg_info) do
277
- get_introspection_data("GIMarshallingTests", "array_out").args[0]
278
- end
279
-
280
- let(:length_argument) { Object.new }
281
- before do
282
- allow(length_argument).to receive(:post_converted_name).and_return "bar"
283
- builder.length_arg = length_argument
284
- end
285
-
286
- it "has the correct value for #pre_conversion" do
287
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer"]
288
- end
289
-
290
- it "has the correct value for #post_conversion" do
291
- _(builder.post_conversion).must_equal ["_v2 = GirFFI::SizedArray.wrap(:gint32, bar, _v1.get_pointer(0))"]
292
- end
293
- end
294
- end
295
-
296
- describe "for :glist" do
297
- let(:arg_info) do
298
- get_introspection_data("GIMarshallingTests", "glist_utf8_none_out").args[0]
299
- end
300
-
301
- it "has the correct value for #pre_conversion" do
302
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer"]
303
- end
304
-
305
- it "has the correct value for #post_conversion" do
306
- _(builder.post_conversion).must_equal ["_v2 = GLib::List.wrap(:utf8, _v1.get_pointer(0))"]
307
- end
308
- end
309
-
310
- describe "for :gslist" do
311
- let(:arg_info) do
312
- get_introspection_data("GIMarshallingTests", "gslist_utf8_none_out").args[0]
313
- end
314
-
315
- it "has the correct value for #pre_conversion" do
316
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer"]
317
- end
318
-
319
- it "has the correct value for #post_conversion" do
320
- _(builder.post_conversion).must_equal ["_v2 = GLib::SList.wrap(:utf8, _v1.get_pointer(0))"]
321
- end
322
- end
323
-
324
- describe "for :ghash" do
325
- let(:arg_info) do
326
- get_introspection_data("GIMarshallingTests", "ghashtable_utf8_none_out").args[0]
327
- end
328
-
329
- it "has the correct value for #pre_conversion" do
330
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer"]
331
- end
332
-
333
- it "has the correct value for #post_conversion" do
334
- _(builder.post_conversion).must_equal ["_v2 = GLib::HashTable.wrap([:utf8, :utf8], _v1.get_pointer(0))"]
335
- end
336
- end
337
-
338
- describe "for :utf8" do
339
- describe "with full ownership transfer" do
340
- let(:arg_info) do
341
- get_introspection_data("GIMarshallingTests", "utf8_full_out").args[0]
342
- end
343
-
344
- it "has the correct value for #pre_conversion" do
345
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer"]
346
- end
347
-
348
- it "has the correct value for #post_conversion" do
349
- _(builder.post_conversion).must_equal [
350
- "_v2 = GirFFI::AllocationHelper.free_after _v1.get_pointer(0), &:to_utf8"
351
- ]
352
- end
353
-
354
- it "has the correct value for #return_value_name" do
355
- builder.post_conversion
356
- _(builder.return_value_name).must_equal "_v2"
357
- end
358
- end
359
-
360
- describe "with no ownership transfer" do
361
- let(:arg_info) do
362
- get_introspection_data("GIMarshallingTests", "utf8_none_out").args[0]
363
- end
364
-
365
- it "has the correct value for #pre_conversion" do
366
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer"]
367
- end
368
-
369
- it "has the correct value for #post_conversion" do
370
- _(builder.post_conversion).must_equal ["_v2 = _v1.get_pointer(0).to_utf8"]
371
- end
372
- end
373
- end
374
-
375
- describe "for :void" do
376
- let(:function_info) do
377
- get_introspection_data("Everything", "one_outparam_gpointer")
378
- end
379
- let(:arg_info) { function_info.args[0] }
380
-
381
- before { skip_below "1.47.1" }
382
-
383
- it "has the correct value for #pre_conversion" do
384
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer"]
385
- end
386
-
387
- it "has the correct value for #post_conversion" do
388
- _(builder.post_conversion).must_equal ["_v2 = _v1.get_pointer(0)"]
389
- end
390
- end
391
- end
392
-
393
- describe "for an argument with direction :inout" do
394
- describe "for :enum" do
395
- let(:arg_info) do
396
- get_introspection_data("GIMarshallingTests", "enum_inout").args[0]
397
- end
398
-
399
- it "has the correct value for #pre_conversion" do
400
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new GIMarshallingTests::Enum",
401
- "GIMarshallingTests::Enum.copy_value_to_pointer(#{arg_info.name}, _v1)"]
402
- end
403
-
404
- it "has the correct value for #post_conversion" do
405
- _(builder.post_conversion).must_equal ["_v2 = GIMarshallingTests::Enum.get_value_from_pointer(_v1, 0)"]
406
- end
407
- end
408
-
409
- describe "for :flags" do
410
- let(:arg_info) do
411
- get_introspection_data("GIMarshallingTests", "no_type_flags_inout").args[0]
412
- end
413
-
414
- it "has the correct value for #pre_conversion" do
415
- _(builder.pre_conversion)
416
- .must_equal ["_v1 = FFI::MemoryPointer.new GIMarshallingTests::NoTypeFlags",
417
- "GIMarshallingTests::NoTypeFlags.copy_value_to_pointer(#{arg_info.name}, _v1)"]
418
- end
419
-
420
- it "has the correct value for #post_conversion" do
421
- _(builder.post_conversion).must_equal ["_v2 = GIMarshallingTests::NoTypeFlags.get_value_from_pointer(_v1, 0)"]
422
- end
423
- end
424
-
425
- describe "for :gint32" do
426
- let(:arg_info) do
427
- get_introspection_data("GIMarshallingTests", "int32_inout_min_max").args[0]
428
- end
429
-
430
- it "has the correct value for method_argument_name" do
431
- _(builder.method_argument_name).must_equal arg_info.name
432
- end
433
-
434
- it "has the correct value for #pre_conversion" do
435
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :int32",
436
- "_v1.put_int32 0, #{arg_info.name}"]
437
- end
438
-
439
- it "has the correct value for #post_conversion" do
440
- _(builder.post_conversion).must_equal ["_v2 = _v1.get_int32(0)"]
441
- end
442
- end
443
-
444
- describe "for an array length" do
445
- let(:function_info) do
446
- get_introspection_data("Regress", "test_array_int_inout")
447
- end
448
- let(:arg_info) { function_info.args[0] }
449
- let(:array_arg_info) { function_info.args[1] }
450
- let(:array_arg_builder) do
451
- GirFFI::Builders::ArgumentBuilder.new(var_gen, array_arg_info)
452
- end
453
-
454
- before do
455
- builder.array_arg = array_arg_builder
456
- end
457
-
458
- it "has the correct value for #pre_conversion" do
459
- _(builder.pre_conversion).must_equal ["n_ints = ints.nil? ? 0 : ints.length",
460
- "_v1 = FFI::MemoryPointer.new :int32",
461
- "_v1.put_int32 0, n_ints"]
462
- end
463
-
464
- it "has the correct value for #post_conversion" do
465
- _(builder.post_conversion).must_equal ["_v2 = _v1.get_int32(0)"]
466
- end
467
- end
468
-
469
- describe "for :strv" do
470
- let(:arg_info) do
471
- get_introspection_data("GIMarshallingTests", "gstrv_inout").args[0]
472
- end
473
-
474
- it "has the correct value for #pre_conversion" do
475
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer",
476
- "_v1.put_pointer 0, GLib::Strv.from(g_strv)"]
477
- end
478
-
479
- it "has the correct value for #post_conversion" do
480
- _(builder.post_conversion).must_equal ["_v2 = GLib::Strv.wrap(_v1.get_pointer(0))"]
481
- end
482
- end
483
-
484
- describe "for :ptr_array" do
485
- let(:arg_info) do
486
- get_introspection_data("GIMarshallingTests", "gptrarray_utf8_none_inout").args[0]
487
- end
488
-
489
- it "has the correct value for #pre_conversion" do
490
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer",
491
- "_v1.put_pointer 0, GLib::PtrArray.from(:utf8, parray_)"]
492
- end
493
-
494
- it "has the correct value for #post_conversion" do
495
- _(builder.post_conversion).must_equal ["_v2 = GLib::PtrArray.wrap(:utf8, _v1.get_pointer(0))"]
496
- end
497
- end
498
-
499
- describe "for :utf8" do
500
- let(:arg_info) do
501
- get_introspection_data("GIMarshallingTests", "utf8_none_inout").args[0]
502
- end
503
-
504
- it "has the correct value for #pre_conversion" do
505
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :pointer",
506
- "_v1.put_pointer 0, GirFFI::InPointer.from_utf8(utf8)"]
507
- end
508
-
509
- it "has the correct value for #post_conversion" do
510
- _(builder.post_conversion).must_equal ["_v2 = _v1.get_pointer(0).to_utf8"]
511
- end
512
- end
513
-
514
- describe "for :struct" do
515
- describe "with full ownership transfer" do
516
- let(:arg_info) do
517
- get_introspection_data("GIMarshallingTests", "boxed_struct_inout").args[0]
518
- end
519
-
520
- it "has the correct value for #pre_conversion" do
521
- _(builder.pre_conversion).must_equal [
522
- "_v1 = FFI::MemoryPointer.new :pointer",
523
- "_v1.put_pointer 0, GIMarshallingTests::BoxedStruct.copy_from(struct_)"
524
- ]
525
- end
526
-
527
- it "has the correct value for #post_conversion" do
528
- _(builder.post_conversion)
529
- .must_equal ["_v2 = GIMarshallingTests::BoxedStruct.wrap_own(_v1.get_pointer(0))"]
530
- end
531
- end
532
- end
533
-
534
- describe "for :c" do
535
- describe "with fixed size" do
536
- let(:arg_info) do
537
- get_introspection_data("GIMarshallingTests", "array_fixed_inout").args[0]
538
- end
539
-
540
- it "has the correct value for #pre_conversion" do
541
- _(builder.pre_conversion).must_equal [
542
- 'GirFFI::ArgHelper.check_fixed_array_size 4, ints, "ints"',
543
- "_v1 = FFI::MemoryPointer.new :pointer",
544
- "_v1.put_pointer 0, GirFFI::SizedArray.from(:gint32, 4, ints)"
545
- ]
546
- end
547
-
548
- it "has the correct value for #post_conversion" do
549
- _(builder.post_conversion).must_equal ["_v2 = GirFFI::SizedArray.wrap(:gint32, 4, _v1.get_pointer(0))"]
550
- end
551
- end
552
-
553
- describe "with separate size parameter" do
554
- let(:function_info) do
555
- get_introspection_data("Regress", "test_array_int_inout")
556
- end
557
- let(:length_arg_info) { function_info.args[0] }
558
- let(:arg_info) { function_info.args[1] }
559
- let(:length_arg_builder) do
560
- GirFFI::Builders::ArgumentBuilder.new(var_gen, length_arg_info)
561
- end
562
-
563
- before do
564
- builder.length_arg = length_arg_builder
565
- end
566
-
567
- it "has the correct value for #pre_conversion" do
568
- _(builder.pre_conversion).must_equal [
569
- "_v1 = FFI::MemoryPointer.new :pointer",
570
- "_v1.put_pointer 0, GirFFI::SizedArray.copy_from(:gint32, -1, ints)"
571
- ]
572
- end
573
-
574
- it "has the correct value for #post_conversion" do
575
- _(builder.post_conversion).must_equal ["_v3 = GirFFI::SizedArray.wrap(:gint32, _v2, _v1.get_pointer(0))"]
576
- end
577
- end
578
- end
579
- end
580
-
581
- describe "for a skipped argument with direction :in" do
582
- let(:arg_info) do
583
- get_method_introspection_data("Regress", "TestObj", "skip_param").args[2]
584
- end
585
-
586
- it "has the correct value for method_argument_name" do
587
- _(builder.method_argument_name).must_be_nil
588
- end
589
-
590
- it "has the correct value for #pre_conversion" do
591
- _(builder.pre_conversion).must_equal ["_v1 = 0"]
592
- end
593
-
594
- it "has the correct value for #post_conversion" do
595
- _(builder.post_conversion).must_equal []
596
- end
597
- end
598
-
599
- describe "for a skipped argument with direction :inout" do
600
- let(:arg_info) do
601
- get_method_introspection_data("Regress", "TestObj", "skip_inout_param").args[3]
602
- end
603
-
604
- it "has the correct value for method_argument_name" do
605
- _(builder.method_argument_name).must_be_nil
606
- end
607
-
608
- it "has the correct value for #pre_conversion" do
609
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :int32",
610
- "_v1.put_int32 0, 0"]
611
- end
612
-
613
- it "has the correct value for #post_conversion" do
614
- _(builder.post_conversion).must_equal []
615
- end
616
- end
617
-
618
- describe "for a skipped argument with direction :out" do
619
- let(:arg_info) do
620
- get_method_introspection_data("Regress", "TestObj", "skip_out_param").args[1]
621
- end
622
-
623
- it "has the correct value for method_argument_name" do
624
- _(builder.method_argument_name).must_be_nil
625
- end
626
-
627
- it "has the correct value for #pre_conversion" do
628
- _(builder.pre_conversion).must_equal ["_v1 = FFI::MemoryPointer.new :int32"]
629
- end
630
-
631
- it "has the correct value for #post_conversion" do
632
- _(builder.post_conversion).must_equal []
633
- end
634
- end
635
-
636
- describe "for an argument with direction :error" do
637
- let(:arg_info) { GirFFI::ErrorArgumentInfo.new }
638
-
639
- it "has the correct value for #pre_conversion" do
640
- _(builder.pre_conversion).must_equal [
641
- "_v1 = FFI::MemoryPointer.new(:pointer).write_pointer nil"
642
- ]
643
- end
644
-
645
- it "has the correct value for #post_conversion" do
646
- _(builder.post_conversion).must_equal [
647
- "GirFFI::ArgHelper.check_error(_v1)"
648
- ]
649
- end
650
- end
651
- end