gir_ffi 0.9.4 → 0.9.5

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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +11 -0
  3. data/README.md +8 -6
  4. data/TODO.md +3 -0
  5. data/lib/ffi-glib.rb +2 -1
  6. data/lib/ffi-gobject.rb +2 -1
  7. data/lib/ffi-gobject/object.rb +19 -9
  8. data/lib/ffi-gobject/value.rb +15 -3
  9. data/lib/gir_ffi-base.rb +9 -4
  10. data/lib/gir_ffi-base/glib.rb +8 -0
  11. data/lib/gir_ffi-base/glib/boolean.rb +1 -0
  12. data/lib/gir_ffi-base/glib/strv.rb +1 -0
  13. data/lib/gir_ffi-base/gobject.rb +5 -1
  14. data/lib/gir_ffi/boxed_base.rb +12 -0
  15. data/lib/gir_ffi/builder.rb +10 -1
  16. data/lib/gir_ffi/builders/argument_builder.rb +8 -4
  17. data/lib/gir_ffi/builders/base_return_value_builder.rb +38 -0
  18. data/lib/gir_ffi/builders/callback_return_value_builder.rb +2 -30
  19. data/lib/gir_ffi/builders/initializer_return_value_builder.rb +2 -6
  20. data/lib/gir_ffi/builders/module_builder.rb +2 -3
  21. data/lib/gir_ffi/builders/property_argument_builder.rb +23 -0
  22. data/lib/gir_ffi/builders/property_builder.rb +65 -46
  23. data/lib/gir_ffi/builders/property_return_value_builder.rb +14 -0
  24. data/lib/gir_ffi/builders/return_value_builder.rb +9 -33
  25. data/lib/gir_ffi/callback_base.rb +5 -0
  26. data/lib/gir_ffi/core.rb +3 -3
  27. data/lib/gir_ffi/in_pointer.rb +1 -1
  28. data/lib/gir_ffi/info_ext/i_signal_info.rb +2 -3
  29. data/lib/gir_ffi/info_ext/i_type_info.rb +22 -14
  30. data/lib/gir_ffi/interface_base.rb +12 -0
  31. data/lib/gir_ffi/user_defined_type_info.rb +8 -0
  32. data/lib/gir_ffi/version.rb +1 -1
  33. data/test/gir_ffi/builders/function_builder_test.rb +19 -0
  34. data/test/gir_ffi/builders/object_builder_test.rb +5 -11
  35. data/test/gir_ffi/builders/property_builder_test.rb +37 -5
  36. data/test/gir_ffi/builders/signal_closure_builder_test.rb +21 -0
  37. data/test/gir_ffi/builders/vfunc_builder_test.rb +20 -0
  38. data/test/gir_ffi/info_ext/i_type_info_test.rb +18 -0
  39. data/test/gir_ffi/user_defined_type_info_test.rb +25 -0
  40. data/test/gir_ffi_test_helper.rb +2 -6
  41. data/test/integration/generated_gimarshallingtests_test.rb +5 -5
  42. data/test/integration/generated_gio_test.rb +2 -3
  43. data/test/integration/generated_gst_test.rb +1 -0
  44. data/test/integration/generated_regress_test.rb +630 -189
  45. data/test/integration/generated_utility_test.rb +173 -0
  46. data/test/lib/Makefile.am +3 -5
  47. metadata +7 -2
@@ -162,5 +162,26 @@ describe GirFFI::Builders::SignalClosureBuilder do
162
162
  builder.marshaller_definition.must_equal expected
163
163
  end
164
164
  end
165
+
166
+ describe 'for a signal with GList argument' do
167
+ let(:signal_info) do
168
+ get_signal_introspection_data 'Regress', 'AnnotationObject', 'list-signal'
169
+ end
170
+
171
+ it 'returns a valid mapping method' do
172
+ skip unless signal_info
173
+
174
+ expected = <<-CODE.reset_indentation
175
+ def self.marshaller(closure, return_value, param_values, _invocation_hint, _marshal_data)
176
+ _instance, list = param_values.map(&:get_value_plain)
177
+ _v1 = _instance
178
+ _v2 = GLib::List.wrap(:utf8, list)
179
+ wrap(closure.to_ptr).invoke_block(_v1, _v2)
180
+ end
181
+ CODE
182
+
183
+ builder.marshaller_definition.must_equal expected
184
+ end
185
+ end
165
186
  end
166
187
  end
@@ -109,6 +109,26 @@ describe GirFFI::Builders::VFuncBuilder do
109
109
  end
110
110
  end
111
111
 
112
+ describe 'for a vfunc with a GObject::Value out argument allocated by them, the caller' do
113
+ let(:vfunc_info) do
114
+ get_vfunc_introspection_data('GIMarshallingTests', 'Object',
115
+ 'vfunc_caller_allocated_out_parameter')
116
+ end
117
+
118
+ it 'returns a valid mapping method including receiver' do
119
+ expected = <<-CODE.reset_indentation
120
+ def self.call_with_argument_mapping(_proc, _instance, a)
121
+ _v1 = GIMarshallingTests::Object.wrap(_instance)
122
+ _v2 = GirFFI::InOutPointer.new(GObject::Value, a)
123
+ _v3 = _proc.call(_v1)
124
+ _v2.set_value GObject::Value.from(_v3)
125
+ end
126
+ CODE
127
+
128
+ result.must_equal expected
129
+ end
130
+ end
131
+
112
132
  describe 'for a vfunc with an error argument' do
113
133
  let(:vfunc_info) do
