gir_ffi 0.0.3 → 0.0.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 (52) hide show
  1. data/DESIGN.rdoc +9 -0
  2. data/History.txt +11 -0
  3. data/TODO.rdoc +6 -9
  4. data/examples/01_empty_window.rb +1 -1
  5. data/examples/02_hello_world.rb +4 -4
  6. data/examples/03_upgraded_hello_world.rb +7 -8
  7. data/lib/gir_ffi.rb +0 -4
  8. data/lib/gir_ffi/arg_helper.rb +27 -2
  9. data/lib/gir_ffi/builder.rb +13 -86
  10. data/lib/gir_ffi/builder_helper.rb +2 -15
  11. data/lib/gir_ffi/class_base.rb +51 -0
  12. data/lib/gir_ffi/class_builder.rb +178 -52
  13. data/lib/gir_ffi/function_definition_builder.rb +46 -9
  14. data/lib/gir_ffi/g_object.rb +37 -0
  15. data/lib/gir_ffi/i_arg_info.rb +27 -9
  16. data/lib/gir_ffi/i_base_info.rb +12 -4
  17. data/lib/gir_ffi/i_callable_info.rb +15 -5
  18. data/lib/gir_ffi/i_enum_info.rb +9 -3
  19. data/lib/gir_ffi/i_field_info.rb +12 -4
  20. data/lib/gir_ffi/i_function_info.rb +24 -8
  21. data/lib/gir_ffi/i_object_info.rb +63 -21
  22. data/lib/gir_ffi/i_registered_type_info.rb +11 -0
  23. data/lib/gir_ffi/i_repository.rb +2 -2
  24. data/lib/gir_ffi/i_signal_info.rb +1 -1
  25. data/lib/gir_ffi/i_struct_info.rb +24 -8
  26. data/lib/gir_ffi/i_type_info.rb +24 -8
  27. data/lib/gir_ffi/i_union_info.rb +15 -0
  28. data/lib/gir_ffi/i_value_info.rb +3 -1
  29. data/lib/gir_ffi/i_vfunc_info.rb +12 -1
  30. data/lib/gir_ffi/lib.rb +23 -1
  31. data/lib/gir_ffi/lib_c.rb +1 -1
  32. data/lib/gir_ffi/module_base.rb +19 -0
  33. data/lib/gir_ffi/module_builder.rb +67 -20
  34. data/lib/gir_ffi/overrides/gobject.rb +174 -0
  35. data/lib/gir_ffi/overrides/gtk.rb +26 -9
  36. data/test/builder_test.rb +57 -37
  37. data/test/{base_test.rb → class_base_test.rb} +3 -3
  38. data/test/class_builder_test.rb +48 -6
  39. data/test/everything_test.rb +285 -36
  40. data/test/function_definition_builder_test.rb +11 -9
  41. data/test/g_object_test.rb +22 -0
  42. data/test/gobject_overrides_test.rb +216 -0
  43. data/test/i_object_info_test.rb +21 -0
  44. data/test/module_builder_test.rb +54 -0
  45. data/test/test_helper.rb +6 -4
  46. metadata +18 -14
  47. data/lib/gir_ffi/base.rb +0 -25
  48. data/lib/gir_ffi/constructor_definition_builder.rb +0 -20
  49. data/lib/gir_ffi/g_type.rb +0 -14
  50. data/lib/gir_ffi/method_missing_definition_builder.rb +0 -59
  51. data/test/constructor_definition_builder_test.rb +0 -19
  52. data/test/g_type_test.rb +0 -22
@@ -1,10 +1,10 @@
1
1
  require File.expand_path('test_helper.rb', File.dirname(__FILE__))
2
- require 'gir_ffi/base'
2
+ require 'gir_ffi/class_base'
3
3
 
4
- class BaseTest < Test::Unit::TestCase
4
+ class ClassBaseTest < Test::Unit::TestCase
5
5
  context "A class derived from GirFFI::Base" do
