gir_ffi 0.5.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. data/History.txt +5 -0
  2. data/lib/ffi-glib/array.rb +2 -3
  3. data/lib/ffi-glib/container_class_methods.rb +3 -4
  4. data/lib/ffi-glib/hash_table.rb +7 -3
  5. data/lib/ffi-glib/list_methods.rb +1 -1
  6. data/lib/ffi-glib/sized_array.rb +66 -0
  7. data/lib/ffi-glib/strv.rb +1 -1
  8. data/lib/ffi-glib.rb +5 -4
  9. data/lib/ffi-gobject/object.rb +2 -3
  10. data/lib/ffi-gobject/ruby_closure.rb +3 -2
  11. data/lib/ffi-gobject/value.rb +26 -14
  12. data/lib/ffi-gobject.rb +8 -5
  13. data/lib/ffi-gobject_introspection/g_error.rb +1 -0
  14. data/lib/ffi-gobject_introspection/i_base_info.rb +3 -2
  15. data/lib/ffi-gobject_introspection/i_union_info.rb +21 -8
  16. data/lib/ffi-gobject_introspection/lib.rb +1 -0
  17. data/lib/gir_ffi/argument_builder.rb +8 -20
  18. data/lib/gir_ffi/base_argument_builder.rb +13 -30
  19. data/lib/gir_ffi/builder/module.rb +3 -9
  20. data/lib/gir_ffi/builder/type/base.rb +2 -0
  21. data/lib/gir_ffi/builder/type/callback.rb +2 -2
  22. data/lib/gir_ffi/builder/type/enum.rb +1 -0
  23. data/lib/gir_ffi/builder/type/object.rb +13 -3
  24. data/lib/gir_ffi/builder/type/registered_type.rb +1 -1
  25. data/lib/gir_ffi/builder/type/struct.rb +18 -3
  26. data/lib/gir_ffi/builder/type/unintrospectable.rb +5 -45
  27. data/lib/gir_ffi/builder/type/user_defined.rb +3 -15
  28. data/lib/gir_ffi/builder/type.rb +5 -5
  29. data/lib/gir_ffi/builder.rb +5 -80
  30. data/lib/gir_ffi/callback.rb +65 -2
  31. data/lib/gir_ffi/callback_helper.rb +0 -56
  32. data/lib/gir_ffi/class_base.rb +2 -2
  33. data/lib/gir_ffi/in_out_pointer.rb +7 -28
  34. data/lib/gir_ffi/in_pointer.rb +12 -19
  35. data/lib/gir_ffi/info_ext/i_arg_info.rb +5 -0
  36. data/lib/gir_ffi/info_ext/i_callable_info.rb +16 -0
  37. data/lib/gir_ffi/info_ext/i_function_info.rb +15 -0
  38. data/lib/gir_ffi/info_ext/i_signal_info.rb +17 -10
  39. data/lib/gir_ffi/info_ext/i_type_info.rb +63 -39
  40. data/lib/gir_ffi/info_ext.rb +5 -3
  41. data/lib/gir_ffi/null_argument_builder.rb +1 -1
  42. data/lib/gir_ffi/return_value_builder.rb +24 -16
  43. data/lib/gir_ffi/unintrospectable_type_info.rb +41 -0
  44. data/lib/gir_ffi/user_defined_property_info.rb +15 -0
  45. data/lib/gir_ffi/user_defined_type_info.rb +25 -0
  46. data/lib/gir_ffi/version.rb +1 -1
  47. data/lib/gir_ffi-base.rb +3 -0
  48. data/lib/gir_ffi.rb +2 -1
  49. data/test/ffi-glib/sized_array_test.rb +87 -0
  50. data/test/ffi-gobject_introspection/i_base_info_test.rb +4 -5
  51. data/test/gir_ffi/argument_builder_test.rb +26 -55
  52. data/test/gir_ffi/builder/type/unintrospectable_test.rb +3 -19
  53. data/test/gir_ffi/builder/type/user_defined_test.rb +16 -21
  54. data/test/gir_ffi/builder_test.rb +31 -53
  55. data/test/gir_ffi/callback_helper_test.rb +0 -47
  56. data/test/gir_ffi/callback_test.rb +49 -0
  57. data/test/gir_ffi/function_builder_test.rb +8 -8
  58. data/test/gir_ffi/in_out_pointer_test.rb +2 -53
  59. data/test/gir_ffi/in_pointer_test.rb +0 -13
  60. data/test/gir_ffi/info_ext/i_callable_info_test.rb +32 -0
  61. data/test/gir_ffi/info_ext/i_function_info_test.rb +61 -0
  62. data/test/gir_ffi/info_ext/i_signal_info_test.rb +7 -0
  63. data/test/gir_ffi/info_ext/i_type_info_test.rb +158 -77
  64. data/test/gir_ffi/return_value_builder_test.rb +2 -2
  65. data/test/gir_ffi/unintrospectable_type_info_test.rb +95 -0
  66. data/test/gir_ffi/user_defined_property_info_test.rb +19 -0
  67. data/test/gir_ffi/user_defined_type_info_test.rb +34 -0
  68. data/test/integration/generated_gimarshallingtests_test.rb +10 -10
  69. data/test/integration/generated_regress_test.rb +10 -10
  70. metadata +24 -15
  71. data/lib/gir_ffi/builder/type/struct_based.rb +0 -31
  72. data/lib/gir_ffi/user_defined/i_base_info.rb +0 -7
  73. data/lib/gir_ffi/user_defined/i_object_info.rb +0 -13
  74. data/lib/gir_ffi/user_defined/i_property_info.rb +0 -9
  75. data/lib/gir_ffi/user_defined/i_registered_type_info.rb +0 -10
  76. data/test/gir_ffi/user_defined/i_object_info_test.rb +0 -18
  77. data/test/gir_ffi/user_defined/i_property_info_test.rb +0 -14
  78. data/test/gir_ffi/user_defined/i_registered_type_info_test.rb +0 -10