114
134
  get_vfunc_introspection_data('GIMarshallingTests', 'Object',
@@ -585,6 +585,15 @@ describe GirFFI::InfoExt::ITypeInfo do
585
585
  end
586
586
  end
587
587
 
588
+ describe 'for :void pointer' do
589
+ let(:tag) { :void }
590
+ let(:pointer?) { true }
591
+
592
+ it 'equals the none type' do
593
+ GObject.type_name(type_info.gtype).must_equal 'gpointer'
594
+ end
595
+ end
596
+
588
597
  describe 'for :gboolean' do
589
598
  let(:tag) { :gboolean }
590
599
  let(:pointer?) { false }
@@ -639,6 +648,15 @@ describe GirFFI::InfoExt::ITypeInfo do
639
648
  end
640
649
  end
641
650
 
651
+ describe 'for pointer to :glist' do
652
+ let(:tag) { :glist }
653
+ let(:pointer?) { true }
654
+
655
+ it 'equals the pointer type' do
656
+ GObject.type_name(type_info.gtype).must_equal 'gpointer'
657
+ end
658
+ end
659
+
642
660
  describe 'for arrays' do
643
661
  let(:tag) { :array }
644
662
  let(:pointer?) { true }
@@ -2,6 +2,8 @@
2
2
  require 'gir_ffi_test_helper'
3
3
  require 'gir_ffi/user_defined_type_info'
4
4
 
5
+ GirFFI.setup :GIMarshallingTests
6
+
5
7
  describe GirFFI::UserDefinedTypeInfo do
6
8
  describe '#described_class' do
7
9
  let(:info) { GirFFI::UserDefinedTypeInfo.new :some_class }
@@ -86,4 +88,27 @@ describe GirFFI::UserDefinedTypeInfo do
86
88
  info.find_method('foo').must_equal nil
87
89
  end
88
90
  end
91
+
92
+ describe '#find_signal' do
93
+ let(:klass) { Object.new }
94
+ let(:info) { GirFFI::UserDefinedTypeInfo.new klass }
95
+
96
+ it 'finds no signals' do
97
+ info.find_signal('foo').must_equal nil
98
+ end
99
+ end
100
+
101
+ describe '#interfaces' do
102
+ let(:modul) { GIMarshallingTests::Interface }
103
+ let(:klass) { Class.new GIMarshallingTests::Object }
104
+ let(:info) { GirFFI::UserDefinedTypeInfo.new klass }
105
+
106
+ before do
107
+ klass.send :include, modul
108
+ end
109
+
110
+ it 'returns the interface infos for the include modules' do
111
+ info.interfaces.must_equal [modul.gir_info]
112
+ end
113
+ end
89
114
  end
@@ -30,12 +30,8 @@ module GirFFITestExtensions
30
30
  SAVED_MODULES.delete name
31
31
  end
32
32
 
33
- def ref_count(object)
34
- GObject::Object::Struct.new(object.to_ptr)[:ref_count]
35
- end
36
-
37
- def ref(object)
38
- object.ref
33
+ def ref_count(ptr)
34
+ GObject::Object::Struct.new(ptr)[:ref_count]
39
35
  end
40
36
 
41
37
  def max_for_unsigned_type(type)
@@ -298,12 +298,12 @@ describe GIMarshallingTests do
298
298
 
299
299
  it 'has a working function #full_inout' do
300
300
  ob = GIMarshallingTests::Object.new 42
301
- ref_count(ob).must_equal 1
301
+ ob.ref_count.must_equal 1
302
302
 
303
303
  res = GIMarshallingTests::Object.full_inout ob
304
304
 
305
- ref_count(ob).must_be :>, 0
306
- ref_count(res).must_equal 1
305
+ ob.ref_count.must_be :>, 0
306
+ res.ref_count.must_equal 1
307
307
 
308
308
  res.must_be_instance_of GIMarshallingTests::Object
309
309
  res.int.must_equal 0
@@ -400,7 +400,7 @@ describe GIMarshallingTests do
400
400
  end
401
401
  result = derived_instance.
402
402
  get_ref_info_for_vfunc_in_object_transfer_none GIMarshallingTests::Object.gtype
403
- ref_count(obj).must_be :>, 0
403
+ obj.ref_count.must_be :>, 0
404
404
  result.must_equal [2, false]
405
405
  obj.must_be_instance_of GIMarshallingTests::Object
406
406
  end
@@ -415,7 +415,7 @@ describe GIMarshallingTests do
415
415
  }
416
416
  end
417
417
  result = derived_instance.get_ref_info_for_vfunc_out_object_transfer_full
418
- ref_count(obj).must_be :>, 0
418
+ obj.ref_count.must_be :>, 0
419
419
  # TODO: Check desired result
420
420
  result.must_equal [2, false]
421
421
  end
@@ -5,10 +5,9 @@ GirFFI.setup :Gio
5
5
 
6
6
  # Tests generated methods and functions in the Gio namespace.
7
7
  describe 'The generated Gio module' do
8
- # TODO: Allow Gio::File.new_for_path
9
- describe '#file_new_for_path, a method returning an interface,' do
8
+ describe 'File#new_for_path, a method returning an interface,' do
10
9
  it 'returns an object of a more specific class' do
11
- file = Gio.file_new_for_path('/')
10
+ file = Gio::File.new_for_path('/')
12
11
  refute_instance_of Gio::File, file
13
12
  assert_includes file.class.ancestors, Gio::File
14
13
  end
@@ -25,6 +25,7 @@ describe 'the generated Gst module' do
25
25
  let(:instance) { Gst::ElementFactory.make('autoaudiosink', 'audiosink') }
26
26
 
27
27
  it 'correctly fetches the name' do
28
+ skip 'Audio sink was not created' unless instance
28
29
  instance.get_name.must_equal 'audiosink'
29
30
  instance.name.must_equal 'audiosink'
30
31
  end
@@ -65,11 +65,11 @@ describe Regress do
65
65
  end
66
66
 
67
67
  it 'has a writable field a' do
68
- skip 'Not implemented yet'
68
+ skip 'Anonymous union fields are not exposed in the GIR data'
69
69
  end
70
70
 
71
71
  it 'has a writable field padding' do
72
- skip 'Not implemented yet'
72
+ skip 'Anonymous union fields are not exposed in the GIR data'
73
73
  end
74
74
  end
75
75
 
@@ -113,153 +113,287 @@ describe Regress do
113
113
  end
114
114
 
115
115
  describe 'Regress::AnnotationObject' do
116
+ let(:instance) { Regress::AnnotationObject.new }
117
+
118
+ it 'has an attribute org.example.Test' do
119
+ info = get_introspection_data('Regress', 'AnnotationObject')
120
+ info.attribute('org.example.Test').must_equal 'cows'
121
+ end
122
+
116
123
  it 'has a working method #allow_none' do
117
- skip 'Needs testing'
124
+ instance.allow_none('hello!').must_be_nil
125
+ instance.allow_none(nil).must_be_nil
126
+ instance.allow_none.must_be_nil
118
127
  end
128
+
119
129
  it 'has a working method #calleeowns' do
120
- skip 'Needs testing'
130
+ result, object = instance.calleeowns
131
+ result.must_equal 1
132
+ object.must_be_nil
121
133
  end
134
+
122
135
  it 'has a working method #calleesowns' do
123
- skip 'Needs testing'
136
+ result, toown1, toown2 = instance.calleesowns
137
+ result.must_equal 1
138
+ toown1.must_be_nil
139
+ toown2.must_be_nil
124
140
  end
141
+
125
142
  it 'has a working method #compute_sum' do
126
- skip 'Needs testing'
143
+ instance.compute_sum [1, 2, 3]
144
+ pass
127
145
  end
146
+
128
147
  it 'has a working method #compute_sum_n' do
129
- skip 'Needs testing'
148
+ instance.compute_sum_n [1, 2, 3]
149
+ pass
130
150
  end
151
+
131
152
  it 'has a working method #compute_sum_nz' do
132
- skip 'Needs testing'
153
+ instance.compute_sum_nz [1, 2, 3]
154
+ pass
133
155
  end
156
+
134
157
  it 'has a working method #create_object' do
135
- skip 'Needs testing'
158
+ result = instance.create_object
159
+ result.must_equal instance
136
160
  end
161
+
137
162
  it 'has a working method #do_not_use' do
138
- skip 'Needs testing'
163
+ # TODO: Handle deprecation
164
+ instance.do_not_use.must_be_nil
139
165
  end
166
+
140
167
  it 'has a working method #extra_annos' do
141
- skip 'Needs testing'
168
+ info = get_method_introspection_data('Regress', 'AnnotationObject', 'extra_annos')
169
+ info.attribute('org.foobar').must_equal 'testvalue'
170
+
171
+ instance.extra_annos.must_be_nil
142
172
  end
173
+
143
174
  it 'has a working method #foreach' do
144
- skip 'Needs testing'
175
+ a = 1
176
+ instance.foreach { a += 1 }
177
+ a.must_equal 1
145
178
  end
179
+
146
180
  it 'has a working method #get_hash' do
147
- skip 'Needs testing'
181
+ result = instance.get_hash
182
+ hash = result.to_hash
183
+ hash['one'].must_equal instance
184
+ hash['two'].must_equal instance
148
185
  end
186
+
149
187
  it 'has a working method #get_objects' do
150
- skip 'Needs testing'
188
+ list = instance.get_objects
189
+ list.to_a.must_equal [instance]
151
190
  end
191
+
152
192
  it 'has a working method #get_strings' do
153
- skip 'Needs testing'
193
+ list = instance.get_strings
194
+ list.to_a.must_equal %w(bar regress_annotation)
154
195
  end
196
+
155
197
  it 'has a working method #hidden_self' do