6
6
  setup do
7
- @klass = Class.new(GirFFI::Base) do
7
+ @klass = Class.new(GirFFI::ClassBase) do
8
8
  # Boilerplate to make regular #new work again.
9
9
  def initialize; end
10
10
  def self.new; self._real_new; end
@@ -3,21 +3,63 @@ require 'gir_ffi'
3
3
 
4
4
  class ClassBuilderTest < Test::Unit::TestCase
5
5
  context "The ClassBuilder" do
6
- setup do
6
+ should "use parent struct as default layout" do
7
7
  @gir = GirFFI::IRepository.default
8
8
  @gir.require 'GObject', nil
9
- end
10
- should "use parent struct as default layout" do
11
- @classbuilder = GirFFI::ClassBuilder.new 'Foo', 'Bar'
9
+
12
10
  stub(info = Object.new).parent { @gir.find_by_name 'GObject', 'Object' }
13
11
  stub(info).fields { [] }
12
+ stub(info).type { :object }
13
+
14
+ @classbuilder = GirFFI::ClassBuilder.new 'Foo', 'Bar'
14
15
  @classbuilder.instance_eval { @info = info }
15
- @classbuilder.instance_eval { @parent = info.parent }
16
- @classbuilder.instance_eval { @superclass = GObject::Object }
17
16
 
18
17
  spec = @classbuilder.send :layout_specification
19
18
  assert_equal [:parent, GObject::Object::Struct, 0], spec
20
19
  end
20
+
21
+ context "for Gtk::Widget" do
22
+ setup do
23
+ @cbuilder = GirFFI::ClassBuilder.new 'Gtk', 'Widget'
24
+ end
25
+
26
+ context "looking at Gtk::Widget#show" do
27
+ setup do
28
+ @go = get_method_introspection_data 'Gtk', 'Widget', 'show'
29
+ end
30
+
31
+ should "delegate definition to FunctionDefinitionBuilder" do
32
+ code = @cbuilder.send :function_definition, @go
33
+ expected = GirFFI::FunctionDefinitionBuilder.new(@go, Gtk::Lib).generate
34
+ assert_equal cws(expected), cws(code)
35
+ end
36
+
37
+ end
38
+ end
39
+
40
+ context 'the find_signal method' do
41
+ should 'find the signal "test" for TestObj' do
42
+ builder = GirFFI::ClassBuilder.new 'Everything', 'TestObj'
43
+ sig = builder.find_signal 'test'
44
+ assert_equal 'test', sig.name
45
+ end
46
+
47
+ should 'find the signal "test" for TestSubObj' do
48
+ builder = GirFFI::ClassBuilder.new 'Everything', 'TestSubObj'
49
+ sig = builder.find_signal 'test'
50
+ assert_equal 'test', sig.name
51
+ end
52
+ end
53
+
54
+ context "for GObject::TypeCValue (a union)" do
55
+ setup do
56
+ @cbuilder = GirFFI::ClassBuilder.new 'GObject', 'TypeCValue'
57
+ end
58
+
59
+ should "not raise an error looking for a method that doesn't exist" do
60
+ assert_nothing_raised { @cbuilder.setup_instance_method 'blub' }
61
+ end
62
+ end
21
63
  end
22
64
  end
23
65
 
@@ -1,34 +1,19 @@
1
1
  require File.expand_path('test_helper.rb', File.dirname(__FILE__))
2
2
  require 'gir_ffi'
3
3
 
4
- GirFFI.setup :Everything
5
-
6
4
  # Tests generated methods and functions in the Everything namespace.
7
5
  class EverythingTest < Test::Unit::TestCase
