gir_ffi 0.6.3 → 0.6.4

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 (67) hide show
  1. data/History.txt +11 -0
  2. data/README.md +24 -6
  3. data/lib/ffi-glib/ptr_array.rb +17 -1
  4. data/lib/ffi-glib/variant.rb +15 -0
  5. data/lib/ffi-glib.rb +1 -0
  6. data/lib/ffi-gobject/object.rb +1 -1
  7. data/lib/ffi-gobject/ruby_closure.rb +1 -1
  8. data/lib/ffi-gobject/value.rb +13 -3
  9. data/lib/ffi-gobject.rb +1 -2
  10. data/lib/ffi-gobject_introspection/i_enum_info.rb +14 -0
  11. data/lib/ffi-gobject_introspection/lib.rb +2 -0
  12. data/lib/gir_ffi/arg_helper.rb +2 -0
  13. data/lib/gir_ffi/argument_builder.rb +22 -21
  14. data/lib/gir_ffi/base_argument_builder.rb +2 -1
  15. data/lib/gir_ffi/builder/module.rb +2 -3
  16. data/lib/gir_ffi/builder/type/enum.rb +18 -1
  17. data/lib/gir_ffi/builder/type/object.rb +20 -18
  18. data/lib/gir_ffi/class_base.rb +0 -1
  19. data/lib/gir_ffi/enum_base.rb +25 -0
  20. data/lib/gir_ffi/ffi_ext.rb +1 -0
  21. data/lib/gir_ffi/function_builder.rb +50 -33
  22. data/lib/gir_ffi/in_out_pointer.rb +0 -5
  23. data/lib/gir_ffi/in_pointer.rb +7 -5
  24. data/lib/gir_ffi/info_ext/i_callable_info.rb +4 -0
  25. data/lib/gir_ffi/info_ext/i_enum_info.rb +13 -0
  26. data/lib/gir_ffi/info_ext/i_field_info.rb +1 -1
  27. data/lib/gir_ffi/info_ext/i_object_info.rb +11 -0
  28. data/lib/gir_ffi/info_ext/i_registered_type_info.rb +11 -0
  29. data/lib/gir_ffi/info_ext/i_struct_info.rb +11 -0
  30. data/lib/gir_ffi/info_ext/i_type_info.rb +10 -19
  31. data/lib/gir_ffi/info_ext/i_union_info.rb +12 -0
  32. data/lib/gir_ffi/info_ext/safe_constant_name.rb +0 -2
  33. data/lib/gir_ffi/info_ext.rb +4 -0
  34. data/lib/gir_ffi/interface_base.rb +0 -1
  35. data/lib/gir_ffi/return_value_builder.rb +3 -2
  36. data/lib/gir_ffi/type_map.rb +3 -0
  37. data/lib/gir_ffi/version.rb +1 -1
  38. data/lib/gir_ffi/zero_terminated.rb +36 -3
  39. data/lib/gir_ffi-base/gir_ffi/library.rb +17 -0
  40. data/lib/gir_ffi-base/gobject/lib.rb +2 -2
  41. data/lib/gir_ffi.rb +1 -0
  42. data/tasks/test.rake +1 -0
  43. data/test/base_test_helper.rb +22 -2
  44. data/test/ffi-glib/ruby_closure_test.rb +1 -1
  45. data/test/ffi-glib/variant_test.rb +10 -0
  46. data/test/ffi-gobject/value_test.rb +24 -8
  47. data/test/ffi-gobject_introspection/i_enum_info_test.rb +17 -0
  48. data/test/gir_ffi/argument_builder_test.rb +66 -24
  49. data/test/gir_ffi/builder_test.rb +1 -1
  50. data/test/gir_ffi/function_builder_test.rb +1 -3
  51. data/test/gir_ffi/in_out_pointer_test.rb +5 -3
  52. data/test/gir_ffi/in_pointer_test.rb +32 -2
  53. data/test/gir_ffi/info_ext/i_arg_info_test.rb +2 -2
  54. data/test/gir_ffi/info_ext/i_callable_info_test.rb +2 -2
  55. data/test/gir_ffi/info_ext/i_field_info_test.rb +14 -20
  56. data/test/gir_ffi/info_ext/i_function_info_test.rb +2 -2
  57. data/test/gir_ffi/info_ext/i_signal_info_test.rb +2 -2
  58. data/test/gir_ffi/info_ext/i_type_info_test.rb +8 -8
  59. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +2 -2
  60. data/test/gir_ffi/info_ext/safe_function_name_test.rb +2 -2
  61. data/test/gir_ffi/return_value_builder_test.rb +18 -1
  62. data/test/gir_ffi/zero_terminated_test.rb +10 -0
  63. data/test/gir_ffi_test_helper.rb +0 -19
  64. data/test/integration/generated_gimarshallingtests_test.rb +291 -99
  65. data/test/integration/generated_regress_test.rb +138 -14
  66. data/test/lib/autogen.sh +6 -2
  67. metadata +14 -2
