gir_ffi 0.0.6 → 0.0.7

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.
@@ -1,19 +1,19 @@
1
1
  require File.expand_path('test_helper.rb', File.dirname(__FILE__))
2
2
 
3
3
  class FunctionDefinitionBuilderTest < Test::Unit::TestCase
4
- context "The FunctionDefinition builder" do
4
+ context "The Builder::Function class" do
5
5
  should "build correct definition of Gtk.init" do
6
6
  go = get_function_introspection_data 'Gtk', 'init'
7
- fbuilder = GirFFI::FunctionDefinitionBuilder.new go, Lib
7
+ fbuilder = GirFFI::Builder::Function.new go, Lib
8
8
  code = fbuilder.generate
9
9
 
10
10
  expected = "
11
11
  def init argv
12
12
  argc = argv.length
13
- _v1 = GirFFI::ArgHelper.int_to_inoutptr argc
13
+ _v1 = GirFFI::ArgHelper.gint32_to_inoutptr argc
14
14
  _v3 = GirFFI::ArgHelper.utf8_array_to_inoutptr argv
15
15
  ::Lib.gtk_init _v1, _v3
16
- _v2 = GirFFI::ArgHelper.outptr_to_int _v1
16
+ _v2 = GirFFI::ArgHelper.outptr_to_gint32 _v1
17
17
  GirFFI::ArgHelper.cleanup_ptr _v1
18
18
  _v4 = GirFFI::ArgHelper.outptr_to_utf8_array _v3, _v2
19
19
  GirFFI::ArgHelper.cleanup_ptr_array_ptr _v3, _v2
@@ -26,7 +26,7 @@ class FunctionDefinitionBuilderTest < Test::Unit::TestCase
26
26
 
27
27
  should "build correct definition of Gtk::Widget.show" do
28
28
  go = get_method_introspection_data 'Gtk', 'Widget', 'show'
29
- fbuilder = GirFFI::FunctionDefinitionBuilder.new go, Lib
29
+ fbuilder = GirFFI::Builder::Function.new go, Lib
30
30
  code = fbuilder.generate
31
31
 
32
32
  expected = "
@@ -38,95 +38,78 @@ class FunctionDefinitionBuilderTest < Test::Unit::TestCase
38
38
  assert_equal cws(expected), cws(code)
39
39
  end
40
40
 
41
- should "build correct definition of GObject.signal_connect_data" do
42
- go = get_function_introspection_data 'GObject', 'signal_connect_data'
43
- fbuilder = GirFFI::FunctionDefinitionBuilder.new go, Lib
41
+ should "build correct definition of Regress.test_callback_destroy_notify" do
42
+ go = get_function_introspection_data 'Regress', 'test_callback_destroy_notify'
43
+ fbuilder = GirFFI::Builder::Function.new go, Lib
44
44
  code = fbuilder.generate
45
45
 
46
46
  expected =
47
- "def signal_connect_data instance, detailed_signal, c_handler, data, destroy_data, connect_flags
48
- _v1 = GirFFI::ArgHelper.object_to_inptr instance
49
- _v2 = GirFFI::ArgHelper.utf8_to_inptr detailed_signal
50
- _v3 = GirFFI::ArgHelper.wrap_in_callback_args_mapper \"GObject\", \"Callback\", c_handler
47
+ "def test_callback_destroy_notify callback, user_data, notify
48
+ _v1 = GirFFI::ArgHelper.wrap_in_callback_args_mapper \"Regress\", \"TestCallbackUserData\", callback
49
+ ::Lib::CALLBACKS << _v1
50
+ _v2 = GirFFI::ArgHelper.object_to_inptr user_data
51
+ _v3 = GirFFI::ArgHelper.wrap_in_callback_args_mapper \"GLib\", \"DestroyNotify\", notify
51
52
  ::Lib::CALLBACKS << _v3
52
- _v4 = GirFFI::ArgHelper.object_to_inptr data
53
- _v5 = GirFFI::ArgHelper.wrap_in_callback_args_mapper \"GObject\", \"ClosureNotify\", destroy_data
54
- ::Lib::CALLBACKS << _v5
55
- _v6 = connect_flags
56
- _v7 = ::Lib.g_signal_connect_data _v1, _v2, _v3, _v4, _v5, _v6
57
- return _v7
53
+ _v4 = ::Lib.regress_test_callback_destroy_notify _v1, _v2, _v3
54
+ return _v4
58
55
  end"
59
56
 
