gir_ffi 0.2.3 → 0.3.0

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 (87) hide show
  1. data/History.txt +14 -0
  2. data/README.rdoc +3 -1
  3. data/examples/02_hello_world.rb +1 -0
  4. data/examples/03_upgraded_hello_world.rb +2 -1
  5. data/examples/05_notification.rb +2 -2
  6. data/examples/hard_coded.rb +31 -8
  7. data/lib/ffi-glib/array.rb +1 -1
  8. data/lib/ffi-glib/container_class_methods.rb +25 -0
  9. data/lib/ffi-glib/hash_table.rb +41 -38
  10. data/lib/ffi-glib/list.rb +15 -22
  11. data/lib/ffi-glib/list_methods.rb +16 -16
  12. data/lib/ffi-glib/ptr_array.rb +20 -15
  13. data/lib/ffi-glib/s_list.rb +15 -23
  14. data/lib/ffi-glib.rb +7 -0
  15. data/lib/ffi-gobject/base.rb +0 -13
  16. data/lib/ffi-gobject/object.rb +6 -0
  17. data/lib/ffi-gobject/ruby_style.rb +21 -0
  18. data/lib/ffi-gobject.rb +44 -0
  19. data/lib/ffi-gobject_introspection/i_object_info.rb +7 -0
  20. data/lib/ffi-gobject_introspection/lib.rb +1 -0
  21. data/lib/gir_ffi/arg_helper.rb +8 -6
  22. data/lib/gir_ffi/builder/argument.rb +1 -1
  23. data/lib/gir_ffi/builder/field.rb +6 -3
  24. data/lib/gir_ffi/builder/property.rb +28 -0
  25. data/lib/gir_ffi/builder/type/base.rb +6 -4
  26. data/lib/gir_ffi/builder/type/interface.rb +1 -0
  27. data/lib/gir_ffi/builder/type/object.rb +26 -1
  28. data/lib/gir_ffi/builder/type/registered_type.rb +9 -1
  29. data/lib/gir_ffi/builder/type/unintrospectable.rb +26 -8
  30. data/lib/gir_ffi/builder/type/user_defined.rb +119 -0
  31. data/lib/gir_ffi/builder/type/with_layout.rb +3 -3
  32. data/lib/gir_ffi/builder.rb +5 -0
  33. data/lib/gir_ffi/class_base.rb +6 -6
  34. data/lib/gir_ffi/info_ext/i_property_info.rb +12 -0
  35. data/lib/gir_ffi/info_ext/i_type_info.rb +4 -0
  36. data/lib/gir_ffi/user_defined/i_base_info.rb +7 -0
  37. data/lib/gir_ffi/user_defined/i_object_info.rb +13 -0
  38. data/lib/gir_ffi/user_defined/i_property_info.rb +9 -0
  39. data/lib/gir_ffi/user_defined/i_registered_type_info.rb +10 -0
  40. data/lib/gir_ffi/version.rb +1 -1
  41. data/lib/gir_ffi.rb +6 -0
  42. data/tasks/test.rake +12 -2
  43. data/test/builder_test.rb +0 -124
  44. data/test/ffi-glib/hash_table_test.rb +0 -14
  45. data/test/ffi-glib/list_test.rb +0 -13
  46. data/test/ffi-glib/ptr_array_test.rb +26 -8
  47. data/test/ffi-glib/s_list_test.rb +4 -4
  48. data/test/ffi-gobject/g_object_overrides_test.rb +16 -32
  49. data/test/ffi-gobject/gobject_test.rb +28 -1
  50. data/test/ffi-gobject/object_class_test.rb +21 -0
  51. data/test/ffi-gobject/object_test.rb +4 -0
  52. data/test/ffi-gobject/ruby_style_test.rb +38 -0
  53. data/test/ffi-gobject_introspection/i_constant_info_test.rb +5 -5
  54. data/test/ffi-gobject_introspection/i_repository_test.rb +4 -4
  55. data/test/ffi-gtk/gtk_test.rb +36 -0
  56. data/test/gir_ffi_test_helper.rb +8 -4
  57. data/test/integration/derived_classes_test.rb +34 -18
  58. data/test/integration/generated_gimarshallingtests_test.rb +20 -23
  59. data/test/integration/generated_gio_test.rb +5 -0
  60. data/test/integration/generated_gobject_test.rb +2 -2
  61. data/test/integration/generated_gtk_test.rb +1 -1
  62. data/test/integration/generated_pango_test.rb +20 -0
  63. data/test/integration/generated_regress_test.rb +1003 -955
  64. data/test/integration/pretty_print_test.rb +3 -1
  65. data/test/test_helper.rb +5 -0
  66. data/test/type_builder_test.rb +2 -19
  67. data/test/unit/arg_helper_test.rb +87 -1
  68. data/test/unit/builder_test.rb +113 -1
  69. data/test/unit/function_builder_test.rb +6 -5
  70. data/test/unit/gir_ffi_test.rb +69 -0
  71. data/test/unit/in_out_pointer_test.rb +3 -3
  72. data/test/unit/in_pointer_test.rb +1 -1
  73. data/test/unit/interface_builder_test.rb +16 -0
  74. data/test/unit/object_type_builder_test.rb +15 -0
  75. data/test/unit/struct_builder_test.rb +5 -1
  76. data/test/{unintrospectable_type_builder_test.rb → unit/unintrospectable_type_builder_test.rb} +18 -1
  77. data/test/unit/user_defined_object_info_test.rb +18 -0
  78. data/test/unit/user_defined_property_info_test.rb +14 -0
  79. data/test/unit/user_defined_registered_type_info_test.rb +10 -0
  80. data/test/unit/user_defined_type_builder_test.rb +41 -0
  81. metadata +34 -17
  82. data/tasks/notes.rake +0 -121
  83. data/tasks/rdoc.rake +0 -9
  84. data/tasks/yardoc.rake +0 -9
  85. data/test/arg_helper_test.rb +0 -33
  86. data/test/gtk_overrides_test.rb +0 -35
  87. data/test/interface_type_builder_test.rb +0 -17