@@ -21,9 +21,7 @@ describe GirFFI::ArgumentBuilder do
21
21
  stub(interface_type_info = Object.new).namespace { "Bar" }
22
22
  stub(interface_type_info).name { "Foo" }
23
23
 
24
- stub(type_info).tag { :interface }
25
24
  stub(type_info).flattened_tag { :callback }
26
- stub(type_info).type_specification { ":callback" }
27
25
  stub(type_info).interface { interface_type_info }
28
26
  end
29
27
 
@@ -38,7 +36,6 @@ describe GirFFI::ArgumentBuilder do
38
36
 
39
37
  describe "for :zero_terminated" do
40
38
  before do
41
- stub(type_info).tag { :array }
42
39
  stub(type_info).flattened_tag { :zero_terminated }
43
40
  stub(type_info).element_type { :foo }
44
41
  end
@@ -58,9 +55,7 @@ describe GirFFI::ArgumentBuilder do
58
55
 
59
56
  describe "for :enum" do
60
57
  before do
61
- stub(type_info).tag { :interface }
62
58
  stub(type_info).flattened_tag { :enum }
63
- stub(type_info).type_specification { ":enum" }
64
59
  end
65
60
 
66
61
  it "has the correct value for #pre" do
@@ -74,9 +69,7 @@ describe GirFFI::ArgumentBuilder do
74
69
 
75
70
  describe "for :flags" do
76
71
  before do
77
- stub(type_info).tag { :interface }
78
72
  stub(type_info).flattened_tag { :flags }
79
- stub(type_info).type_specification { ":flags" }
80
73
  end
81
74
 
82
75
  it "has the correct value for #pre" do
@@ -90,9 +83,7 @@ describe GirFFI::ArgumentBuilder do
90
83
 
91
84
  describe "for :object" do
92
85
  before do
93
- stub(type_info).tag { :interface }
94
86
  stub(type_info).flattened_tag { :object }
95
- stub(type_info).type_specification { ":object" }
96
87
  end
97
88
 
98
89
  describe "when not allocated by the caller" do
@@ -115,7 +106,7 @@ describe GirFFI::ArgumentBuilder do
115
106
  end
116
107
 
117
108
  it "has the correct value for #pre" do
118
- builder.pre.must_equal [ "_v1 = Bar::Foo.allocate" ]
109
+ builder.pre.must_equal [ "_v1 = Bar::Foo._allocate" ]
119
110
  end
120
111
 
121
112
  it "has the correct value for #post" do
@@ -126,9 +117,7 @@ describe GirFFI::ArgumentBuilder do
126
117
 
127
118
  describe "for :struct" do
128
119
  before do
129
- stub(type_info).tag { :interface }
130
120
  stub(type_info).flattened_tag { :struct }
131
- stub(type_info).type_specification { ":struct" }
132
121
  end
133
122
 
134
123
  describe "when not allocated by the caller" do
@@ -151,7 +140,7 @@ describe GirFFI::ArgumentBuilder do
151
140
  end
152
141
 
153
142
  it "has the correct value for #pre" do
154
- builder.pre.must_equal [ "_v1 = Bar::Foo.allocate" ]
143
+ builder.pre.must_equal [ "_v1 = Bar::Foo._allocate" ]
155
144
  end
156
145
 
157
146
  it "has the correct value for #post" do
