gir_ffi 0.6.7 → 0.7.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 (136) hide show
  1. checksums.yaml +7 -0
  2. data/{History.txt → Changelog.md} +93 -61
  3. data/{DESIGN.rdoc → DESIGN.md} +7 -7
  4. data/README.md +5 -7
  5. data/TODO.md +90 -0
  6. data/lib/ffi-glib.rb +0 -1
  7. data/lib/ffi-glib/array.rb +13 -29
  8. data/lib/ffi-glib/array_methods.rb +13 -0
  9. data/lib/ffi-glib/container_class_methods.rb +6 -1
  10. data/lib/ffi-glib/hash_table.rb +3 -2
  11. data/lib/ffi-glib/list.rb +3 -17
  12. data/lib/ffi-glib/list_methods.rb +22 -3
  13. data/lib/ffi-glib/ptr_array.rb +19 -19
  14. data/lib/ffi-glib/s_list.rb +3 -17
  15. data/lib/ffi-gobject.rb +10 -17
  16. data/lib/ffi-gobject/object.rb +19 -9
  17. data/lib/ffi-gobject/object_class.rb +14 -0
  18. data/lib/ffi-gobject/ruby_closure.rb +4 -5
  19. data/lib/ffi-gobject/value.rb +7 -5
  20. data/lib/ffi-gobject_introspection/i_vfunc_info.rb +1 -1
  21. data/lib/gir_ffi-base.rb +0 -2
  22. data/lib/gir_ffi-base/gobject.rb +1 -0
  23. data/lib/gir_ffi-base/gobject/lib.rb +1 -1
  24. data/lib/gir_ffi.rb +2 -0
  25. data/lib/gir_ffi/arg_helper.rb +18 -8
  26. data/lib/gir_ffi/builders/argument_builder.rb +62 -55
  27. data/lib/gir_ffi/builders/base_argument_builder.rb +52 -106
  28. data/lib/gir_ffi/builders/base_type_builder.rb +3 -3
  29. data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +34 -0
  30. data/lib/gir_ffi/builders/callback_argument_builder.rb +73 -0
  31. data/lib/gir_ffi/builders/callback_builder.rb +19 -9
  32. data/lib/gir_ffi/builders/callback_return_value_builder.rb +54 -0
  33. data/lib/gir_ffi/builders/closure_convertor.rb +9 -0
  34. data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +9 -0
  35. data/lib/gir_ffi/builders/constructor_result_convertor.rb +9 -0
  36. data/lib/gir_ffi/builders/enum_builder.rb +16 -16
  37. data/lib/gir_ffi/builders/field_builder.rb +36 -15
  38. data/lib/gir_ffi/builders/function_builder.rb +32 -27
  39. data/lib/gir_ffi/builders/interface_builder.rb +14 -4
  40. data/lib/gir_ffi/builders/mapping_method_builder.rb +95 -43
  41. data/lib/gir_ffi/builders/module_builder.rb +22 -35
  42. data/lib/gir_ffi/builders/null_convertor.rb +9 -0
  43. data/lib/gir_ffi/builders/object_builder.rb +11 -14
  44. data/lib/gir_ffi/builders/property_builder.rb +107 -9
  45. data/lib/gir_ffi/builders/registered_type_builder.rb +2 -2
  46. data/lib/gir_ffi/builders/return_value_builder.rb +42 -33
  47. data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +15 -0
  48. data/lib/gir_ffi/builders/signal_builder.rb +18 -58
  49. data/lib/gir_ffi/builders/struct_builder.rb +1 -2
  50. data/lib/gir_ffi/builders/type_builder.rb +1 -0
  51. data/lib/gir_ffi/builders/unintrospectable_builder.rb +4 -4
  52. data/lib/gir_ffi/builders/user_defined_builder.rb +151 -26
  53. data/lib/gir_ffi/builders/vfunc_builder.rb +57 -0
  54. data/lib/gir_ffi/builders/with_layout.rb +10 -8
  55. data/lib/gir_ffi/builders/with_methods.rb +1 -1
  56. data/lib/gir_ffi/callback_base.rb +42 -8
  57. data/lib/gir_ffi/class_base.rb +1 -2
  58. data/lib/gir_ffi/enum_base.rb +26 -4
  59. data/lib/gir_ffi/error_argument_info.rb +21 -0
  60. data/lib/gir_ffi/{setter_argument_info.rb → field_argument_info.rb} +2 -1
  61. data/lib/gir_ffi/g_type.rb +25 -0
  62. data/lib/gir_ffi/in_out_pointer.rb +3 -14
  63. data/lib/gir_ffi/in_pointer.rb +20 -21
  64. data/lib/gir_ffi/info_ext.rb +2 -0
  65. data/lib/gir_ffi/info_ext/i_callable_info.rb +0 -9
  66. data/lib/gir_ffi/info_ext/i_callback_info.rb +17 -0
  67. data/lib/gir_ffi/info_ext/i_function_info.rb +4 -0
  68. data/lib/gir_ffi/info_ext/i_property_info.rb +4 -0
  69. data/lib/gir_ffi/info_ext/i_registered_type_info.rb +1 -0
  70. data/lib/gir_ffi/info_ext/i_signal_info.rb +14 -16
  71. data/lib/gir_ffi/info_ext/i_type_info.rb +72 -34
  72. data/lib/gir_ffi/info_ext/i_vfunc_info.rb +12 -0
  73. data/lib/gir_ffi/info_ext/safe_constant_name.rb +3 -2
  74. data/lib/gir_ffi/interface_base.rb +8 -3
  75. data/lib/gir_ffi/module_base.rb +3 -5
  76. data/lib/gir_ffi/object_base.rb +8 -0
  77. data/lib/gir_ffi/receiver_argument_info.rb +21 -0
  78. data/lib/gir_ffi/receiver_type_info.rb +27 -0
  79. data/lib/gir_ffi/return_value_info.rb +23 -0
  80. data/lib/gir_ffi/signal_base.rb +1 -1
  81. data/lib/{ffi-glib → gir_ffi}/sized_array.rb +10 -6
  82. data/lib/gir_ffi/struct_base.rb +10 -9
  83. data/lib/gir_ffi/type_base.rb +1 -0
  84. data/lib/gir_ffi/type_map.rb +3 -0
  85. data/lib/gir_ffi/unintrospectable_type_info.rb +4 -1
  86. data/lib/gir_ffi/union_base.rb +4 -21
  87. data/lib/gir_ffi/user_data_argument_info.rb +21 -0
  88. data/lib/gir_ffi/user_data_type_info.rb +17 -0
  89. data/lib/gir_ffi/user_defined_type_info.rb +18 -4
  90. data/lib/gir_ffi/version.rb +1 -1
  91. data/lib/gir_ffi/vfunc_base.rb +8 -0
  92. data/lib/gir_ffi/vfunc_implementation.rb +11 -0
  93. data/lib/gir_ffi/zero_terminated.rb +18 -24
  94. data/test/base_test_helper.rb +2 -3
  95. data/test/ffi-glib/array_test.rb +3 -3
  96. data/test/ffi-glib/ruby_closure_test.rb +3 -3
  97. data/test/ffi-gobject/value_test.rb +15 -1
  98. data/test/ffi-gobject_test.rb +2 -1
  99. data/test/gir_ffi/arg_helper_test.rb +21 -2
  100. data/test/gir_ffi/builders/argument_builder_test.rb +213 -287
  101. data/test/gir_ffi/builders/base_argument_builder_test.rb +1 -1
  102. data/test/gir_ffi/builders/callback_builder_test.rb +26 -8
  103. data/test/gir_ffi/builders/field_builder_test.rb +18 -3
  104. data/test/gir_ffi/builders/function_builder_test.rb +30 -12
  105. data/test/gir_ffi/builders/interface_builder_test.rb +9 -0
  106. data/test/gir_ffi/builders/module_builder_test.rb +0 -39
  107. data/test/gir_ffi/builders/object_builder_test.rb +27 -27
  108. data/test/gir_ffi/builders/property_builder_test.rb +110 -0
  109. data/test/gir_ffi/builders/return_value_builder_test.rb +168 -200
  110. data/test/gir_ffi/builders/signal_builder_test.rb +58 -14
  111. data/test/gir_ffi/builders/struct_builder_test.rb +2 -41
  112. data/test/gir_ffi/builders/user_defined_builder_test.rb +88 -20
  113. data/test/gir_ffi/builders/vfunc_builder_test.rb +44 -0
  114. data/test/gir_ffi/g_type_test.rb +29 -0
  115. data/test/gir_ffi/in_pointer_test.rb +28 -9
  116. data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -9
  117. data/test/gir_ffi/info_ext/i_callback_info_test.rb +19 -0
  118. data/test/gir_ffi/info_ext/i_function_info_test.rb +9 -0
  119. data/test/gir_ffi/info_ext/i_signal_info_test.rb +8 -11
  120. data/test/gir_ffi/info_ext/i_type_info_test.rb +140 -16
  121. data/test/gir_ffi/interface_base_test.rb +9 -3
  122. data/test/gir_ffi/object_base_test.rb +1 -2
  123. data/test/{ffi-glib → gir_ffi}/sized_array_test.rb +28 -28
  124. data/test/gir_ffi/type_map_test.rb +1 -1
  125. data/test/gir_ffi/user_defined_type_info_test.rb +36 -4
  126. data/test/gir_ffi_test.rb +5 -5
  127. data/test/gir_ffi_test_helper.rb +4 -0
  128. data/test/integration/generated_gimarshallingtests_test.rb +163 -59
  129. data/test/integration/generated_gobject_test.rb +21 -8
  130. data/test/integration/generated_pango_test.rb +2 -2
  131. data/test/integration/generated_regress_test.rb +361 -101
  132. data/test/lib/autogen.sh +5 -1
  133. metadata +51 -35
  134. data/TODO.rdoc +0 -63
  135. data/lib/gir_ffi-base/gir_ffi/library.rb +0 -17
  136. data/lib/gir_ffi-base/gir_ffi/struct.rb +0 -27
