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.
@@ -2,8 +2,77 @@ module GirFFI
2
2
  module Overrides
3
3
  module GObject
4
4
 
5
- def self.included(base)
5
+ def self.included base
6
6
  base.extend ClassMethods
7
+ extend_classes(base)
8
+ attach_non_introspectable_functions(base)
9
+ build_extra_classes(base)
10
+ end
11
+
12
+ def self.extend_classes base
13
+ base::InitiallyUnowned.extend InitiallyUnownedClassMethods
14
+ base::Value.class_eval {
15
+ include ValueInstanceMethods
16
+ extend ValueClassMethods
17
+ }
18
+ base::Closure.class_eval {
19
+ include ClosureInstanceMethods
20
+ }
21
+ end
22
+
23
+ def self.attach_non_introspectable_functions base
24
+ base::Lib.attach_function :g_signal_connect_data,
25
+ [:pointer, :string, base::Callback, :pointer, base::ClosureNotify,
26
+ base::ConnectFlags],
27
+ :ulong
28
+ base::Lib.attach_function :g_closure_set_marshal,
29
+ [:pointer, base::ClosureMarshal], :void
30
+ end
31
+
32
+ def self.build_extra_classes base
33
+ klass = Class.new(base::Closure) do
34
+ const_set :BLOCK_STORE, {}
35
+
36
+ const_set :Struct, Class.new(FFI::Struct) {
37
+ layout :parent, base::Closure::Struct, 0,
38
+ :blockhash, :int64
39
+ }
40
+
41
+ def self.new &block
42
+ raise ArgumentError unless block_given?
43
+ wrap(new_simple(self::Struct.size, nil).to_ptr).tap do |it|
44
+ # XXX: Check that this methods is fool-proof!
45
+ h = block.hash
46
+ self::BLOCK_STORE[h] = block
47
+ it[:blockhash] = h
48
+ it.set_marshal Proc.new {|*args| marshaller(*args)}
49
+ end
50
+ end
51
+
52
+ def self.marshaller(closure, return_value, n_param_values,
53
+ param_values, invocation_hint, marshal_data)
54
+ rclosure = self.wrap(closure.to_ptr)
55
+
56
+ args = []
57
+ n_param_values.times {|i|
58
+ gv = ::GObject::Value.wrap(param_values.to_ptr +
59
+ i * ::GObject::Value::Struct.size)
60
+ args << gv.ruby_value
61
+ }
62
+
63
+ r = rclosure.invoke_block(*args)
64
+ return_value.set_ruby_value r unless return_value.nil?
65
+ end
66
+
67
+ def block
68
+ self.class::BLOCK_STORE[self[:blockhash]]
69
+ end
70
+
71
+ def invoke_block *args
72
+ block.call(*args)
73
+ end
74
+ end
75
+ base.const_set :RubyClosure, klass
7
76
  end
8
77
 
9
78
  module ClassMethods
@@ -18,29 +87,6 @@ module GirFFI
18
87
  type_from_instance_pointer instance.to_ptr
19
88
  end
20
89
 
21
- def wrap_in_g_value val
22
- gvalue = ::GObject::Value.new
23
- case val
24
- when true, false
25
- gvalue.init ::GObject.type_from_name("gboolean")
26
- gvalue.set_boolean val
27
- else
28
- nil
29
- end
30
- gvalue
31
- end
32
-
33
- def unwrap_g_value gvalue
34
- gtype = gvalue[:g_type]
35
- gtypename = ::GObject.type_name gtype
36
- case gtypename
37
- when "gboolean"
38
- gvalue.get_boolean
39
- else
40
- nil
41
- end
42
- end
43
-
44
90
  def signal_emit object, signal, *args
45
91
  type = type_from_instance object
46
92
  id = signal_lookup signal, type
@@ -64,12 +110,16 @@ module GirFFI
64
110
 
65
111
  rettype = GirFFI::Builder.itypeinfo_to_ffitype sig.return_type
66
112
 
113
+ # FIXME: Why are these all pointers?
67
114
  argtypes = [:pointer] + sig.args.map {|arg| :pointer} + [:pointer]
68
115
 
69
116
  callback = FFI::Function.new rettype, argtypes,
70
117
  &(Helper.signal_callback_args(sig, object.class, &block))