@@ -162,13 +151,11 @@ describe GirFFI::ArgumentBuilder do
162
151
 
163
152
  describe "for :strv" do
164
153
  before do
165
- stub(type_info).tag { :array }
166
154
  stub(type_info).flattened_tag { :strv }
167
- stub(type_info).type_specification { "[:strv, :utf8]" }
168
155
  end
169
156
 
170
157
  it "has the correct value for #pre" do
171
- builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.for [:strv, :utf8]" ]
158
+ builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.for :strv" ]
172
159
  end
173
160
 
174
161
  it "has the correct value for #post" do
@@ -178,10 +165,8 @@ describe GirFFI::ArgumentBuilder do
178
165
 
179
166
  describe "for :array" do
180
167
  before do
181
- stub(type_info).tag { :array }
182
168
  stub(type_info).flattened_tag { :array }
183
169
  stub(type_info).element_type { :foo }
184
- stub(type_info).type_specification { ":array" }
185
170
  end
186
171
 
187
172
  it "has the correct value for #pre" do
@@ -194,50 +179,47 @@ describe GirFFI::ArgumentBuilder do
194
179
  end
195
180
 
196
181
  describe "for :c" do
182
+ before do
183
+ stub(type_info).flattened_tag { :c }
184
+ stub(type_info).subtype_tag_or_class_name { ":foo" }
185
+ end
186
+
197
187
  describe "with fixed size" do
198
188
  before do
199
- stub(type_info).tag { :array }
200
- stub(type_info).flattened_tag { :c }
201
- stub(type_info).type_specification { "[:c, :foo]" }
202
189
  stub(type_info).array_fixed_size { 3 }
203
190
  end
204
191
 
205
192
  it "has the correct value for #pre" do
206
- builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.for [:c, :foo]" ]
193
+ builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.for :c" ]
207
194
  end
208
195
 
209
196
  it "has the correct value for #post" do
210
- builder.post.must_equal [ "_v2 = _v1.to_sized_array_value 3" ]
197
+ builder.post.must_equal [ "_v2 = GLib::SizedArray.wrap(:foo, 3, _v1.to_value)" ]
211
198
  end
212
199
  end
213
200
 
214
201
  describe "with separate size parameter" do
215
202
  let(:length_argument) { Object.new }
216
203
  before do
217
- stub(type_info).tag { :array }
218
- stub(type_info).flattened_tag { :c }
219
- stub(type_info).type_specification { "[:c, :foo]" }
220
204
  stub(type_info).array_fixed_size { -1 }
221
205
  stub(length_argument).retname { "bar" }
222
206
  builder.length_arg = length_argument
223
207
  end
224
208
 
225
209
  it "has the correct value for #pre" do
226
- builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.for [:c, :foo]" ]
210
+ builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.for :c" ]
227
211
  end
228
212
 
229
213
  it "has the correct value for #post" do
230
- builder.post.must_equal [ "_v2 = _v1.to_sized_array_value bar" ]
214
+ builder.post.must_equal [ "_v2 = GLib::SizedArray.wrap(:foo, bar, _v1.to_value)" ]
231
215
  end
232
216
  end
233
217
  end
234
218
 
235
219
  describe "for :glist" do
236
220
  before do
237
- stub(type_info).tag { :glist }
238
221
  stub(type_info).flattened_tag { :glist }
239
222
  stub(type_info).element_type { :foo }
240
- stub(type_info).type_specification { ":glist" }
241
223
  end
242
224
 
243
225
  it "has the correct value for #pre" do
@@ -251,10 +233,8 @@ describe GirFFI::ArgumentBuilder do
251
233
 
252
234
  describe "for :gslist" do
253
235
  before do
254
- stub(type_info).tag { :gslist }
255
236
  stub(type_info).flattened_tag { :gslist }
256
237
  stub(type_info).element_type { :foo }
257
- stub(type_info).type_specification { ":gslist" }
258
238
  end
259
239
 
260
240
  it "has the correct value for #pre" do
@@ -268,10 +248,8 @@ describe GirFFI::ArgumentBuilder do
268
248
 
269
249
  describe "for :ghash" do
270
250
  before do
271
- stub(type_info).tag { :ghash }
272
251
  stub(type_info).flattened_tag { :ghash }
273
252
  stub(type_info).element_type { [:foo, :bar] }
274
- stub(type_info).type_specification { ":ghash" }
275
253
  end
276
254
 
277
255
  it "has the correct value for #pre" do
@@ -289,7 +267,6 @@ describe GirFFI::ArgumentBuilder do
289
267
 
290
268
  describe "for :enum" do
291
269
  before do
292
- stub(type_info).tag { :interface }
293
270
  stub(type_info).flattened_tag { :enum }