@@ -86,13 +86,27 @@ describe GirFFI::ArgumentBuilder do
86
86
  stub(type_info).flattened_tag { :object }
87
87
  end
88
88
 
89
+ it "has the correct value for #pre" do
90
+ builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.for :object" ]
91
+ end
92
+
93
+ it "has the correct value for #post" do
94
+ builder.post.must_equal [ "_v2 = Bar::Foo.wrap(_v1.to_value)" ]
95
+ end
96
+ end
97
+
98
+ describe "for :struct" do
99
+ before do
100
+ stub(type_info).flattened_tag { :struct }
101
+ end
102
+
89
103
  describe "when not allocated by the caller" do
90
104
  before do
91
105
  stub(argument_info).caller_allocates? { false }
92
106
  end
93
107
 
94
108
  it "has the correct value for #pre" do
95
- builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.for :object" ]
109
+ builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.for :struct" ]
96
110
  end
97
111
 
98
112
  it "has the correct value for #post" do
@@ -106,7 +120,7 @@ describe GirFFI::ArgumentBuilder do
106
120
  end
107
121
 
108
122
  it "has the correct value for #pre" do
109
- builder.pre.must_equal [ "_v1 = Bar::Foo._allocate" ]
123
+ builder.pre.must_equal [ "_v1 = Bar::Foo.new" ]
110
124
  end
111
125
 
112
126
  it "has the correct value for #post" do
@@ -115,32 +129,45 @@ describe GirFFI::ArgumentBuilder do
115
129
  end
116
130
  end
117
131
 
118
- describe "for :struct" do
132
+ describe "for :strv" do
119
133
  before do
120
- stub(type_info).flattened_tag { :struct }
134
+ stub(type_info).flattened_tag { :strv }
121
135
  end
122
136
 
123
- describe "when not allocated by the caller" do
137
+ it "has the correct value for #pre" do
138
+ builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.for :strv" ]
139
+ end
140
+
141
+ it "has the correct value for #post" do
142
+ builder.post.must_equal [ "_v2 = GLib::Strv.wrap(_v1.to_value)" ]
143
+ end
144
+ end
145
+
146
+ describe "for :array" do
147
+ before do
148
+ stub(type_info).flattened_tag { :array }
149
+ stub(type_info).element_type { :foo }
150
+ end
151
+
152
+ context "when allocated by the callee" do
124
153
  before do
125
154
  stub(argument_info).caller_allocates? { false }
126
155
  end
127
-
128
156
  it "has the correct value for #pre" do
129
- builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.for :struct" ]
157
+ builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.for :array" ]
130
158
  end
131
159
 
132
160
  it "has the correct value for #post" do
133
- builder.post.must_equal [ "_v2 = Bar::Foo.wrap(_v1.to_value)" ]
161
+ builder.post.must_equal [ "_v2 = GLib::Array.wrap(:foo, _v1.to_value)" ]
134
162
  end
135
163
  end
136
164
 
137
- describe "when allocated by the caller" do
165
+ context "when allocated by the caller" do
138
166
  before do