@@ -10,10 +10,10 @@ describe GirFFI::Builders::SignalBuilder do
10
10
 
11
11
  it "returns a valid mapping method including receiver and user data" do
12
12
  expected = <<-CODE.reset_indentation
13
- def self.call_with_argument_mapping(_proc, _v1, _v2)
14
- _v3 = ::Regress::TestObj.wrap(_v1)
15
- _v4 = GirFFI::ArgHelper::OBJECT_STORE[_v2.address]
16
- _proc.call(_v3, _v4)
13
+ def self.call_with_argument_mapping(_proc, _instance, _user_data)
14
+ _v1 = Regress::TestObj.wrap(_instance)
15
+ _v2 = GirFFI::ArgHelper::OBJECT_STORE[_user_data.address]
16
+ _proc.call(_v1, _v2)
17
17
  end
18
18
  CODE
19
19
 
@@ -29,11 +29,12 @@ describe GirFFI::Builders::SignalBuilder do
29
29
  skip unless signal_info
30
30
 
31
31
  expected = <<-CODE.reset_indentation
32
- def self.call_with_argument_mapping(_proc, _v1, _v2, _v3)
33
- _v4 = ::Regress::TestObj.wrap(_v1)
34
- _v5 = GirFFI::ArgHelper::OBJECT_STORE[_v3.address]
35
- _v6 = _proc.call(_v4, _v2, _v5)
36
- return _v6
32
+ def self.call_with_argument_mapping(_proc, _instance, i, _user_data)
33
+ _v1 = Regress::TestObj.wrap(_instance)
34
+ _v2 = i
35
+ _v3 = GirFFI::ArgHelper::OBJECT_STORE[_user_data.address]
36
+ _v4 = _proc.call(_v1, _v2, _v3)
37
+ return _v4
37
38
  end