294
271
  end
295
272
 
@@ -304,7 +281,6 @@ describe GirFFI::ArgumentBuilder do
304
281
 
305
282
  describe "for :flags" do
306
283
  before do
307
- stub(type_info).tag { :interface }
308
284
  stub(type_info).flattened_tag { :flags }
309
285
  end
310
286
 
@@ -319,7 +295,6 @@ describe GirFFI::ArgumentBuilder do
319
295
 
320
296
  describe "for :gint32" do
321
297
  before do
322
- stub(type_info).tag { :gint32 }
323
298
  stub(type_info).flattened_tag { :gint32 }
324
299
  end
325
300
 
@@ -335,7 +310,6 @@ describe GirFFI::ArgumentBuilder do
335
310
  describe "for an array length" do
336
311
  let(:array_argument) { Object.new }
337
312
  before do
338
- stub(type_info).tag { :gint32 }
339
313
  stub(type_info).flattened_tag { :gint32 }
340
314
  stub(array_argument).name { "foo_array" }
341
315
  builder.array_arg = array_argument
@@ -353,13 +327,11 @@ describe GirFFI::ArgumentBuilder do
353
327
 
354
328
  describe "for :strv" do
355
329
  before do
356
- stub(type_info).tag { :array }
357
330
  stub(type_info).flattened_tag { :strv }
358
- stub(type_info).type_specification { "[:strv, :utf8]" }
359
331
  end
360
332
 
361
333
  it "has the correct value for #pre" do
362
- builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.from [:strv, :utf8], GLib::Strv.from(foo)" ]
334
+ builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.from :pointer, GLib::Strv.from(foo)" ]
363
335
  end
364
336
 
365
337
  it "has the correct value for #post" do
@@ -369,47 +341,44 @@ describe GirFFI::ArgumentBuilder do
369
341
 
370
342
  describe "for :utf8" do
371
343
  before do
372
- stub(type_info).tag { :utf8 }
373
344
  stub(type_info).flattened_tag { :utf8 }
374
- stub(type_info).type_specification { ":utf8" }
375
345
  end
376
346
 
377
347
  it "has the correct value for #pre" do
378
- builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.from :utf8, foo" ]
348
+ builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.from :pointer, GirFFI::InPointer.from(:utf8, foo)" ]
379
349
  end
380
350
 
381
351
  it "has the correct value for #post" do
382
- builder.post.must_equal [ "_v2 = _v1.to_value" ]
352
+ builder.post.must_equal [ "_v2 = ArgHelper.ptr_to_utf8 _v1.to_value" ]
383
353
  end
384
354
  end
385
355
 
386
356
  describe "for :c" do
357
+ before do
358
+ stub(type_info).flattened_tag { :c }
359
+ stub(type_info).subtype_tag_or_class_name { ":bar" }
360
+ end
361
+
387
362
  describe "with fixed size" do
388
363
  before do
389
- stub(type_info).tag { :array }
390
- stub(type_info).flattened_tag { :c }
391
- stub(type_info).type_specification { "[:c, :bar]" }
392
364
  stub(type_info).array_fixed_size { 3 }
393
365
  end
394
366
 
395
367
  it "has the correct value for #pre" do
396
368
  builder.pre.must_equal [
397
369
  "GirFFI::ArgHelper.check_fixed_array_size 3, foo, \"foo\"",
398
- "_v1 = GirFFI::InOutPointer.from [:c, :bar], foo"
370
+ "_v1 = GirFFI::InOutPointer.from :pointer, GLib::SizedArray.from(:bar, 3, foo)"
399
371
  ]
400
372
  end
401
373
 
402
374
  it "has the correct value for #post" do
403
- builder.post.must_equal [ "_v2 = _v1.to_sized_array_value 3" ]
375
+ builder.post.must_equal [ "_v2 = GLib::SizedArray.wrap(:bar, 3, _v1.to_value)" ]
404
376
  end
405
377
  end
406
378
 
407
379
  describe "with separate size parameter" do
408
380
  let(:length_argument) { Object.new }
409
381
  before do
410
- stub(type_info).tag { :array }
411
- stub(type_info).flattened_tag { :c }
412
- stub(type_info).type_specification { "[:c, :bar]" }
413
382
  stub(type_info).array_fixed_size { -1 }
414
383
  stub(length_argument).retname { "baz" }
415
384
  builder.length_arg = length_argument
@@ -417,11 +386,13 @@ describe GirFFI::ArgumentBuilder do
417
386
 
418
387
  it "has the correct value for #pre" do
419
388
  # TODO: Perhaps this should include a length check as well.