156
- skip 'Needs testing'
198
+ instance.hidden_self.must_be_nil
157
199
  end
200
+
158
201
  it 'has a working method #in' do
159
- skip 'Needs testing'
202
+ # TODO: Automatically convert to pointer argument
203
+ ptr = FFI::MemoryPointer.new(:int, 1)
204
+ ptr.put_int 0, 2342
205
+ instance.in(ptr).must_equal 2342
160
206
  end
207
+
161
208
  it 'has a working method #inout' do
162
- skip 'Needs testing'
209
+ instance.inout(2342).must_equal [2343, 2343]
163
210
  end
211
+
164
212
  it 'has a working method #inout2' do
165
- skip 'Needs testing'
213
+ instance.inout2(2342).must_equal [2343, 2343]
166
214
  end
215
+
167
216
  it 'has a working method #inout3' do
168
- skip 'Needs testing'
217
+ instance.inout3(2342).must_equal [2343, 2342]
169
218
  end
219
+
170
220
  it 'has a working method #method' do
171
- skip 'Needs testing'
221
+ instance.method.must_equal 1
172
222
  end
223
+
173
224
  it 'has a working method #notrans' do
174
- skip 'Needs testing'
225
+ instance.notrans.must_be_nil
175
226
  end
227
+
176
228
  it 'has a working method #out' do
177
- skip 'Needs testing'
229
+ instance.out.must_equal [1, 2]
178
230
  end
231
+
179
232
  it 'has a working method #parse_args' do
180
- skip 'Needs testing'
233
+ instance.parse_args(%w(one two)).to_a.must_equal %w(one two)
181
234
  end
235
+
182
236
  it 'has a working method #set_data' do
183
- skip 'Needs testing'
237
+ # TODO: Explicitely allow or deny passing a string here.
238
+ instance.set_data([1, 2, 3]).must_be_nil
184
239
  end
240
+
185
241
  it 'has a working method #set_data2' do
186
- skip 'Needs testing'
242
+ instance.set_data2([1, -2, 3]).must_be_nil
187
243
  end
244
+
188
245
  it 'has a working method #set_data3' do
189
- skip 'Needs testing'
246
+ instance.set_data3([1, 2, 3]).must_be_nil
190
247
  end
248
+
191
249
  it 'has a working method #string_out' do
192
- skip 'Needs testing'
250
+ instance.string_out.must_equal [false, nil]
193
251
  end
252
+
194
253
  it 'has a working method #use_buffer' do
195
- skip 'Needs testing'
254
+ skip 'Ingoing pointer argument conversion is not implemented yet'
255
+ instance.use_buffer(FFI::MemoryPointer.new(:void, 1)).must_be_nil
196
256
  end
257
+
197
258
  it 'has a working method #watch_full' do
198
- skip 'Needs testing'
259
+ instance.watch {}
199
260
  end
261
+
200
262
  it 'has a working method #with_voidp' do
201
- skip 'Needs testing'
263
+ # NOTE: Anything implementing #to_ptr could be passed in here
264
+ obj = Regress::AnnotationObject.new
265
+ instance.with_voidp(obj).must_be_nil
202
266
  end
267
+
203
268
  describe "its 'function-property' property" do
204
- it 'can be retrieved with #get_property' do
205
- skip 'Needs testing'
269
+ it 'can be retrieved with #get_property_extended' do
270
+ instance.get_property_extended('function-property').must_be_nil
206
271
  end
272
+
207
273
  it 'can be retrieved with #function_property' do
208
- skip 'Needs testing'
274
+ instance.function_property.must_be_nil
209
275
  end
210
- it 'can be set with #set_property' do
211
- skip 'Needs testing'
276
+
277
+ it 'can be set with #set_property_extended' do
278
+ instance.set_property_extended('function-property', proc {})
279
+ # AnnotationObject doesn't actually store stuff
280
+ instance.function_property.must_be_nil
212
281
  end
282
+
213
283
  it 'can be set with #function_property=' do
214
- skip 'Needs testing'
284
+ instance.function_property = proc {}
285
+ # AnnotationObject doesn't actually store stuff
286
+ instance.get_property_extended('function-property').must_be_nil
215
287
  end
216
288
  end
289
+
217
290
  describe "its 'string-property' property" do
218
291
  it 'can be retrieved with #get_property' do
219
- skip 'Needs testing'
292
+ instance.get_property('string-property').must_be_nil
220
293
  end
294
+
221
295
  it 'can be retrieved with #string_property' do
222
- skip 'Needs testing'
296
+ instance.string_property.must_be_nil
223
297
  end
298
+
224
299
  it 'can be set with #set_property' do
225
- skip 'Needs testing'
300
+ instance.set_property('string-property', 'hello 42')
301
+ # AnnotationObject doesn't actually store stuff
302
+ instance.string_property.must_be_nil
226
303
  end
304
+
227
305
  it 'can be set with #string_property=' do
228
- skip 'Needs testing'
306
+ instance.string_property = 'hello 42'
307
+ # AnnotationObject doesn't actually store stuff
308
+ instance.get_property('string-property').must_be_nil
229
309
  end
230
310
  end
311
+
231
312
  describe "its 'tab-property' property" do
232
313
  it 'can be retrieved with #get_property' do
233
- skip 'Needs testing'
314
+ instance.get_property('tab-property').must_be_nil
234
315
  end
316
+
235
317
  it 'can be retrieved with #tab_property' do
236
- skip 'Needs testing'
318
+ instance.tab_property.must_be_nil
237
319
  end
320
+
238
321
  it 'can be set with #set_property' do
239
- skip 'Needs testing'
322
+ instance.set_property('tab-property', 'hello 42')
323
+ # AnnotationObject doesn't actually store stuff
324
+ instance.tab_property.must_be_nil
240
325
  end
326
+
241
327
  it 'can be set with #tab_property=' do
242
- skip 'Needs testing'
328
+ instance.tab_property = 'hello 42'
329
+ # AnnotationObject doesn't actually store stuff
330
+ instance.get_property('tab-property').must_be_nil
243
331
  end
244
332
  end
333
+
245
334
  it "handles the 'attribute-signal' signal" do
246
- skip 'Needs testing'
335
+ signal_info = get_signal_introspection_data('Regress',
336
+ 'AnnotationObject',
337
+ 'attribute-signal')
338
+ argument_infos = signal_info.args
339
+ argument_infos.first.attribute('some.annotation.foo1').must_equal 'val1'
340
+ argument_infos.last.attribute('some.annotation.foo2').must_equal 'val2'
341
+
342
+ result = nil
343
+ instance.signal_connect 'attribute-signal' do |_obj, _arg1, _arg2, _user_data|
344
+ # This signal uses a null marshaller, so the return value is never passed on.
345
+ result = 'hello'
346
+ end
347
+
348
+ GObject.signal_emit instance, 'attribute-signal', 'foo', 'bar'
349
+ result.must_equal 'hello'
247
350
  end
351
+
248
352
  it "handles the 'doc-empty-arg-parsing' signal" do
249
- skip 'Needs testing'
353
+ test = nil
354
+ instance.signal_connect 'doc-empty-arg-parsing' do |_obj, arg1, _user_data|
355
+ test = arg1
356
+ end
357
+
358
+ result = GObject.signal_emit instance, 'doc-empty-arg-parsing', FFI::Pointer.new(123)
359
+ result.must_be_nil
360
+ test.address.must_equal 123
250
361
  end
362
+
251
363
  it "handles the 'list-signal' signal" do