118
+ ::GObject::Lib::CALLBACKS << callback
119
+
120
+ data_ptr = GirFFI::ArgHelper.object_to_inptr data
71
121
 
72
- signal_connect_data object, signal, callback, data, nil, 0
122
+ ::GObject::Lib.g_signal_connect_data object, signal, callback, data_ptr, nil, 0
73
123
  end
74
124
  end
75
125
 
@@ -150,7 +200,7 @@ module GirFFI
150
200
  arg = args.shift
151
201
  if info.type.tag == :interface
152
202
  iface = info.type.interface
153
- kls = GirFFI::Builder.build_class(iface.namespace, iface.name)
203
+ kls = GirFFI::Builder.build_class iface
154
204
  result << kls.wrap(arg)
155
205
  else
156
206
  result << arg
@@ -174,6 +224,73 @@ module GirFFI
174
224
  end
175
225
  end
176
226
 
227
+ module InitiallyUnownedClassMethods
228
+ def constructor_wrap ptr
229
+ super.tap {|obj| GirFFI::GObject.object_ref_sink obj}
230
+ end
231
+ end
232
+
233
+ module ValueClassMethods
234
+ def wrap_ruby_value val
235
+ self.new.set_ruby_value val
236
+ end
237
+ end
238
+
239
+ module ValueInstanceMethods
240
+ def set_ruby_value val
241
+ if current_gtype == 0
242
+ init_for_ruby_value val
243
+ end
244
+
245
+ case current_gtype_name
246
+ when "gboolean"
247
+ set_boolean val
248
+ when "gint"
249
+ set_int val
250
+ else
251
+ nil
252
+ end
253
+ self
254
+ end
255
+
256
+ def init_for_ruby_value val
257
+ case val
258
+ when true, false
259
+ init ::GObject.type_from_name("gboolean")
260
+ when Integer
261
+ init ::GObject.type_from_name("gint")
262
+ end
263
+ self
264
+ end
265
+
266
+ def current_gtype
267
+ self[:g_type]
268
+ end
269
+
270
+ def current_gtype_name
271
+ ::GObject.type_name current_gtype
272
+ end
273
+
274
+ def ruby_value
275
+ case current_gtype_name
276
+ when "gboolean"
277
+ get_boolean
278
+ when "gint"
279
+ get_int
280
+ else
281
+ nil
282
+ end
283
+ end
284
+ end
285
+
286
+ module ClosureInstanceMethods
287
+ def set_marshal marshal
288
+ _v1 = GirFFI::ArgHelper.wrap_in_callback_args_mapper(
289
+ "GObject", "ClosureMarshal", marshal)
290
+ ::GObject::Lib::CALLBACKS << _v1
291
+ ::GObject::Lib.g_closure_set_marshal self, _v1
292
+ end
293
+ end
177
294
  end
178
295
  end
179
296
  end
data/tasks/test.rake CHANGED
@@ -8,6 +8,20 @@ namespace :test do
8
8
  t.ruby_opts += ["-w"]
9
9
  end
10
10
 
11
+ desc 'Build Regress test library and typelib'
12
+ task :lib => "test/lib/Makefile" do
13
+ sh %{cd test/lib && make}
14
+ end
15
+
16
+ task :run => :lib
17
+ end
18
+
19
+ file "test/lib/Makefile" => "test/lib/configure" do
20
+ sh %{cd test/lib && ./configure}
21
+ end
22
+
23
+ file "test/lib/configure" do
24
+ sh %{cd test/lib && NOCONFIGURE=1 ./autogen.sh}
11
25
  end
12
26
 
13
27
  desc 'Alias to test:run'
@@ -120,17 +120,33 @@ class ArgHelperTest < Test::Unit::TestCase
120
120
 
121
121
  context "The object_pointer_to_object method" do
122
122
  setup do
123
- GirFFI.setup :Everything
124
- @o = Everything::TestSubObj.new
123
+ GirFFI.setup :Regress
124
+ @o = Regress::TestSubObj.new
125
125
  @o2 = GirFFI::ArgHelper.object_pointer_to_object @o.to_ptr
126
126
  end
127
127
 
128
128
  should "return an object of the correct class" do
129
- assert_instance_of Everything::TestSubObj, @o2
129
+ assert_instance_of Regress::TestSubObj, @o2
130
130
  end
131
131
 