60
57
  assert_equal cws(expected), cws(code)
61
58
  end
62
59
 
63
- should "build correct definition of Everything::TestObj#new_from_file" do
64
- go = get_method_introspection_data 'Everything', 'TestObj', 'new_from_file'
65
- fbuilder = GirFFI::FunctionDefinitionBuilder.new go, Lib
60
+ should "build correct definition of Regress::TestObj#new_from_file" do
61
+ go = get_method_introspection_data 'Regress', 'TestObj', 'new_from_file'
62
+ fbuilder = GirFFI::Builder::Function.new go, Lib
66
63
  code = fbuilder.generate
67
64
 
68
65
  expected =
69
66
  "def new_from_file x
70
67
  _v1 = GirFFI::ArgHelper.utf8_to_inptr x
71
68
  _v4 = FFI::MemoryPointer.new(:pointer).write_pointer nil
72
- _v2 = ::Lib.test_obj_new_from_file _v1, _v4
69
+ _v2 = ::Lib.regress_test_obj_new_from_file _v1, _v4
73
70
  GirFFI::ArgHelper.check_error(_v4)
74
- _v3 = ::Everything::TestObj.wrap(_v2)
71
+ _v3 = ::Regress::TestObj.constructor_wrap(_v2)
75
72
  return _v3
76
73
  end"
77
74
 
78
75
  assert_equal cws(expected), cws(code)
79
76
  end
80
77
 
81
- should "build correct definition of Everything:test_array_int_null_in" do
82
- go = get_function_introspection_data 'Everything', 'test_array_int_null_in'
83
- fbuilder = GirFFI::FunctionDefinitionBuilder.new go, Lib
78
+ should "build correct definition of Regress:test_array_int_null_in" do
79
+ go = get_function_introspection_data 'Regress', 'test_array_int_null_in'
80
+ fbuilder = GirFFI::Builder::Function.new go, Lib
84
81
  code = fbuilder.generate
85
82
 
86
83
  expected =
87
84
  "def test_array_int_null_in arr
88
- _v1 = GirFFI::ArgHelper.int_array_to_inptr arr
85
+ _v1 = GirFFI::ArgHelper.gint32_array_to_inptr arr
89
86
  len = arr.nil? ? 0 : arr.length
90
87
  _v2 = len
91
- ::Lib.test_array_int_null_in _v1, _v2
88
+ ::Lib.regress_test_array_int_null_in _v1, _v2
92
89
  GirFFI::ArgHelper.cleanup_ptr _v1
93
90
  end"
94
91
 
95
92
  assert_equal cws(expected), cws(code)
96
93
  end
97
94
 
98
- should "build correct definition of Everything:test_array_int_null_out" do
99
- go = get_function_introspection_data 'Everything', 'test_array_int_null_out'
100
- fbuilder = GirFFI::FunctionDefinitionBuilder.new go, Lib
95
+ should "build correct definition of Regress:test_array_int_null_out" do
96
+ go = get_function_introspection_data 'Regress', 'test_array_int_null_out'
97
+ fbuilder = GirFFI::Builder::Function.new go, Lib
101
98
  code = fbuilder.generate
102
99
 
103
100
  expected =
104
101
  "def test_array_int_null_out
105
102
  _v1 = GirFFI::ArgHelper.pointer_outptr
106
- _v3 = GirFFI::ArgHelper.int_outptr
107
- ::Lib.test_array_int_null_out _v1, _v3
108
- _v4 = GirFFI::ArgHelper.outptr_to_int _v3
103
+ _v3 = GirFFI::ArgHelper.gint32_outptr
104
+ ::Lib.regress_test_array_int_null_out _v1, _v3
105
+ _v4 = GirFFI::ArgHelper.outptr_to_gint32 _v3
109
106
  GirFFI::ArgHelper.cleanup_ptr _v3
110
- _v2 = GirFFI::ArgHelper.outptr_to_int_array _v1, _v4
107
+ _v2 = GirFFI::ArgHelper.outptr_to_gint32_array _v1, _v4
111
108
  GirFFI::ArgHelper.cleanup_ptr_ptr _v1
112
109
  return _v2
113
110
  end"
114
111
 
115
112
  assert_equal cws(expected), cws(code)
116
113
  end