8
- context "The generated Everything module" do
9
- should "have correct test_boolean" do
10
- assert_equal false, Everything.test_boolean(false)
11
- assert_equal true, Everything.test_boolean(true)
12
- end
13
-
14
- should "have correct test_callback_user_data" do
15
- a = :foo
16
- result = Everything.test_callback_user_data Proc.new {|u|
17
- a = u
18
- 5
19
- }, :bar
20
- assert_equal :bar, a
21
- assert_equal 5, result
22
- end
6
+ def ref_count object
7
+ GObject::Object::Struct.new(object.to_ptr)[:ref_count]
8
+ end
23
9
 
24
- should "have correct test_gtype" do
25
- result = Everything.test_gtype 23
26
- assert_equal 23, result
27
- end
10
+ def is_floating? object
11
+ (GObject::Object::Struct.new(object.to_ptr)[:qdata].address & 2) == 2
12
+ end
28
13
 
29
- should "have correct test_value_return" do
30
- result = Everything.test_value_return 3423
31
- assert_equal 3423, result.get_int
14
+ context "The generated Everything module" do
15
+ setup do
16
+ GirFFI.setup :Everything
32
17
  end
33
18
 
34
19
  context "the Everything::TestBoxed class" do
@@ -37,33 +22,56 @@ class EverythingTest < Test::Unit::TestCase
37
22
  assert_instance_of Everything::TestBoxed, tb
38
23
  end
39
24
 
40
- should "allow creating an instance using alternative constructors" do
25
+ should "create an instance using #new_alternative_constructor1" do
41
26
  tb = Everything::TestBoxed.new_alternative_constructor1 1
42
27
  assert_instance_of Everything::TestBoxed, tb
43
28
  assert_equal 1, tb[:some_int8]
29
+ end
44
30
 
31
+ should "create an instance using #new_alternative_constructor2" do
45
32
  tb = Everything::TestBoxed.new_alternative_constructor2 1, 2
46
33
  assert_instance_of Everything::TestBoxed, tb
47
34
  assert_equal 1 + 2, tb[:some_int8]
35
+ end
48
36
 
37
+ should "create an instance using #new_alternative_constructor3" do
49
38
  tb = Everything::TestBoxed.new_alternative_constructor3 "54"
50
39
  assert_instance_of Everything::TestBoxed, tb
51
40
  assert_equal 54, tb[:some_int8]
52
41
  end
53
42
 
54
- should "have a working equals method" do
55
- tb = Everything::TestBoxed.new_alternative_constructor1 123
56
- tb2 = Everything::TestBoxed.new_alternative_constructor2 120, 3
57
- assert_equal true, tb.equals(tb2)
43
+ should "have non-zero result for #get_gtype" do
44
+ assert Everything::TestBoxed.get_gtype > 0
58
45
  end
59
46
 
60
- should "have a working copy method" do
61
- tb = Everything::TestBoxed.new_alternative_constructor1 123
62
- tb2 = tb.copy
63
- assert_instance_of Everything::TestBoxed, tb2
64
- assert_equal 123, tb2[:some_int8], "fields copied"
65
- tb2[:some_int8] = 89
66
- assert_equal 123, tb[:some_int8], "is a true copy"
47
+ context "an instance" do
48
+ setup do
49
+ @tb = Everything::TestBoxed.new_alternative_constructor1 123
50
+ end
51
+
52
+ should "have a working equals method" do
53
+ tb2 = Everything::TestBoxed.new_alternative_constructor2 120, 3
54
+ assert_equal true, @tb.equals(tb2)
55
+ end
56
+
57
+ context "its copy method" do
58
+ setup do
59
+ @tb2 = @tb.copy
60
+ end
61
+
62
+ should "return an instance of TestBoxed" do
63
+ assert_instance_of Everything::TestBoxed, @tb2
64
+ end
65
+
66
+ should "copy fields" do
67
+ assert_equal 123, @tb2[:some_int8]
68
+ end
69
+
70
+ should "create a true copy" do
71
+ @tb[:some_int8] = 89
72
+ assert_equal 123, @tb2[:some_int8]
73
+ end
74
+ end
67
75
  end