132
132
  should "return an object pointing to the original struct" do
133
133
  assert_equal @o.to_ptr, @o2.to_ptr
134
134
  end
135
135
  end
136
+
137
+ context "The map_single_callback_arg method" do
138
+ should "correctly map a :struct type" do
139
+ GirFFI.setup :GObject
140
+
141
+ cl = GObject::Closure.new_simple GObject::Closure::Struct.size, nil
142
+
143
+ cinfo = GirFFI::IRepository.default.find_by_name 'GObject', 'ClosureMarshal'
144
+ ainfo = cinfo.args[0]
145
+
146
+ r = GirFFI::ArgHelper.map_single_callback_arg cl.to_ptr, ainfo
147
+
148
+ assert_instance_of GObject::Closure, r
149
+ assert_equal r.to_ptr, cl.to_ptr
150
+ end
151
+ end
136
152
  end
data/test/builder_test.rb CHANGED
@@ -2,15 +2,18 @@ require File.expand_path('test_helper.rb', File.dirname(__FILE__))
2
2
 
3
3
  class BuilderTest < Test::Unit::TestCase
4
4
  context "The GirFFI::Builder module" do
5
+ setup do
6
+ @gir = GirFFI::IRepository.default
7
+ end
8
+
5
9
  context "building GObject::Object" do
6
10
  setup do
7
11
  cleanup_module :GObject
8
- GirFFI::Builder.build_class 'GObject', 'Object'
12
+ GirFFI::Builder.build_class @gir.find_by_name('GObject', 'Object')
9
13
  end
10
14
 
11
15
  should "create a Lib module in the parent namespace ready to attach functions from gobject-2.0" do
12
- gir = GirFFI::IRepository.default
13
- expected = gir.shared_library('GObject')
16
+ expected = @gir.shared_library('GObject')
14
17
  assert_equal [expected], GObject::Lib.ffi_libraries.map(&:name)
15
18
  end
16
19
 
@@ -20,7 +23,7 @@ class BuilderTest < Test::Unit::TestCase
20
23
 
21
24
  should "not replace existing classes" do
22
25
  oldclass = GObject::Object
23
- GirFFI::Builder.build_class 'GObject', 'Object'
26
+ GirFFI::Builder.build_class @gir.find_by_name('GObject', 'Object')
24
27
  assert_equal oldclass, GObject::Object
25
28
  end
26
29
  end
@@ -29,7 +32,7 @@ class BuilderTest < Test::Unit::TestCase
29
32
  setup do
30
33
  cleanup_module :Gtk
31
34
  cleanup_module :GObject
32
- GirFFI::Builder.build_class 'Gtk', 'Window'
35
+ GirFFI::Builder.build_class @gir.find_by_name('Gtk', 'Window')
33
36
  end
34
37
 
35
38
  should "build Gtk namespace" do
@@ -39,22 +42,21 @@ class BuilderTest < Test::Unit::TestCase
39
42
 
40
43
  should "build parent classes also" do
41
44
  assert Gtk.const_defined? :Widget
42
- assert Gtk.const_defined? :Object
43
45
  assert Object.const_defined? :GObject
44
46
  assert GObject.const_defined? :InitiallyUnowned
45
47
  assert GObject.const_defined? :Object
46
48
  end
47
49
 
48
- should "set up inheritence chain" do
50
+ should "set up inheritance chain" do
51
+ ancestors = Gtk::Window.ancestors
49
52
  assert_equal [
50
53
  Gtk::Window,
51
54
  Gtk::Bin,
52
55
  Gtk::Container,
53
- Gtk::Widget,
54
- Gtk::Object,
55
- GObject::InitiallyUnowned,
56
- GObject::Object
57
- ], Gtk::Window.ancestors[0..6]
56
+ Gtk::Widget
57
+ ], ancestors[0..3]
58
+ assert ancestors.include? GObject::InitiallyUnowned
59
+ assert ancestors.include? GObject::Object
58
60
  end
59
61
 
60
62
  should "create a Gtk::Window#to_ptr method" do
@@ -66,6 +68,17 @@ class BuilderTest < Test::Unit::TestCase
66
68
  end
67
69
  end
68
70
 