data/test/builder_test.rb CHANGED
@@ -32,130 +32,6 @@ class BuilderTest < MiniTest::Spec
32
32
  end
33
33
  end
34
34
 
35
- context "building Gtk::Window" do
36
- before do
37
- save_module :Gtk
38
- save_module :GObject
39
- GirFFI::Builder.build_class get_introspection_data('Gtk', 'Window')
40
- end
41
-
42
- should "build Gtk namespace" do
43
- assert Gtk.const_defined? :Lib
44
- assert Gtk.respond_to? :method_missing
45
- end
46
-
47
- should "build parent classes also" do
48
- assert Gtk.const_defined? :Widget
49
- assert Object.const_defined? :GObject
50
- assert GObject.const_defined? :InitiallyUnowned
51
- assert GObject.const_defined? :Object
52
- end
53
-
54
- should "set up inheritance chain" do
55
- ancestors = Gtk::Window.ancestors
56
- assert_equal [
57
- Gtk::Window,
58
- Gtk::Bin,
59
- Gtk::Container,
60
- Gtk::Widget
61
- ], ancestors[0..3]
62
- assert ancestors.include? GObject::InitiallyUnowned
63
- assert ancestors.include? GObject::Object
64
- end
65
-
66
- should "create a Gtk::Window#to_ptr method" do
67
- assert Gtk::Window.public_method_defined? :to_ptr
68
- end
69
-
70
- after do
71
- restore_module :Gtk
72
- restore_module :GObject
73
- end
74
- end
75
-
76
- context "building Gtk" do
77
- before do
78
- save_module :Gtk
79
- GirFFI::Builder.build_module 'Gtk'
80
- end
81
-
82
- should "create a Lib module ready to attach functions from gtk-x11-2.0" do
83
- # The Gtk module has more than one library on my current machine.
84
- expected = (@gir.shared_library 'Gtk').split(',')
85
- assert_equal expected.sort, Gtk::Lib.ffi_libraries.map(&:name).sort
86
- end
87
-
88
- should "create an array CALLBACKS inside the Gtk::Lib module" do
89
- assert_equal [], Gtk::Lib::CALLBACKS
90
- end
91
-
92
- should "not replace existing module" do
93
- oldmodule = Gtk
94
- GirFFI::Builder.build_module 'Gtk'
95
- assert_equal oldmodule, Gtk
96
- end
97
-
98
- should "not replace existing Lib module" do
99
- oldmodule = Gtk::Lib
100
- GirFFI::Builder.build_module 'Gtk'
101
- assert_equal oldmodule, Gtk::Lib
102
- end
103
-
104
- after do
105
- restore_module :Gtk
106
- end
107
- end
108
-
109
- context "looking at Gtk.main" do
110
- setup do
111
- @go = get_introspection_data 'Gtk', 'main'
112
- end
113
-
114
- should "have correct introspection data" do
115
- @gir.require "Gtk", "2.0"
116
- go2 = @gir.find_by_name "Gtk", "main"
117
- assert_equal go2, @go
118
- end
119
-
120
- should "attach function to Whatever::Lib" do
121
- mod = Module.new
122
- mod.const_set :Lib, libmod = Module.new
123
- libmod.module_eval do
124
- extend FFI::Library
125
- ffi_lib "gtk-x11-2.0"
126
- end
127
-
128
- GirFFI::Builder.send :attach_ffi_function, libmod, @go
129
- assert_defines_singleton_method libmod, :gtk_main
130
- end
131
- end
132
-
133
- context "looking at Gtk.init" do
134
- setup do
135
- GirFFI::Builder.build_module 'Gtk'
136
- @go = get_introspection_data 'Gtk', 'init'
137
- end
138
-
139
- should "have :pointer, :pointer as types of the arguments for the attached function" do
140
- assert_equal [:pointer, :pointer], GirFFI::Builder.send(:ffi_function_argument_types, @go)
141
- end
142
-
143
- should "have :void as return type for the attached function" do
144
- assert_equal :void, GirFFI::Builder.send(:ffi_function_return_type, @go)
145
- end
146
- end
147
-
148
- context "looking at Gtk::Widget#show" do
149
- setup do
150
- @go = get_method_introspection_data 'Gtk', 'Widget', 'show'
151
- end
152
-
153
- should "have :pointer as types of the arguments for the attached function" do
154
- assert_equal [:pointer], GirFFI::Builder.send(:ffi_function_argument_types, @go)
155
- end
156
-
157
- end
158
-
159
35
  context "looking at Regress.test_callback_destroy_notify" do