68
76
  end
69
77
 
@@ -73,6 +81,247 @@ class EverythingTest < Test::Unit::TestCase
73
81
  end
74
82
  end
75
83
 
84
+ # TestFlags
85
+
86
+ context "the Everything::TestFloating class" do
87
+ context "an instance" do
88
+ setup do
89
+ @o = Everything::TestFloating.new
90
+ end
91
+
92
+ should "have a reference count of 1" do
93
+ assert_equal 1, ref_count(@o)
94
+ end
95
+
96
+ should "have been sunk" do
97
+ assert !is_floating?(@o)
98
+ end
99
+ end
100
+ end
101
+
102
+ context "the Everything::TestObj class" do
103
+ should "create an instance using #new_from_file" do
104
+ o = Everything::TestObj.new_from_file("foo")
105
+ assert_instance_of Everything::TestObj, o
106
+ end
107
+
108
+ should "create an instance using #new_callback" do
109
+ o = Everything::TestObj.new_callback Proc.new { }, nil, nil
110
+ assert_instance_of Everything::TestObj, o
111
+ end
112
+
113
+ should "have a working #static_method" do
114
+ rv = Everything::TestObj.static_method 623
115
+ assert_equal 623.0, rv
116
+ end
117
+
118
+ should "have a working #static_method_callback" do
119
+ a = 1
120
+ Everything::TestObj.static_method_callback Proc.new { a = 2 }
121
+ assert_equal 2, a
122
+ end
123
+
124
+ context "an instance" do
125
+ setup do
126
+ @o = Everything::TestObj.new_from_file("foo")
127
+ end
128
+
129
+ should "have a reference count of 1" do
130
+ assert_equal 1, ref_count(@o)
131
+ end
132
+
133
+ should "not float" do
134
+ assert !is_floating?(@o)
135
+ end
136
+
137
+ should "have a working (virtual) #matrix method" do
138
+ rv = @o.matrix "bar"
139
+ assert_equal 42, rv
140
+ end
141
+
142
+ should "have a working #set_bare method" do
143
+ obj = Everything::TestObj.new_from_file("bar")
144
+ rv = @o.set_bare obj
145
+ # TODO: What is the correct value to retrieve from the fields?
146
+ assert_equal obj.to_ptr, @o[:bare]
147
+ end
148
+
149
+ should "have a working #instance_method method" do
150
+ rv = @o.instance_method
151
+ assert_equal(-1, rv)
152
+ end
153
+
154
+ should "have a working #torture_signature_0 method" do
155
+ y, z, q = @o.torture_signature_0(-21, "hello", 13)
156
+ assert_equal [-21, 2 * -21, "hello".length + 13],
157
+ [y, z, q]
158
+ end
159
+
160
+ context "its #torture_signature_1 method" do
161
+ should "work for m even" do
162
+ ret, y, z, q = @o.torture_signature_1(-21, "hello", 12)
163
+ assert_equal [true, -21, 2 * -21, "hello".length + 12],
164
+ [ret, y, z, q]
165
+ end
166
+
167
+ should "throw an exception for m odd" do
168
+ assert_raises RuntimeError do
169
+ @o.torture_signature_1(-21, "hello", 11)
170
+ end
171
+ end
172
+ end
173
+
174
+ should "have a working #instance_method_callback method" do
175
+ a = 1
176
+ @o.instance_method_callback Proc.new { a = 2 }
177
+ assert_equal 2, a
178
+ end
179
+ end
180
+ end
181
+
182
+ context "the Everything::TestSimpleBoxedA class" do
183
+ should "create an instance using #new" do
184
+ obj = Everything::TestSimpleBoxedA.new
185
+ assert_instance_of Everything::TestSimpleBoxedA, obj
186
+ end
187
+
188
+ context "an instance" do
189
+ setup do
190
+ @obj = Everything::TestSimpleBoxedA.new
191
+ @obj[:some_int] = 4236
192
+ @obj[:some_int8] = 36
193
+ @obj[:some_double] = 23.53
194
+ @obj[:some_enum] = :value2
195
+ end
196
+
197
+ context "its equals method" do
198
+ setup do
199
+ @ob2 = Everything::TestSimpleBoxedA.new
200
+ @ob2[:some_int] = 4236
201
+ @ob2[:some_int8] = 36
202
+ @ob2[:some_double] = 23.53
203
+ @ob2[:some_enum] = :value2
204
+ end
205
+
206
+ should "return true if values are the same" do
207
+ assert_equal true, @obj.equals(@ob2)
208
+ end
209
+
210
+ should "return true if enum values differ" do
211
+ @ob2[:some_enum] = :value3
212
+ assert_equal true, @obj.equals(@ob2)
213
+ end
214
+
215
+ should "return false if other values differ" do
216
+ @ob2[:some_int] = 1
217
+ assert_equal false, @obj.equals(@ob2)
218
+ end
219
+ end
220
+
221
+ context "its copy method" do
222
+ setup do
223
+ @ob2 = @obj.copy
224
+ end
225
+
226
+ should "return an instance of TestSimpleBoxedA" do
227
+ assert_instance_of Everything::TestSimpleBoxedA, @ob2
228
+ end
229
+
230
+ should "copy fields" do
231
+ assert_equal 4236, @ob2[:some_int]
232
+ assert_equal 36, @ob2[:some_int8]
233
+ assert_equal 23.53, @ob2[:some_double]
234
+ assert_equal :value2, @ob2[:some_enum]
235
+ end
236
+
237
+ should "create a true copy" do
238
+ @obj[:some_int8] = 89
239
+ assert_equal 36, @ob2[:some_int8]
240
+ end
241
+ end
242
+ end
243
+ end
244
+
245
+ context "the Everything::TestStructA class" do
246
+ context "an instance" do
247
+ should "have a working clone method" do
248
+ a = Everything::TestStructA.new
249
+ a[:some_int] = 2556
250
+ a[:some_int8] = -10
251
+ a[:some_double] = 1.03455e20
252
+ a[:some_enum] = :value2
253
+
254
+ b = a.clone
255
+
256
+ assert_equal 2556, b[:some_int]
257
+ assert_equal(-10, b[:some_int8])
258
+ assert_equal 1.03455e20, b[:some_double]
259
+ assert_equal :value2, b[:some_enum]
260
+ end
261
+ end
262
+ end
263
+
264
+ # TestStructB
265
+ # TestStructC
266
+ # TestSubObj
267
+
268
+ context "the Everything::TestWi8021x class" do
269
+ should "create an instance using #new" do
270
+ o = Everything::TestWi8021x.new
271
+ assert_instance_of Everything::TestWi8021x, o
272
+ end
273
+
274
+ context "an instance" do
275
+ setup do
276
+ @obj = Everything::TestWi8021x.new
277
+ end
278
+ should "set its boolean struct member with #set_testbool" do
279
+ @obj.set_testbool true
280
+ assert_equal 1, @obj[:testbool]
281
+ gv = GObject::Value.new
282
+ gv.init GObject.type_from_name "gboolean"
283
+ @obj.get_property "testbool", gv
284
+ assert_equal true, gv.get_boolean
285
+ end
286
+ end
287
+ end
288
+
289
+ should "have correct test_boolean" do
290
+ assert_equal false, Everything.test_boolean(false)
291
+ assert_equal true, Everything.test_boolean(true)
292
+ end
293
+
294
+ should "have correct test_callback" do
295
+ result = Everything.test_callback Proc.new { 5 }
296
+ assert_equal 5, result
297
+ end
298
+
299
+ context "the test_callback_user_data function" do
300
+ should "return the callbacks return value" do
301
+ result = Everything.test_callback_user_data Proc.new {|u| 5 }, nil
302
+ assert_equal 5, result
303
+ end
304
+
305
+ should "handle boolean user_data" do
306
+ a = false
307
+ result = Everything.test_callback_user_data Proc.new {|u|
308
+ a = u
309
+ 5
310
+ }, true
311
+ assert_equal true, a
312
+ end
313
+ end
314
+
315
+ should "have correct test_gtype" do
316
+ result = Everything.test_gtype 23
317
+ assert_equal 23, result
318
+ end
319
+
320
+ should "have correct test_value_return" do
321
+ result = Everything.test_value_return 3423
322
+ assert_equal 3423, result.get_int
323
+ end
324
+
76
325
  end