38
39
  CODE
39
40
 
@@ -47,11 +48,54 @@ describe GirFFI::Builders::SignalBuilder do
47
48
 
48
49
  it "returns a valid mapping method" do
49
50
  expected = <<-CODE.reset_indentation
50
- def self.call_with_argument_mapping(_proc, _v1, _v2, _v3)
51
- _v4 = ::Gio::MountOperation.wrap(_v1)
52
- _v5 = ::Gio::MountOperationResult[_v2]
53
- _v6 = GirFFI::ArgHelper::OBJECT_STORE[_v3.address]
54
- _proc.call(_v4, _v5, _v6)
51
+ def self.call_with_argument_mapping(_proc, _instance, result, _user_data)
52
+ _v1 = Gio::MountOperation.wrap(_instance)
53
+ _v2 = Gio::MountOperationResult.wrap(result)
54
+ _v3 = GirFFI::ArgHelper::OBJECT_STORE[_user_data.address]
55
+ _proc.call(_v1, _v2, _v3)
56
+ end
57
+ CODE
58
+
59
+ builder.mapping_method_definition.must_equal expected
60
+ end
61
+ end
62
+
63
+ describe "for a signal with a array plus length arguments" do
64
+ let(:signal_info) {
65
+ get_signal_introspection_data "Regress", "TestObj", "sig-with-array-len-prop" }
66
+
67
+ it "returns a valid mapping method" do
68
+ skip unless signal_info
69
+
70
+ expected = <<-CODE.reset_indentation
71
+ def self.call_with_argument_mapping(_proc, _instance, arr, len, _user_data)
72
+ _v1 = Regress::TestObj.wrap(_instance)
73
+ _v2 = GirFFI::ArgHelper::OBJECT_STORE[_user_data.address]
74
+ _v3 = len
75
+ _v4 = GirFFI::SizedArray.wrap(:guint32, _v3, arr)
76
+ _proc.call(_v1, _v4, _v2)
77
+ end
78
+ CODE
79
+
80
+ builder.mapping_method_definition.must_equal expected
81
+ end
82
+ end
83
+
84
+ describe "for a signal returning an array of integers" do
85
+ let(:signal_info) {
86
+ get_signal_introspection_data "Regress", "TestObj", "sig-with-intarray-ret" }
87
+
88
+ it "returns a valid mapping method" do
89
+ skip unless signal_info
90
+
91
+ expected = <<-CODE.reset_indentation
92
+ def self.call_with_argument_mapping(_proc, _instance, i, _user_data)
93
+ _v1 = Regress::TestObj.wrap(_instance)
94
+ _v2 = i
95
+ _v3 = GirFFI::ArgHelper::OBJECT_STORE[_user_data.address]
96
+ _v4 = _proc.call(_v1, _v2, _v3)
97
+ _v5 = GLib::Array.from(:gint32, _v4)
98
+ return _v5
55
99
  end