160
36
  before do
161
37
  save_module :GLib
@@ -7,20 +7,6 @@ describe GLib::HashTable do
7
7
  assert_equal :utf8, hsh.value_type
8
8
  end
9
9
 
10
- describe "::from_hash" do
11
- it "creates a GHashTable from a Ruby array" do
12
- hsh = GLib::HashTable.from_hash [:utf8, :gint32],
13
- {"foo" => 23, "bar" => 32}
14
- assert_equal({"foo" => 23, "bar" => 32}, hsh.to_hash)
15
- end
16
-
17
- it "return its argument if given a GHashTable" do
18
- hsh = GLib::HashTable.from_hash [:utf8, :gint32], {"foo" => 23, "bar" => 32}
19
- hsh2 = GLib::HashTable.from_hash [:utf8, :gint32], hsh
20
- assert_equal hsh, hsh2
21
- end
22
- end
23
-
24
10
  describe "::from" do
25
11
  it "creates a GHashTable from a Ruby array" do
26
12
  hsh = GLib::HashTable.from [:utf8, :gint32],
@@ -31,19 +31,6 @@ describe GLib::List do
31
31
  end
32
32
  end
33
33
 
34
- describe "::from_array" do
35
- it "creates a GList from a Ruby array" do
36
- lst = GLib::List.from_array :gint32, [3, 2, 1]
37
- assert_equal [3, 2, 1], lst.to_a
38
- end
39
-
40
- it "return its argument if given a GList" do
41
- lst = GLib::List.from_array :gint32, [3, 2, 1]
42
- lst2 = GLib::List.from_array :gint32, lst
43
- assert_equal lst, lst2
44
- end
45
- end
46
-
47
34
  describe "::from" do