117
-
118
- should "build correct definition of Everything:test_utf8_nonconst_in" do
119
- go = get_function_introspection_data 'Everything', 'test_utf8_nonconst_in'
120
- fbuilder = GirFFI::FunctionDefinitionBuilder.new go, Lib
121
- code = fbuilder.generate
122
-
123
- expected =
124
- "def test_utf8_nonconst_in in_
125
- _v1 = GirFFI::ArgHelper.utf8_to_inptr in_
126
- ::Lib.test_utf8_nonconst_in _v1
127
- end"
128
-
129
- assert_equal cws(expected), cws(code)
130
- end
131
114
  end
132
115
  end
@@ -4,43 +4,45 @@ class GObjectOverridesTest < Test::Unit::TestCase
4
4
  context "In the GObject module with overridden functions" do
5
5
  setup do
6
6
  GirFFI.setup :GObject
7
- GirFFI.setup :Everything
7
+ GirFFI.setup :Regress
8
8
  GirFFI.setup :Gio
9
9
  end
10
10
 
11
- context "the wrap_in_g_value function" do
12
- should "wrap a boolean false" do
13
- gv = GObject.wrap_in_g_value false
14
- assert_instance_of GObject::Value, gv
15
- assert_equal false, gv.get_boolean
11
+ context "the Value class" do
12
+ context "the wrap_ruby_value class method" do
13
+ should "wrap a boolean false" do
14
+ gv = GObject::Value.wrap_ruby_value false
15
+ assert_instance_of GObject::Value, gv
16
+ assert_equal false, gv.get_boolean
17
+ end
18
+
19
+ should "wrap a boolean true" do
20
+ gv = GObject::Value.wrap_ruby_value true
21
+ assert_instance_of GObject::Value, gv
22
+ assert_equal true, gv.get_boolean
23
+ end
16
24
  end
17
25
 
18
- should "wrap a boolean true" do
19
- gv = GObject.wrap_in_g_value true
20
- assert_instance_of GObject::Value, gv
21
- assert_equal true, gv.get_boolean
22
- end
23
- end
24
-
25
- context "the unwrap_g_value function" do
26
- should "unwrap a boolean false" do
27
- gv = GObject.wrap_in_g_value false
28
- result = GObject.unwrap_g_value gv
29
- assert_equal false, result
30
- end
31
-
32
- should "unwrap a boolean true" do
33
- gv = GObject.wrap_in_g_value true
34
- result = GObject.unwrap_g_value gv
35
- assert_equal true, result
26
+ context "the ruby_value method" do
27
+ should "unwrap a boolean false" do
28
+ gv = GObject::Value.wrap_ruby_value false
29
+ result = gv.ruby_value
30
+ assert_equal false, result
31
+ end
32
+
33
+ should "unwrap a boolean true" do
34
+ gv = GObject::Value.wrap_ruby_value true
35
+ result = gv.ruby_value
36
+ assert_equal true, result
37
+ end
36
38
  end
37
39
  end
38
40
 
39
41
  context "the signal_emit function" do
40
42
  should "emit a signal" do
41
43
  a = 1
42
- o = Everything::TestSubObj.new
43
- GObject.signal_connect_data o, "test", Proc.new { a = 2 }, nil, nil, 0
44
+ o = Regress::TestSubObj.new
45
+ ::GObject::Lib.g_signal_connect_data o, "test", Proc.new { a = 2 }, nil, nil, 0
44
46
  GObject.signal_emit o, "test"
45
47
  assert_equal 2, a
46
48
  end
@@ -50,14 +52,14 @@ class GObjectOverridesTest < Test::Unit::TestCase
50
52
 
51
53
  argtypes = [:pointer, :pointer, :pointer, :pointer]
52
54
  callback = FFI::Function.new(:bool, argtypes) { |a,b,c,d| true }
53
- GObject.signal_connect_data s, "incoming", callback, nil, nil, 0
55
+ ::GObject::Lib.g_signal_connect_data s, "incoming", callback, nil, nil, 0
54
56
  rv = GObject.signal_emit s, "incoming"
55
57
  assert_equal true, rv.get_boolean
56
58
  end
57
59
 
58
60
  should "pass in extra arguments" do
59
- o = Everything::TestSubObj.new
60
- sb = Everything::TestSimpleBoxedA.new
61
+ o = Regress::TestSubObj.new
62
+ sb = Regress::TestSimpleBoxedA.new
61
63
  sb[:some_int8] = 31
62
64
  sb[:some_double] = 2.42
63
65
  sb[:some_enum] = :value2
@@ -67,10 +69,10 @@ class GObjectOverridesTest < Test::Unit::TestCase
67
69
  callback = FFI::Function.new(:void, argtypes) do |a,b,c|