56
100
  CODE
57
101
 
@@ -8,28 +8,17 @@ describe GirFFI::Builders::StructBuilder do
8
8
  builder.layout_specification.must_equal [:some_int, :int32, 0,
9
9
  :some_int8, :int8, 4,
10
10
  :some_double, :double, 8,
11
- :some_enum, Regress::TestEnum::Enum, 16]
11
+ :some_enum, Regress::TestEnum, 16]
12
12
  end
13
13
  end
14
14
 
15
15
  describe "for a struct with a simple layout" do
16
16
  before do
17
- module Foo
18
- class Bar
19
- class Struct
20
-
21
- end
22
- end
23
- module Lib
24
-
25
- end
26
- end
27
17
  @field = Object.new
28
18
 
29
19
  @struct = Object.new
30
- stub(@struct).safe_name { 'Bar' }
31
20
  stub(@struct).namespace { 'Foo' }
32
- stub(@struct).safe_namespace { 'Foo' }
21
+ stub(@struct).safe_name { 'Bar' }
33
22
  stub(@struct).fields { [ @field ] }
34
23
 
35
24
  @builder = GirFFI::Builders::StructBuilder.new @struct
@@ -40,34 +29,6 @@ describe GirFFI::Builders::StructBuilder do
40
29
  spec = @builder.send :layout_specification
41
30
  assert_equal [:bar, :int32, 0], spec
42
31
  end
43
-
44
- it "creates getter and setter methods" do
45
- # FIXME: Loads of stubs.
46
-
47
- stub(type = Object.new).pointer? { false }
48
- stub(type).tag { :gint32 }
49
- stub(type).flattened_tag { :gint32 }
50
- stub(type).tag_or_class { :gint32 }
51
- stub(type).extra_conversion_arguments { [] }
52
-
53
- stub(@field).field_type { type }
54
- stub(@field).name { "bar" }
55
- stub(@field).writable? { true }
56
- stub(@field).offset { 4 }
57
- stub(@field).container { @struct }
58
-
59
- stub(@struct).find_instance_method { }
60
-
61
- stub(GirFFI::Builder).build_module('Foo') { Foo }
62
-
63
- refute Foo::Bar.method_defined?(:bar)
64
- refute Foo::Bar.method_defined?(:bar=)
65
-
66
- @builder.send :setup_field_accessors
67
-
68
- assert Foo::Bar.method_defined?(:bar)
69
- assert Foo::Bar.method_defined?(:bar=)
70
- end
71
32
  end