252
- skip 'Needs testing'
364
+ result = nil
365
+ instance.signal_connect 'list-signal' do |_obj, list, _user_data|
366
+ result = list
367
+ end
368
+
369
+ # TODO: Automatically convert to GLib::List
370
+ GObject.signal_emit instance, 'list-signal', GLib::List.from(:utf8, %w(foo bar))
371
+ result.to_a.must_equal %w(foo bar)
253
372
  end
373
+
254
374
  it "handles the 'string-signal' signal" do
255
- skip 'Needs testing'
375
+ result = nil
376
+ instance.signal_connect 'string-signal' do |_obj, string, _user_data|
377
+ result = string
378
+ end
379
+
380
+ GObject.signal_emit instance, 'string-signal', 'foo'
381
+ result.must_equal 'foo'
256
382
  end
257
383
  end
384
+
258
385
  describe 'Regress::AnnotationStruct' do
386
+ let(:instance) { Regress::AnnotationStruct.new }
387
+
259
388
  it 'has a writable field objects' do
260
- skip 'Needs testing'
389
+ instance.objects.to_a.must_equal [nil] * 10
390
+
391
+ obj = Regress::AnnotationObject.new
392
+ instance.objects = [nil] * 5 + [obj] + [nil] * 4
393
+ instance.objects.to_a[5].must_equal obj
261
394
  end
262
395
  end
396
+
263
397
  it 'has the constant BOOL_CONSTANT' do
264
398
  skip unless get_introspection_data 'Regress', 'BOOL_CONSTANT'
265
399
  Regress::BOOL_CONSTANT.must_equal true
@@ -270,355 +404,615 @@ describe Regress do
270
404
  end
271
405
 
272
406
  it 'has the constant FOO_DEFINE_SHOULD_BE_EXPOSED' do
273
- skip 'Needs testing'
407
+ Regress::FOO_DEFINE_SHOULD_BE_EXPOSED.must_equal 'should be exposed'
274
408
  end
409
+
275
410
  it 'has the constant FOO_PIE_IS_TASTY' do
276
- skip 'Needs testing'
411
+ Regress::FOO_PIE_IS_TASTY.must_equal 3.141590
277
412
  end
413
+
278
414
  it 'has the constant FOO_SUCCESS_INT' do
279
- skip 'Needs testing'
415
+ Regress::FOO_SUCCESS_INT.must_equal 4408
280
416
  end
417
+
281
418
  describe 'Regress::FooASingle' do
282
419
  it 'has the member :foo_some_single_enum' do
283
- skip 'Needs testing'
420
+ Regress::FooASingle[:foo_some_single_enum].must_equal 0
284
421
  end
285
422
  end
423
+
286
424
  describe 'Regress::FooAddressType' do
287
425
  it 'has the member :invalid' do
288
- skip 'Needs testing'
426
+ Regress::FooAddressType[:invalid].must_equal 0
289
427
  end
428
+
290
429
  it 'has the member :ipv4' do
291
- skip 'Needs testing'
430
+ Regress::FooAddressType[:ipv4].must_equal 1
292
431
  end
432
+
293
433
  it 'has the member :ipv6' do
294
- skip 'Needs testing'
434
+ Regress::FooAddressType[:ipv6].must_equal 2
295
435
  end
296
436
  end
437
+
297
438
  describe 'Regress::FooBRect' do
439
+ let(:instance) { Regress::FooBRect.wrap(Regress::FooBRect::Struct.new.to_ptr) }
440
+
298
441
  it 'has a writable field x' do
299
- skip 'Needs testing'
442
+ instance.x.must_equal 0.0
443
+ instance.x = 23.42
444
+ instance.x.must_equal 23.42
300
445
  end
446
+
301
447
  it 'has a writable field y' do
302
- skip 'Needs testing'
448
+ instance.y.must_equal 0.0
449
+ instance.y = 23.42
450
+ instance.y.must_equal 23.42
303
451
  end
452
+
304
453
  it 'creates an instance using #new' do
305
- skip 'Needs testing'
454
+ skip 'This function is defined in the header but not implemented'
306
455
  end
456
+
307
457
  it 'has a working method #add' do
308
- skip 'Needs testing'
458
+ skip 'This function is defined in the header but not implemented'
309
459
  end
310
460
  end
461
+
311
462
  describe 'Regress::FooBUnion' do
463
+ let(:instance) { Regress::FooBUnion.wrap(Regress::FooBUnion::Struct.new.to_ptr) }
464
+
312
465
  it 'has a writable field type' do
313
- skip 'Needs testing'
466
+ instance.type.must_equal 0
467
+ instance.type = 42
468
+ instance.type.must_equal 42
314
469
  end
470
+
315
471
  it 'has a writable field v' do
316
- skip 'Needs testing'
472
+ instance.v.must_equal 0.0
473
+ instance.v = 23.42
474
+ instance.v.must_equal 23.42
317
475
  end
476
+
318
477
  it 'has a writable field rect' do
319
- skip 'Needs testing'
478
+ instance.rect.must_be_nil
479
+ rect = Regress::FooBRect.wrap(Regress::FooBRect::Struct.new.to_ptr)
480
+ rect.x = 42
481
+ rect.y = 23
482
+ instance.rect = rect
483
+ instance.rect.x.must_equal 42.0
484
+ instance.rect.y.must_equal 23.0
320
485
  end
486
+
321
487
  it 'creates an instance using #new' do
322
- skip 'Needs testing'
488
+ skip 'This function is defined in the header but not implemented'
323
489
  end
490
+
324
491
  it 'has a working method #get_contained_type' do
325
- skip 'Needs testing'
492
+ skip 'This function is defined in the header but not implemented'
326
493
  end
327
494
  end
495
+
328
496
  describe 'Regress::FooBoxed' do
497
+ let(:instance) { Regress::FooBoxed.new }
498
+
329
499
  it 'creates an instance using #new' do
330
- skip 'Needs testing'
500
+ instance.must_be_instance_of Regress::FooBoxed
331
501
  end
502
+
332
503
  it 'has a working method #method' do
333
- skip 'Needs testing'
504
+ instance.method.must_be_nil
334
505
  end
335
506
  end
507
+
336
508
  describe 'Regress::FooBuffer' do
509
+ let(:instance) { Regress::FooBuffer.new }
510
+
511
+ it 'creates an instance using #new' do
512
+ instance.must_be_instance_of Regress::FooBuffer
513
+ end
514
+
337
515
  it 'has a working method #some_method' do
338
- skip 'Needs testing'
516
+ instance.some_method.must_be_nil
339
517
  end
340
518
  end
519
+
341
520
  describe 'Regress::FooDBusData' do
521
+ let(:instance) { Regress::FooDBusData.new }
522
+
523
+ it 'creates an instance using #new' do
524
+ instance.must_be_instance_of Regress::FooDBusData
525
+ end
526
+
342
527
  it 'has a working method #method' do
343
- skip 'Needs testing'
528
+ skip 'This function is defined in the header but not implemented'
344
529
  end
345
530
  end
531
+
346
532
  describe 'Regress::FooEnumFullname' do
347
533
  it 'has the member :one' do
348
- skip 'Needs testing'
534
+ Regress::FooEnumFullname[:one].must_equal 1
349
535
  end
536
+
350
537
  it 'has the member :two' do
351
- skip 'Needs testing'
538
+ Regress::FooEnumFullname[:two].must_equal 2
352
539
  end
540
+
353
541
  it 'has the member :three' do
354
- skip 'Needs testing'
542
+ Regress::FooEnumFullname[:three].must_equal 3
355
543
  end
356
544
  end
545
+
357
546
  describe 'Regress::FooEnumNoType' do
358
547
  it 'has the member :un' do