71
+ context "built Gtk::Widget" do
72
+ setup do
73
+ cleanup_module :Gtk
74
+ GirFFI::Builder.build_class @gir.find_by_name('Gtk', 'Widget')
75
+ end
76
+
77
+ should "not have regular #new as a constructor" do
78
+ assert_raises(NoMethodError) { Gtk::Widget.new }
79
+ end
80
+ end
81
+
69
82
  context "building Gtk" do
70
83
  setup do
71
84
  cleanup_module :Gtk
@@ -74,8 +87,7 @@ class BuilderTest < Test::Unit::TestCase
74
87
 
75
88
  should "create a Lib module ready to attach functions from gtk-x11-2.0" do
76
89
  # The Gtk module has more than one library on my current machine.
77
- gir = GirFFI::IRepository.default
78
- expected = (gir.shared_library 'Gtk').split(',')
90
+ expected = (@gir.shared_library 'Gtk').split(',')
79
91
  assert_equal expected.sort, Gtk::Lib.ffi_libraries.map(&:name).sort
80
92
  end
81
93
 
@@ -102,9 +114,8 @@ class BuilderTest < Test::Unit::TestCase
102
114
  end
103
115
 
104
116
  should "have correct introspection data" do
105
- gir = GirFFI::IRepository.default
106
- gir.require "Gtk", nil
107
- go2 = gir.find_by_name "Gtk", "main"
117
+ @gir.require "Gtk", nil
118
+ go2 = @gir.find_by_name "Gtk", "main"
108
119
  assert_equal go2, @go
109
120
  end
110
121
 
@@ -147,62 +158,67 @@ class BuilderTest < Test::Unit::TestCase
147
158
 
148
159
  end
149
160
 
150
- context "looking at GObject.signal_connect_data" do
161
+ context "looking at Regress.test_callback_destroy_notify" do
151
162
  setup do
163
+ cleanup_module :GLib
152
164
  cleanup_module :GObject
165
+ cleanup_module :Regress
166
+ GirFFI::Builder.build_module 'GLib'
153
167
  GirFFI::Builder.build_module 'GObject'
154
- @go = get_function_introspection_data 'GObject', 'signal_connect_data'
168
+ GirFFI::Builder.build_module 'Regress'
169
+ @go = get_function_introspection_data 'Regress', 'test_callback_destroy_notify'
155
170
  end
156
171
 
157
172
  should "have the correct types of the arguments for the attached function" do
158
173
  argtypes = GirFFI::Builder.send(:ffi_function_argument_types, @go)
159
- assert_equal [:pointer, :pointer, GObject::Callback, :pointer, GObject::ClosureNotify, GObject::ConnectFlags],
174
+ assert_equal [Regress::TestCallbackUserData, :pointer, GLib::DestroyNotify],
160
175
  argtypes
161
176
  end
162
177
 
163
178
  should "define ffi callback types :Callback and :ClosureNotify" do
164
- GObject.gir_ffi_builder.setup_function 'signal_connect_data'
165
- cb = GObject::Lib.find_type :Callback
166
- cn = GObject::Lib.find_type :ClosureNotify
179
+ Regress.gir_ffi_builder.setup_function 'test_callback_destroy_notify'
180
+ tcud = Regress::Lib.find_type :TestCallbackUserData
181
+ dn = GLib::Lib.find_type :DestroyNotify
167
182
 
168
- assert_equal FFI.find_type(:void), cb.result_type
169
- assert_equal FFI.find_type(:void), cn.result_type
170
- assert_equal [], cb.param_types
171
- assert_equal [FFI.find_type(:pointer), FFI.find_type(:pointer)], cn.param_types
183
+ assert_equal FFI.find_type(:int32), tcud.result_type
184
+ assert_equal FFI.find_type(:void), dn.result_type
185
+ assert_equal [FFI.find_type(:pointer)], tcud.param_types
186
+ assert_equal [FFI.find_type(:pointer)], dn.param_types
172
187
  end
173
188
 
189
+ # FIXME: Test passes but does not test what it claims to test.
174
190
  should "define ffi enum type ConnectFlags" do
175
191
  assert_equal({:after => 1, :swapped => 2}, GObject::ConnectFlags.to_h)
176
192
  end
177
193
  end
178
194
 
179
- context "building Everything::TestStructA" do
195
+ context "building Regress::TestStructA" do
180
196
  setup do
181
197
  @fieldnames = [:some_int, :some_int8, :some_double, :some_enum]