420
- builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.from [:c, :bar], foo" ]
389
+ builder.pre.must_equal [
390
+ "_v1 = GirFFI::InOutPointer.from :pointer, GLib::SizedArray.from(:bar, -1, foo)"
391
+ ]
421
392
  end
422
393
 
423
394
  it "has the correct value for #post" do
424
- builder.post.must_equal [ "_v2 = _v1.to_sized_array_value baz" ]
395
+ builder.post.must_equal [ "_v2 = GLib::SizedArray.wrap(:bar, baz, _v1.to_value)" ]
425
396
  end
426
397
  end
427
398
  end
@@ -12,7 +12,8 @@ describe GirFFI::Builder::Type::Unintrospectable do
12
12
  Gio::Lib.g_file_new_for_path(ptr)
13
13
 
14
14
  @gtype = GObject.type_from_name 'GLocalFile'
15
- @bldr = GirFFI::Builder::Type::Unintrospectable.new(@gtype)
15
+ @info = GirFFI::UnintrospectableTypeInfo.new(@gtype)
16
+ @bldr = GirFFI::Builder::Type::Unintrospectable.new(@info)
16
17
  @klass = @bldr.build_class
17
18
  end
18
19
 
@@ -29,7 +30,7 @@ describe GirFFI::Builder::Type::Unintrospectable do
29
30
  end
30
31
 
31
32
  it "returns the same class when built again" do
32
- other_bldr = GirFFI::Builder::Type::Unintrospectable.new(@gtype)
33
+ other_bldr = GirFFI::Builder::Type::Unintrospectable.new(@info)
33
34
  other_klass = other_bldr.build_class
34
35
 
35
36
  assert_equal @klass, other_klass
@@ -47,21 +48,4 @@ describe GirFFI::Builder::Type::Unintrospectable do
47
48
  end
48
49
  end
49
50
  end
50
-
51
- # FIXME: Testing a private method, and with rather a lot of
52
- # mocking, too.
53
- describe "#interfaces" do
54
- it "skips interfaces that have no introspection data" do
55
- bldr = GirFFI::Builder::Type::Unintrospectable.new(:some_type)
56
-
57
- mock(bldr).interface_gtypes { [:foo, :bar ] }
58
- mock(gir = Object.new).find_by_gtype(:foo) { :foo_info }
59
- mock(gir).find_by_gtype(:bar) { nil }
60
- bldr.instance_eval { @gir = gir }
61
- mock(GirFFI::Builder).build_class(:foo_info) { :foo_module }
62
-
63
- result = bldr.send :interfaces
64
- result.must_equal [:foo_module]
65
- end
66
- end
67
51
  end
@@ -3,41 +3,36 @@ require 'gir_ffi_test_helper'
3
3
  GirFFI.setup :GIMarshallingTests
4
4
 
5
5
  describe GirFFI::Builder::Type::UserDefined do
6
- describe "with a block with a call to #install_property" do
6
+ describe "with type info containing one property" do
7
7
  before do
8
8
  @klass = Class.new GIMarshallingTests::OverridesObject
9
9
  Object.const_set "DerivedC#{Sequence.next}", @klass
10
- @builder = GirFFI::Builder::Type::UserDefined.new @klass do
10
+
11
+ @info = GirFFI::UserDefinedTypeInfo.new @klass do
11
12
  install_property GObject.param_spec_int("foo", "foo bar",
12
13
  "The Foo Bar Property",
13
14
  10, 20, 15,
14
15
  3)
15
16
  end
17
+
18
+ @builder = GirFFI::Builder::Type::UserDefined.new @info
16
19
  @builder.build_class
17
20
  end
18
21
 
19
- it "has one property of type GirFFI::UserDefined::IPropertyInfo" do
20
- props = @builder.send(:properties)
21
- props.length.must_equal 1
22
- props[0].must_be_instance_of GirFFI::UserDefined::IPropertyInfo
22
+ it "registers a type that is bigger than the parent" do
23
+ gtype = @klass.get_gtype
24
+ q = GObject.type_query gtype
25
+ q.instance_size.must_be :>, GIMarshallingTests::OverridesObject::Struct.size
23
26
  end
24
27
 
25
- describe "the info attribute" do
26
- before do
27
- @info = @builder.info
28
- end
29
-
30
- it "is an object of type GirFFI::UserDefined::IObjectInfo" do
31
- @info.must_be_instance_of GirFFI::UserDefined::IObjectInfo
32
- end
28
+ it "gives the types Struct the fields :parent and :foo" do
29
+ @klass::Struct.members.must_equal [:parent, :foo]
30
+ end
33
31
 