72
33
 
73
34
  describe "for a struct with a layout with a complex type" do
@@ -3,36 +3,104 @@ require 'gir_ffi_test_helper'
3
3
  GirFFI.setup :GIMarshallingTests
4
4
 
5
5
  describe GirFFI::Builders::UserDefinedBuilder do
6
- describe "with type info containing one property" do
6
+ let(:klass) { Object.const_set("DerivedClass#{Sequence.next}",
7
+ Class.new(GIMarshallingTests::Object)) }
8
+ let(:builder) { GirFFI::Builders::UserDefinedBuilder.new info }
9
+ let(:info) { GirFFI::UserDefinedTypeInfo.new klass }
10
+
11
+ describe "#build_class" do
7
12
  before do
8
- @klass = Class.new GIMarshallingTests::OverridesObject
9
- Object.const_set "DerivedC#{Sequence.next}", @klass
13
+ builder.build_class
14
+ end
15
+
16
+ describe "with type info containing one property" do
17
+ let(:info) { GirFFI::UserDefinedTypeInfo.new klass do |info|
18
+ info.install_property GObject.param_spec_int("foo", "foo bar",
19
+ "The Foo Bar Property",
20
+ 10, 20, 15,
21
+ 3)
22
+ end }
10
23
 
11
- @info = GirFFI::UserDefinedTypeInfo.new @klass do
12
- install_property GObject.param_spec_int("foo", "foo bar",
13
- "The Foo Bar Property",
14
- 10, 20, 15,
15
- 3)
24
+ it "registers a type that is bigger than the parent" do
25
+ gtype = klass.get_gtype
26
+ q = GObject.type_query gtype
27
+ q.instance_size.must_be :>, GIMarshallingTests::Object::Struct.size
16
28
  end
17
29
 
18
- @builder = GirFFI::Builders::UserDefinedBuilder.new @info
19
- @builder.build_class
30
+ it "gives the types Struct the fields :parent and :foo" do
31
+ klass::Struct.members.must_equal [:parent, :foo]
32
+ end
33
+
34
+ it "creates accessor functions for the property" do
35
+ obj = klass.new
36
+ obj.foo = 13
37
+ obj.foo.must_equal 13
38
+ end
39
+
40
+ it "makes the property retrievable using #get_property" do
41
+ obj = klass.new
42
+ obj.foo = 13
43
+ obj.get_property("foo").get_value.must_equal 13
44
+ end
45
+
46
+ it "makes the property settable using #set_property" do
47
+ obj = klass.new
48
+ obj.set_property("foo", 20)
49
+ obj.foo.must_equal 20
50
+ end
20
51
  end
21
52
 
22
- it "registers a type that is bigger than the parent" do
23
- gtype = @klass.get_gtype
24
- q = GObject.type_query gtype
25
- q.instance_size.must_be :>, GIMarshallingTests::OverridesObject::Struct.size
53
+ describe "with type info containing an overridden g_name" do
54
+ let(:info) { GirFFI::UserDefinedTypeInfo.new klass do |info|
55
+ info.g_name = "OtherName#{Sequence.next}"
56
+ end }
57
+
58
+ it "registers a type under the overridden name" do
59
+ registered_name = GObject.type_name(klass.get_gtype)
60
+ registered_name.must_equal info.g_name
61
+ registered_name.wont_equal klass.name
62
+ end
63
+ end
64
+
65
+ describe "with type info containing a vfunc" do
66
+ let(:info) { GirFFI::UserDefinedTypeInfo.new klass do |info|
67
+ info.install_vfunc_implementation :method_int8_in, proc {|instance, in_|
68
+ instance.int = in_ }
69
+ end }
70
+
71
+ it "allows the vfunc to be called through its invoker" do
72
+ obj = klass.new
73
+ obj.method_int8_in 12
74
+ obj.int.must_equal 12
75
+ end
26
76
  end
27
77
 