182
- GirFFI::Builder.build_class 'Everything', 'TestStructA'
198
+ GirFFI::Builder.build_class @gir.find_by_name('Regress', 'TestStructA')
183
199
  end
184
200
 
185
201
  should "set up the correct struct members" do
186
202
  assert_equal @fieldnames,
187
- Everything::TestStructA::Struct.members
203
+ Regress::TestStructA::Struct.members
188
204
  end
189
205
 
190
206
  should "set up struct members with the correct offset" do
191
- info = GirFFI::IRepository.default.find_by_name 'Everything', 'TestStructA'
207
+ info = @gir.find_by_name 'Regress', 'TestStructA'
192
208
  assert_equal info.fields.map{|f| [f.name.to_sym, f.offset]},
193
- Everything::TestStructA::Struct.offsets
209
+ Regress::TestStructA::Struct.offsets
194
210
  end
195
211
 
196
212
  should "set up struct members with the correct types" do
197
- tags = [:int, :int8, :double, Everything::TestEnum]
213
+ tags = [:int, :int8, :double, Regress::TestEnum]
198
214
  assert_equal tags.map {|t| FFI.find_type t},
199
- @fieldnames.map {|f| Everything::TestStructA::Struct.layout[f].type}
215
+ @fieldnames.map {|f| Regress::TestStructA::Struct.layout[f].type}
200
216
  end
201
217
  end
202
218
 
203
219
  context "building GObject::TypeCValue" do
204
220
  setup do
205
- GirFFI::Builder.build_class 'GObject', 'TypeCValue'
221
+ GirFFI::Builder.build_class @gir.find_by_name('GObject', 'TypeCValue')
206
222
  end
207
223
 
208
224
  should "set up the correct union members" do
@@ -222,106 +238,102 @@ class BuilderTest < Test::Unit::TestCase
222
238
 
223
239
  context "building GObject::ValueArray" do
224
240
  should "use provided constructor if present" do
225
- GirFFI::Builder.build_class 'GObject', 'ValueArray'
241
+ GirFFI::Builder.build_class @gir.find_by_name('GObject', 'ValueArray')
226
242
  assert_nothing_raised {
227
243
  GObject::ValueArray.new 2
228
244
  }
229
245
  end
230
246
  end
231
247
 
232
- context "building Everything::TestBoxed" do
248
+ context "building Regress::TestBoxed" do
233
249
  setup do
234
- GirFFI::Builder.build_class 'Everything', 'TestBoxed'
250
+ GirFFI::Builder.build_class @gir.find_by_name('Regress', 'TestBoxed')
235
251
  end
236
252
 
237
253
  should "set up #wrap" do
238
- assert Everything::TestBoxed.respond_to? "wrap"
254
+ assert Regress::TestBoxed.respond_to? "wrap"
239
255
  end
240
256
 
241
257
  should "set up #allocate" do
242
- assert Everything::TestBoxed.respond_to? "allocate"
258
+ assert Regress::TestBoxed.respond_to? "allocate"
243
259
  end
244
260
  end
245
261
 
246
- context "built Everything module" do
262
+ context "built Regress module" do
247
263
  setup do
248
- cleanup_module :Everything
249
- GirFFI::Builder.build_module 'Everything'
264
+ cleanup_module :Regress
265
+ GirFFI::Builder.build_module 'Regress'
250
266
  end
251
267
 
252
268
  should "have a method_missing method" do
253
- ms = (Everything.public_methods - Module.public_methods).map(&:to_sym)
269
+ ms = (Regress.public_methods - Module.public_methods).map(&:to_sym)
254
270
  assert ms.include? :method_missing
255
271
  end
256
272
 
257
273
  should "autocreate the TestObj class" do
258
- assert !Everything.const_defined?(:TestObj)
259
- assert_nothing_raised {Everything::TestObj}
260
- assert Everything.const_defined? :TestObj
274
+ assert !Regress.const_defined?(:TestObj)
275
+ assert_nothing_raised {Regress::TestObj}
276
+ assert Regress.const_defined? :TestObj
261
277
  end
262
278
 
263
279
  should "know its own module builder" do
264
- assert GirFFI::ModuleBuilder === Everything.gir_ffi_builder
280
+ assert GirFFI::Builder::Module === Regress.gir_ffi_builder
265
281
  end