139
167
  stub(argument_info).caller_allocates? { true }
140
168
  end
141
-
142
169
  it "has the correct value for #pre" do
143
- builder.pre.must_equal [ "_v1 = Bar::Foo._allocate" ]
170
+ builder.pre.must_equal [ "_v1 = GLib::Array.new :foo" ]
144
171
  end
145
172
 
146
173
  it "has the correct value for #post" do
@@ -149,32 +176,32 @@ describe GirFFI::ArgumentBuilder do
149
176
  end
150
177
  end
151
178
 
152
- describe "for :strv" do
179
+ describe "for :ptr_array" do
153
180
  before do
154
- stub(type_info).flattened_tag { :strv }
181
+ stub(type_info).flattened_tag { :ptr_array }
182
+ stub(type_info).element_type { :foo }
155
183
  end
156
184
 
157
185
  it "has the correct value for #pre" do
158
- builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.for :strv" ]
186
+ builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.for :ptr_array" ]
159
187
  end
160
188
 
161
189
  it "has the correct value for #post" do
162
- builder.post.must_equal [ "_v2 = GLib::Strv.wrap(_v1.to_value)" ]
190
+ builder.post.must_equal [ "_v2 = GLib::PtrArray.wrap(:foo, _v1.to_value)" ]
163
191
  end
164
192
  end
165
193
 
166
- describe "for :array" do
194
+ describe "for :error" do
167
195
  before do
168
- stub(type_info).flattened_tag { :array }
169
- stub(type_info).element_type { :foo }
196
+ stub(type_info).flattened_tag { :error }
170
197
  end
171
198
 
172
199
  it "has the correct value for #pre" do
173
- builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.for :array" ]
200
+ builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.for :error" ]
174
201
  end
175
202
 
176
203
  it "has the correct value for #post" do
177
- builder.post.must_equal [ "_v2 = GLib::Array.wrap(:foo, _v1.to_value)" ]
204
+ builder.post.must_equal [ "_v2 = GLib::Error.wrap(_v1.to_value)" ]
178
205
  end
179
206
  end
180
207
 
@@ -331,7 +358,7 @@ describe GirFFI::ArgumentBuilder do
331
358
  end
332
359
 
333
360
  it "has the correct value for #pre" do
334
- builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.from :pointer, GLib::Strv.from(foo)" ]
361
+ builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.from :strv, GLib::Strv.from(foo)" ]
335
362
  end
336
363
 
337
364
  it "has the correct value for #post" do
@@ -339,13 +366,28 @@ describe GirFFI::ArgumentBuilder do
339
366
  end
340
367
  end
341
368
 
369
+ describe "for :ptr_array" do
370
+ before do
371
+ stub(type_info).flattened_tag { :ptr_array }
372
+ stub(type_info).element_type { :foo }
373
+ end
374
+
375
+ it "has the correct value for #pre" do
376
+ builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.from :ptr_array, GLib::PtrArray.from(:foo, foo)" ]
377
+ end
378
+
379
+ it "has the correct value for #post" do
380
+ builder.post.must_equal [ "_v2 = GLib::PtrArray.wrap(:foo, _v1.to_value)" ]
381
+ end
382
+ end
383
+
342
384
  describe "for :utf8" do
343
385
  before do
344
386
  stub(type_info).flattened_tag { :utf8 }
345
387
  end
346
388
 
347
389
  it "has the correct value for #pre" do
348
- builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.from :pointer, GirFFI::InPointer.from(:utf8, foo)" ]
390
+ builder.pre.must_equal [ "_v1 = GirFFI::InOutPointer.from :utf8, GirFFI::InPointer.from(:utf8, foo)" ]
349
391
  end
350
392
 
351
393
  it "has the correct value for #post" do
@@ -367,7 +409,7 @@ describe GirFFI::ArgumentBuilder do
367
409
  it "has the correct value for #pre" do