34
- it "knows about the single property :foo" do
35
- props = @info.properties
36
- props.length.must_equal 1
37
- foo_property = props[0]
38
- foo_property.must_be_instance_of GirFFI::UserDefined::IPropertyInfo
39
- foo_property.name.must_equal "foo"
40
- end
32
+ it "creates accessor functions for the property" do
33
+ obj = @klass.new
34
+ obj.foo = 13
35
+ obj.foo.must_equal 13
41
36
  end
42
37
  end
43
38
  end
@@ -5,33 +5,6 @@ describe GirFFI::Builder do
5
5
  @gir = GObjectIntrospection::IRepository.default
6
6
  end
7
7
 
8
- describe "::itypeinfo_to_callback_ffitype" do
9
- describe "for an :interface argument" do
10
- before do
11
- @iface = Object.new
12
- stub(@info = Object.new).interface { @iface }
13
- stub(@info).tag { :interface }
14
- stub(@info).pointer? { false }
15
- end
16
-
17
- it "correctly maps a :union argument to :pointer" do
18
- stub(@iface).info_type { :union }
19
-
20
- result = GirFFI::Builder.itypeinfo_to_callback_ffitype @info
21
-
22
- assert_equal :pointer, result
23
- end
24
-
25
- it "correctly maps a :flags argument to :int32" do
26
- stub(@iface).info_type { :flags }
27
-
28
- result = GirFFI::Builder.itypeinfo_to_callback_ffitype @info
29
-
30
- assert_equal :int32, result
31
- end
32
- end
33
- end
34
-
35
8
  describe "building GObject::Object" do
36
9
  before do
37
10
  save_module :GObject
@@ -63,12 +36,6 @@ describe GirFFI::Builder do
63
36
  @go = get_introspection_data 'Regress', 'test_callback_destroy_notify'
64
37
  end
65
38
 
66
- should "have the correct types of the arguments for the attached function" do
67
- argtypes = GirFFI::Builder.send(:ffi_function_argument_types, @go)
68
- assert_equal [Regress::TestCallbackUserData, :pointer, GLib::DestroyNotify],
69
- argtypes
70
- end
71
-
72
39
  should "define ffi callback types :Callback and :ClosureNotify" do
73
40
  Regress.setup_method 'test_callback_destroy_notify'
74
41
  tcud = Regress::Lib.find_type :TestCallbackUserData
@@ -80,6 +47,13 @@ describe GirFFI::Builder do
80
47
  assert_equal [FFI.find_type(:pointer)], dn.param_types
81
48
  end
82
49
 
50
+ it "calls attach_function with the correct types" do
51
+ argtypes = [ Regress::TestCallbackUserData, :pointer, GLib::DestroyNotify ]
52
+ mock(Regress::Lib).attach_function("regress_test_callback_destroy_notify",
53
+ argtypes, :int32) { true }
54
+ GirFFI::Builder.attach_ffi_function(Regress::Lib, @go)
55
+ end
56
+
83
57
  after do
84
58
  restore_module :Regress
85
59
  restore_module :GObject
@@ -210,11 +184,26 @@ describe GirFFI::Builder do
210
184
  end
211
185
 
212
186
  describe "its #torture_signature_0 method" do
213
- should "have the correct types of the arguments for the attached function" do
187
+ it "is attached with the correct ffi types" do
214
188
  info = get_method_introspection_data 'Regress', 'TestObj',
215
189
  'torture_signature_0'
216
- assert_equal [:pointer, :int32, :pointer, :pointer, :pointer, :pointer, :uint32],
217
- GirFFI::Builder.send(:ffi_function_argument_types, info)
190
+
191
+ argtypes = [:pointer, :int32, :pointer, :pointer, :pointer, :pointer, :uint32]
192
+ mock(Regress::Lib).attach_function("regress_test_obj_torture_signature_0",
193
+ argtypes, :void) { true }
194
+ GirFFI::Builder.attach_ffi_function(Regress::Lib, info)
195
+ end
196
+ end
197
+
198
+ describe "its #instance_method method" do
199
+ setup do
200
+ end
201
+
202
+ it "is attached with the correct ffi types" do
203
+ info = get_method_introspection_data 'Regress', 'TestObj', 'instance_method'
204
+ mock(Regress::Lib).attach_function("regress_test_obj_instance_method",
205
+ [:pointer], :int32) { true }
206
+ GirFFI::Builder.attach_ffi_function(Regress::Lib, info)
218
207
  end
219
208
  end
220
209
 
@@ -356,30 +345,19 @@ describe GirFFI::Builder do
356
345
  end
357
346
 
358
347
  it "attaches function to Regress::Lib" do