48
35
  it "creates a GList from a Ruby array" do
49
36
  lst = GLib::List.from :gint32, [3, 2, 1]
@@ -16,17 +16,35 @@ describe GLib::PtrArray do
16
16
  end
17
17
  end
18
18
 
19
- it "has a working #each method" do
20
- arr = GLib::PtrArray.new :utf8
19
+ describe "#each" do
20
+ it "works normally" do
21
+ arr = GLib::PtrArray.new :utf8
21
22
 
22
- GLib::PtrArray.add arr, "test1"
23
- GLib::PtrArray.add arr, "test2"
24
- GLib::PtrArray.add arr, "test3"
23
+ GLib::PtrArray.add arr, "test1"
24
+ GLib::PtrArray.add arr, "test2"
25
+ GLib::PtrArray.add arr, "test3"
26
+
27
+ a = []
28
+ arr.each {|v| a << v}
25
29
 
26
- a = []
27
- arr.each {|v| a << v}
30
+ assert_equal ["test1", "test2", "test3"], a
31
+ end
32
+
33
+ it "works when exiting the loop prematurely" do
34
+ arr = GLib::PtrArray.new :utf8
28
35
 
29
- assert_equal ["test1", "test2", "test3"], a
36
+ GLib::PtrArray.add arr, "test1"
37
+ GLib::PtrArray.add arr, "test2"
38
+ GLib::PtrArray.add arr, "test3"
39
+
40
+ a = []
41
+ arr.each do |v|
42
+ a << v
43
+ break if v == "test2"
44
+ end
45
+
46
+ assert_equal ["test1", "test2"], a
47
+ end
30
48
  end
31
49
 
32
50
  it "includes Enumerable" do
@@ -31,15 +31,15 @@ describe GLib::SList do
31
31
  end
32
32
  end
33
33
 
34
- describe "::from_array" do
34
+ describe "::from" do
35
35
  it "creates a GSList from a Ruby array" do
36
- lst = GLib::SList.from_array :gint32, [3, 2, 1]
36
+ lst = GLib::SList.from :gint32, [3, 2, 1]
37
37
  assert_equal [3, 2, 1], lst.to_a
38
38
  end
39
39
 
40
40
  it "return its argument if given a GSList" do
41
- lst = GLib::SList.from_array :gint32, [3, 2, 1]
42
- lst2 = GLib::SList.from_array :gint32, lst
41
+ lst = GLib::SList.from :gint32, [3, 2, 1]
42
+ lst2 = GLib::SList.from :gint32, lst
43
43
  assert_equal lst, lst2
44
44
  end
45
45
  end
@@ -164,42 +164,26 @@ class GObjectOverridesTest < MiniTest::Spec
164
164
  end
165
165
  end
166
166
 
167
- context "#cast_back_signal_arguments" do
168
- context "the result of casting pointers for the test-with-static-scope-arg signal" do
169
- setup do
170
- sig_name = "test-with-static-scope-arg"
171
- o = Regress::TestSubObj.new
172
- b = Regress::TestSimpleBoxedA.new
173
- ud = GirFFI::ArgHelper.object_to_inptr "Hello!"
174
- sig = o.class._find_signal sig_name
175
-
176
- @gva =
177
- GObject::Helper.cast_back_signal_arguments(
178
- sig, o.class, o.to_ptr, b.to_ptr, ud)
179
- end
167
+ describe "#cast_back_signal_arguments" do
168
+ it "correctly casts back pointers for the test-with-static-scope-arg signal" do
169
+ o = Regress::TestSubObj.new
170
+ b = Regress::TestSimpleBoxedA.new
171
+ ud = GirFFI::ArgHelper.object_to_inptr "Hello!"
180
172
 