28
- it "gives the types Struct the fields :parent and :foo" do
29
- @klass::Struct.members.must_equal [:parent, :foo]
78
+ describe "with type info containing a vfunc from an included Interface" do
79
+ let(:info) do
80
+ klass.class_eval { include GIMarshallingTests::Interface }
81
+ GirFFI::UserDefinedTypeInfo.new klass do |info|
82
+ info.install_vfunc_implementation :test_int8_in,
83
+ proc {|instance, in_| instance.int = in_ }
84
+ end
85
+ end
86
+
87
+ it "marks the type as conforming to the included Interface" do
88
+ iface_gtype = GIMarshallingTests::Interface.get_gtype
89
+ GObject.type_interfaces(klass.get_gtype).to_a.must_equal [iface_gtype]
90
+ end
91
+
92
+ it "allows the vfunc to be called through its invoker" do
93
+ obj = klass.new
94
+ obj.test_int8_in 12
95
+ obj.int.must_equal 12
96
+ end
30
97
  end
31
98
 
32
- it "creates accessor functions for the property" do
33
- obj = @klass.new
34
- obj.foo = 13
35
- obj.foo.must_equal 13
99
+ it "does not attempt to register a registered class" do
100
+ gtype = klass.get_gtype
101
+ other_builder = GirFFI::Builders::UserDefinedBuilder.new info
102
+ other_builder.build_class
103
+ other_builder.gtype.must_equal gtype
36
104
  end
37
105
  end
38
106
  end
@@ -0,0 +1,44 @@
1
+ require 'gir_ffi_test_helper'
2
+
3
+ describe GirFFI::Builders::VFuncBuilder do
4
+ let(:builder) { GirFFI::Builders::VFuncBuilder.new vfunc_info }
5
+
6
+ describe "#mapping_method_definition" do
7
+ describe "for a vfunc with only one argument" do
8
+ let(:vfunc_info) {
9
+ get_vfunc_introspection_data "GIMarshallingTests", "Object", "method_int8_in" }
10
+
11
+ it "returns a valid mapping method including receiver" do
12
+ expected = <<-CODE.reset_indentation
13
+ def self.call_with_argument_mapping(_proc, _instance, in_)
14
+ _v1 = GIMarshallingTests::Object.wrap(_instance)
15
+ _v2 = in_
16
+ _proc.call(_v1, _v2)
17
+ end
18
+ CODE
19
+
20
+ builder.mapping_method_definition.must_equal expected
21
+ end
22
+ end
23
+
24
+ describe "for a vfunc returning an enum" do
25
+ let(:vfunc_info) {
26
+ get_vfunc_introspection_data "GIMarshallingTests", "Object", "vfunc_return_enum" }
27
+
28
+ it "returns a valid mapping method including receiver" do
29
+ skip unless vfunc_info
30
+ expected = <<-CODE.reset_indentation
31
+ def self.call_with_argument_mapping(_proc, _instance)
32
+ _v1 = GIMarshallingTests::Object.wrap(_instance)
33
+ _v2 = _proc.call(_v1)
34
+ _v3 = GIMarshallingTests::Enum.from(_v2)
35
+ return _v3
36
+ end
37
+ CODE
38
+
39
+ builder.mapping_method_definition.must_equal expected
40
+ end
41
+ end
42
+ end
43
+ end
44
+
@@ -0,0 +1,29 @@
1
+ require 'gir_ffi_test_helper'
2
+
3
+ require 'gir_ffi/g_type'
4
+
5
+ describe GirFFI::GType do
6
+ let(:gobject_gtype) { GObject::Object.get_gtype }
7
+ let(:gobject_type_query) { GObject.type_query gobject_gtype }
8
+
9
+ describe "#to_i" do
10
+ it "returns the integer gtype" do
11
+ gt = GirFFI::GType.new(gobject_gtype)
12
+ gt.to_i.must_equal gobject_gtype
13
+ end
14
+ end
15
+
16
+ describe "#class_size" do
17
+ it "returns the class size for object types" do
18
+ gt = GirFFI::GType.new(gobject_gtype)
19
+ gt.class_size.must_equal gobject_type_query.class_size
20
+ end
21
+ end
22
+
23
+ describe "#instance_size" do
24
+ it "returns the instance size for object types" do
25
+ gt = GirFFI::GType.new(gobject_gtype)
26
+ gt.instance_size.must_equal gobject_type_query.instance_size
27
+ end
28
+ end
29
+ end
@@ -24,7 +24,7 @@ describe GirFFI::InPointer do
24
24
 
25
25
  it "handles struct types" do
26
26
  e = Class.new(GirFFI::StructBase) do