359
- skip 'Needs testing'
548
+ Regress::FooEnumNoType[:un].must_equal 1
360
549
  end
550
+
361
551
  it 'has the member :deux' do
362
- skip 'Needs testing'
552
+ Regress::FooEnumNoType[:deux].must_equal 2
363
553
  end
554
+
364
555
  it 'has the member :trois' do
365
- skip 'Needs testing'
556
+ Regress::FooEnumNoType[:trois].must_equal 3
366
557
  end
558
+
367
559
  it 'has the member :neuf' do
368
- skip 'Needs testing'
560
+ Regress::FooEnumNoType[:neuf].must_equal 9
369
561
  end
370
562
  end
563
+
371
564
  describe 'Regress::FooEnumType' do
372
565
  it 'has the member :alpha' do
373
- skip 'Needs testing'
566
+ Regress::FooEnumType[:alpha].must_equal 0
374
567
  end
568
+
375
569
  it 'has the member :beta' do
376
- skip 'Needs testing'
570
+ Regress::FooEnumType[:beta].must_equal 1
377
571
  end
572
+
378
573
  it 'has the member :delta' do
379
- skip 'Needs testing'
574
+ Regress::FooEnumType[:delta].must_equal 2
380
575
  end
576
+
381
577
  it 'has a working function #method' do
382
- skip 'Needs testing'
578
+ skip 'This function is defined in the header but not implemented'
383
579
  end
580
+
384
581
  it 'has a working function #returnv' do
385
- skip 'Needs testing'
582
+ skip 'This function is defined in the header but not implemented'
386
583
  end
387
584
  end
585
+
388
586
  describe 'Regress::FooError' do
389
587
  it 'has the member :good' do
390
- skip 'Needs testing'
588
+ Regress::FooError[:good].must_equal 0
391
589
  end
590
+
392
591
  it 'has the member :bad' do
393
- skip 'Needs testing'
592
+ Regress::FooError[:bad].must_equal 1
394
593
  end
594
+
395
595
  it 'has the member :ugly' do
396
- skip 'Needs testing'
596
+ Regress::FooError[:ugly].must_equal 2
397
597
  end
598
+
398
599
  it 'has a working function #quark' do
399
- skip 'Needs testing'
600
+ quark = Regress::FooError.quark
601
+ GLib.quark_to_string(quark).must_equal 'regress_foo-error-quark'
400
602
  end
401
603
  end
604
+
402
605
  describe 'Regress::FooEvent' do
606
+ let(:instance) { Regress::FooEvent.new }
607
+
403
608
  it 'has a writable field type' do
404
- skip 'Needs testing'
609
+ instance.type.must_equal 0
610
+ instance.type = 23
611
+ instance.type.must_equal 23
405
612
  end
613
+
406
614
  it 'has a writable field any' do
407
- skip 'Needs testing'
615
+ instance.any.send_event.must_equal 0
616
+ any = Regress::FooEventAny.new
617
+ any.send_event = 42
618
+ instance.any = any
619
+ instance.any.send_event.must_equal 42
408
620
  end
621
+
409
622
  it 'has a writable field expose' do
410
- skip 'Needs testing'
623
+ instance.expose.send_event.must_equal 0
624
+ instance.expose.count.must_equal 0
625
+ expose = Regress::FooEventExpose.new
626
+ expose.send_event = 23
627
+ expose.count = 14
628
+ instance.expose = expose
629
+ instance.expose.send_event.must_equal 23
630
+ instance.expose.count.must_equal 14
411
631
  end
412
632
  end
633
+
413
634
  describe 'Regress::FooEventAny' do
635
+ let(:instance) { Regress::FooEventAny.new }
636
+
414
637
  it 'has a writable field send_event' do
415
- skip 'Needs testing'
638
+ instance.send_event.must_equal 0
639
+ instance.send_event = 23
640
+ instance.send_event.must_equal 23
416
641
  end
417
642
  end
643
+
418
644
  describe 'Regress::FooEventExpose' do
645
+ let(:instance) { Regress::FooEventExpose.new }
646
+
419
647
  it 'has a writable field send_event' do
420
- skip 'Needs testing'
648
+ instance.send_event.must_equal 0
649
+ instance.send_event = 23
650
+ instance.send_event.must_equal 23
421
651
  end
652
+
422
653
  it 'has a writable field count' do
423
- skip 'Needs testing'
654
+ instance.count.must_equal 0
655
+ instance.count = 42
656
+ instance.count.must_equal 42
424
657
  end
425
658
  end
659
+
426
660
  describe 'Regress::FooFlagsNoType' do
427
661
  it 'has the member :ett' do
428
- skip 'Needs testing'
662
+ Regress::FooFlagsNoType[:ett].must_equal 1
429
663
  end
664
+
430
665
  it 'has the member :tva' do
431
- skip 'Needs testing'
666
+ Regress::FooFlagsNoType[:tva].must_equal 2
432
667
  end
668
+
433
669
  it 'has the member :fyra' do
434
- skip 'Needs testing'
670
+ Regress::FooFlagsNoType[:fyra].must_equal 4
435
671
  end
436
672
  end
673
+
437
674
  describe 'Regress::FooFlagsType' do
438
675
  it 'has the member :first' do
439
- skip 'Needs testing'
676
+ Regress::FooFlagsType[:first].must_equal 1
440
677
  end
678
+
441
679
  it 'has the member :second' do
442
- skip 'Needs testing'
680
+ Regress::FooFlagsType[:second].must_equal 2
443
681
  end
682
+
444
683
  it 'has the member :third' do
445
- skip 'Needs testing'
684
+ Regress::FooFlagsType[:third].must_equal 4
446
685
  end
447
686
  end
687
+
448
688
  describe 'Regress::FooForeignStruct' do
689
+ let(:instance) { Regress::FooForeignStruct.new }
690
+
449
691
  it 'has a writable field regress_foo' do
450
- skip 'Needs testing'
692
+ instance.regress_foo.must_equal 0
693
+ instance.regress_foo = 143
694
+ instance.regress_foo.must_equal 143
451
695
  end
696
+
452
697
  it 'creates an instance using #new' do
453
- skip 'Needs testing'
698
+ instance.must_be_instance_of Regress::FooForeignStruct
454
699
  end
700
+
455
701
  it 'has a working method #copy' do
456
- skip 'Needs testing'
702
+ instance.regress_foo = 585
703
+ result = instance.copy
704
+ instance.regress_foo = 0
705
+ result.regress_foo.must_equal 585
457
706
  end
458
707
  end
708
+
459
709
  describe 'Regress::FooInterface' do
460
710
  it 'has a working function #static_method' do
461
- skip 'Needs testing'
711
+ Regress::FooInterface.static_method(42).must_be_nil
462
712
  end
713
+
463
714
  it 'has a working method #do_regress_foo' do
464
- skip 'Needs testing'
715
+ instance = Regress::FooObject.new
716
+ instance.must_be_kind_of Regress::FooInterface
717
+ instance.do_regress_foo(42).must_be_nil
465
718
  end
466
719
  end
720
+
467
721
  describe 'Regress::FooObject' do
722
+ let(:instance) { Regress::FooObject.new }
723
+
468
724
  it 'creates an instance using #new' do
469
- skip 'Needs testing'
725
+ instance.must_be_instance_of Regress::FooObject
470
726
  end
727
+
471
728
  it 'creates an instance using #new_as_super' do
472
- skip 'Needs testing'
729
+ other_instance = Regress::FooObject.new_as_super
730
+ other_instance.must_be_instance_of Regress::FooObject
473
731
  end
732
+
474
733
  it 'has a working function #a_global_method' do