77
326
 
78
327
  end
@@ -12,7 +12,7 @@ class FunctionDefinitionBuilderTest < Test::Unit::TestCase
12
12
  def init argc, argv
13
13
  _v1 = GirFFI::ArgHelper.int_to_inoutptr argc
14
14
  _v3 = GirFFI::ArgHelper.string_array_to_inoutptr argv
15
- Lib.gtk_init _v1, _v3
15
+ ::Lib.gtk_init _v1, _v3
16
16
  _v2 = GirFFI::ArgHelper.outptr_to_int _v1
17
17
  _v4 = GirFFI::ArgHelper.outptr_to_string_array _v3, argv.nil? ? 0 : argv.size
18
18
  return _v2, _v4
@@ -29,7 +29,7 @@ class FunctionDefinitionBuilderTest < Test::Unit::TestCase
29
29
 
30
30
  expected = "
31
31
  def show
32
- Lib.gtk_widget_show self
32
+ ::Lib.gtk_widget_show self
33
33
  end
34
34
  "
35
35
 
@@ -45,11 +45,11 @@ class FunctionDefinitionBuilderTest < Test::Unit::TestCase
45
45
  "def signal_connect_data instance, detailed_signal, c_handler, data, destroy_data, connect_flags
46
46
  _v2 = GirFFI::ArgHelper.object_to_inptr instance