368
410
  builder.pre.must_equal [
369
411
  "GirFFI::ArgHelper.check_fixed_array_size 3, foo, \"foo\"",
370
- "_v1 = GirFFI::InOutPointer.from :pointer, GLib::SizedArray.from(:bar, 3, foo)"
412
+ "_v1 = GirFFI::InOutPointer.from :c, GLib::SizedArray.from(:bar, 3, foo)"
371
413
  ]
372
414
  end
373
415
 
@@ -387,7 +429,7 @@ describe GirFFI::ArgumentBuilder do
387
429
  it "has the correct value for #pre" do
388
430
  # TODO: Perhaps this should include a length check as well.
389
431
  builder.pre.must_equal [
390
- "_v1 = GirFFI::InOutPointer.from :pointer, GLib::SizedArray.from(:bar, -1, foo)"
432
+ "_v1 = GirFFI::InOutPointer.from :c, GLib::SizedArray.from(:bar, -1, foo)"
391
433
  ]
392
434
  end
393
435
 
@@ -77,7 +77,7 @@ describe GirFFI::Builder do
77
77
  end
78
78
 
79
79
  should "set up struct members with the correct types" do
80
- tags = [:int, :int8, :double, Regress::TestEnum]
80
+ tags = [:int, :int8, :double, Regress::TestEnum::Enum]
81
81
  assert_equal tags.map {|t| FFI.find_type t},
82
82
  Regress::TestStructA::Struct.layout.fields.map {|f| f.type}
83
83
  end
@@ -83,7 +83,6 @@ describe GirFFI::FunctionBuilder do
83
83
  def self.gvalue_in value
84
84
  _v1 = ::GObject::Value.from(value)
85
85
  DummyLib.gi_marshalling_tests_gvalue_in _v1
86
-
87
86
  end
88
87
  CODE
89
88
 
@@ -101,7 +100,6 @@ describe GirFFI::FunctionBuilder do
101
100
  len = arr.nil? ? 0 : arr.length
102
101
  _v2 = len
103
102
  DummyLib.regress_test_array_int_null_in _v1, _v2
104
-
105
103
  end
106
104
  CODE
107
105
 
@@ -134,7 +132,7 @@ describe GirFFI::FunctionBuilder do
134
132
 
135
133
  expected = <<-CODE
136
134
  def method_array_inout ints
137
- _v1 = GirFFI::InOutPointer.from :pointer, GLib::SizedArray.from(:gint32, -1, ints)
135
+ _v1 = GirFFI::InOutPointer.from :c, GLib::SizedArray.from(:gint32, -1, ints)
138
136
  length = ints.nil? ? 0 : ints.length
139
137
  _v2 = GirFFI::InOutPointer.from :gint32, length
140
138
  DummyLib.gi_marshalling_tests_object_method_array_inout self, _v1, _v2
@@ -22,8 +22,9 @@ describe GirFFI::InOutPointer do
22
22
  GirFFI::InOutPointer.from :gboolean, false
23
23
  end
24
24
 
25
- it "handles :utf8" do
26
- GirFFI::InOutPointer.from :utf8, "Hello"
25
+ it "handles :utf8 pointers" do
26
+ str_ptr = GirFFI::InPointer.from :utf8, "Hello"
27
+ GirFFI::InOutPointer.from :utf8, str_ptr
27
28
  end
28
29
  end
29
30
 
@@ -71,7 +72,8 @@ describe GirFFI::InOutPointer do
71
72
 
72
73
  describe "for :utf8 values" do
73
74
  it "returns a pointer to the held value" do
74
- ptr = GirFFI::InOutPointer.from :utf8, "Some value"
75
+ str_ptr = GirFFI::InPointer.from :utf8, "Some value"
76
+ ptr = GirFFI::InOutPointer.from :utf8, str_ptr
75
77
  assert_equal "Some value", ptr.to_value.read_string
76
78
  end
77
79
  end
@@ -14,10 +14,21 @@ describe GirFFI::InPointer do
14
14
  end
15
15
 
16
16
  it "handles enum types" do