181
- should "have three elements" do
182
- assert_equal 3, @gva.length
183
- end
173
+ assert_equal "Hello!", GirFFI::ArgHelper::OBJECT_STORE[ud.address]
184
174
 
185
- context "its first value" do
186
- should "be a TestSubObj" do
187
- assert_instance_of Regress::TestSubObj, @gva[0]
188
- end
189
- end
175
+ sig = o.class._find_signal "test-with-static-scope-arg"
190
176
 
191
- context "its second value" do
192
- should "be a TestSimpleBoxedA" do
193
- assert_instance_of Regress::TestSimpleBoxedA, @gva[1]
194
- end
195
- end
177
+ gva =
178
+ GObject::Helper.cast_back_signal_arguments(
179
+ sig, o.class, o.to_ptr, b.to_ptr, ud)
196
180
 
197
- context "its third value" do
198
- should "be a 'Hello!'" do
199
- assert_equal "Hello!", @gva[2]
200
- end
201
- end
202
- end
181
+ klasses = gva.map {|it| it.class}
182
+ klasses.must_equal [ Regress::TestSubObj,
183
+ Regress::TestSimpleBoxedA,
184
+ String ]
185
+ gva[2].must_equal "Hello!"
186
+ end
203
187
  end
204
188
 
205
189
  describe "#cast_signal_argument" do
@@ -2,6 +2,8 @@ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
2
 
3
3
  require 'ffi-gobject'
4
4
 
5
+ GirFFI.setup :GIMarshallingTests
6
+
5
7
  describe GObject do
6
8
  it "has type_init as a public method" do
7
9
  assert GObject.respond_to?('type_init')
@@ -48,5 +50,30 @@ describe GObject do
48
50
  assert_equal "GStrv", GObject.type_name(GObject::TYPE_STRV)
49
51
  assert_equal "GHashTable", GObject.type_name(GObject::TYPE_HASH_TABLE)
50
52
  end
51
- end
52
53
 
54
+ describe "::object_class_from_instance" do
55
+ it "returns a GObject::ObjectClass with the correct GType" do
56
+ obj = GIMarshallingTests::OverridesObject.new
57
+ object_class = GObject.object_class_from_instance obj
58
+ gtype = object_class.g_type_class.g_type
59
+
60
+ object_class.must_be_instance_of GObject::ObjectClass
61
+ gtype.must_equal GIMarshallingTests::OverridesObject.get_gtype
62
+ end
63
+ end
64
+
65
+ describe "creating ParamSpecs" do
66
+ describe "#param_spec_int" do
67
+ it "creates a GObject::ParamSpecInt" do
68
+ spec = GObject.param_spec_int("foo", "foo bar",
69
+ "The Foo Bar Property",
70
+ 10, 20, 15,
71
+ 3)
72
+ spec.must_be_instance_of GObject::ParamSpecInt
73
+ spec.minimum.must_equal 10
74
+ spec.maximum.must_equal 20
75
+ spec.default_value.must_equal 15
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
+
3
+ require 'ffi-gobject'
4
+
5
+ describe GObject::ObjectClass do
6
+ describe "#list_properties" do
7
+ it "returns GIMarshallingTests::OverridesObject's properties" do
8
+ obj = GIMarshallingTests::OverridesObject.new
9
+ object_class = GObject.object_class_from_instance obj
10
+
11
+ info = get_introspection_data 'GIMarshallingTests', 'OverridesObject'
12
+ expected_props = info.properties.map(&:name)
13
+ expected_props += info.parent.properties.map(&:name)
14
+
15
+ props = object_class.list_properties
16
+ prop_names = props.map(&:get_name)
17
+
18
+ prop_names.sort.must_equal expected_props.sort
19
+ end
20
+ end
21
+ end
@@ -8,5 +8,9 @@ describe GObject::Object do
8
8
  assert_equal 1,
