gir_ffi 0.0.3 → 0.0.4

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