475
- skip 'Needs testing'
734
+ skip 'This function is defined in the header but not implemented'
476
735
  end
736
+
477
737
  it 'has a working function #get_default' do
478
- skip 'Needs testing'
738
+ Regress::FooObject.get_default.must_be_nil
479
739
  end
740
+
480
741
  it 'has a working function #static_meth' do
481
- skip 'Needs testing'
742
+ skip 'This function is defined in the header but not implemented'
482
743
  end
744
+
483
745
  it 'has a working method #append_new_stack_layer' do
484
- skip 'Needs testing'
746
+ instance.append_new_stack_layer(42).must_be_nil
485
747
  end
748
+
486
749
  it 'has a working method #dup_name' do
487
- skip 'Needs testing'
750
+ instance.dup_name.must_equal 'regress_foo'
488
751
  end
752
+
489
753
  it 'has a working method #external_type' do
490
- skip 'Needs testing'
754
+ result = instance.external_type
755
+ result.must_be_nil
491
756
  end
757
+
492
758
  it 'has a working method #get_name' do
493
- skip 'Needs testing'
759
+ instance.get_name.must_equal 'regress_foo'
494
760
  end
761
+
495
762
  it 'has a working method #handle_glyph' do
496
- skip 'Needs testing'
763
+ skip 'This function is defined in the header but not implemented'
497
764
  end
765
+
498
766
  it 'has a working method #is_it_time_yet' do
499
- skip 'Needs testing'
767
+ instance.is_it_time_yet(Time.now.to_i).must_be_nil
500
768
  end
769
+
501
770
  it 'has a working method #read' do
502
- skip 'Needs testing'
771
+ instance.read(12, 13).must_be_nil
503
772
  end
773
+
504
774
  it 'has a working method #various' do
505
- skip 'Needs testing'
775
+ skip 'This function is defined in the header but not implemented'
506
776
  end
777
+
507
778
  it 'has a working method #virtual_method' do
508
- skip 'Needs testing'
779
+ skip 'This function is defined in the header but not implemented'
509
780
  end
781
+
510
782
  describe "its 'string' property" do
511
783
  it 'can be retrieved with #get_property' do
512
- skip 'Needs testing'
784
+ instance.get_property('string').must_equal nil
513
785
  end
786
+
514
787
  it 'can be retrieved with #string' do
515
- skip 'Needs testing'
788
+ instance.string.must_equal nil
516
789
  end
790
+
517
791
  it 'can be set with #set_property' do
518
- skip 'Needs testing'
792
+ instance.set_property 'string', 'hello 42'
793
+ # FooObject doesn't actually store stuff
794
+ instance.string.must_be_nil
795
+ instance.get_property('string').must_be_nil
519
796
  end
797
+
520
798
  it 'can be set with #string=' do
521
- skip 'Needs testing'
799
+ instance.string = 'hello 42'
800
+ # FooObject doesn't actually store stuff
801
+ instance.string.must_be_nil
802
+ instance.get_property('string').must_be_nil
522
803
  end
523
804
  end
805
+
524
806
  it "handles the 'signal' signal" do
807
+ instance.signal_connect 'signal' do
808
+ 'hello'
809
+ end
810
+
811
+ result = GObject.signal_emit instance, 'signal'
812
+ result.must_equal 'hello'
525
813
  end
526
814
  end
815
+
527
816
  describe 'Regress::FooOtherObject' do
817
+ it 'is derived from GObject::Object' do
818
+ Regress::FooOtherObject.superclass.must_equal GObject::Object
819
+ end
528
820
  end
821
+
529
822
  describe 'Regress::FooRectangle' do
823
+ let(:instance) { Regress::FooRectangle.new }
824
+
530
825
  it 'has a writable field x' do
531
- skip 'Needs testing'
826
+ instance.x.must_equal 0
827
+ instance.x = 23
828
+ instance.x.must_equal 23
532
829
  end
830
+
533
831
  it 'has a writable field y' do
534
- skip 'Needs testing'
832
+ instance.y.must_equal 0
833
+ instance.y = 23
834
+ instance.y.must_equal 23
535
835
  end
836
+
536
837
  it 'has a writable field width' do
537
- skip 'Needs testing'
838
+ instance.width.must_equal 0
839
+ instance.width = 23
840
+ instance.width.must_equal 23
538
841
  end
842
+
539
843
  it 'has a writable field height' do
540
- skip 'Needs testing'
844
+ instance.height.must_equal 0
845
+ instance.height = 23
846
+ instance.height.must_equal 23
541
847
  end
848
+
542
849
  it 'has a working method #add' do
543
- skip 'Needs testing'
850
+ skip 'Not implemented yet'
851
+ other_instance = Regress::FooRectangle.new
852
+ instance.add other_instance
544
853
  end
545
854
  end
855
+
546
856
  describe 'Regress::FooStackLayer' do
547
857
  it 'has the member :desktop' do
548
- skip 'Needs testing'
858
+ Regress::FooStackLayer[:desktop].must_equal 0
549
859
  end
860
+
550
861
  it 'has the member :bottom' do
551
- skip 'Needs testing'
862
+ Regress::FooStackLayer[:bottom].must_equal 1
552
863
  end
864
+
553
865
  it 'has the member :normal' do
554
- skip 'Needs testing'
866
+ Regress::FooStackLayer[:normal].must_equal 2
555
867
  end
868
+
556
869
  it 'has the member :top' do
557
- skip 'Needs testing'
870
+ Regress::FooStackLayer[:top].must_equal 4
558
871
  end
872
+
559
873
  it 'has the member :dock' do
560
- skip 'Needs testing'
874
+ Regress::FooStackLayer[:dock].must_equal 4
561
875
  end
876
+
562
877
  it 'has the member :fullscreen' do
563
- skip 'Needs testing'
878
+ Regress::FooStackLayer[:fullscreen].must_equal 5
564
879
  end
880
+
565
881
  it 'has the member :focused_window' do
566
- skip 'Needs testing'
882
+ Regress::FooStackLayer[:focused_window].must_equal 6
567
883
  end
884
+
568
885
  it 'has the member :override_redirect' do
569
- skip 'Needs testing'
886
+ Regress::FooStackLayer[:override_redirect].must_equal 7
570
887
  end
888
+
571
889
  it 'has the member :last' do
572
- skip 'Needs testing'
890
+ Regress::FooStackLayer[:last].must_equal 8
573
891
  end
574
892
  end
893
+
575
894
  describe 'Regress::FooStruct' do
895
+ let(:instance) { Regress::FooStruct.new }
896
+
576
897
  it 'has a writable field priv' do
577
- skip 'Needs testing'
898
+ instance.priv.must_be_nil
899
+ struct = Regress::FooStructPrivate.new
900
+ instance.priv = struct
901
+ instance.priv.must_equal struct
578
902
  end
903
+
579
904
  it 'has a writable field member' do
580
- skip 'Needs testing'
905
+ instance.member.must_equal 0
906
+ instance.member = 23
907
+ instance.member.must_equal 23
581
908
  end
582
909
  end
910
+
583
911
  describe 'Regress::FooSubInterface' do
912
+ let(:derived_klass) do
913
+ Object.const_set("DerivedClass#{Sequence.next}",
914
+ Class.new(Regress::FooObject))
915
+ end
916
+
917
+ def make_derived_instance
918
+ derived_klass.send :include, Regress::FooSubInterface
919
+ GirFFI.define_type derived_klass do |info|
920
+ yield info if block_given?
921
+ end
922
+ derived_klass.new
923
+ end
924
+
584
925
  it 'has a working method #do_bar' do