17
- e = FFI::Enum.new [:foo, :bar, :baz]
17
+ e = Module.new do
18
+ self::Enum = FFI::Enum.new [:foo, :bar, :baz]
19
+ end
18
20
  ptr = GirFFI::InPointer.from_array e, [:bar, :foo, :baz]
19
21
  ptr.read_array_of_int32(3).must_equal [1, 0, 2]
20
22
  end
23
+
24
+ it "handles typed pointers" do
25
+ p1 = GirFFI::InPointer.from :gint32, 42
26
+ p2 = GirFFI::InPointer.from :gint32, 24
27
+
28
+ ptr = GirFFI::InPointer.from_array [:pointer, :uint32], [p1, p2]
29
+
30
+ ptr.read_array_of_pointer(2).must_equal [p1, p2]
31
+ end
21
32
  end
22
33
 
23
34
  describe "an instance created with .from_array :gint32" do
@@ -75,6 +86,20 @@ describe GirFFI::InPointer do
75
86
  end
76
87
  end
77
88
 
89
+ describe "an instance created with .from :guint32" do
90
+ before do
91
+ @result = GirFFI::InPointer.from :guint32, 12345
92
+ end
93
+
94
+ it "returns a pointer with an address equal to the given value" do
95
+ assert_equal 12345, @result.address
96
+ end
97
+
98
+ it "is an instance of GirFFI::InPointer" do
99
+ assert_instance_of GirFFI::InPointer, @result
100
+ end
101
+ end
102
+
78
103
  describe "an instance created with .from :filename" do
79
104
  before do
80
105
  @result = GirFFI::InPointer.from :filename, "foo"
@@ -97,7 +122,12 @@ describe GirFFI::InPointer do
97
122
  end
98
123
 
99
124
  it "handles enum types" do
100
- e = FFI::Enum.new [:foo, :bar, :baz]
125
+ e = Module.new do
126
+ self::Enum = FFI::Enum.new [:foo, :bar, :baz]
127
+ def self.[](val)
128
+ self::Enum[val]
129
+ end
130
+ end
101
131
  ptr = GirFFI::InPointer.from e, :bar
102
132
  ptr.address.must_equal 1
103
133
  end
@@ -1,10 +1,10 @@
1
1
  require 'gir_ffi_test_helper'
2
2
 
3
3
  describe GirFFI::InfoExt::IArgInfo do