266
282
  end
267
283
 
268
- context "built Everything::TestObj" do
284
+ context "built Regress::TestObj" do
269
285
  setup do
270
- cleanup_module :Everything
271
- GirFFI::Builder.build_class 'Everything', 'TestObj'
286
+ cleanup_module :Regress
287
+ GirFFI::Builder.build_class @gir.find_by_name('Regress', 'TestObj')
272
288
  end
273
289
 
274
290
  should "make autocreated instance method available to all instances" do
275
- o1 = Everything::TestObj.new_from_file("foo")
276
- o2 = Everything::TestObj.new_from_file("foo")
291
+ o1 = Regress::TestObj.new_from_file("foo")
292
+ o2 = Regress::TestObj.new_from_file("foo")
277
293
  o1.instance_method
278
- Everything::TestObj.class_eval do
294
+ Regress::TestObj.class_eval do
279
295
  undef method_missing
280
296
  end
281
297
  assert_nothing_raised { o2.instance_method }
282
298
  end
283
299
 
284
- should "attach C functions to Everything::Lib" do
285
- o = Everything::TestObj.new_from_file("foo")
300
+ should "attach C functions to Regress::Lib" do
301
+ o = Regress::TestObj.new_from_file("foo")
286
302
  o.instance_method
287
- assert Everything::Lib.respond_to? :test_obj_instance_method
288
- end
289
-
290
- should "not have regular #new as a constructor" do
291
- assert_raises(NoMethodError) { Everything::TestObj.new }
303
+ assert Regress::Lib.respond_to? :regress_test_obj_instance_method
292
304
  end
293
305
 
294
306
  should "know its own GIR info" do
295
- assert_equal 'TestObj', Everything::TestObj.gir_info.name
307
+ assert_equal 'TestObj', Regress::TestObj.gir_info.name
296
308
  end
297
309
 
298
310
  should "know its own class builder" do
299
- assert GirFFI::ClassBuilder === Everything::TestObj.gir_ffi_builder
311
+ assert GirFFI::Builder::Class === Regress::TestObj.gir_ffi_builder
300
312
  end
301
313
 
302
314
  context "its #torture_signature_0 method" do
303
315
  should "have the correct types of the arguments for the attached function" do
304
- info = get_method_introspection_data 'Everything', 'TestObj',
316
+ info = get_method_introspection_data 'Regress', 'TestObj',
305
317
  'torture_signature_0'
306
- assert_equal [:pointer, :int, :pointer, :pointer, :pointer, :pointer, :uint],
318
+ assert_equal [:pointer, :int32, :pointer, :pointer, :pointer, :pointer, :uint32],
307
319
  GirFFI::Builder.send(:ffi_function_argument_types, info)
308
320
  end
309
321
  end
310
322
  end
311
323
 
312
- context "built Everything::TestSubObj" do
324
+ context "built Regress::TestSubObj" do
313
325
  setup do
314
- cleanup_module :Everything
315
- GirFFI::Builder.build_class 'Everything', 'TestSubObj'
326
+ cleanup_module :Regress
327
+ GirFFI::Builder.build_class @gir.find_by_name('Regress', 'TestSubObj')
316
328
  end
317
329
 
318
330
  should "autocreate parent class' set_bare inside the parent class" do
319
- o1 = Everything::TestSubObj.new
320
- o2 = Everything::TestObj.new_from_file("foo")
331
+ o1 = Regress::TestSubObj.new
332
+ o2 = Regress::TestObj.new_from_file("foo")
321
333
 
322
334
  assert_nothing_raised {o1.set_bare(nil)}
323
335
 
324
- Everything::TestObj.class_eval do
336
+ Regress::TestObj.class_eval do
325
337
  undef method_missing
326
338
  end
327
339
 
@@ -329,9 +341,9 @@ class BuilderTest < Test::Unit::TestCase
329
341
  end
330
342
 
331
343
  should "use its own version of instance_method when parent's version has been created" do
332
- obj = Everything::TestObj.new_from_file("foo")
344
+ obj = Regress::TestObj.new_from_file("foo")
333
345
  assert_equal(-1, obj.instance_method)
334
- subobj = Everything::TestSubObj.new
346
+ subobj = Regress::TestSubObj.new
335
347
  assert_equal 0, subobj.instance_method