359
- GirFFI::Builder.send :attach_ffi_function, Regress::Lib, @go
348
+ GirFFI::Builder.attach_ffi_function Regress::Lib, @go
360
349
  assert_defines_singleton_method Regress::Lib, :regress_test_array_gint32_in
361
350
  end
362
351
 
363
- it "has :pointer, :pointer as types of the arguments for the attached function" do
364
- assert_equal [:int32, :pointer], GirFFI::Builder.send(:ffi_function_argument_types, @go)
365
- end
366
-
367
- it "has :void as return type for the attached function" do
368
- assert_equal :int32, GirFFI::Builder.send(:ffi_function_return_type, @go)
352
+ it "calls attach_function with the correct types" do
353
+ argtypes = [:int32, :pointer]
354
+ mock(Regress::Lib).attach_function("regress_test_array_gint32_in",
355
+ argtypes, :int32) { true }
356
+ GirFFI::Builder.attach_ffi_function(Regress::Lib, @go)
369
357
  end
370
358
 
371
359
  after do
372
360
  restore_module :Regress
373
361
  end
374
362
  end
375
-
376
- describe "looking at Regress::TestObj#instance_method" do
377
- setup do
378
- @go = get_method_introspection_data 'Regress', 'TestObj', 'instance_method'
379
- end
380
-
381
- it "has :pointer as types of the arguments for the attached function" do
382
- assert_equal [:pointer], GirFFI::Builder.send(:ffi_function_argument_types, @go)
383
- end
384
- end
385
363
  end
@@ -1,53 +1,6 @@
1
1
  require 'gir_ffi_test_helper'
2
- require "gir_ffi/callback_helper"
3
2
 
4
3
  describe GirFFI::CallbackHelper do
5
- describe "::map_single_callback_arg" do
6
- it "maps a :struct type by building the type and wrapping the argument in it" do
7
- cinfo = get_introspection_data 'GObject', 'ClosureMarshal'
8
- ainfo = cinfo.args[0]
9
- ifinfo = ainfo.argument_type.interface
10
-
11
- assert_equal :struct, ifinfo.info_type
12
-
13
- struct_class = Class.new
14
- mock(GirFFI::Builder).build_class(ifinfo) { struct_class }
15
- mock(struct_class).wrap("dummy") { "good-result" }
16
-
17
- r = GirFFI::CallbackHelper.map_single_callback_arg "dummy", ainfo.argument_type
18
-
19
- assert_equal "good-result", r
20
- end
21
-
22
- it "maps an :interface type by calling #to_object on the argument" do
23
- cinfo = get_introspection_data 'Gtk', 'CellLayoutDataFunc'
24
- ainfo = cinfo.args[0]
25
- ifinfo = ainfo.argument_type.interface
26
-
27
- assert_equal :interface, ifinfo.info_type
28
-
29
- mock(ptr = Object.new).to_object { "good-result" }
30
-
31
- r = GirFFI::CallbackHelper.map_single_callback_arg ptr, ainfo.argument_type
32
-
33
- assert_equal "good-result", r
34
- end
35
-
36
- it "maps an :object type by calling #to_object on the argument" do
37
- cinfo = get_introspection_data 'Gtk', 'CellLayoutDataFunc'
38
- ainfo = cinfo.args[1]
39
- ifinfo = ainfo.argument_type.interface
40
-
41
- assert_equal :object, ifinfo.info_type
42
-
43
- mock(ptr = Object.new).to_object { "good-result" }
44
-
45
- r = GirFFI::CallbackHelper.map_single_callback_arg ptr, ainfo.argument_type
46
-
47
- assert_equal "good-result", r
48
- end
49
- end
50
-
51
4
  describe ".store_callback" do
52
5
  it "stores the passed in proc in GirFFI::CallbackHelper::CALLBACKS" do
53
6
  GirFFI::CallbackHelper.store_callback "some-callback"