9
9
  GObject::Object.instance_method("get_property").arity
10
10
  end
11
+
12
+ it 'includes GObject::RubyStyle' do
13
+ assert GObject::Object.included_modules.include?(GObject::RubyStyle)
14
+ end
11
15
  end
12
16
  end
@@ -0,0 +1,38 @@
1
+ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
+
3
+ require 'ffi-gobject/ruby_style'
4
+
5
+ describe GObject::RubyStyle do
6
+ class RubyStyleTest
7
+ include GObject::RubyStyle
8
+ def get_x
9
+ @x
10
+ end
11
+ def set_x(val)
12
+ @x = val
13
+ end
14
+ end
15
+
16
+ subject { RubyStyleTest.new }
17
+
18
+ it 'reads x by calling get_x' do
19
+ subject.set_x(1)
20
+ assert_equal 1, subject.x
21
+ end
22
+
23
+ it 'writes x by calling set_x' do
24
+ subject.x = 2
25
+ assert_equal 2, subject.x
26
+ end
27
+
28
+ it 'delegates signal_connect to GObject' do
29
+ mock(GObject).signal_connect(subject, 'some-event')
30
+ subject.signal_connect('some-event') do
31
+ nothing
32
+ end
33
+
34
+ RR.verify
35
+ end
36
+
37
+ end
38
+
@@ -1,21 +1,21 @@
1
1
  require File.expand_path('../test_helper.rb', File.dirname(__FILE__))
2
2
 
3
3
  describe GObjectIntrospection::IConstantInfo do
4
- describe "for GLib::ALLOCATOR_LIST, a constant of type :gint32" do
4
+ describe "for GLib::USEC_PER_SEC, a constant of type :gint32" do
5
5
  before do
6
- @info = get_introspection_data 'GLib', 'ALLOCATOR_LIST'
6
+ @info = get_introspection_data 'GLib', 'USEC_PER_SEC'
7
7
  end
8
8
 
9
9
  it "returns :gint32 as its type" do
10
10
  assert_equal :gint32, @info.constant_type.tag
11
11
  end
12
12
 
13
- it "returns a value union with member :v_int32 with value 1" do
14
- assert_equal 1, @info.value_union[:v_int32]
13
+ it "returns a value union with member :v_int32 with value 1_000_000" do
14
+ assert_equal 1_000_000, @info.value_union[:v_int32]
15
15
  end
16
16
 
17
17
  it "returns 1 as its value" do
18
- assert_equal 1, @info.value
18
+ assert_equal 1_000_000, @info.value
19
19
  end
20
20
  end
21
21
  end
@@ -40,18 +40,18 @@ describe GObjectIntrospection::IRepository do
40
40
  end
41
41
  end
42
42
 
43
- describe "enumerating the infos for Gtk" do
43
+ describe "enumerating the infos for GObject" do
44
44
  setup do
45
45
  @gir = GObjectIntrospection::IRepository.default
46
- @gir.require 'Gtk', "2.0"
46
+ @gir.require 'GObject', "2.0"
47
47
  end
48
48
 
49
49
  should "yield more than one object" do
50
- assert_operator @gir.n_infos('Gtk'), :>, 0
50
+ assert_operator @gir.n_infos('GObject'), :>, 0
51
51
  end
52
52
 
53
53
  should "yield IBaseInfo objects" do
54
- assert_kind_of GObjectIntrospection::IBaseInfo, @gir.info('Gtk', 0)
54
+ assert_kind_of GObjectIntrospection::IBaseInfo, @gir.info('GObject', 0)
55
55
  end
56
56
  end
57
57
  end
