gir_ffi 0.9.0 → 0.9.1
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.
- checksums.yaml +4 -4
- data/Changelog.md +8 -0
- data/Gemfile +2 -0
- data/README.md +2 -2
- data/Rakefile +3 -1
- data/TODO.md +7 -19
- data/lib/ffi-glib/byte_array.rb +1 -1
- data/lib/ffi-glib/list.rb +1 -1
- data/lib/ffi-glib/main_loop.rb +8 -8
- data/lib/ffi-glib/s_list.rb +1 -1
- data/lib/ffi-gobject/object.rb +8 -6
- data/lib/ffi-gobject/value.rb +2 -2
- data/lib/ffi-gobject.rb +5 -1
- data/lib/ffi-gobject_introspection/i_arg_info.rb +1 -1
- data/lib/ffi-gobject_introspection/i_base_info.rb +1 -1
- data/lib/ffi-gobject_introspection/i_callable_info.rb +2 -2
- data/lib/ffi-gobject_introspection/i_constant_info.rb +2 -2
- data/lib/ffi-gobject_introspection/i_enum_info.rb +2 -2
- data/lib/ffi-gobject_introspection/i_field_info.rb +1 -1
- data/lib/ffi-gobject_introspection/i_interface_info.rb +9 -9
- data/lib/ffi-gobject_introspection/i_object_info.rb +19 -14
- data/lib/ffi-gobject_introspection/i_property_info.rb +1 -1
- data/lib/ffi-gobject_introspection/i_repository.rb +1 -1
- data/lib/ffi-gobject_introspection/i_struct_info.rb +2 -2
- data/lib/ffi-gobject_introspection/i_type_info.rb +1 -1
- data/lib/ffi-gobject_introspection/i_union_info.rb +3 -3
- data/lib/ffi-gobject_introspection/i_vfunc_info.rb +2 -2
- data/lib/gir_ffi/builders/argument_builder.rb +2 -1
- data/lib/gir_ffi/builders/base_argument_builder.rb +1 -1
- data/lib/gir_ffi/builders/boxed_builder.rb +6 -0
- data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +7 -1
- data/lib/gir_ffi/builders/field_builder.rb +2 -4
- data/lib/gir_ffi/builders/object_builder.rb +20 -9
- data/lib/gir_ffi/builders/type_builder.rb +1 -1
- data/lib/gir_ffi/builders/unintrospectable_builder.rb +8 -0
- data/lib/gir_ffi/builders/with_layout.rb +0 -6
- data/lib/gir_ffi/core.rb +2 -1
- data/lib/gir_ffi/ffi_ext/pointer.rb +1 -1
- data/lib/gir_ffi/info_ext/i_type_info.rb +10 -12
- data/lib/gir_ffi/object_base.rb +4 -2
- data/lib/gir_ffi/property_not_found_error.rb +12 -0
- data/lib/gir_ffi/signal_not_found_error.rb +12 -0
- data/lib/gir_ffi/sized_array.rb +4 -4
- data/lib/gir_ffi/type_map.rb +1 -1
- data/lib/gir_ffi/unintrospectable_boxed_info.rb +2 -1
- data/lib/gir_ffi/unintrospectable_signal_info.rb +39 -0
- data/lib/gir_ffi/version.rb +2 -1
- data/lib/gir_ffi-base/gobject/lib.rb +1 -1
- data/tasks/rubocop.rake +5 -0
- data/tasks/test.rake +7 -0
- data/test/ffi-gobject/object_test.rb +29 -1
- data/test/ffi-gobject_introspection/i_object_info_test.rb +16 -0
- data/test/ffi-gobject_test.rb +3 -6
- data/test/gir_ffi/builders/argument_builder_test.rb +2 -2
- data/test/gir_ffi/builders/object_builder_test.rb +25 -12
- data/test/gir_ffi/builders/unintrospectable_builder_test.rb +21 -15
- data/test/integration/generated_gimarshallingtests_test.rb +16 -13
- data/test/integration/generated_gio_test.rb +2 -1
- data/test/integration/generated_gobject_test.rb +11 -1
- data/test/integration/generated_gst_test.rb +18 -0
- data/test/integration/generated_regress_test.rb +6 -8
- metadata +21 -2
@@ -9,6 +9,8 @@ module GirFFI
|
|
9
9
|
# Convertor for fields for field getters. Used when building getter
|
10
10
|
# methods.
|
11
11
|
class GetterArgumentBuilder < BaseArgumentBuilder
|
12
|
+
attr_reader :array_length_idx
|
13
|
+
|
12
14
|
def initialize(var_gen, field_argument_info, field_info,
|
13
15
|
array_length_idx: -1)
|
14
16
|
super(var_gen, field_argument_info)
|
@@ -49,10 +51,6 @@ module GirFFI
|
|
49
51
|
end
|
50
52
|
end
|
51
53
|
|
52
|
-
def array_length_idx
|
53
|
-
@array_length_idx
|
54
|
-
end
|
55
|
-
|
56
54
|
private
|
57
55
|
|
58
56
|
def field_offset
|
@@ -21,13 +21,11 @@ module GirFFI
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def find_signal(signal_name)
|
24
|
-
seek_in_ancestor_infos { |info| info.find_signal signal_name }
|
25
|
-
raise "Signal #{signal_name} not found"
|
24
|
+
seek_in_ancestor_infos { |info| info.find_signal signal_name }
|
26
25
|
end
|
27
26
|
|
28
27
|
def find_property(property_name)
|
29
|
-
seek_in_ancestor_infos { |info| info.find_property property_name }
|
30
|
-
raise "Property #{property_name} not found"
|
28
|
+
seek_in_ancestor_infos { |info| info.find_property property_name }
|
31
29
|
end
|
32
30
|
|
33
31
|
def object_class_struct
|
@@ -38,6 +36,15 @@ module GirFFI
|
|
38
36
|
@ancestor_infos ||= [info] + info.interfaces + parent_ancestor_infos
|
39
37
|
end
|
40
38
|
|
39
|
+
def eligible_fields
|
40
|
+
info.fields.reject do |finfo|
|
41
|
+
fname = finfo.name
|
42
|
+
fname == 'parent_instance' ||
|
43
|
+
info.find_instance_method("get_#{fname}") ||
|
44
|
+
info.find_property(fname)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
41
48
|
protected
|
42
49
|
|
43
50
|
def object_class_struct_info
|
@@ -51,11 +58,8 @@ module GirFFI
|
|
51
58
|
setup_layout
|
52
59
|
setup_constants
|
53
60
|
stub_methods
|
54
|
-
|
55
|
-
|
56
|
-
else
|
57
|
-
setup_property_accessors
|
58
|
-
end
|
61
|
+
setup_field_accessors
|
62
|
+
setup_property_accessors
|
59
63
|
setup_vfunc_invokers
|
60
64
|
setup_interfaces
|
61
65
|
provide_initializer
|
@@ -91,6 +95,12 @@ module GirFFI
|
|
91
95
|
@parent_ancestor_infos ||= parent_builder.ancestor_infos
|
92
96
|
end
|
93
97
|
|
98
|
+
def setup_field_accessors
|
99
|
+
eligible_fields.each do |finfo|
|
100
|
+
FieldBuilder.new(finfo).build
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
94
104
|
def setup_property_accessors
|
95
105
|
info.properties.each do |prop|
|
96
106
|
PropertyBuilder.new(prop).build
|
@@ -119,6 +129,7 @@ module GirFFI
|
|
119
129
|
def provide_initializer
|
120
130
|
return if info.find_method 'new'
|
121
131
|
|
132
|
+
# FIXME: Only valid if the object descends from GObject::Object
|
122
133
|
klass.class_eval "
|
123
134
|
def initialize(properties = {})
|
124
135
|
base_initialize(properties)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'gir_ffi/builders/object_builder'
|
2
|
+
require 'gir_ffi/unintrospectable_signal_info'
|
2
3
|
|
3
4
|
module GirFFI
|
4
5
|
module Builders
|
@@ -19,6 +20,13 @@ module GirFFI
|
|
19
20
|
def setup_instance_method(_method)
|
20
21
|
false
|
21
22
|
end
|
23
|
+
|
24
|
+
def find_signal(signal_name)
|
25
|
+
info = super
|
26
|
+
return info if info
|
27
|
+
signal_id = GObject.signal_lookup signal_name, target_gtype
|
28
|
+
return UnintrospectableSignalInfo.new(signal_id) if signal_id > 0
|
29
|
+
end
|
22
30
|
end
|
23
31
|
end
|
24
32
|
end
|
@@ -34,12 +34,6 @@ module GirFFI
|
|
34
34
|
fields.map(&:layout_specification).flatten(1)
|
35
35
|
end
|
36
36
|
|
37
|
-
def setup_field_accessors
|
38
|
-
fields.each do |finfo|
|
39
|
-
FieldBuilder.new(finfo).build
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
37
|
def klass
|
44
38
|
@klass ||= get_or_define_class namespace_module, @classname, superclass
|
45
39
|
end
|
data/lib/gir_ffi/core.rb
CHANGED
@@ -14,8 +14,9 @@ require 'gir_ffi/in_out_pointer'
|
|
14
14
|
require 'gir_ffi/sized_array'
|
15
15
|
require 'gir_ffi/zero_terminated'
|
16
16
|
require 'gir_ffi/arg_helper'
|
17
|
-
require 'gir_ffi/user_defined_type_info'
|
18
17
|
require 'gir_ffi/builder'
|
18
|
+
require 'gir_ffi/user_defined_type_info'
|
19
|
+
require 'gir_ffi/builders/user_defined_builder'
|
19
20
|
require 'gir_ffi/version'
|
20
21
|
|
21
22
|
# Main module containing classes and modules needed for generating GLib and
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'gir_ffi/builder_helper'
|
2
3
|
|
3
4
|
module GirFFI
|
@@ -16,17 +17,14 @@ module GirFFI
|
|
16
17
|
strv: GObject::TYPE_STRV,
|
17
18
|
utf8: GObject::TYPE_STRING,
|
18
19
|
void: GObject::TYPE_NONE
|
19
|
-
}
|
20
|
+
}.freeze
|
20
21
|
end
|
21
22
|
|
22
23
|
def gtype
|
23
|
-
if tag == :interface
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
else
|
28
|
-
raise "Can't find GType for #{flattened_tag} pointer? = #{pointer?}"
|
29
|
-
end
|
24
|
+
return interface.gtype if tag == :interface
|
25
|
+
type = ITypeInfo.flattened_tag_to_gtype_map[flattened_tag]
|
26
|
+
return type if type
|
27
|
+
raise "Can't find GType for #{flattened_tag} pointer? = #{pointer?}"
|
30
28
|
end
|
31
29
|
|
32
30
|
def make_g_value
|
@@ -86,7 +84,7 @@ module GirFFI
|
|
86
84
|
utf8: 'GirFFI::InPointer',
|
87
85
|
void: 'GirFFI::InPointer',
|
88
86
|
zero_terminated: 'GirFFI::ZeroTerminated'
|
89
|
-
}
|
87
|
+
}.freeze
|
90
88
|
|
91
89
|
# TODO: Use class rather than class name
|
92
90
|
def argument_class_name
|
@@ -133,13 +131,13 @@ module GirFFI
|
|
133
131
|
TAGS_NEEDING_RUBY_TO_C_CONVERSION = [
|
134
132
|
:array, :c, :callback, :error, :ghash, :glist, :gslist, :object,
|
135
133
|
:ptr_array, :struct, :strv, :utf8, :void, :zero_terminated
|
136
|
-
]
|
134
|
+
].freeze
|
137
135
|
|
138
136
|
TAGS_NEEDING_C_TO_RUBY_CONVERSION = [
|
139
137
|
:array, :byte_array, :c, :error, :filename, :ghash, :glist, :gslist,
|
140
138
|
:interface, :object, :ptr_array, :struct, :strv, :union, :utf8,
|
141
139
|
:zero_terminated
|
142
|
-
]
|
140
|
+
].freeze
|
143
141
|
|
144
142
|
def needs_ruby_to_c_conversion_for_functions?
|
145
143
|
TAGS_NEEDING_RUBY_TO_C_CONVERSION.include?(flattened_tag)
|
@@ -180,7 +178,7 @@ module GirFFI
|
|
180
178
|
end
|
181
179
|
end
|
182
180
|
|
183
|
-
GOBJECT_VALUE_NAME = 'GObject::Value'
|
181
|
+
GOBJECT_VALUE_NAME = 'GObject::Value'.freeze
|
184
182
|
|
185
183
|
def gvalue?
|
186
184
|
argument_class_name == GOBJECT_VALUE_NAME
|
data/lib/gir_ffi/object_base.rb
CHANGED
@@ -43,7 +43,8 @@ module GirFFI
|
|
43
43
|
# @return [GObjectIntrospection::IPropertyInfo] The property's info
|
44
44
|
#
|
45
45
|
def self.find_property(name)
|
46
|
-
gir_ffi_builder.find_property name
|
46
|
+
gir_ffi_builder.find_property name or
|
47
|
+
raise GirFFI::PropertyNotFoundError.new(name, self)
|
47
48
|
end
|
48
49
|
|
49
50
|
#
|
@@ -54,7 +55,8 @@ module GirFFI
|
|
54
55
|
# @return [GObjectIntrospection::ISignalInfo] The signal's info
|
55
56
|
#
|
56
57
|
def self.find_signal(name)
|
57
|
-
gir_ffi_builder.find_signal name
|
58
|
+
gir_ffi_builder.find_signal name or
|
59
|
+
raise GirFFI::SignalNotFoundError.new(name, self)
|
58
60
|
end
|
59
61
|
|
60
62
|
def self.object_class
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module GirFFI
|
2
|
+
# Exception class to be raised when a property is not found.
|
3
|
+
class PropertyNotFoundError < RuntimeError
|
4
|
+
attr_reader :property_name
|
5
|
+
|
6
|
+
def initialize(property_name, klass)
|
7
|
+
@property_name = property_name
|
8
|
+
@klass = klass
|
9
|
+
super "Property '#{property_name}' not found in #{klass}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module GirFFI
|
2
|
+
# Exception class to be raised when a signal is not found.
|
3
|
+
class SignalNotFoundError < RuntimeError
|
4
|
+
attr_reader :signal_name
|
5
|
+
|
6
|
+
def initialize(signal_name, klass)
|
7
|
+
@signal_name = signal_name
|
8
|
+
@klass = klass
|
9
|
+
super "Signal '#{signal_name}' not found in #{klass}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/gir_ffi/sized_array.rb
CHANGED
@@ -42,6 +42,10 @@ module GirFFI
|
|
42
42
|
pointer.put_bytes(0, value.to_ptr.read_bytes(size), 0, size)
|
43
43
|
end
|
44
44
|
|
45
|
+
def self.wrap(element_type, size, pointer)
|
46
|
+
new element_type, size, pointer unless pointer.null?
|
47
|
+
end
|
48
|
+
|
45
49
|
private
|
46
50
|
|
47
51
|
def element_ffi_type
|
@@ -52,10 +56,6 @@ module GirFFI
|
|
52
56
|
@element_size ||= FFI.type_size element_ffi_type
|
53
57
|
end
|
54
58
|
|
55
|
-
def self.wrap(element_type, size, pointer)
|
56
|
-
new element_type, size, pointer unless pointer.null?
|
57
|
-
end
|
58
|
-
|
59
59
|
class << self
|
60
60
|
def from(element_type, size, item)
|
61
61
|
return unless item
|
data/lib/gir_ffi/type_map.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'gir_ffi/info_ext/full_type_name'
|
2
3
|
|
3
4
|
module GirFFI
|
@@ -18,7 +19,7 @@ module GirFFI
|
|
18
19
|
GObject.type_name g_type
|
19
20
|
end
|
20
21
|
|
21
|
-
DEFAULT_BOXED_NAMESPACE = 'GLib'
|
22
|
+
DEFAULT_BOXED_NAMESPACE = 'GLib'.freeze
|
22
23
|
|
23
24
|
def namespace
|
24
25
|
DEFAULT_BOXED_NAMESPACE
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module GirFFI
|
2
|
+
# Represents a signal not found in the GIR, conforming, as needed, to the
|
3
|
+
# interface of GObjectIntrospection::ISignalInfo.
|
4
|
+
class UnintrospectableSignalInfo
|
5
|
+
attr_reader :signal_id
|
6
|
+
|
7
|
+
def initialize(signal_id)
|
8
|
+
@signal_id = signal_id
|
9
|
+
end
|
10
|
+
|
11
|
+
def name
|
12
|
+
GObject.signal_name signal_id
|
13
|
+
end
|
14
|
+
|
15
|
+
def wrap_in_closure(&block)
|
16
|
+
GObject::RubyClosure.new(&block)
|
17
|
+
end
|
18
|
+
|
19
|
+
def arguments_to_gvalues(instance, arguments)
|
20
|
+
param_gtypes = signal_query.param_types || []
|
21
|
+
|
22
|
+
argument_gvalues = param_gtypes.zip(arguments).map do |gtype, arg|
|
23
|
+
GObject::Value.for_gtype(gtype).tap { |it| it.set_value arg }
|
24
|
+
end
|
25
|
+
|
26
|
+
argument_gvalues.unshift GObject::Value.wrap_instance(instance)
|
27
|
+
end
|
28
|
+
|
29
|
+
def gvalue_for_return_value
|
30
|
+
GObject::Value.for_gtype signal_query.return_type
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def signal_query
|
36
|
+
@signal_query ||= GObject.signal_query signal_id
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/gir_ffi/version.rb
CHANGED
data/tasks/rubocop.rake
ADDED
data/tasks/test.rake
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'rake/testtask'
|
2
|
+
require 'cucumber/rake/task'
|
2
3
|
|
3
4
|
require 'rexml/document'
|
4
5
|
require 'rexml/streamlistener'
|
@@ -185,6 +186,10 @@ namespace :test do
|
|
185
186
|
make_stub_file 'Utility'
|
186
187
|
make_stub_file 'WarnLib'
|
187
188
|
end
|
189
|
+
|
190
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
191
|
+
t.cucumber_opts = 'features --format pretty'
|
192
|
+
end
|
188
193
|
end
|
189
194
|
|
190
195
|
file "test/lib/Makefile" => "test/lib/configure" do
|
@@ -194,3 +199,5 @@ end
|
|
194
199
|
file "test/lib/configure" => ["test/lib/autogen.sh", "test/lib/configure.ac"] do
|
195
200
|
sh %{cd test/lib && ./autogen.sh}
|
196
201
|
end
|
202
|
+
|
203
|
+
task test: 'test:all'
|
@@ -19,7 +19,7 @@ describe GObject::Object do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'raises an error for properties that do not exist' do
|
22
|
-
proc { GObject::Object.new(dog: 'bark') }.must_raise
|
22
|
+
proc { GObject::Object.new(dog: 'bark') }.must_raise GirFFI::PropertyNotFoundError
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -27,6 +27,34 @@ describe GObject::Object do
|
|
27
27
|
it 'is overridden to have arity 1' do
|
28
28
|
GObject::Object.instance_method('get_property').arity.must_equal 1
|
29
29
|
end
|
30
|
+
|
31
|
+
it 'raises an error for a property that does not exist' do
|
32
|
+
instance = GObject::Object.new
|
33
|
+
proc { instance.get_property 'foo-bar' }.must_raise GirFFI::PropertyNotFoundError
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#get_property_extended' do
|
38
|
+
it 'raises an error for a property that does not exist' do
|
39
|
+
instance = GObject::Object.new
|
40
|
+
proc { instance.get_property_extended 'foo-bar' }.
|
41
|
+
must_raise GirFFI::PropertyNotFoundError
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#set_property' do
|
46
|
+
it 'raises an error for a property that does not exist' do
|
47
|
+
instance = GObject::Object.new
|
48
|
+
proc { instance.set_property 'foo-bar', 123 }.must_raise GirFFI::PropertyNotFoundError
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#set_property_extended' do
|
53
|
+
it 'raises an error for a property that does not exist' do
|
54
|
+
instance = GObject::Object.new
|
55
|
+
proc { instance.set_property_extended 'foo-bar', 123 }.
|
56
|
+
must_raise GirFFI::PropertyNotFoundError
|
57
|
+
end
|
30
58
|
end
|
31
59
|
|
32
60
|
describe 'automatic accessor methods' do
|
@@ -23,6 +23,22 @@ describe GObjectIntrospection::IObjectInfo do
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
describe '#find_property' do
|
27
|
+
let(:object_info) { get_introspection_data('GObject', 'Binding') }
|
28
|
+
|
29
|
+
it 'finds a property by name string' do
|
30
|
+
object_info.find_property('source-property').wont_be_nil
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'finds a property by snake case string' do
|
34
|
+
object_info.find_property('source_property').wont_be_nil
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'finds a property by name symbol' do
|
38
|
+
object_info.find_property(:source).wont_be_nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
26
42
|
describe '#type_name' do
|
27
43
|
it 'returns the correct name' do
|
28
44
|
object_info.type_name.must_equal 'GObject'
|
data/test/ffi-gobject_test.rb
CHANGED
@@ -86,9 +86,8 @@ describe GObject do
|
|
86
86
|
|
87
87
|
it 'does not allow connecting an invalid signal' do
|
88
88
|
o = Regress::TestSubObj.new
|
89
|
-
|
90
|
-
|
91
|
-
end
|
89
|
+
proc { GObject.signal_connect(o, 'not-really-a-signal') {} }.
|
90
|
+
must_raise GirFFI::SignalNotFoundError
|
92
91
|
end
|
93
92
|
|
94
93
|
it 'handles return values' do
|
@@ -100,9 +99,7 @@ describe GObject do
|
|
100
99
|
|
101
100
|
it 'requires a block' do
|
102
101
|
o = Regress::TestSubObj.new
|
103
|
-
|
104
|
-
GObject.signal_connect o, 'test'
|
105
|
-
end
|
102
|
+
proc { GObject.signal_connect o, 'test' }.must_raise ArgumentError
|
106
103
|
end
|
107
104
|
|
108
105
|
it 'allows specifying signal detail' do
|
@@ -344,7 +344,7 @@ describe GirFFI::Builders::ArgumentBuilder do
|
|
344
344
|
end
|
345
345
|
|
346
346
|
it 'has the correct value for method_argument_name' do
|
347
|
-
builder.method_argument_name.must_equal
|
347
|
+
builder.method_argument_name.must_equal arg_info.name
|
348
348
|
end
|
349
349
|
|
350
350
|
it 'has the correct value for #pre_conversion' do
|
@@ -435,7 +435,7 @@ describe GirFFI::Builders::ArgumentBuilder do
|
|
435
435
|
|
436
436
|
it 'has the correct value for #pre_conversion' do
|
437
437
|
builder.pre_conversion.must_equal [
|
438
|
-
|
438
|
+
'GirFFI::ArgHelper.check_fixed_array_size 4, ints, "ints"',
|
439
439
|
'_v1 = GirFFI::InOutPointer.for [:pointer, :c]',
|
440
440
|
'_v1.set_value GirFFI::SizedArray.from(:gint32, 4, ints)'
|
441
441
|
]
|
@@ -9,6 +9,10 @@ describe GirFFI::Builders::ObjectBuilder do
|
|
9
9
|
GirFFI::Builders::ObjectBuilder.new(
|
10
10
|
get_introspection_data('Regress', 'TestSubObj'))
|
11
11
|
end
|
12
|
+
let(:param_spec_builder) do
|
13
|
+
GirFFI::Builders::ObjectBuilder.new(
|
14
|
+
get_introspection_data('GObject', 'ParamSpec'))
|
15
|
+
end
|
12
16
|
|
13
17
|
describe '#find_signal' do
|
14
18
|
it 'finds the signal "test" for TestObj' do
|
@@ -27,14 +31,8 @@ describe GirFFI::Builders::ObjectBuilder do
|
|
27
31
|
sig.name.must_equal 'changed'
|
28
32
|
end
|
29
33
|
|
30
|
-
it "
|
31
|
-
|
32
|
-
begin
|
33
|
-
obj_builder.find_signal 'foo'
|
34
|
-
rescue RuntimeError => e
|
35
|
-
msg = e.message
|
36
|
-
end
|
37
|
-
assert_match(/^Signal/, msg)
|
34
|
+
it "returns nil for a signal that doesn't exist" do
|
35
|
+
obj_builder.find_signal('foo').must_be_nil
|
38
36
|
end
|
39
37
|
end
|
40
38
|
|
@@ -49,10 +47,8 @@ describe GirFFI::Builders::ObjectBuilder do
|
|
49
47
|
prop.name.must_equal 'int'
|
50
48
|
end
|
51
49
|
|
52
|
-
it '
|
53
|
-
|
54
|
-
sub_obj_builder.find_property('this-property-does-not-exist')
|
55
|
-
end.must_raise RuntimeError
|
50
|
+
it 'returns nil if the property is not found' do
|
51
|
+
sub_obj_builder.find_property('this-property-does-not-exist').must_be_nil
|
56
52
|
end
|
57
53
|
end
|
58
54
|
|
@@ -86,4 +82,21 @@ describe GirFFI::Builders::ObjectBuilder do
|
|
86
82
|
assert_equal [:parent, GObject::Object::Struct, 0], spec
|
87
83
|
end
|
88
84
|
end
|
85
|
+
|
86
|
+
describe '#eligible_fields' do
|
87
|
+
it 'skips fields that have a matching getter method' do
|
88
|
+
result = param_spec_builder.eligible_fields
|
89
|
+
result.map(&:name).wont_include 'name'
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'skips fields that have a matching property' do
|
93
|
+
result = obj_builder.eligible_fields
|
94
|
+
result.map(&:name).wont_include 'hash_table'
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'skips the parent instance field' do
|
98
|
+
result = obj_builder.eligible_fields
|
99
|
+
result.map(&:name).wont_include 'parent_instance'
|
100
|
+
end
|
101
|
+
end
|
89
102
|
end
|
@@ -1,15 +1,13 @@
|
|
1
1
|
require 'gir_ffi_test_helper'
|
2
2
|
|
3
|
+
GirFFI.setup :Gio
|
4
|
+
GirFFI.setup :Gst
|
5
|
+
Gst.init []
|
6
|
+
|
3
7
|
describe GirFFI::Builders::UnintrospectableBuilder do
|
4
8
|
describe 'building the GLocalFile type' do
|
5
9
|
before do
|
6
|
-
|
7
|
-
GirFFI.setup :Gio
|
8
|
-
unless Gio::Lib.respond_to? :g_file_new_for_path
|
9
|
-
Gio.setup_method 'file_new_for_path'
|
10
|
-
end
|
11
|
-
ptr = GirFFI::InPointer.from :utf8, '/'
|
12
|
-
Gio::Lib.g_file_new_for_path(ptr)
|
10
|
+
Gio.file_new_for_path '/'
|
13
11
|
|
14
12
|
@gtype = GObject.type_from_name 'GLocalFile'
|
15
13
|
@info = GirFFI::UnintrospectableTypeInfo.new(@gtype)
|
@@ -37,14 +35,8 @@ describe GirFFI::Builders::UnintrospectableBuilder do
|
|
37
35
|
end
|
38
36
|
|
39
37
|
describe 'its #find_signal method' do
|
40
|
-
it "
|
41
|
-
|
42
|
-
begin
|
43
|
-
@bldr.find_signal 'foo'
|
44
|
-
rescue RuntimeError => e
|
45
|
-
msg = e.message
|
46
|
-
end
|
47
|
-
assert_match(/^Signal/, msg)
|
38
|
+
it "returns nil for a signal that doesn't exist" do
|
39
|
+
@bldr.find_signal('foo').must_be_nil
|
48
40
|
end
|
49
41
|
|
50
42
|
it 'finds signals in ancestor classes' do
|
@@ -59,4 +51,18 @@ describe GirFFI::Builders::UnintrospectableBuilder do
|
|
59
51
|
end
|
60
52
|
end
|
61
53
|
end
|
54
|
+
|
55
|
+
describe 'building the GstFakeSink type' do
|
56
|
+
let(:instance) { Gst::ElementFactory.make('fakesink', 'sink') }
|
57
|
+
let(:klass) { instance.class }
|
58
|
+
let(:builder) { klass.gir_ffi_builder }
|
59
|
+
|
60
|
+
describe 'its #find_signal method' do
|
61
|
+
it 'finds signals that are not defined in the GIR' do
|
62
|
+
signal = builder.find_signal 'handoff'
|
63
|
+
signal.wont_be_nil
|
64
|
+
signal.name.must_equal 'handoff'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
62
68
|
end
|