@@ -0,0 +1,49 @@
1
+ require 'gir_ffi_test_helper'
2
+
3
+ describe GirFFI::Callback do
4
+ describe "::map_single_callback_arg" do
5
+ it "maps a :struct type by building the type and wrapping the argument in it" do
6
+ cinfo = get_introspection_data 'GObject', 'ClosureMarshal'
7
+ ainfo = cinfo.args[0]
8
+ ifinfo = ainfo.argument_type.interface
9
+
10
+ assert_equal :struct, ifinfo.info_type
11
+
12
+ struct_class = Class.new
13
+ mock(GirFFI::Builder).build_class(ifinfo) { struct_class }
14
+ mock(struct_class).wrap("dummy") { "good-result" }
15
+
16
+ r = GirFFI::Callback.map_single_callback_arg "dummy", ainfo.argument_type
17
+
18
+ assert_equal "good-result", r
19
+ end
20
+
21
+ it "maps an :interface type by calling #to_object on the argument" do
22
+ cinfo = get_introspection_data 'Gtk', 'CellLayoutDataFunc'
23
+ ainfo = cinfo.args[0]
24
+ ifinfo = ainfo.argument_type.interface
25
+
26
+ assert_equal :interface, ifinfo.info_type
27
+
28
+ mock(ptr = Object.new).to_object { "good-result" }
29
+
30
+ r = GirFFI::Callback.map_single_callback_arg ptr, ainfo.argument_type
31
+
32
+ assert_equal "good-result", r
33
+ end
34
+
35
+ it "maps an :object type by calling #to_object on the argument" do
36
+ cinfo = get_introspection_data 'Gtk', 'CellLayoutDataFunc'
37
+ ainfo = cinfo.args[1]
38
+ ifinfo = ainfo.argument_type.interface
39
+
40
+ assert_equal :object, ifinfo.info_type
41
+
42
+ mock(ptr = Object.new).to_object { "good-result" }
43
+
44
+ r = GirFFI::Callback.map_single_callback_arg ptr, ainfo.argument_type
45
+
46
+ assert_equal "good-result", r
47
+ end
48
+ end
49
+ end
@@ -9,9 +9,9 @@ describe GirFFI::FunctionBuilder do
9
9
 
10
10
  expected = <<-CODE
11
11
  def self.test_array_fixed_out_objects
12
- _v1 = GirFFI::InOutPointer.for [:c, [:pointer, ::Regress::TestObj]]
12
+ _v1 = GirFFI::InOutPointer.for :c
13
13
  DummyLib.regress_test_array_fixed_out_objects _v1
14
- _v2 = _v1.to_sized_array_value 2
14
+ _v2 = GLib::SizedArray.wrap([:pointer, ::Regress::TestObj], 2, _v1.to_value)
15
15
  return _v2
16
16
  end
17
17
  CODE
@@ -28,7 +28,7 @@ describe GirFFI::FunctionBuilder do
28
28
  def self.test_array_gint16_in ints
29
29
  n_ints = ints.nil? ? 0 : ints.length
30
30
  _v1 = n_ints
31
- _v2 = GirFFI::InPointer.from([:c, :gint16], ints)
31
+ _v2 = GLib::SizedArray.from(:gint16, -1, ints)
32
32
  _v3 = DummyLib.regress_test_array_gint16_in _v1, _v2
33
33
  return _v3
34
34
  end
@@ -97,7 +97,7 @@ describe GirFFI::FunctionBuilder do
97
97
 
98
98
  expected = <<-CODE
99
99
  def self.test_array_int_null_in arr
100
- _v1 = GirFFI::InPointer.from([:c, :gint32], arr)
100
+ _v1 = GLib::SizedArray.from(:gint32, -1, arr)
101
101
  len = arr.nil? ? 0 : arr.length
102
102
  _v2 = len
103
103
  DummyLib.regress_test_array_int_null_in _v1, _v2
@@ -115,11 +115,11 @@ describe GirFFI::FunctionBuilder do
115
115
 
116
116
  expected = <<-CODE
117
117
  def self.test_array_int_null_out
118
- _v1 = GirFFI::InOutPointer.for [:c, :gint32]
118
+ _v1 = GirFFI::InOutPointer.for :c
119
119
  _v2 = GirFFI::InOutPointer.for :gint32
120
120
  DummyLib.regress_test_array_int_null_out _v1, _v2
121
121
  _v3 = _v2.to_value
122
- _v4 = _v1.to_sized_array_value _v3
122
+ _v4 = GLib::SizedArray.wrap(:gint32, _v3, _v1.to_value)
123
123
  return _v4
124
124
  end
125
125
  CODE
@@ -134,12 +134,12 @@ describe GirFFI::FunctionBuilder do
134
134
 
135
135
  expected = <<-CODE
136
136
  def method_array_inout ints
137
- _v1 = GirFFI::InOutPointer.from [:c, :gint32], ints
137
+ _v1 = GirFFI::InOutPointer.from :pointer, GLib::SizedArray.from(:gint32, -1, ints)
138
138
  length = ints.nil? ? 0 : ints.length
139
139
  _v2 = GirFFI::InOutPointer.from :gint32, length
140
140
  DummyLib.gi_marshalling_tests_object_method_array_inout self, _v1, _v2
141
141
  _v3 = _v2.to_value
142
- _v4 = _v1.to_sized_array_value _v3
142
+ _v4 = GLib::SizedArray.wrap(:gint32, _v3, _v1.to_value)
143
143
  return _v4
144
144
  end
145
145
  CODE