gir_ffi 0.9.4 → 0.9.5

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