336
348
  end
337
349
  end
@@ -1,17 +1,21 @@
1
1
  require File.expand_path('test_helper.rb', File.dirname(__FILE__))
2
2
 
3
3
  class ClassBuilderTest < Test::Unit::TestCase
4
- context "The ClassBuilder" do
5
- should "use parent struct as default layout" do
4
+ context "The Builder::Class class" do
5
+ setup do
6
6
  @gir = GirFFI::IRepository.default
7
+ end
8
+
9
+ should "use parent struct as default layout" do
7
10
  @gir.require 'GObject', nil
8
11
 
9
12
  stub(info = Object.new).parent { @gir.find_by_name 'GObject', 'Object' }
10
13
  stub(info).fields { [] }
11
14
  stub(info).type { :object }
15
+ stub(info).name { 'Bar' }
16
+ stub(info).namespace { 'Foo' }
12
17
 
13
- @classbuilder = GirFFI::ClassBuilder.new 'Foo', 'Bar'
14
- @classbuilder.instance_eval { @info = info }
18
+ @classbuilder = GirFFI::Builder::Class.new info
15
19
 
16
20
  spec = @classbuilder.send :layout_specification
17
21
  assert_equal [:parent, GObject::Object::Struct, 0], spec
@@ -19,7 +23,7 @@ class ClassBuilderTest < Test::Unit::TestCase
19
23
 
20
24
  context "for Gtk::Widget" do
21
25
  setup do
22
- @cbuilder = GirFFI::ClassBuilder.new 'Gtk', 'Widget'
26
+ @cbuilder = GirFFI::Builder::Class.new @gir.find_by_name('Gtk', 'Widget')
23
27
  end
24
28
 
25
29
  context "looking at Gtk::Widget#show" do
@@ -27,9 +31,9 @@ class ClassBuilderTest < Test::Unit::TestCase
27
31
  @go = get_method_introspection_data 'Gtk', 'Widget', 'show'
28
32
  end
29
33
 
30
- should "delegate definition to FunctionDefinitionBuilder" do
34
+ should "delegate definition to Builder::Function" do
31
35
  code = @cbuilder.send :function_definition, @go
32
- expected = GirFFI::FunctionDefinitionBuilder.new(@go, Gtk::Lib).generate
36
+ expected = GirFFI::Builder::Function.new(@go, Gtk::Lib).generate
33
37
  assert_equal cws(expected), cws(code)
34
38
  end
35
39
 
@@ -38,19 +42,19 @@ class ClassBuilderTest < Test::Unit::TestCase
38
42
 
39
43
  context 'the find_signal method' do
40
44
  should 'find the signal "test" for TestObj' do
41
- builder = GirFFI::ClassBuilder.new 'Everything', 'TestObj'
45
+ builder = GirFFI::Builder::Class.new @gir.find_by_name('Regress', 'TestObj')
42
46
  sig = builder.find_signal 'test'
43
47
  assert_equal 'test', sig.name
44
48
  end
45
49
 
46
50
  should 'find the signal "test" for TestSubObj' do
47
- builder = GirFFI::ClassBuilder.new 'Everything', 'TestSubObj'
51
+ builder = GirFFI::Builder::Class.new @gir.find_by_name('Regress', 'TestSubObj')
48
52
  sig = builder.find_signal 'test'
49
53
  assert_equal 'test', sig.name
50
54
  end
51
55
 
52
56
  should 'find the signal "changed" for Gtk::Entry' do
53
- builder = GirFFI::ClassBuilder.new 'Gtk', 'Entry'
57
+ builder = GirFFI::Builder::Class.new @gir.find_by_name('Gtk', 'Entry')
54
58
  sig = builder.find_signal 'changed'
55
59
  assert_equal 'changed', sig.name
56
60
  end
@@ -58,7 +62,7 @@ class ClassBuilderTest < Test::Unit::TestCase
58
62
 
59
63
  context "for GObject::TypeCValue (a union)" do
60
64
  setup do
61
- @cbuilder = GirFFI::ClassBuilder.new 'GObject', 'TypeCValue'
65
+ @cbuilder = GirFFI::Builder::Class.new @gir.find_by_name('GObject', 'TypeCValue')
62
66
  end
63
67
 
64
68
  should "not raise an error looking for a method that doesn't exist" do