gir_ffi 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -7,10 +7,12 @@ GirFFI.setup :Regress
7
7
  describe "Pretty-printing" do
8
8
  def assert_syntax_ok str
9
9
  tmp = Tempfile.new "gir_ffi"
10
+ # TODO: Make #pretty_print add this preamble.
11
+ tmp.write "# coding: utf-8\n"
10
12
  tmp.write str
11
13
  tmp.flush
12
14
  is_ok = `ruby -c #{tmp.path} 2>&1`
13
- assert_equal "Syntax OK\n", is_ok
15
+ is_ok.must_match(/^Syntax OK/)
14
16
  end
15
17
 
16
18
  describe "for the Regress module" do
data/test/test_helper.rb CHANGED
@@ -4,6 +4,11 @@ if RUBY_PLATFORM == 'java'
4
4
  require 'rubygems'
5
5
  end
6
6
 
7
+ if RUBY_VERSION >= "1.9" and ENV["SIMPLECOV"]
8
+ require 'simplecov'
9
+ SimpleCov.start
10
+ end
11
+
7
12
  require 'minitest/spec'
8
13
  require 'minitest/autorun'
9
14
  require 'rr'
@@ -1,26 +1,9 @@
1
1
  require File.expand_path('gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
2
 
3
+ require 'ffi-gtk3'
4
+
3
5
  class TypeBuilderTest < MiniTest::Spec
4
6
  context "The Builder::Type class" do
5
- context "for Gtk::Widget" do
6
- setup do
7
- @cbuilder = GirFFI::Builder::Type::Object.new get_introspection_data('Gtk', 'Widget')
8
- end
9
-
10
- context "looking at Gtk::Widget#show" do
11
- setup do
12
- @go = get_method_introspection_data 'Gtk', 'Widget', 'show'
13
- end
14
-
15
- should "delegate definition to Builder::Function" do
16
- code = @cbuilder.send :function_definition, @go
17
- expected = GirFFI::Builder::Function.new(@go, Gtk::Lib).generate
18
- assert_equal cws(expected), cws(code)
19
- end
20
-
21
- end
22
- end
23
-
24
7
  context 'the find_signal method' do
25
8
  should 'find the signal "test" for TestObj' do
26
9
  builder = GirFFI::Builder::Type::Object.new get_introspection_data('Regress', 'TestObj')
@@ -2,18 +2,104 @@ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
2
 
3
3
  describe GirFFI::ArgHelper do
4
4
  describe "::ptr_to_typed_array" do
5
- describe "for pointers to class types" do
5
+ describe "for pointers to arrays of pointers to class types" do
6
6
  it "reads an array of pointers and wraps each in the class" do
7
7
  c = Class.new do
8
8
  def self.wrap a; "wrapped: #{a}"; end
9
9
  end
10
10
 
11
11
  mock(ptr = Object.new).read_array_of_pointer(2) { [:a, :b] }
12
+ mock(ptr).null? { false }
12
13
 
13
14
  result = GirFFI::ArgHelper.ptr_to_typed_array [:pointer, c], ptr, 2
14
15
 
15
16
  assert_equal ["wrapped: a", "wrapped: b"], result
16
17
  end
18
+
19
+ it "returns an empty array when passed a null pointer" do
20
+ result = GirFFI::ArgHelper.ptr_to_typed_array [:pointer, Class.new], FFI::Pointer.new(0), 42
21
+ result.must_equal []
22
+ end
23
+
24
+ it "returns an empty array when passed nil" do
25
+ result = GirFFI::ArgHelper.ptr_to_typed_array [:pointer, Class.new], nil, 42
26
+ result.must_equal []
27
+ end
28
+ end
29
+
30
+ describe "for pointers to arrays of class types" do
31
+ it "returns an empty array when passed a null pointer" do
32
+ result = GirFFI::ArgHelper.ptr_to_typed_array Class.new, FFI::Pointer.new(0), 42
33
+ result.must_equal []
34
+ end
35
+
36
+ it "returns an empty array when passed nil" do
37
+ result = GirFFI::ArgHelper.ptr_to_typed_array Class.new, nil, 42
38
+ result.must_equal []
39
+ end
40
+ end
41
+
42
+ describe "for pointers to string arrays" do
43
+ it "returns an empty array when passed a null pointer" do
44
+ result = GirFFI::ArgHelper.ptr_to_typed_array :utf8, FFI::Pointer.new(0), 42
45
+ result.must_equal []
46
+ end
47
+
48
+ it "returns an empty array when passed nil" do
49
+ result = GirFFI::ArgHelper.ptr_to_typed_array :utf8, nil, 42
50
+ result.must_equal []
51
+ end
52
+ end
53
+
54
+ describe "for pointers to arrays of base types" do
55
+ it "returns an empty array when passed a null pointer" do
56
+ result = GirFFI::ArgHelper.ptr_to_typed_array :gint32, FFI::Pointer.new(0), 0
57
+ result.must_equal []
58
+ end
59
+
60
+ it "returns an empty array when passed nil" do
61
+ result = GirFFI::ArgHelper.ptr_to_typed_array :gint32, nil, 0
62
+ result.must_equal []
63
+ end
64
+ end
65
+ end
66
+
67
+ describe "#object_to_inptr" do
68
+ describe "when called with an object implementing to_ptr" do
69
+ it "returns the result of to_ptr" do
70
+ obj = Object.new
71
+ def obj.to_ptr; :test_value; end
72
+ assert_equal :test_value, GirFFI::ArgHelper.object_to_inptr(obj)
73
+ end
74
+ end
75
+
76
+ describe "when called with nil" do
77
+ it "returns nil" do
78
+ assert_equal nil, GirFFI::ArgHelper.object_to_inptr(nil)
79
+ end
80
+ end
81
+
82
+ describe "when called with a string" do
83
+ it "stores the string in GirFFI::ArgHelper::OBJECT_STORE" do
84
+ str = "Foo"
85
+ ptr = GirFFI::ArgHelper.object_to_inptr(str)
86
+ result = GirFFI::ArgHelper::OBJECT_STORE[ptr.address]
87
+ result.must_equal str
88
+ end
89
+ end
90
+ end
91
+
92
+ describe "::object_pointer_to_object" do
93
+ it "finds the wrapping class by gtype and wraps the pointer in it" do
94
+ klsptr = GirFFI::InOutPointer.from :gtype, 0xdeadbeef
95
+ objptr = GirFFI::InOutPointer.from :pointer, klsptr
96
+
97
+ object_class = Class.new
98
+ mock(GirFFI::Builder).build_by_gtype(0xdeadbeef) { object_class }
99
+ mock(object_class).wrap(objptr) { "good-result" }
100
+
101
+ r = GirFFI::ArgHelper.object_pointer_to_object objptr
102
+ assert_equal "good-result", r
17
103
  end
18
104
  end
19
105
  end
@@ -3,7 +3,7 @@ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
3
3
  describe GirFFI::Builder do
4
4
  describe "::itypeinfo_to_callback_ffitype" do
5
5
  describe "for an :interface argument" do
6
- setup do
6
+ before do
7
7
  @iface = Object.new
8
8
  stub(@info = Object.new).interface { @iface }
9
9
  stub(@info).tag { :interface }
@@ -27,5 +27,117 @@ describe GirFFI::Builder do
27
27
  end
28
28
  end
29
29
  end
30
+
31
+ describe "building Regress::TestSubObj" do
32
+ before do
33
+ save_module :Regress
34
+ save_module :GObject
35
+ GirFFI::Builder.build_class get_introspection_data('Regress', 'TestSubObj')
36
+ end
37
+
38
+ it "builds Regress namespace" do
39
+ assert Regress.const_defined? :Lib
40
+ assert Regress.respond_to? :method_missing
41
+ end
42
+
43
+ it "builds parent classes also" do
44
+ assert Regress.const_defined? :TestObj
45
+ assert Object.const_defined? :GObject
46
+ assert GObject.const_defined? :Object
47
+ end
48
+
49
+ it "sets up the inheritance chain" do
50
+ ancestors = Regress::TestSubObj.ancestors
51
+ assert_equal [
52
+ Regress::TestSubObj,
53
+ Regress::TestObj,
54
+ GObject::Object
55
+ ], ancestors[0..2]
56
+ end
57
+
58
+ it "creates a Regress::TestSubObj#to_ptr method" do
59
+ assert Regress::TestSubObj.public_method_defined? :to_ptr
60
+ end
61
+
62
+ after do
63
+ restore_module :Regress
64
+ restore_module :GObject
65
+ end
66
+ end
67
+
68
+ describe "building Regress" do
69
+ before do
70
+ save_module :Regress
71
+ GirFFI::Builder.build_module 'Regress'
72
+ end
73
+
74
+ it "creates a Lib module ready to attach functions from the shared library" do
75
+ gir = GObjectIntrospection::IRepository.default
76
+ expected = [gir.shared_library('Regress')]
77
+ assert_equal expected, Regress::Lib.ffi_libraries.map(&:name)
78
+ end
79
+
80
+ it "creates an array CALLBACKS inside the Regress::Lib module" do
81
+ assert_equal [], Regress::Lib::CALLBACKS
82
+ end
83
+
84
+ it "does not replace existing module" do
85
+ oldmodule = Regress
86
+ GirFFI::Builder.build_module 'Regress'
87
+ assert_equal oldmodule, Regress
88
+ end
89
+
90
+ it "does not replace existing Lib module" do
91
+ oldmodule = Regress::Lib
92
+ GirFFI::Builder.build_module 'Regress'
93
+ assert_equal oldmodule, Regress::Lib
94
+ end
95
+
96
+ after do
97
+ restore_module :Regress
98
+ end
99
+ end
100
+
101
+ describe "looking at Regress.test_array_gint32_in" do
102
+ setup do
103
+ save_module :Regress
104
+ GirFFI::Builder.build_module 'Regress'
105
+ @go = get_introspection_data 'Regress', 'test_array_gint32_in'
106
+ end
107
+
108
+ it "has correct introspection data" do
109
+ gir = GObjectIntrospection::IRepository.default
110
+ gir.require "Regress", nil
111
+ go2 = gir.find_by_name "Regress", "test_array_gint32_in"
112
+ assert_equal go2, @go
113
+ end
114
+
115
+ it "attaches function to Regress::Lib" do
116
+ GirFFI::Builder.send :attach_ffi_function, Regress::Lib, @go
117
+ assert_defines_singleton_method Regress::Lib, :regress_test_array_gint32_in
118
+ end
119
+
120
+ it "has :pointer, :pointer as types of the arguments for the attached function" do
121
+ assert_equal [:int32, :pointer], GirFFI::Builder.send(:ffi_function_argument_types, @go)
122
+ end
123
+
124
+ it "has :void as return type for the attached function" do
125
+ assert_equal :int32, GirFFI::Builder.send(:ffi_function_return_type, @go)
126
+ end
127
+
128
+ after do
129
+ restore_module :Regress
130
+ end
131
+ end
132
+
133
+ describe "looking at Regress::TestObj#instance_method" do
134
+ setup do
135
+ @go = get_method_introspection_data 'Regress', 'TestObj', 'instance_method'
136
+ end
137
+
138
+ it "has :pointer as types of the arguments for the attached function" do
139
+ assert_equal [:pointer], GirFFI::Builder.send(:ffi_function_argument_types, @go)
140
+ end
141
+ end
30
142
  end
31
143
 
@@ -13,6 +13,7 @@ describe GirFFI::Builder::Function do
13
13
 
14
14
  it "builds a correct definition of Regress:test_array_fixed_out_objects" do
15
15
  go = get_introspection_data 'Regress', 'test_array_fixed_out_objects'
16
+ skip unless go
16
17
  fbuilder = GirFFI::Builder::Function.new go, DummyLib
17
18
  code = fbuilder.generate
18
19
 
@@ -23,7 +24,7 @@ describe GirFFI::Builder::Function do
23
24
  _v2 = _v1.to_sized_array_value 2
24
25
  return _v2
25
26
  end
26
- CODE
27
+ CODE
27
28
 
28
29
  assert_equal expected.reset_indentation, code
29
30
  end
@@ -159,14 +160,14 @@ describe GirFFI::Builder::Function do
159
160
  end
160
161
 
161
162
  it "builds a correct definition for a simple method" do
162
- go = get_method_introspection_data 'Gtk', 'Widget', 'show'
163
+ go = get_method_introspection_data 'Regress', 'TestObj', 'instance_method'
163
164
  fbuilder = GirFFI::Builder::Function.new go, DummyLib
164
165
  code = fbuilder.generate
165
166
 
166
167
  expected = <<-CODE
167
- def show
168
- DummyLib.gtk_widget_show self
169
-
168
+ def instance_method
169
+ _v1 = DummyLib.regress_test_obj_instance_method self
170
+ return _v1
170
171
  end
171
172
  CODE
172
173
 
@@ -0,0 +1,69 @@
1
+ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
+
3
+ GirFFI.setup :GIMarshallingTests
4
+
5
+ describe GirFFI do
6
+ describe "::define_type" do
7
+ describe "without a block" do
8
+ before do
9
+ @klass = Class.new GIMarshallingTests::OverridesObject
10
+ Object.const_set "Derived#{Sequence.next}", @klass
11
+ @gtype = GirFFI.define_type @klass
12
+ end
13
+
14
+ it "returns a GType for the derived class" do
15
+ parent_gtype = GIMarshallingTests::OverridesObject.get_gtype
16
+ @gtype.wont_equal parent_gtype
17
+ GObject.type_name(@gtype).must_equal @klass.name
18
+ end
19
+
20
+ it "makes #get_gtype on the registered class return the new GType" do
21
+ @klass.get_gtype.must_equal @gtype
22
+ end
23
+
24
+ it "registers a type with the same size as the parent" do
25
+ q = GObject.type_query @gtype
26
+ q.instance_size.must_equal GIMarshallingTests::OverridesObject::Struct.size
27
+ end
28
+
29
+ it "creates a struct class for the derived class with just one member" do
30
+ @klass::Struct.members.must_equal [:parent]
31
+ end
32
+
33
+ it "allows the new class to be instantiated" do
34
+ obj = @klass.new
35
+ type = GObject.type_from_instance obj
36
+ type.must_equal @gtype
37
+ end
38
+ end
39
+
40
+ describe "with a block with a call to #install_property" do
41
+ before do
42
+ @klass = Class.new GIMarshallingTests::OverridesObject
43
+ Object.const_set "Derived#{Sequence.next}", @klass
44
+ @gtype = GirFFI.define_type @klass do
45
+ install_property GObject.param_spec_int("foo", "foo bar",
46
+ "The Foo Bar Property",
47
+ 10, 20, 15,
48
+ 3)
49
+ end
50
+ end
51
+
52
+ it "registers a type that is bigger than the parent" do
53
+ q = GObject.type_query @gtype
54
+ q.instance_size.must_be :>, GIMarshallingTests::OverridesObject::Struct.size
55
+ end
56
+
57
+ it "gives the types Struct the fields :parent and :foo" do
58
+ @klass::Struct.members.must_equal [:parent, :foo]
59
+ end
60
+
61
+ it "creates accessor functions for the property" do
62
+ obj = @klass.new
63
+ obj.foo = 13
64
+ obj.foo.must_equal 13
65
+ end
66
+ end
67
+ end
68
+ end
69
+
@@ -4,7 +4,7 @@ require 'gir_ffi/in_out_pointer'
4
4
 
5
5
  describe GirFFI::InOutPointer do
6
6
  describe "an instance created with .from" do
7
- setup do
7
+ before do
8
8
  @result = GirFFI::InOutPointer.from :gint32, 23
9
9
  end
10
10
 
@@ -28,7 +28,7 @@ describe GirFFI::InOutPointer do
28
28
  end
29
29
 
30
30
  describe "an instance created with .from_array" do
31
- setup do
31
+ before do
32
32
  @result = GirFFI::InOutPointer.from_array :gint32, [24, 13]
33
33
  end
34
34
 
@@ -67,7 +67,7 @@ describe GirFFI::InOutPointer do
67
67
  end
68
68
 
69
69
  describe "in instance created with .for" do
70
- setup do
70
+ before do
71
71
  @result = GirFFI::InOutPointer.for :gint32
72
72
  end
73
73
 
@@ -19,7 +19,7 @@ describe GirFFI::InPointer do
19
19
  end
20
20
 
21
21
  describe "an instance created with .from_array" do
22
- setup do
22
+ before do
23
23
  @result = GirFFI::InPointer.from_array :gint32, [24, 13]
24
24
  end
25
25
 
@@ -11,6 +11,22 @@ describe GirFFI::Builder::Type::Interface do
11
11
  assert_equal "module Bar\n extend InterfaceBase\nend", builder.pretty_print
12
12
  end
13
13
  end
14
+
15
+ describe "#build_class" do
16
+ before do
17
+ info = get_introspection_data 'GObject', 'TypePlugin'
18
+ @bldr = GirFFI::Builder::Type::Interface.new info
19
+ @iface = @bldr.build_class
20
+ end
21
+
22
+ it "builds an interface as a module" do
23
+ assert_instance_of Module, @iface
24
+ end
25
+
26
+ it "creates methods on the interface" do
27
+ assert_defines_instance_method @iface, :complete_interface_info
28
+ end
29
+ end
14
30
  end
15
31
 
16
32
 
@@ -24,4 +24,19 @@ describe GirFFI::Builder::Type::Object do
24
24
  end
25
25
  end
26
26
  end
27
+
28
+ describe "#function_definition" do
29
+ before do
30
+ @cbuilder = GirFFI::Builder::Type::Object.new get_introspection_data('Regress', 'TestObj')
31
+ @go = get_method_introspection_data 'Regress', 'TestObj', 'instance_method'
32
+ end
33
+
34
+ it "delegates definition to Builder::Function" do
35
+ code = @cbuilder.send :function_definition, @go
36
+ expected = GirFFI::Builder::Function.new(@go, Regress::Lib).generate
37
+ assert_equal cws(expected), cws(code)
38
+ end
39
+
40
+ end
41
+
27
42
  end
@@ -75,11 +75,15 @@ describe GirFFI::Builder::Type::Struct do
75
75
  stub(GirFFI::Builder).build_module('Foo') { m }
76
76
 
77
77
  c = Class.new
78
+ c::Struct = Class.new
78
79
 
79
80
  refute c.method_defined?(:bar)
80
81
  refute c.method_defined?(:bar=)
81
82
 
82
- @builder.instance_eval { @klass = c }
83
+ @builder.instance_eval {
84
+ @klass = c
85
+ @structklass = c::Struct
86
+ }
83
87
  @builder.send :setup_field_accessors
84
88
 
85
89
  assert c.method_defined?(:bar)
@@ -1,4 +1,4 @@
1
- require File.expand_path('gir_ffi_test_helper.rb', File.dirname(__FILE__))
1
+ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
2
 
3
3
  describe GirFFI::Builder::Type::Unintrospectable do
4
4
  describe "building the GLocalFile type" do
@@ -47,4 +47,21 @@ describe GirFFI::Builder::Type::Unintrospectable do
47
47
  end
48
48
  end
49
49
  end
50
+
51
+ # FIXME: Testing a private method, and with rather a lot of
52
+ # mocking, too.
53
+ describe "#interfaces" do
54
+ it "skips interfaces that have no introspection data" do
55
+ bldr = GirFFI::Builder::Type::Unintrospectable.new(:some_type)
56
+
57
+ mock(bldr).interface_gtypes { [:foo, :bar ] }
58
+ mock(gir = Object.new).find_by_gtype(:foo) { :foo_info }
59
+ mock(gir).find_by_gtype(:bar) { nil }
60
+ bldr.instance_eval { @gir = gir }
61
+ mock(GirFFI::Builder).build_class(:foo_info) { :foo_module }
62
+
63
+ result = bldr.send :interfaces
64
+ result.must_equal [:foo_module]
65
+ end
66
+ end
50
67
  end
@@ -0,0 +1,18 @@
1
+ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
+
3
+ describe GirFFI::UserDefined::IObjectInfo do
4
+ it "has the attribute #properties" do
5
+ inf = GirFFI::UserDefined::IObjectInfo.new
6
+ inf.properties.must_equal []
7
+ inf.properties << :foo
8
+ inf.properties.must_equal [:foo]
9
+ inf.properties = [:bar, :baz]
10
+ inf.properties.must_equal [:bar, :baz]
11
+ end
12
+
13
+ it "derives from GirFFI::UserDefined::IRegisteredTypeInfo" do
14
+ inf = GirFFI::UserDefined::IObjectInfo.new
15
+ inf.must_be_kind_of GirFFI::UserDefined::IRegisteredTypeInfo
16
+ end
17
+ end
18
+
@@ -0,0 +1,14 @@
1
+ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
+
3
+ describe GirFFI::UserDefined::IPropertyInfo do
4
+ it "has the attribute #property_type" do
5
+ inf = GirFFI::UserDefined::IPropertyInfo.new
6
+ inf.property_type = :foo
7
+ inf.property_type.must_equal :foo
8
+ end
9
+
10
+ it "derives from GirFFI::UserDefined::IBaseInfo" do
11
+ inf = GirFFI::UserDefined::IPropertyInfo.new
12
+ inf.must_be_kind_of GirFFI::UserDefined::IBaseInfo
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
+
3
+ describe GirFFI::UserDefined::IRegisteredTypeInfo do
4
+ it "derives from GirFFI::UserDefined::IBaseInfo" do
5
+ inf = GirFFI::UserDefined::IRegisteredTypeInfo.new
6
+ inf.must_be_kind_of GirFFI::UserDefined::IBaseInfo
7
+ end
8
+ end
9
+
10
+
@@ -0,0 +1,41 @@
1
+ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
+
3
+ describe GirFFI::Builder::Type::UserDefined do
4
+ describe "with a block with a call to #install_property" do
5
+ before do
6
+ @klass = Class.new GIMarshallingTests::OverridesObject
7
+ Object.const_set "Derived#{Sequence.next}", @klass
8
+ @builder = GirFFI::Builder::Type::UserDefined.new @klass do
9
+ install_property GObject.param_spec_int("foo", "foo bar",
10
+ "The Foo Bar Property",
11
+ 10, 20, 15,
12
+ 3)
13
+ end
14
+ @builder.build_class
15
+ end
16
+
17
+ it "has one property of type GirFFI::UserDefined::IPropertyInfo" do
18
+ props = @builder.send(:properties)
19
+ props.length.must_equal 1
20
+ props[0].must_be_instance_of GirFFI::UserDefined::IPropertyInfo
21
+ end
22
+
23
+ describe "the info attribute" do
24
+ before do
25
+ @info = @builder.info
26
+ end
27
+
28
+ it "is an object of type GirFFI::UserDefined::IObjectInfo" do
29
+ @info.must_be_instance_of GirFFI::UserDefined::IObjectInfo
30
+ end
31
+
32
+ it "knows about the single property :foo" do
33
+ props = @info.properties
34
+ props.length.must_equal 1
35
+ foo_property = props[0]
36
+ foo_property.must_be_instance_of GirFFI::UserDefined::IPropertyInfo
37
+ foo_property.name.must_equal "foo"
38
+ end
39
+ end
40
+ end
41
+ end