4
- let(:testclass) { Class.new do
4
+ let(:klass) { Class.new do
5
5
  include GirFFI::InfoExt::IArgInfo
6
6
  end }
7
- let(:arg_info) { testclass.new }
7
+ let(:arg_info) { klass.new }
8
8
 
9
9
  describe "#cast_signal_argument" do
10
10
  describe "with info for an enum" do
@@ -1,10 +1,10 @@
1
1
  require 'gir_ffi_test_helper'
2
2
 
3
3
  describe GirFFI::InfoExt::ICallableInfo do
4
- let(:testclass) { Class.new do
4
+ let(:klass) { Class.new do
5
5
  include GirFFI::InfoExt::ICallableInfo
6
6
  end }
7
- let(:callable_info) { testclass.new }
7
+ let(:callable_info) { klass.new }
8
8
 
9
9
  describe "#argument_ffi_types" do
10
10
  describe "for a simple callable with several arguments" do
@@ -1,37 +1,31 @@
1
1
  require 'gir_ffi_test_helper'
2
2
 
3
3
  describe GirFFI::InfoExt::IFieldInfo do
4
+ let(:klass) { Class.new do
5
+ include GirFFI::InfoExt::IFieldInfo
6
+ end }
7
+ let(:field_info) { klass.new }
4
8
  describe "#layout_specification" do
5
9
  it "returns an array of name, typespec and offset" do
6
- testclass = Class.new do
7
- include GirFFI::InfoExt::IFieldInfo
8
- end
10
+ mock(type = Object.new).to_ffitype { :bar }
9
11
 
10
- mock(type = Object.new).layout_specification_type { :bar }
12
+ mock(field_info).name { "foo" }
13
+ mock(field_info).field_type { type }
14
+ mock(field_info).offset { 0 }
11
15
 
12
- field = testclass.new
13
- mock(field).name { "foo" }
14
- mock(field).field_type { type }
15
- mock(field).offset { 0 }
16
-
17
- result = field.layout_specification
16
+ result = field_info.layout_specification
18
17
 
19
18
  assert_equal [:foo, :bar, 0], result
20
19
  end
21
20
 
22
21
  it "keeps a complex typespec intact" do
23
- testclass = Class.new do
24
- include GirFFI::InfoExt::IFieldInfo
25
- end
26
-
27
- mock(type = Object.new).layout_specification_type { [:bar, 2] }
22
+ mock(type = Object.new).to_ffitype { [:bar, 2] }
28
23
 
29
- field = testclass.new
30
- mock(field).name { "foo" }
31
- mock(field).field_type { type }
32
- mock(field).offset { 0 }
24
+ mock(field_info).name { "foo" }
25
+ mock(field_info).field_type { type }
26
+ mock(field_info).offset { 0 }
33
27
 
34
- result = field.layout_specification
28
+ result = field_info.layout_specification
35
29
 
36
30
  assert_equal [:foo, [:bar, 2], 0], result
37
31
  end
@@ -1,11 +1,11 @@
1
1
  require 'gir_ffi_test_helper'
2
2
 
3
3
  describe GirFFI::InfoExt::IFunctionInfo do
4
- let(:testclass) { Class.new do
4
+ let(:klass) { Class.new do
5
5
  include GirFFI::InfoExt::ICallableInfo
6
6
  include GirFFI::InfoExt::IFunctionInfo
7
7
  end }
8
- let(:function_info) { testclass.new }
8
+ let(:function_info) { klass.new }
9
9
 
10
10
  describe "#argument_ffi_types" do
11
11
  before do
@@ -1,10 +1,10 @@
1
1
  require 'gir_ffi_test_helper'
2
2
 
3
3
  describe GirFFI::InfoExt::ISignalInfo do
4
- let(:testclass) { Class.new do
4
+ let(:klass) { Class.new do
5
5
  include GirFFI::InfoExt::ISignalInfo
6
6
  end }
7
- let(:signal_info) { testclass.new }
7
+ let(:signal_info) { klass.new }
8
8
 
9
9
  describe "#cast_back_signal_arguments" do
10
10
  # TODO: Move to integration tests
@@ -1,24 +1,24 @@
1
1
  require 'gir_ffi_test_helper'
2
2
 
3
3
  describe GirFFI::InfoExt::ITypeInfo do
4
- let(:testclass) { Class.new do
4
+ let(:klass) { Class.new do
5
5
  include GirFFI::InfoExt::ITypeInfo
6
6
  end }
7
- let(:type_info) { testclass.new }
8
- let(:elmtype_info) { testclass.new }
9
- let(:keytype_info) { testclass.new }
10
- let(:valtype_info) { testclass.new }
7
+ let(:type_info) { klass.new }
8
+ let(:elmtype_info) { klass.new }
9
+ let(:keytype_info) { klass.new }
10
+ let(:valtype_info) { klass.new }
11
11
 
12
- describe "#layout_specification_type" do
12
+ describe "#to_ffitype" do
13
13
  it "returns an array with elements subtype and size for type :array" do
14
14
  mock(type_info).pointer? { false }
15
15
  stub(type_info).tag { :array }
16
16
  mock(type_info).array_fixed_size { 2 }
17
17
 
18
- mock(elmtype_info).layout_specification_type { :foo }
18
+ mock(elmtype_info).to_ffitype { :foo }
19
19
  mock(type_info).param_type(0) { elmtype_info }
20
20
 
21
- result = type_info.layout_specification_type
21
+ result = type_info.to_ffitype
22
22
  assert_equal [:foo, 2], result
23
23
  end
24
24
  end
@@ -1,10 +1,10 @@
1
1
  require 'gir_ffi_test_helper'
2
2
 
3
3
  describe GirFFI::InfoExt::SafeConstantName do
4
- let(:testclass) { Class.new do
4
+ let(:klass) { Class.new do
5
5
  include GirFFI::InfoExt::SafeConstantName
6
6
  end }
7
- let(:info) { testclass.new }
7
+ let(:info) { klass.new }
8
8
 
9
9
  describe "#safe_name" do
10
10
  it "makes names starting with an underscore safe" do
@@ -1,10 +1,10 @@
1
1
  require 'gir_ffi_test_helper'
2
2
 
3
3
  describe GirFFI::InfoExt::SafeFunctionName do
4
- let(:testclass) { Class.new do
4
+ let(:klass) { Class.new do
5
5
  include GirFFI::InfoExt::SafeFunctionName
6
6
  end }
7
- let(:info) { testclass.new }
7
+ let(:info) { klass.new }
8
8
 
9
9
  describe "#safe_name" do
10
10
  it "keeps lower case names lower case" do
@@ -179,11 +179,12 @@ describe GirFFI::ReturnValueBuilder do
179
179
  describe "for :ptr_array" do
180
180
  before do
181
181
  stub(type_info).flattened_tag { :ptr_array }
182
+ stub(type_info).element_type { :foo }
182
183
  end
183
184
 
184
185
  it "wraps the result in #post" do
185
186
  builder.callarg.must_equal "_v1"
186
- builder.post.must_equal [ "_v2 = GLib::PtrArray.wrap(_v1)" ]
187
+ builder.post.must_equal [ "_v2 = GLib::PtrArray.wrap(:foo, _v1)" ]
187
188
  end
188
189
 
189
190
  it "returns the wrapped result" do
@@ -260,6 +261,22 @@ describe GirFFI::ReturnValueBuilder do
260
261
  end
261
262
  end
262
263
 
264
+ describe "for :error" do
265
+ before do
266
+ stub(type_info).flattened_tag { :error }
267
+ end
268
+
269
+ it "wraps the result in #post" do
270
+ builder.callarg.must_equal "_v1"
271
+ builder.post.must_equal [ "_v2 = GLib::Error.wrap(_v1)" ]
272
+ end
273
+
274
+ it "returns the wrapped result" do
275
+ builder.callarg.must_equal "_v1"
276
+ builder.retval.must_equal "_v2"
277
+ end
278
+ end
279
+
263
280
  describe "for :c" do
264
281
  describe "with fixed size" do
265
282
  before do
@@ -39,6 +39,16 @@ describe GirFFI::ZeroTerminated do
39
39
  flunk
40
40
  end
41
41
  end
42
+
43
+ it "works for :int8" do
44
+ zt = GirFFI::ZeroTerminated.from :int8, [1, 2, 3]
45
+ arr = []
46
+ zt.each do |int|
47
+ arr << int
48
+ end
49
+ arr.must_equal [1, 2, 3]
50
+ end
51
+
42
52
  end
43
53
 
44
54
  it "includes Enumerable" do
@@ -2,25 +2,6 @@ require 'introspection_test_helper'
2
2
 
3
3
  require 'gir_ffi'
4
4
 
5
- GObjectIntrospection::IRepository.prepend_search_path File.join(File.dirname(__FILE__), 'lib')
6
- module GObjectIntrospection
7
- class IRepository
8
- def shared_library_with_regress namespace
9
- case namespace
10
- when "Regress"
11
- return File.join(File.dirname(__FILE__), 'lib', 'libregress.so')
12
- when "GIMarshallingTests"
13
- return File.join(File.dirname(__FILE__), 'lib', 'libgimarshallingtests.so')
14
- else
15
- return shared_library_without_regress namespace
16
- end
17
- end
18
-
19
- alias shared_library_without_regress shared_library
20
- alias shared_library shared_library_with_regress
21
- end
22
- end
23
-
24
5
  # Need a dummy module for some tests.
25
6
  module DummyLib
26
7
  end