27
- self::Struct = Class.new(GirFFI::Struct) do
27
+ self::Struct = Class.new(FFI::Struct) do
28
28
  layout :foo, :int32, :bar, :int32
29
29
  end
30
30
  end
@@ -42,10 +42,16 @@ describe GirFFI::InPointer do
42
42
  p1 = GirFFI::InPointer.from :gint32, 42
43
43
  p2 = GirFFI::InPointer.from :gint32, 24
44
44
 
45
- ptr = GirFFI::InPointer.from_array [:pointer, :uint32], [p1, p2]
45
+ ptr = GirFFI::InPointer.from_array [:pointer, :gint32], [p1, p2]
46
46
 
47
47
  ptr.read_array_of_pointer(2).must_equal [p1, p2]
48
48
  end
49
+
50
+ it "handles pointer casting" do
51
+ ptr = GirFFI::InPointer.from_array [:pointer, :gint32], [42, 24]
52
+
53
+ ptr.read_array_of_pointer(2).map(&:address).must_equal [42, 24]
54
+ end
49
55
  end
50
56
 
51
57
  describe "an instance created with .from_array :gint32" do
@@ -148,27 +154,40 @@ describe GirFFI::InPointer do
148
154
  ptr = GirFFI::InPointer.from e, :bar
149
155
  ptr.address.must_equal 1
150
156
  end
151
- end
152
157
 
153
- describe ".from_object" do
154
- describe "when called with an object implementing to_ptr" do
158
+ describe "for type :void" do
155
159
  it "returns the result of to_ptr" do
156
160
  obj = Object.new
157
161
  def obj.to_ptr; :test_value; end
158
- GirFFI::InPointer.from_object(obj).must_equal :test_value
162
+ GirFFI::InPointer.from(:void, obj).must_equal :test_value
163
+ end
164
+
165
+ it "returns nil when passed nil" do
166
+ GirFFI::InPointer.from(:void, nil).must_equal nil
167
+ end
168
+ end
169
+
170
+ describe "for types that are classes" do
171
+ it "returns the result of to_ptr" do
172
+ klass = Class.new
173
+ obj = klass.new
174
+ def obj.to_ptr; :test_value; end
175
+ GirFFI::InPointer.from(klass, obj).must_equal :test_value
159
176
  end
160
177
  end
178
+ end
161
179
 
180
+ describe ".from_closure_data" do
162
181
  describe "when called with nil" do
163
- it "returns nil" do
164
- GirFFI::InPointer.from_object(nil).must_equal nil
182
+ it "returns a pointer pointing to nil.object_id" do
183
+ GirFFI::InPointer.from_closure_data(nil).address.must_equal nil.object_id
165
184
  end
166
185
  end
167
186
 
168
187
  describe "when called with a string" do
169
188
  it "stores the string in GirFFI::ArgHelper::OBJECT_STORE" do
170
189
  str = "Foo"
171
- ptr = GirFFI::InPointer.from_object(str)
190
+ ptr = GirFFI::InPointer.from_closure_data(str)
172
191
  result = GirFFI::ArgHelper::OBJECT_STORE[ptr.address]
173
192
  result.must_equal str
174
193
  end
@@ -19,14 +19,5 @@ describe GirFFI::InfoExt::ICallableInfo do
19
19
  end
20
20
  end
21
21
  end
22
-
23
- describe "#return_ffi_type" do
24
- it "returns the ffi type of the return type" do
25
- stub(return_type_info = Object.new).to_ffitype { :some_type }
26
- stub(callable_info).return_type { return_type_info }
27
-
28
- callable_info.return_ffi_type.must_equal :some_type
29
- end
30
- end
31
22
  end
32
23
 
@@ -0,0 +1,19 @@
1
+ require 'gir_ffi_test_helper'
2
+
3
+ describe GirFFI::InfoExt::ICallbackInfo do
4
+ let(:klass) { Class.new do
5
+ include GirFFI::InfoExt::ICallbackInfo
6
+ end }
7
+ let(:callback_info) { klass.new }
8
+
9
+ describe "#return_ffi_type" do
10
+ it "returns the callback ffi type of the return type" do
11
+ stub(return_type_info = Object.new).to_callback_ffitype { :some_type }
12
+ stub(callback_info).return_type { return_type_info }
13
+
14
+ callback_info.return_ffi_type.must_equal :some_type
15
+ end
16
+ end
17
+ end
18
+
19
+