47
47
  _v3 = GirFFI::ArgHelper.mapped_callback_args c_handler
48
- Lib::CALLBACKS << _v3
48
+ ::Lib::CALLBACKS << _v3
49
49
  _v4 = GirFFI::ArgHelper.object_to_inptr data
50
50
  _v5 = GirFFI::ArgHelper.mapped_callback_args destroy_data
51
- Lib::CALLBACKS << _v5
52
- _v1 = Lib.g_signal_connect_data _v2, detailed_signal, _v3, _v4, _v5, connect_flags
51
+ ::Lib::CALLBACKS << _v5
52
+ _v1 = ::Lib.g_signal_connect_data _v2, detailed_signal, _v3, _v4, _v5, connect_flags
53
53
  return _v1
54
54
  end"
55
55
 
@@ -63,10 +63,12 @@ class FunctionDefinitionBuilderTest < Test::Unit::TestCase
63
63
 
64
64
  expected =
65
65
  "def new_from_file x
66
- _v2 = FFI::MemoryPointer.new(:pointer).write_pointer nil
67
- _v1 = Lib.test_obj_new_from_file x, _v2
68
- GirFFI::ArgHelper.check_error(_v2)
69
- return Everything::TestObj._real_new(_v1)
66
+ _v3 = FFI::MemoryPointer.new(:pointer).write_pointer nil
67
+ _v1 = ::Lib.test_obj_new_from_file x, _v3
68
+ GirFFI::ArgHelper.check_error(_v3)
69
+ _v2 = ::Everything::TestObj._real_new(_v1)
70
+ GirFFI::ArgHelper.sink_if_floating(_v2)
71
+ return _v2
70
72
  end"
71
73
 
72
74
  assert_equal cws(expected), cws(code)