gir_ffi 0.15.3 → 0.15.4
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 +15 -0
- data/README.md +5 -6
- data/TODO.md +14 -35
- data/docs/Documentation.md +6 -0
- data/docs/Subclassing.md +38 -0
- data/lib/ffi-glib.rb +8 -3
- data/lib/ffi-glib/byte_array.rb +2 -1
- data/lib/ffi-glib/destroy_notify.rb +2 -2
- data/lib/ffi-glib/hash_table.rb +1 -2
- data/lib/ffi-glib/list.rb +11 -5
- data/lib/ffi-glib/list_methods.rb +12 -0
- data/lib/ffi-glib/s_list.rb +10 -4
- data/lib/ffi-gobject.rb +0 -3
- data/lib/ffi-gobject/object.rb +77 -73
- data/lib/ffi-gobject/object_class.rb +1 -1
- data/lib/ffi-gobject/value.rb +107 -108
- data/lib/ffi-gobject_introspection/i_base_info.rb +20 -19
- data/lib/gir_ffi-base/gobject/lib.rb +4 -0
- data/lib/gir_ffi/array_element_convertor.rb +1 -2
- data/lib/gir_ffi/boxed_base.rb +1 -5
- data/lib/gir_ffi/builder.rb +1 -1
- data/lib/gir_ffi/builder_helper.rb +7 -4
- data/lib/gir_ffi/builders/base_argument_builder.rb +2 -2
- data/lib/gir_ffi/builders/base_method_builder.rb +1 -1
- data/lib/gir_ffi/builders/base_type_builder.rb +1 -1
- data/lib/gir_ffi/builders/callback_argument_builder.rb +2 -0
- data/lib/gir_ffi/builders/callback_builder.rb +14 -12
- data/lib/gir_ffi/builders/callback_return_value_builder.rb +4 -6
- data/lib/gir_ffi/builders/class_struct_builder.rb +24 -0
- data/lib/gir_ffi/builders/enum_builder.rb +3 -3
- data/lib/gir_ffi/builders/interface_builder.rb +3 -1
- data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
- data/lib/gir_ffi/builders/marshalling_method_builder.rb +5 -2
- data/lib/gir_ffi/builders/method_template.rb +4 -4
- data/lib/gir_ffi/builders/null_argument_builder.rb +0 -2
- data/lib/gir_ffi/builders/null_return_value_builder.rb +0 -2
- data/lib/gir_ffi/builders/object_builder.rb +16 -6
- data/lib/gir_ffi/builders/property_builder.rb +1 -2
- data/lib/gir_ffi/builders/signal_closure_builder.rb +3 -5
- data/lib/gir_ffi/builders/struct_builder.rb +5 -5
- data/lib/gir_ffi/builders/user_defined_builder.rb +8 -1
- data/lib/gir_ffi/builders/vfunc_argument_builder.rb +1 -1
- data/lib/gir_ffi/callback_base.rb +3 -3
- data/lib/gir_ffi/core.rb +17 -2
- data/lib/gir_ffi/glib_error.rb +1 -2
- data/lib/gir_ffi/in_pointer.rb +7 -0
- data/lib/gir_ffi/object_base.rb +27 -0
- data/lib/gir_ffi/return_value_info.rb +1 -2
- data/lib/gir_ffi/struct_base.rb +1 -9
- data/lib/gir_ffi/struct_like_base.rb +9 -5
- data/lib/gir_ffi/unintrospectable_type_info.rb +1 -1
- data/lib/gir_ffi/union_base.rb +1 -9
- data/lib/gir_ffi/user_defined_object_info.rb +3 -2
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi/vfunc_implementation.rb +1 -0
- metadata +86 -136
- data/Gemfile +0 -14
- data/Rakefile +0 -9
- data/tasks/test.rake +0 -204
- data/test/base_test_helper.rb +0 -70
- data/test/ffi-glib/array_test.rb +0 -203
- data/test/ffi-glib/byte_array_test.rb +0 -28
- data/test/ffi-glib/bytes_test.rb +0 -61
- data/test/ffi-glib/closure_test.rb +0 -38
- data/test/ffi-glib/destroy_notify_test.rb +0 -18
- data/test/ffi-glib/hash_table_test.rb +0 -68
- data/test/ffi-glib/list_test.rb +0 -86
- data/test/ffi-glib/main_loop_test.rb +0 -53
- data/test/ffi-glib/ptr_array_test.rb +0 -112
- data/test/ffi-glib/ruby_closure_test.rb +0 -62
- data/test/ffi-glib/s_list_test.rb +0 -76
- data/test/ffi-glib/strv_test.rb +0 -60
- data/test/ffi-glib/variant_test.rb +0 -12
- data/test/ffi-gobject/gobject_test.rb +0 -76
- data/test/ffi-gobject/object_class_test.rb +0 -31
- data/test/ffi-gobject/object_test.rb +0 -123
- data/test/ffi-gobject/param_spec_test.rb +0 -32
- data/test/ffi-gobject/value_test.rb +0 -390
- data/test/ffi-gobject_introspection/gobject_type_init_test.rb +0 -26
- data/test/ffi-gobject_introspection/i_base_info_test.rb +0 -52
- data/test/ffi-gobject_introspection/i_constant_info_test.rb +0 -29
- data/test/ffi-gobject_introspection/i_enum_info_test.rb +0 -18
- data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -6
- data/test/ffi-gobject_introspection/i_interface_info_test.rb +0 -23
- data/test/ffi-gobject_introspection/i_object_info_test.rb +0 -49
- data/test/ffi-gobject_introspection/i_property_info_test.rb +0 -47
- data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +0 -27
- data/test/ffi-gobject_introspection/i_repository_test.rb +0 -81
- data/test/ffi-gobject_introspection/i_struct_info_test.rb +0 -23
- data/test/ffi-gobject_introspection/i_type_info_test.rb +0 -30
- data/test/ffi-gobject_introspection/i_union_info_test.rb +0 -17
- data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +0 -41
- data/test/ffi-gobject_introspection/lib_test.rb +0 -13
- data/test/ffi-gobject_introspection/strv_test.rb +0 -46
- data/test/ffi-gobject_test.rb +0 -153
- data/test/gir_ffi/allocation_helper_test.rb +0 -36
- data/test/gir_ffi/arg_helper_test.rb +0 -146
- data/test/gir_ffi/boolean_test.rb +0 -43
- data/test/gir_ffi/boxed_base_test.rb +0 -65
- data/test/gir_ffi/builder_test.rb +0 -168
- data/test/gir_ffi/builders/argument_builder_test.rb +0 -691
- data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -6
- data/test/gir_ffi/builders/callback_argument_builder_test.rb +0 -130
- data/test/gir_ffi/builders/callback_builder_test.rb +0 -117
- data/test/gir_ffi/builders/callback_return_value_builder_test.rb +0 -84
- data/test/gir_ffi/builders/constant_builder_test.rb +0 -6
- data/test/gir_ffi/builders/constructor_builder_test.rb +0 -39
- data/test/gir_ffi/builders/enum_builder_test.rb +0 -23
- data/test/gir_ffi/builders/field_builder_test.rb +0 -140
- data/test/gir_ffi/builders/function_builder_test.rb +0 -570
- data/test/gir_ffi/builders/initializer_builder_test.rb +0 -56
- data/test/gir_ffi/builders/interface_builder_test.rb +0 -32
- data/test/gir_ffi/builders/module_builder_test.rb +0 -43
- data/test/gir_ffi/builders/object_builder_test.rb +0 -98
- data/test/gir_ffi/builders/property_builder_test.rb +0 -161
- data/test/gir_ffi/builders/registered_type_builder_test.rb +0 -54
- data/test/gir_ffi/builders/return_value_builder_test.rb +0 -444
- data/test/gir_ffi/builders/signal_closure_builder_test.rb +0 -199
- data/test/gir_ffi/builders/struct_builder_test.rb +0 -96
- data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +0 -29
- data/test/gir_ffi/builders/unintrospectable_builder_test.rb +0 -84
- data/test/gir_ffi/builders/union_builder_test.rb +0 -28
- data/test/gir_ffi/builders/user_defined_builder_test.rb +0 -528
- data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +0 -107
- data/test/gir_ffi/builders/vfunc_builder_test.rb +0 -245
- data/test/gir_ffi/callback_base_test.rb +0 -22
- data/test/gir_ffi/class_base_test.rb +0 -171
- data/test/gir_ffi/core_test.rb +0 -99
- data/test/gir_ffi/enum_base_test.rb +0 -43
- data/test/gir_ffi/error_type_info_test.rb +0 -50
- data/test/gir_ffi/ffi_ext/pointer_test.rb +0 -22
- data/test/gir_ffi/g_type_test.rb +0 -31
- data/test/gir_ffi/in_pointer_test.rb +0 -203
- data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -26
- data/test/gir_ffi/info_ext/i_callback_info_test.rb +0 -22
- data/test/gir_ffi/info_ext/i_field_info_test.rb +0 -37
- data/test/gir_ffi/info_ext/i_function_info_test.rb +0 -74
- data/test/gir_ffi/info_ext/i_signal_info_test.rb +0 -32
- data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -712
- data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +0 -19
- data/test/gir_ffi/info_ext/safe_constant_name_test.rb +0 -26
- data/test/gir_ffi/info_ext/safe_function_name_test.rb +0 -26
- data/test/gir_ffi/interface_base_test.rb +0 -20
- data/test/gir_ffi/method_stubber_test.rb +0 -67
- data/test/gir_ffi/object_base_test.rb +0 -64
- data/test/gir_ffi/object_store_test.rb +0 -41
- data/test/gir_ffi/receiver_argument_info_test.rb +0 -33
- data/test/gir_ffi/sized_array_test.rb +0 -206
- data/test/gir_ffi/struct_base_test.rb +0 -23
- data/test/gir_ffi/struct_like_base_test.rb +0 -167
- data/test/gir_ffi/type_map_test.rb +0 -17
- data/test/gir_ffi/unintrospectable_type_info_test.rb +0 -121
- data/test/gir_ffi/union_base_test.rb +0 -23
- data/test/gir_ffi/user_defined_object_info_test.rb +0 -119
- data/test/gir_ffi/user_defined_property_info_test.rb +0 -39
- data/test/gir_ffi/variable_name_generator_test.rb +0 -18
- data/test/gir_ffi/version_test.rb +0 -9
- data/test/gir_ffi/zero_terminated_test.rb +0 -108
- data/test/gir_ffi_test_helper.rb +0 -84
- data/test/integration/callback_exceptions_test.rb +0 -59
- data/test/integration/derived_classes_test.rb +0 -54
- data/test/integration/generated_everything_test.rb +0 -453
- data/test/integration/generated_gimarshallingtests_test.rb +0 -3109
- data/test/integration/generated_gio_test.rb +0 -116
- data/test/integration/generated_glib_test.rb +0 -10
- data/test/integration/generated_gobject_test.rb +0 -124
- data/test/integration/generated_gst_test.rb +0 -38
- data/test/integration/generated_gtk_source_test.rb +0 -21
- data/test/integration/generated_gtop_test.rb +0 -22
- data/test/integration/generated_pango_ft2_test.rb +0 -17
- data/test/integration/generated_pango_test.rb +0 -24
- data/test/integration/generated_regress_test.rb +0 -4076
- data/test/integration/generated_secret_test.rb +0 -14
- data/test/integration/generated_utility_test.rb +0 -174
- data/test/integration/generated_warnlib_test.rb +0 -45
- data/test/integration/method_lookup_test.rb +0 -34
- data/test/introspection_test_helper.rb +0 -94
- data/test/lib/Makefile.am +0 -110
- data/test/lib/autogen.sh +0 -4
- data/test/lib/configure.ac +0 -34
- data/test/lib/m4/jhflags.m4 +0 -21
- data/test/minitest/stats_plugin.rb +0 -30
@@ -1,41 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "introspection_test_helper"
|
4
|
-
|
5
|
-
describe GObjectIntrospection::IVFuncInfo do
|
6
|
-
let(:vfunc_info) do
|
7
|
-
get_vfunc_introspection_data "GIMarshallingTests", "Object", "method_int8_in"
|
8
|
-
end
|
9
|
-
|
10
|
-
let(:throwing_vfunc_info) do
|
11
|
-
get_vfunc_introspection_data "GIMarshallingTests", "Object", "vfunc_meth_with_err"
|
12
|
-
end
|
13
|
-
|
14
|
-
let(:vfunc_info_with_different_invoker) do
|
15
|
-
get_vfunc_introspection_data "Regress", "TestObj", "matrix"
|
16
|
-
end
|
17
|
-
|
18
|
-
describe "#throws?" do
|
19
|
-
it "returns false if there is no error argument" do
|
20
|
-
_(vfunc_info).wont_be :throws?
|
21
|
-
end
|
22
|
-
|
23
|
-
it "returns true if there is and error argument" do
|
24
|
-
_(throwing_vfunc_info).must_be :throws?
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe "#invoker" do
|
29
|
-
it "returns nil if no invoker method is present" do
|
30
|
-
_(throwing_vfunc_info.invoker).must_be_nil
|
31
|
-
end
|
32
|
-
|
33
|
-
it "returns info for the invoker method if present" do
|
34
|
-
_(vfunc_info.invoker.name).must_equal "method_int8_in"
|
35
|
-
end
|
36
|
-
|
37
|
-
it "returns the correct invoker even if named differently" do
|
38
|
-
_(vfunc_info_with_different_invoker.invoker.name).must_equal "do_matrix"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "introspection_test_helper"
|
4
|
-
|
5
|
-
describe GObjectIntrospection::Lib::GIArgument do
|
6
|
-
describe "its member :v_ssize" do
|
7
|
-
it "is signed" do
|
8
|
-
gia = GObjectIntrospection::Lib::GIArgument.new
|
9
|
-
gia[:v_int64] = -1
|
10
|
-
assert_equal(-1, gia[:v_ssize])
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "base_test_helper"
|
4
|
-
|
5
|
-
describe GObjectIntrospection::Strv do
|
6
|
-
it "wraps a pointer" do
|
7
|
-
strv = GObjectIntrospection::Strv.new :some_pointer
|
8
|
-
assert_equal :some_pointer, strv.to_ptr
|
9
|
-
end
|
10
|
-
|
11
|
-
describe "::wrap" do
|
12
|
-
it "takes a pointer and returns a GObjectIntrospection::Strv wrapping it" do
|
13
|
-
strv = GObjectIntrospection::Strv.wrap :some_pointer
|
14
|
-
assert_instance_of GObjectIntrospection::Strv, strv
|
15
|
-
assert_equal :some_pointer, strv.to_ptr
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe "#each" do
|
20
|
-
it "yields each string element" do
|
21
|
-
ary = %w(one two three)
|
22
|
-
ptrs = ary.map { |a| FFI::MemoryPointer.from_string(a) }
|
23
|
-
ptrs << nil
|
24
|
-
block = FFI::MemoryPointer.new(:pointer, ptrs.length)
|
25
|
-
block.write_array_of_pointer ptrs
|
26
|
-
|
27
|
-
strv = GObjectIntrospection::Strv.new block
|
28
|
-
arr = []
|
29
|
-
strv.each do |str|
|
30
|
-
arr << str
|
31
|
-
end
|
32
|
-
assert_equal %w(one two three), arr
|
33
|
-
end
|
34
|
-
|
35
|
-
it "yields zero times for a Strv wrapping a null pointer" do
|
36
|
-
strv = GObjectIntrospection::Strv.new FFI::Pointer.new(0)
|
37
|
-
strv.each do |_str|
|
38
|
-
flunk
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
it "includes Enumerable" do
|
44
|
-
_(GObjectIntrospection::Strv).must_include Enumerable
|
45
|
-
end
|
46
|
-
end
|
data/test/ffi-gobject_test.rb
DELETED
@@ -1,153 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "gir_ffi_test_helper"
|
4
|
-
|
5
|
-
describe GObject do
|
6
|
-
before do
|
7
|
-
GirFFI.setup :Regress
|
8
|
-
end
|
9
|
-
|
10
|
-
describe "::signal_emit" do
|
11
|
-
it "emits a signal" do
|
12
|
-
a = 1
|
13
|
-
o = Regress::TestSubObj.new
|
14
|
-
prc = proc { a = 2 }
|
15
|
-
callback = GObject::Callback.from prc
|
16
|
-
::GObject::Lib.g_signal_connect_data o, "test", callback, nil, nil, 0
|
17
|
-
GObject.signal_emit o, "test"
|
18
|
-
assert_equal 2, a
|
19
|
-
end
|
20
|
-
|
21
|
-
it "handles return values" do
|
22
|
-
s = Gio::SocketService.new
|
23
|
-
|
24
|
-
argtypes = [:pointer, :pointer, :pointer, :pointer]
|
25
|
-
callback = FFI::Function.new(:bool, argtypes) { |_a, _b, _c, _d| true }
|
26
|
-
::GObject::Lib.g_signal_connect_data s, "incoming", callback, nil, nil, 0
|
27
|
-
rv = GObject.signal_emit s, "incoming"
|
28
|
-
assert_equal true, rv
|
29
|
-
end
|
30
|
-
|
31
|
-
it "passes in extra arguments" do
|
32
|
-
o = Regress::TestSubObj.new
|
33
|
-
sb = Regress::TestSimpleBoxedA.new
|
34
|
-
sb.some_int8 = 31
|
35
|
-
sb.some_double = 2.42
|
36
|
-
sb.some_enum = :value2
|
37
|
-
b2 = nil
|
38
|
-
|
39
|
-
argtypes = [:pointer, :pointer, :pointer]
|
40
|
-
callback = FFI::Function.new(:void, argtypes) do |_a, b, _c|
|
41
|
-
b2 = b
|
42
|
-
end
|
43
|
-
::GObject::Lib.g_signal_connect_data(o, "test-with-static-scope-arg",
|
44
|
-
callback, nil, nil, 0)
|
45
|
-
GObject.signal_emit o, "test-with-static-scope-arg", sb
|
46
|
-
|
47
|
-
sb2 = Regress::TestSimpleBoxedA.wrap b2
|
48
|
-
assert sb.equals(sb2)
|
49
|
-
end
|
50
|
-
|
51
|
-
it "allows specifying signal detail" do
|
52
|
-
a = 1
|
53
|
-
o = Regress::TestSubObj.new
|
54
|
-
|
55
|
-
callback = FFI::Function.new(:void, [:pointer, :pointer, :pointer]) { a = 2 }
|
56
|
-
::GObject::Lib.g_signal_connect_data o, "notify::detail", callback, nil, nil, 0
|
57
|
-
|
58
|
-
GObject.signal_emit o, "notify::detail"
|
59
|
-
|
60
|
-
_(a).must_equal 2
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
describe "::signal_connect" do
|
65
|
-
it "installs a signal handler" do
|
66
|
-
a = 1
|
67
|
-
o = Regress::TestSubObj.new
|
68
|
-
GObject.signal_connect(o, "test") { a = 2 }
|
69
|
-
GObject.signal_emit o, "test"
|
70
|
-
assert_equal 2, a
|
71
|
-
end
|
72
|
-
|
73
|
-
it "passes user data to handler" do
|
74
|
-
a = 1
|
75
|
-
o = Regress::TestSubObj.new
|
76
|
-
GObject.signal_connect(o, "test", 2) { |_i, d| a = d }
|
77
|
-
GObject.signal_emit o, "test"
|
78
|
-
assert_equal 2, a
|
79
|
-
end
|
80
|
-
|
81
|
-
it "passes object to handler" do
|
82
|
-
o = Regress::TestSubObj.new
|
83
|
-
o2 = nil
|
84
|
-
GObject.signal_connect(o, "test") { |i, _d| o2 = i }
|
85
|
-
GObject.signal_emit o, "test"
|
86
|
-
assert_instance_of Regress::TestSubObj, o2
|
87
|
-
assert_equal o.to_ptr, o2.to_ptr
|
88
|
-
end
|
89
|
-
|
90
|
-
it "does not allow connecting an invalid signal" do
|
91
|
-
o = Regress::TestSubObj.new
|
92
|
-
_(proc { GObject.signal_connect(o, "not-really-a-signal") {} })
|
93
|
-
.must_raise GirFFI::SignalNotFoundError
|
94
|
-
end
|
95
|
-
|
96
|
-
it "handles return values" do
|
97
|
-
s = Gio::SocketService.new
|
98
|
-
GObject.signal_connect(s, "incoming") { true }
|
99
|
-
rv = GObject.signal_emit s, "incoming"
|
100
|
-
assert_equal true, rv
|
101
|
-
end
|
102
|
-
|
103
|
-
it "requires a block" do
|
104
|
-
o = Regress::TestSubObj.new
|
105
|
-
_(proc { GObject.signal_connect o, "test" }).must_raise ArgumentError
|
106
|
-
end
|
107
|
-
|
108
|
-
it "allows specifying signal detail" do
|
109
|
-
a = 1
|
110
|
-
o = Regress::TestSubObj.new
|
111
|
-
GObject.signal_connect(o, "notify::detail", 2) { |_i, _, d| a = d }
|
112
|
-
GObject.signal_emit o, "notify::detail"
|
113
|
-
assert_equal 2, a
|
114
|
-
end
|
115
|
-
|
116
|
-
describe "connecting a signal with extra arguments" do
|
117
|
-
before do
|
118
|
-
@a = nil
|
119
|
-
@b = 2
|
120
|
-
|
121
|
-
o = Regress::TestSubObj.new
|
122
|
-
sb = Regress::TestSimpleBoxedA.new
|
123
|
-
sb.some_int = 23
|
124
|
-
|
125
|
-
GObject.signal_connect(o, "test-with-static-scope-arg", 2) \
|
126
|
-
do |_instance, object, user_data|
|
127
|
-
@a = user_data
|
128
|
-
@b = object
|
129
|
-
end
|
130
|
-
GObject.signal_emit o, "test-with-static-scope-arg", sb
|
131
|
-
end
|
132
|
-
|
133
|
-
it "passes on the user data argument" do
|
134
|
-
assert_equal 2, @a
|
135
|
-
end
|
136
|
-
|
137
|
-
it "passes on the extra arguments" do
|
138
|
-
assert_instance_of Regress::TestSimpleBoxedA, @b
|
139
|
-
assert_equal 23, @b.some_int
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
describe "::signal_connect_after" do
|
145
|
-
it "installs a signal handler" do
|
146
|
-
a = 1
|
147
|
-
o = Regress::TestSubObj.new
|
148
|
-
GObject.signal_connect_after(o, "test") { a = 2 }
|
149
|
-
GObject.signal_emit o, "test"
|
150
|
-
assert_equal 2, a
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "gir_ffi_test_helper"
|
4
|
-
|
5
|
-
describe GirFFI::AllocationHelper do
|
6
|
-
describe ".free_after" do
|
7
|
-
before do
|
8
|
-
allow(GirFFI::LibC).to receive(:free)
|
9
|
-
end
|
10
|
-
|
11
|
-
it "frees the passed-in pointer" do
|
12
|
-
ptr = double("pointer", null?: false)
|
13
|
-
GirFFI::AllocationHelper.free_after(ptr) {}
|
14
|
-
expect(GirFFI::LibC).to have_received(:free).with(ptr)
|
15
|
-
end
|
16
|
-
|
17
|
-
it "does not free a passed-in null pointer" do
|
18
|
-
ptr = double("pointer", null?: true)
|
19
|
-
GirFFI::AllocationHelper.free_after(ptr) {}
|
20
|
-
expect(GirFFI::LibC).not_to have_received(:free)
|
21
|
-
end
|
22
|
-
|
23
|
-
it "yields ptr to the block" do
|
24
|
-
ptr = double("pointer", null?: false)
|
25
|
-
foo = nil
|
26
|
-
GirFFI::AllocationHelper.free_after(ptr) { |it| foo = it }
|
27
|
-
_(foo).must_equal ptr
|
28
|
-
end
|
29
|
-
|
30
|
-
it "returns the result of the block" do
|
31
|
-
ptr = double("pointer", null?: false)
|
32
|
-
result = GirFFI::AllocationHelper.free_after(ptr) { "bar" }
|
33
|
-
_(result).must_equal "bar"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,146 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "gir_ffi_test_helper"
|
4
|
-
|
5
|
-
describe GirFFI::ArgHelper do
|
6
|
-
describe ".cast_from_pointer" do
|
7
|
-
it "handles class types" do
|
8
|
-
klass = Class.new
|
9
|
-
expect(klass).to receive(:wrap).with(:pointer_value).and_return :wrapped_value
|
10
|
-
_(GirFFI::ArgHelper.cast_from_pointer(klass, :pointer_value))
|
11
|
-
.must_equal :wrapped_value
|
12
|
-
end
|
13
|
-
|
14
|
-
describe "for :gint8" do
|
15
|
-
it "handles negative :gint8" do
|
16
|
-
ptr = FFI::Pointer.new(-127)
|
17
|
-
_(GirFFI::ArgHelper.cast_from_pointer(:gint8, ptr)).must_equal(-127)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "handles positive :gint8" do
|
21
|
-
ptr = FFI::Pointer.new(128)
|
22
|
-
_(GirFFI::ArgHelper.cast_from_pointer(:gint8, ptr)).must_equal(128)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
it "handles :guint32" do
|
27
|
-
ptr = FFI::Pointer.new(0xffffffff)
|
28
|
-
_(GirFFI::ArgHelper.cast_from_pointer(:guint32, ptr)).must_equal(0xffffffff)
|
29
|
-
end
|
30
|
-
|
31
|
-
describe "for :gint32" do
|
32
|
-
it "handles positive :gint32" do
|
33
|
-
ptr = FFI::Pointer.new(1)
|
34
|
-
_(GirFFI::ArgHelper.cast_from_pointer(:gint32, ptr)).must_equal(1)
|
35
|
-
end
|
36
|
-
|
37
|
-
it "handles negative :gint32" do
|
38
|
-
ptr = FFI::Pointer.new(0xffffffff)
|
39
|
-
_(GirFFI::ArgHelper.cast_from_pointer(:gint32, ptr)).must_equal(-1)
|
40
|
-
end
|
41
|
-
|
42
|
-
it "handles largest negative :gint32" do
|
43
|
-
ptr = FFI::Pointer.new(0x80000000)
|
44
|
-
_(GirFFI::ArgHelper.cast_from_pointer(:gint32, ptr)).must_equal(-0x80000000)
|
45
|
-
end
|
46
|
-
|
47
|
-
it "handles largest positive :gint32" do
|
48
|
-
ptr = FFI::Pointer.new(0x7fffffff)
|
49
|
-
_(GirFFI::ArgHelper.cast_from_pointer(:gint32, ptr)).must_equal(0x7fffffff)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
it "handles :utf8" do
|
54
|
-
ptr = FFI::MemoryPointer.from_string "foo"
|
55
|
-
_(GirFFI::ArgHelper.cast_from_pointer(:utf8, ptr)).must_equal "foo"
|
56
|
-
end
|
57
|
-
|
58
|
-
it "handles :filename" do
|
59
|
-
ptr = FFI::MemoryPointer.from_string "foo"
|
60
|
-
_(GirFFI::ArgHelper.cast_from_pointer(:filename, ptr)).must_equal "foo"
|
61
|
-
end
|
62
|
-
|
63
|
-
it "handles GHashTable" do
|
64
|
-
hash = GLib::HashTable.from [:utf8, :gint32], "foo" => 1, "bar" => 2
|
65
|
-
ptr = hash.to_ptr
|
66
|
-
result = GirFFI::ArgHelper.cast_from_pointer([:pointer, [:ghash, :utf8, :gint32]],
|
67
|
-
ptr)
|
68
|
-
_(result.to_hash).must_equal hash.to_hash
|
69
|
-
end
|
70
|
-
|
71
|
-
describe "when passing a broken typespec" do
|
72
|
-
it "raises on unknown symbol" do
|
73
|
-
ptr = FFI::Pointer.new(0xffffffff)
|
74
|
-
exception = _(-> { GirFFI::ArgHelper.cast_from_pointer(:foo, ptr) })
|
75
|
-
.must_raise RuntimeError
|
76
|
-
_(exception.message).must_equal "Don't know how to cast foo"
|
77
|
-
end
|
78
|
-
|
79
|
-
it "raises on unexpected main type for complex type" do
|
80
|
-
ptr = FFI::Pointer.new(0xffffffff)
|
81
|
-
exception = _(-> { GirFFI::ArgHelper.cast_from_pointer([:utf8], ptr) })
|
82
|
-
.must_raise RuntimeError
|
83
|
-
_(exception.message).must_equal "Don't know how to cast [:utf8]"
|
84
|
-
end
|
85
|
-
|
86
|
-
it "raises on unexpected sub type for complex type" do
|
87
|
-
ptr = FFI::Pointer.new(0xffffffff)
|
88
|
-
exception = _(-> { GirFFI::ArgHelper.cast_from_pointer([:pointer, :utf8], ptr) })
|
89
|
-
.must_raise RuntimeError
|
90
|
-
_(exception.message).must_equal "Don't know how to cast [:pointer, :utf8]"
|
91
|
-
end
|
92
|
-
|
93
|
-
it "raises on unexpected container type for complex type" do
|
94
|
-
ptr = FFI::Pointer.new(0xffffffff)
|
95
|
-
exception =
|
96
|
-
_(-> { GirFFI::ArgHelper.cast_from_pointer([:pointer, [:gint32]], ptr) })
|
97
|
-
.must_raise RuntimeError
|
98
|
-
_(exception.message).must_equal "Don't know how to cast [:pointer, [:gint32]]"
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
describe ".store" do
|
104
|
-
describe "when called with nil" do
|
105
|
-
it "returns a null pointer" do
|
106
|
-
_(GirFFI::ArgHelper.store(nil)).must_be :null?
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
describe "when called with a string" do
|
111
|
-
it "stores the string in GirFFI::ArgHelper::OBJECT_STORE" do
|
112
|
-
str = "Foo"
|
113
|
-
ptr = GirFFI::ArgHelper.store(str)
|
114
|
-
result = GirFFI::ArgHelper::OBJECT_STORE.fetch(ptr)
|
115
|
-
_(result).must_equal str
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
describe ".check_fixed_array_size" do
|
121
|
-
it "passes if array has the correct size" do
|
122
|
-
GirFFI::ArgHelper.check_fixed_array_size(3, [1, 2, 3], "foo")
|
123
|
-
pass
|
124
|
-
end
|
125
|
-
|
126
|
-
it "raises if array does not have the correct size" do
|
127
|
-
result = _(-> { GirFFI::ArgHelper.check_fixed_array_size(3, [1, 2], "foo") })
|
128
|
-
.must_raise ArgumentError
|
129
|
-
_(result.message).must_equal "foo should have size 3"
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
describe ".check_error" do
|
134
|
-
it "does nothing if there is no error" do
|
135
|
-
err_ptr = double("err_ptr", read_pointer: nil)
|
136
|
-
GirFFI::ArgHelper.check_error err_ptr
|
137
|
-
pass
|
138
|
-
end
|
139
|
-
|
140
|
-
it "raises an exception if there is an error" do
|
141
|
-
err = GLib::Error.new
|
142
|
-
err_ptr = double("err_ptr", read_pointer: err.to_ptr)
|
143
|
-
_(-> { GirFFI::ArgHelper.check_error err_ptr }).must_raise GirFFI::GLibError
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "gir_ffi_test_helper"
|
4
|
-
|
5
|
-
describe GirFFI::Boolean do
|
6
|
-
it "has the same native size as an int" do
|
7
|
-
_(FFI.type_size(GirFFI::Boolean)).must_equal FFI.type_size :int
|
8
|
-
end
|
9
|
-
|
10
|
-
describe ".from_native" do
|
11
|
-
it "converts 0 to false" do
|
12
|
-
_(GirFFI::Boolean.from_native(0, "whatever")).must_equal false
|
13
|
-
end
|
14
|
-
|
15
|
-
it "converts 1 to true" do
|
16
|
-
_(GirFFI::Boolean.from_native(1, "whatever")).must_equal true
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe ".to_native" do
|
21
|
-
it "converts false to 0" do
|
22
|
-
_(GirFFI::Boolean.to_native(false, "whatever")).must_equal 0
|
23
|
-
end
|
24
|
-
|
25
|
-
it "converts true to 1" do
|
26
|
-
_(GirFFI::Boolean.to_native(true, "whatever")).must_equal 1
|
27
|
-
end
|
28
|
-
|
29
|
-
it "converts nil to 0" do
|
30
|
-
_(GirFFI::Boolean.to_native(nil, "whatever")).must_equal 0
|
31
|
-
end
|
32
|
-
|
33
|
-
it "converts truthy value to 1" do
|
34
|
-
_(GirFFI::Boolean.to_native("i am truth!", "whatever")).must_equal 1
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe ".size" do
|
39
|
-
it "returns the correct type size" do
|
40
|
-
_(GirFFI::Boolean.size).must_equal FFI.type_size :int
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|