585
- skip 'Needs testing'
926
+ result = nil
927
+ instance = make_derived_instance do |info|
928
+ info.install_vfunc_implementation :do_bar, proc { |obj| result = obj.get_name }
929
+ end
930
+ instance.do_bar
931
+ result.must_equal 'regress_foo'
586
932
  end
933
+
587
934
  it 'has a working method #do_baz' do
588
- skip 'Needs testing'
935
+ a = nil
936
+ instance = make_derived_instance do |info|
937
+ # TODO: Do not pass callback again in user_data if destroy notifier is absent
938
+ info.install_vfunc_implementation :do_baz,
939
+ proc { |obj, callback, _user_data| callback.call; a = obj.get_name }
940
+ end
941
+ b = nil
942
+ instance.do_baz { b = 'hello' }
943
+ a.must_equal 'regress_foo'
944
+ b.must_equal 'hello'
589
945
  end
946
+
590
947
  it "handles the 'destroy-event' signal" do
948
+ a = nil
949
+ instance = make_derived_instance
950
+ instance.signal_connect 'destroy-event' do
951
+ a = 'hello'
952
+ end
953
+ GObject.signal_emit instance, 'destroy-event'
954
+ a.must_equal 'hello'
591
955
  end
592
956
  end
957
+
593
958
  describe 'Regress::FooSubobject' do
594
959
  it 'creates an instance using #new' do
595
- skip 'Needs testing'
960
+ # TODO: Guard against instantiating abstract classes
961
+ skip 'This function is defined in the header but not implemented'
596
962
  end
597
963
  end
964
+
598
965
  describe 'Regress::FooThingWithArray' do
966
+ let(:instance) { Regress::FooThingWithArray.new }
967
+
599
968
  it 'has a writable field x' do
600
- skip 'Needs testing'
969
+ instance.x.must_equal 0
970
+ instance.x = 23
971
+ instance.x.must_equal 23
601
972
  end
973
+
602
974
  it 'has a writable field y' do
603
- skip 'Needs testing'
975
+ instance.y.must_equal 0
976
+ instance.y = 23
977
+ instance.y.must_equal 23
604
978
  end
979
+
605
980
  it 'has a writable field lines' do
606
- skip 'Needs testing'
981
+ instance.lines.must_be :==, [0] * 80
982
+ instance.lines = (1..80).to_a
983
+ instance.lines.must_be :==, (1..80).to_a
607
984
  end
985
+
608
986
  it 'has a writable field data' do
609
- skip 'Needs testing'
987
+ instance.data.must_equal FFI::Pointer::NULL
988
+ instance.data = FFI::Pointer.new(23)
989
+ instance.data.must_equal FFI::Pointer.new(23)
610
990
  end
611
991
  end
992
+
612
993
  describe 'Regress::FooUnion' do
994
+ let(:instance) { Regress::FooUnion.new }
995
+
613
996
  it 'has a writable field regress_foo' do
614
- skip 'Needs testing'
997
+ instance.regress_foo.must_equal 0
998
+ instance.regress_foo = 23
999
+ instance.regress_foo.must_equal 23
615
1000
  end
616
1001
  end
1002
+
617
1003
  describe 'Regress::FooUtilityStruct' do
1004
+ let(:instance) { Regress::FooUtilityStruct.new }
1005
+
618
1006
  it 'has a writable field bar' do
619
- skip 'Needs testing'
1007
+ struct = Utility::Struct.new
1008
+ struct.field = 23
1009
+
1010
+ instance.bar.field.must_equal 0
1011
+ instance.bar = struct
1012
+ instance.bar.field.must_equal 23
620
1013
  end
621
1014
  end
1015
+
622
1016
  it 'has the constant GI_SCANNER_ELSE' do
623
1017
  skip unless get_introspection_data 'Regress', 'GI_SCANNER_ELSE'
624
1018
  Regress::GI_SCANNER_ELSE.must_equal 3
@@ -1030,7 +1424,7 @@ describe Regress do
1030
1424
  end
1031
1425
 
1032
1426
  it 'has a reference count of 1' do
1033
- assert_equal 1, ref_count(@o)
1427
+ assert_equal 1, @o.ref_count
1034
1428
  end
1035
1429
 
1036
1430
  it 'has been sunk' do
@@ -1190,7 +1584,7 @@ describe Regress do
1190
1584
  end
1191
1585
 
1192
1586
  it 'has a reference count of 1' do
1193
- assert_equal 1, ref_count(instance)
1587
+ assert_equal 1, instance.ref_count
1194
1588
  end
1195
1589
 
1196
1590
  it 'does not float' do
@@ -1261,9 +1655,9 @@ describe Regress do
1261
1655
 
1262
1656
  it 'has a working method #instance_method_full' do
1263
1657
  skip unless get_method_introspection_data('Regress', 'TestObj', 'instance_method_full')
1264
- ref_count(instance).must_equal 1
1658
+ instance.ref_count.must_equal 1
1265
1659
  instance.instance_method_full
1266
- ref_count(instance).must_equal 1
1660
+ instance.ref_count.must_equal 1
1267
1661
  end
1268
1662
 
1269
1663
  it 'has a working method #set_bare' do
@@ -2314,53 +2708,81 @@ describe Regress do
2314
2708
  end
2315
2709
 
2316
2710
  it 'has a working function #annotation_attribute_func' do
2317
- skip 'Needs testing'
2711
+ info = get_introspection_data('Regress', 'annotation_attribute_func')
2712
+ param = info.args.last
2713
+ param.attribute('some.annotation').must_equal 'value'
2714
+ param.attribute('another.annotation').must_equal 'blahvalue'
2715
+
2716
+ obj = Regress::AnnotationObject.new
2717
+ Regress.annotation_attribute_func(obj, 'hello').must_equal 42
2318
2718
  end
2719
+
2319
2720
  it 'has a working function #annotation_custom_destroy' do
2320
- skip 'Needs testing'
2721
+ result = Regress.annotation_custom_destroy {}
2722
+ result.must_be_nil
2321
2723
  end
2724
+
2322
2725
  it 'has a working function #annotation_get_source_file' do
2323
- skip 'Needs testing'
2726
+ Regress.annotation_get_source_file.must_be_nil
2324
2727
  end
2728
+
2325
2729
  it 'has a working function #annotation_init' do
2326
- skip 'Needs testing'
2730
+ result = Regress.annotation_init %w(foo bar)
2731
+ result.to_a.must_equal %w(foo bar)
2327
2732
  end
2733
+
2328
2734
  it 'has a working function #annotation_invalid_regress_annotation' do
2329
- skip 'Needs testing'
2735
+ Regress.annotation_invalid_regress_annotation(42).must_be_nil
2330
2736
  end
2737
+
2331
2738
  it 'has a working function #annotation_ptr_array' do
2332
- skip 'Needs testing'
2739
+ # TODO: Automatically convert array elements to correct type
2740
+ val1 = GObject::Value.from 1
2741
+ val2 = GObject::Value.from 'a'
2742
+ Regress.annotation_ptr_array([val1, val2]).must_be_nil
2333
2743
  end
2744
+
2334
2745
  it 'has a working function #annotation_return_array' do
2335
- skip 'Needs testing'
2746
+ Regress.annotation_return_array.must_be_nil
2336
2747
  end
2748
+
2337
2749
  it 'has a working function #annotation_return_filename' do
2338
- skip 'Needs testing'
2750
+ Regress.annotation_return_filename.must_equal 'a utf-8 filename'
2339
2751
  end
2752
+
2340
2753
  it 'has a working function #annotation_set_source_file' do
2341
- skip 'Needs testing'
2754
+ Regress.annotation_set_source_file('a filename').must_be_nil
2342
2755
  end