@@ -0,0 +1,36 @@
1
+ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
+
3
+ require 'ffi-gtk3'
4
+
5
+ describe Gtk do
6
+ describe "::init" do
7
+ before do
8
+ save_module :Gtk
9
+ ::Object.const_set :Gtk, Module.new
10
+ Gtk.class_eval do
11
+ def self.init arr
12
+ ["baz", "qux", "zonk"]
13
+ end
14
+ end
15
+ stub(Gtk)._setup_method { }
16
+
17
+ load 'ffi-gtk/base.rb'
18
+ end
19
+
20
+ it "does not take any arguments" do
21
+ assert_raises(ArgumentError) { Gtk.init 1, ["foo"] }
22
+ assert_raises(ArgumentError) { Gtk.init ["foo"] }
23
+ assert_nothing_raised { Gtk.init }
24
+ end
25
+
26
+ it "replaces ARGV with the tail of the result of the original init function" do
27
+ ARGV.replace ["foo", "bar"]
28
+ Gtk.init
29
+ assert_equal ["qux", "zonk"], ARGV.to_a
30
+ end
31
+
32
+ after do
33
+ restore_module :Gtk
34
+ end
35
+ end
36
+ end
@@ -21,14 +21,18 @@ module GObjectIntrospection
21
21
  end
22
22
  end
23
23
 
24
- # Preload data for Gtk+ version 2.0.
25
- gir = GObjectIntrospection::IRepository.default
26
- gir.require "Gtk", "2.0"
27
-
28
24
  # Need a dummy module for some tests.
29
25
  module DummyLib
30
26
  end
31
27
 
28
+ # Global sequence provider. Needed to make unique class names.
29
+ class Sequence
30
+ @@seq = 0
31
+ def self.next
32
+ @@seq += 1
33
+ end
34
+ end
35
+
32
36
  class MiniTest::Unit::TestCase
33
37
  def cws code
34
38
  code.gsub(/(^\s*|\s*$)/, "")
@@ -1,31 +1,47 @@
1
1
  require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
2
 
3
- # Tests deriving Ruby classes from GObject classes.
4
- describe "Class derivation" do
5
- before do
6
- save_module :GIMarshallingTests
7
- GirFFI.setup :GIMarshallingTests
8
- end
3
+ GirFFI.setup :Regress
9
4
 
10
- describe "with an interface mixed in" do
5
+ # Tests deriving Ruby classes from GObject classes.
6
+ describe "For derived classes" do
7
+ describe "setting up methods when first called" do
11
8
  before do
12
- @klass = Class.new GIMarshallingTests::OverridesObject
13
- @klass.send :include, GIMarshallingTests::Interface
9
+ save_module :GIMarshallingTests
10
+ GirFFI.setup :GIMarshallingTests
14
11
  end
15
12
 
16
- it "finds class methods in the superclass" do
17
- @klass.returnv
13
+ describe "when an interface is mixed in" do
14
+ before do
15
+ @klass = Class.new GIMarshallingTests::OverridesObject
16
+ @klass.send :include, GIMarshallingTests::Interface
17
+ end
18
+
19
+ it "finds class methods in the superclass" do
20
+ @klass.returnv
21
+ end
22
+
23
+ it "finds instance methods in the superclass" do
24
+ obj = @klass.new
25
+ result = obj.method
26
+ result.must_equal 42
27
+ end
18
28
  end
19
29
 
20
- it "finds instance methods in the superclass" do
21
- obj = @klass.new
22
- result = obj.method
23
- result.must_equal 42
30
+ after do
31
+ restore_module :GIMarshallingTests
24
32
  end
25
33
  end
26
34
 
27
- after do
28
- restore_module :GIMarshallingTests
35
+ describe "the initializer" do
36
+ it "does not have to call super" do
37
+ klass = Class.new Regress::TestSubObj do
38
+ def initialize *args
39
+ end
40
+ end
41
+
42
+ obj = klass.new
43
+ obj.must_be_instance_of klass
44
+ obj.to_ptr.wont_be_nil
45
+ end
29
46
  end
30
47
  end
31
-