68
70
  b2 = b
69
71
  end
70
- GObject.signal_connect_data o, "test-with-static-scope-arg", callback, nil, nil, 0
72
+ ::GObject::Lib.g_signal_connect_data o, "test-with-static-scope-arg", callback, nil, nil, 0
71
73
  GObject.signal_emit o, "test-with-static-scope-arg", sb
72
74
 
73
- sb2 = Everything::TestSimpleBoxedA.wrap b2
75
+ sb2 = Regress::TestSimpleBoxedA.wrap b2
74
76
  assert sb.equals(sb2)
75
77
  end
76
78
  end
@@ -78,7 +80,7 @@ class GObjectOverridesTest < Test::Unit::TestCase
78
80
  context "the signal_connect function" do
79
81
  should "install a signal handler" do
80
82
  a = 1
81
- o = Everything::TestSubObj.new
83
+ o = Regress::TestSubObj.new
82
84
  GObject.signal_connect(o, "test") { a = 2 }
83
85
  GObject.signal_emit o, "test"
84
86
  assert_equal 2, a
@@ -86,23 +88,23 @@ class GObjectOverridesTest < Test::Unit::TestCase
86
88
 
87
89
  should "pass user data to handler" do
88
90
  a = 1
89
- o = Everything::TestSubObj.new
91
+ o = Regress::TestSubObj.new
90
92
  GObject.signal_connect(o, "test", 2) { |i, d| a = d }
91
93
  GObject.signal_emit o, "test"
92
94
  assert_equal 2, a
93
95
  end
94
96
 
95
97
  should "pass object to handler" do
96
- o = Everything::TestSubObj.new
98
+ o = Regress::TestSubObj.new
97
99
  o2 = nil
98
100
  GObject.signal_connect(o, "test") { |i, d| o2 = i }
99
101
  GObject.signal_emit o, "test"
100
- assert_instance_of Everything::TestSubObj, o2
102
+ assert_instance_of Regress::TestSubObj, o2
101
103
  assert_equal o.to_ptr, o2.to_ptr
102
104
  end
103
105
 
104
106
  should "not allow connecting an invalid signal" do
105
- o = Everything::TestSubObj.new
107
+ o = Regress::TestSubObj.new
106
108
  assert_raises RuntimeError do
107
109
  GObject.signal_connect(o, "not-really-a-signal") {}
108
110
  end
@@ -116,7 +118,7 @@ class GObjectOverridesTest < Test::Unit::TestCase
116
118
  end
117
119
 
118
120
  should "require a block" do
119
- o = Everything::TestSubObj.new
121
+ o = Regress::TestSubObj.new
120
122
  assert_raises ArgumentError do
121
123
  GObject.signal_connect o, "test"
122
124
  end
@@ -127,8 +129,8 @@ class GObjectOverridesTest < Test::Unit::TestCase
127
129
  @a = nil
128
130
  @b = 2
129
131
 
130
- o = Everything::TestSubObj.new
131
- sb = Everything::TestSimpleBoxedA.new
132
+ o = Regress::TestSubObj.new
133
+ sb = Regress::TestSimpleBoxedA.new
132
134
  sb[:some_int] = 23
133
135
 