2756
+
2343
2757
  it 'has a working function #annotation_space_after_comment_bug631690' do
2344
- skip 'Needs testing'
2758
+ Regress.annotation_space_after_comment_bug631690.must_be_nil
2345
2759
  end
2760
+
2346
2761
  it 'has a working function #annotation_string_array_length' do
2347
- skip 'Needs testing'
2762
+ Regress.annotation_string_array_length(%w(foo bar)).must_be_nil
2348
2763
  end
2764
+
2349
2765
  it 'has a working function #annotation_string_zero_terminated' do
2350
- skip 'Needs testing'
2766
+ Regress.annotation_string_zero_terminated.to_a.must_equal []
2351
2767
  end
2768
+
2352
2769
  it 'has a working function #annotation_string_zero_terminated_out' do
2353
- skip 'Needs testing'
2770
+ Regress.annotation_string_zero_terminated_out(%w(foo bar)).to_a.
2771
+ must_equal %w(foo bar)
2354
2772
  end
2773
+
2355
2774
  it 'has a working function #annotation_test_parsing_bug630862' do
2356
- skip 'Needs testing'
2775
+ Regress.annotation_test_parsing_bug630862.must_be_nil
2357
2776
  end
2777
+
2358
2778
  it 'has a working function #annotation_transfer_floating' do
2359
- skip 'Needs testing'
2779
+ Regress.annotation_transfer_floating.must_be_nil
2360
2780
  end
2781
+
2361
2782
  it 'has a working function #annotation_versioned' do
2362
- skip 'Needs testing'
2783
+ Regress.annotation_versioned.must_be_nil
2363
2784
  end
2785
+
2364
2786
  it 'has a working function #atest_error_quark' do
2365
2787
  skip unless get_introspection_data 'Regress', 'atest_error_quark'
2366
2788
  result = Regress.atest_error_quark
@@ -2368,59 +2790,78 @@ describe Regress do
2368
2790
  end
2369
2791
 
2370
2792
  it 'has a working function #foo_async_ready_callback' do
2371
- skip 'Needs testing'
2793
+ skip 'This function is defined in the header but not implemented'
2372
2794
  end
2795
+
2373
2796
  it 'has a working function #foo_destroy_notify_callback' do
2374
- skip 'Needs testing'
2797
+ skip 'This function is defined in the header but not implemented'
2375
2798
  end
2799
+
2376
2800
  it 'has a working function #foo_enum_type_method' do
2377
- skip 'Needs testing'
2801
+ skip 'This function is defined in the header but not implemented'
2378
2802
  end
2803
+
2379
2804
  it 'has a working function #foo_enum_type_returnv' do
2380
- skip 'Needs testing'
2805
+ skip 'This function is defined in the header but not implemented'
2381
2806
  end
2807
+
2382
2808
  it 'has a working function #foo_error_quark' do
2383
- skip 'Needs testing'
2809
+ result = Regress.foo_error_quark
2810
+ GLib.quark_to_string(result).must_equal('regress_foo-error-quark')
2384
2811
  end
2812
+
2385
2813
  it 'has a working function #foo_init' do
2386
- skip 'Needs testing'
2814
+ Regress.foo_init.must_equal 0x1138
2387
2815
  end
2816
+
2388
2817
  it 'has a working function #foo_interface_static_method' do
2389
- skip 'Needs testing'
2818
+ Regress.foo_interface_static_method(42).must_be_nil
2390
2819
  end
2820
+
2391
2821
  it 'has a working function #foo_method_external_references' do
2392
- skip 'Needs testing'
2822
+ skip 'This function is defined in the header but not implemented'
2393
2823
  end
2824
+
2394
2825
  it 'has a working function #foo_not_a_constructor_new' do
2395
- skip 'Needs testing'
2826
+ Regress.foo_not_a_constructor_new.must_be_nil
2396
2827
  end
2828
+
2397
2829
  it 'has a working function #foo_test_array' do
2398
- skip 'Needs testing'
2830
+ Regress.foo_test_array.must_be_nil
2399
2831
  end
2832
+
2400
2833
  it 'has a working function #foo_test_const_char_param' do
2401
- skip 'Needs testing'
2834
+ skip 'This function is defined in the header but not implemented'
2402
2835
  end
2836
+
2403
2837
  it 'has a working function #foo_test_const_char_retval' do
2404
- skip 'Needs testing'
2838
+ skip 'This function is defined in the header but not implemented'
2405
2839
  end
2840
+
2406
2841
  it 'has a working function #foo_test_const_struct_param' do
2407
- skip 'Needs testing'
2842
+ skip 'This function is defined in the header but not implemented'
2408
2843
  end
2844
+
2409
2845
  it 'has a working function #foo_test_const_struct_retval' do
2410
- skip 'Needs testing'
2846
+ skip 'This function is defined in the header but not implemented'
2411
2847
  end
2848
+
2412
2849
  it 'has a working function #foo_test_string_array' do
2413
- skip 'Needs testing'
2850
+ Regress.foo_test_string_array(%w(foo bar)).must_be_nil
2414
2851
  end
2852
+
2415
2853
  it 'has a working function #foo_test_string_array_with_g' do
2416
- skip 'Needs testing'
2854
+ Regress.foo_test_string_array_with_g(%w(foo bar)).must_be_nil
2417
2855
  end
2856
+
2418
2857
  it 'has a working function #foo_test_unsigned_qualifier' do
2419
- skip 'Needs testing'
2858
+ skip 'This function is defined in the header but not implemented'
2420
2859
  end
2860
+
2421
2861
  it 'has a working function #foo_test_unsigned_type' do
2422
- skip 'Needs testing'
2862
+ skip 'This function is defined in the header but not implemented'
2423
2863
  end
2864
+
2424
2865
  it 'has a working function #func_obj_null_in' do
2425
2866
  Regress.func_obj_null_in nil
2426
2867
  Regress.func_obj_null_in Regress::TestObj.constructor
@@ -2700,7 +3141,7 @@ describe Regress do
2700
3141
  skip unless get_introspection_data 'Regress', 'test_callback_return_full'
2701
3142
  obj = Regress::TestObj.constructor
2702
3143
  Regress.test_callback_return_full { obj }
2703
- ref_count(obj).must_equal 1
3144
+ obj.ref_count.must_equal 1
2704
3145
  end
2705
3146
 
2706
3147
  it 'has a working function #test_callback_thaw_async' do
@@ -2937,8 +3378,8 @@ describe Regress do
2937
3378
  end
2938
3379
 
2939
3380
  it 'has a working function #test_glist_gtype_container_in' do
2940
- skip 'Not implemented yet'
2941
- Regress.test_glist_gtype_container_in %w(1 2 3)
3381
+ skip unless get_introspection_data 'Regress', 'test_glist_gtype_container_in'
3382
+ Regress.test_glist_gtype_container_in [Regress::TestObj.gtype, Regress::TestSubObj.gtype]
2942
3383
  pass
2943
3384
  end
2944
3385
 
@@ -3025,8 +3466,8 @@ describe Regress do
3025
3466
  it 'has a working function #test_gvariant_asv' do
3026
3467
  result = Regress.test_gvariant_asv
3027
3468
  result.n_children.must_equal 2
3028
- result.lookup_value('name', nil).get_string.must_equal 'foo'
3029
- result.lookup_value('timeout', nil).get_int32.must_equal 10
3469
+ result.lookup_value('name').get_string.must_equal 'foo'
3470
+ result.lookup_value('timeout').get_int32.must_equal 10
3030
3471
  end
3031
3472
 
3032
3473
  it 'has a working function #test_gvariant_i' do