134
136
  GObject.signal_connect(o, "test-with-static-scope-arg", 2) { |i, object, d|
@@ -143,7 +145,7 @@ class GObjectOverridesTest < Test::Unit::TestCase
143
145
  end
144
146
 
145
147
  should "pass on the extra arguments" do
146
- assert_instance_of Everything::TestSimpleBoxedA, @b
148
+ assert_instance_of Regress::TestSimpleBoxedA, @b
147
149
  assert_equal 23, @b[:some_int]
148
150
  end
149
151
  end
@@ -154,8 +156,8 @@ class GObjectOverridesTest < Test::Unit::TestCase
154
156
  context "#signal_arguments_to_gvalue_array" do
155
157
  context "the result of wrapping test-with-static-scope-arg" do
156
158
  setup do
157
- o = Everything::TestSubObj.new
158
- b = Everything::TestSimpleBoxedA.new
159
+ o = Regress::TestSubObj.new
160
+ b = Regress::TestSimpleBoxedA.new
159
161
 
160
162
  @gva =
161
163
  GirFFI::Overrides::GObject::Helper.signal_arguments_to_gvalue_array(
@@ -171,11 +173,11 @@ class GObjectOverridesTest < Test::Unit::TestCase
171
173
  end
172
174
 
173
175
  should "have a first value with GType for TestSubObj" do
174
- assert_equal Everything::TestSubObj.get_gtype, (@gva.get_nth 0)[:g_type]
176
+ assert_equal Regress::TestSubObj.get_gtype, (@gva.get_nth 0)[:g_type]
175
177
  end
176
178
 
177
179
  should "have a second value with GType for TestSimpleBoxedA" do
178
- assert_equal Everything::TestSimpleBoxedA.get_gtype, (@gva.get_nth 1)[:g_type]
180
+ assert_equal Regress::TestSimpleBoxedA.get_gtype, (@gva.get_nth 1)[:g_type]
179
181
  end
180
182
  end
181
183
  end
@@ -184,8 +186,8 @@ class GObjectOverridesTest < Test::Unit::TestCase
184
186
  context "the result of casting pointers for the test-with-static-scope-arg signal" do
185
187
  setup do
186
188
  sig_name = "test-with-static-scope-arg"
187
- o = Everything::TestSubObj.new
188
- b = Everything::TestSimpleBoxedA.new
189
+ o = Regress::TestSubObj.new
190
+ b = Regress::TestSimpleBoxedA.new
189
191
  ud = GirFFI::ArgHelper.object_to_inptr "Hello!"
190
192
  sig = o.class.gir_ffi_builder.find_signal sig_name
191
193
 
@@ -200,13 +202,13 @@ class GObjectOverridesTest < Test::Unit::TestCase
200
202
 
201
203
  context "its first value" do
202
204
  should "be a TestSubObj" do
203
- assert_instance_of Everything::TestSubObj, @gva[0]
205
+ assert_instance_of Regress::TestSubObj, @gva[0]
204
206
  end
205
207
  end
206
208
 
207
209
  context "its second value" do
208
210
  should "be a TestSimpleBoxedA" do
209
- assert_instance_of Everything::TestSimpleBoxedA, @gva[1]
211
+ assert_instance_of Regress::TestSimpleBoxedA, @gva[1]
210
212
  end
211
213
  end
212
214
 
@@ -218,6 +220,59 @@ class GObjectOverridesTest < Test::Unit::TestCase
218
220
  end
219
221
  end
220
222
  end
223
+
224
+ context "The RubyClosure class" do
225
+ should "have a constructor with a block argument" do
226
+ assert_raises ArgumentError do
227
+ GObject::RubyClosure.new
228
+ end
229
+ end
230
+
231
+ should "be a kind of Closure" do
232
+ c = GObject::RubyClosure.new {}
233
+ assert_kind_of GObject::Closure, c
234
+ end
235
+
236
+ should "be able to retrieve its block from its struct" do
237
+ a = 0
238
+ c = GObject::RubyClosure.new { a = 2 }
239
+ c2 = GObject::RubyClosure.wrap(c.to_ptr)
240
+ c2.block.call
241
+ assert_equal 2, a
242
+ end
243
+
244
+ context "its #marshaller singleton method" do
245
+ should "invoke its closure argument's block" do
246
+ a = 0
247
+ c = GObject::RubyClosure.new { a = 2 }
248
+ GObject::RubyClosure.marshaller(c, nil, 0, nil, nil, nil)
249
+ assert_equal 2, a
250
+ end
251
+
252
+ should "work when its closure argument is a GObject::Closure" do
253
+ a = 0
254
+ c = GObject::RubyClosure.new { a = 2 }
255
+ c2 = GObject::Closure.wrap(c.to_ptr)
256
+ GObject::RubyClosure.marshaller(c2, nil, 0, nil, nil, nil)
257
+ assert_equal 2, a
258
+ end
259
+
260
+ should "store the closure's return value in the proper gvalue" do
261
+ c = GObject::RubyClosure.new { 2 }
262
+ gv = GObject::Value.new
263
+ GObject::RubyClosure.marshaller(c, gv, 0, nil, nil, nil)
264
+ assert_equal 2, gv.ruby_value
265
+ end
266
+ end
267
+
268
+ should "have GObject::Closure#invoke call its block" do
269
+ a = 0
270
+ c = GObject::RubyClosure.new { a = 2 }
271
+ c2 = GObject::Closure.wrap(c.to_ptr)
272
+ c2.invoke nil, nil, nil
273
+ assert_equal 2, a
274
+ end
275
+ end
221
276
  end
222
277
  end
223
278