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.
- checksums.yaml +7 -0
- data/{History.txt → Changelog.md} +93 -61
- data/{DESIGN.rdoc → DESIGN.md} +7 -7
- data/README.md +5 -7
- data/TODO.md +90 -0
- data/lib/ffi-glib.rb +0 -1
- data/lib/ffi-glib/array.rb +13 -29
- data/lib/ffi-glib/array_methods.rb +13 -0
- data/lib/ffi-glib/container_class_methods.rb +6 -1
- data/lib/ffi-glib/hash_table.rb +3 -2
- data/lib/ffi-glib/list.rb +3 -17
- data/lib/ffi-glib/list_methods.rb +22 -3
- data/lib/ffi-glib/ptr_array.rb +19 -19
- data/lib/ffi-glib/s_list.rb +3 -17
- data/lib/ffi-gobject.rb +10 -17
- data/lib/ffi-gobject/object.rb +19 -9
- data/lib/ffi-gobject/object_class.rb +14 -0
- data/lib/ffi-gobject/ruby_closure.rb +4 -5
- data/lib/ffi-gobject/value.rb +7 -5
- data/lib/ffi-gobject_introspection/i_vfunc_info.rb +1 -1
- data/lib/gir_ffi-base.rb +0 -2
- data/lib/gir_ffi-base/gobject.rb +1 -0
- data/lib/gir_ffi-base/gobject/lib.rb +1 -1
- data/lib/gir_ffi.rb +2 -0
- data/lib/gir_ffi/arg_helper.rb +18 -8
- data/lib/gir_ffi/builders/argument_builder.rb +62 -55
- data/lib/gir_ffi/builders/base_argument_builder.rb +52 -106
- data/lib/gir_ffi/builders/base_type_builder.rb +3 -3
- data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +34 -0
- data/lib/gir_ffi/builders/callback_argument_builder.rb +73 -0
- data/lib/gir_ffi/builders/callback_builder.rb +19 -9
- data/lib/gir_ffi/builders/callback_return_value_builder.rb +54 -0
- data/lib/gir_ffi/builders/closure_convertor.rb +9 -0
- data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +9 -0
- data/lib/gir_ffi/builders/constructor_result_convertor.rb +9 -0
- data/lib/gir_ffi/builders/enum_builder.rb +16 -16
- data/lib/gir_ffi/builders/field_builder.rb +36 -15
- data/lib/gir_ffi/builders/function_builder.rb +32 -27
- data/lib/gir_ffi/builders/interface_builder.rb +14 -4
- data/lib/gir_ffi/builders/mapping_method_builder.rb +95 -43
- data/lib/gir_ffi/builders/module_builder.rb +22 -35
- data/lib/gir_ffi/builders/null_convertor.rb +9 -0
- data/lib/gir_ffi/builders/object_builder.rb +11 -14
- data/lib/gir_ffi/builders/property_builder.rb +107 -9
- data/lib/gir_ffi/builders/registered_type_builder.rb +2 -2
- data/lib/gir_ffi/builders/return_value_builder.rb +42 -33
- data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +15 -0
- data/lib/gir_ffi/builders/signal_builder.rb +18 -58
- data/lib/gir_ffi/builders/struct_builder.rb +1 -2
- data/lib/gir_ffi/builders/type_builder.rb +1 -0
- data/lib/gir_ffi/builders/unintrospectable_builder.rb +4 -4
- data/lib/gir_ffi/builders/user_defined_builder.rb +151 -26
- data/lib/gir_ffi/builders/vfunc_builder.rb +57 -0
- data/lib/gir_ffi/builders/with_layout.rb +10 -8
- data/lib/gir_ffi/builders/with_methods.rb +1 -1
- data/lib/gir_ffi/callback_base.rb +42 -8
- data/lib/gir_ffi/class_base.rb +1 -2
- data/lib/gir_ffi/enum_base.rb +26 -4
- data/lib/gir_ffi/error_argument_info.rb +21 -0
- data/lib/gir_ffi/{setter_argument_info.rb → field_argument_info.rb} +2 -1
- data/lib/gir_ffi/g_type.rb +25 -0
- data/lib/gir_ffi/in_out_pointer.rb +3 -14
- data/lib/gir_ffi/in_pointer.rb +20 -21
- data/lib/gir_ffi/info_ext.rb +2 -0
- data/lib/gir_ffi/info_ext/i_callable_info.rb +0 -9
- data/lib/gir_ffi/info_ext/i_callback_info.rb +17 -0
- data/lib/gir_ffi/info_ext/i_function_info.rb +4 -0
- data/lib/gir_ffi/info_ext/i_property_info.rb +4 -0
- data/lib/gir_ffi/info_ext/i_registered_type_info.rb +1 -0
- data/lib/gir_ffi/info_ext/i_signal_info.rb +14 -16
- data/lib/gir_ffi/info_ext/i_type_info.rb +72 -34
- data/lib/gir_ffi/info_ext/i_vfunc_info.rb +12 -0
- data/lib/gir_ffi/info_ext/safe_constant_name.rb +3 -2
- data/lib/gir_ffi/interface_base.rb +8 -3
- data/lib/gir_ffi/module_base.rb +3 -5
- data/lib/gir_ffi/object_base.rb +8 -0
- data/lib/gir_ffi/receiver_argument_info.rb +21 -0
- data/lib/gir_ffi/receiver_type_info.rb +27 -0
- data/lib/gir_ffi/return_value_info.rb +23 -0
- data/lib/gir_ffi/signal_base.rb +1 -1
- data/lib/{ffi-glib → gir_ffi}/sized_array.rb +10 -6
- data/lib/gir_ffi/struct_base.rb +10 -9
- data/lib/gir_ffi/type_base.rb +1 -0
- data/lib/gir_ffi/type_map.rb +3 -0
- data/lib/gir_ffi/unintrospectable_type_info.rb +4 -1
- data/lib/gir_ffi/union_base.rb +4 -21
- data/lib/gir_ffi/user_data_argument_info.rb +21 -0
- data/lib/gir_ffi/user_data_type_info.rb +17 -0
- data/lib/gir_ffi/user_defined_type_info.rb +18 -4
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi/vfunc_base.rb +8 -0
- data/lib/gir_ffi/vfunc_implementation.rb +11 -0
- data/lib/gir_ffi/zero_terminated.rb +18 -24
- data/test/base_test_helper.rb +2 -3
- data/test/ffi-glib/array_test.rb +3 -3
- data/test/ffi-glib/ruby_closure_test.rb +3 -3
- data/test/ffi-gobject/value_test.rb +15 -1
- data/test/ffi-gobject_test.rb +2 -1
- data/test/gir_ffi/arg_helper_test.rb +21 -2
- data/test/gir_ffi/builders/argument_builder_test.rb +213 -287
- data/test/gir_ffi/builders/base_argument_builder_test.rb +1 -1
- data/test/gir_ffi/builders/callback_builder_test.rb +26 -8
- data/test/gir_ffi/builders/field_builder_test.rb +18 -3
- data/test/gir_ffi/builders/function_builder_test.rb +30 -12
- data/test/gir_ffi/builders/interface_builder_test.rb +9 -0
- data/test/gir_ffi/builders/module_builder_test.rb +0 -39
- data/test/gir_ffi/builders/object_builder_test.rb +27 -27
- data/test/gir_ffi/builders/property_builder_test.rb +110 -0
- data/test/gir_ffi/builders/return_value_builder_test.rb +168 -200
- data/test/gir_ffi/builders/signal_builder_test.rb +58 -14
- data/test/gir_ffi/builders/struct_builder_test.rb +2 -41
- data/test/gir_ffi/builders/user_defined_builder_test.rb +88 -20
- data/test/gir_ffi/builders/vfunc_builder_test.rb +44 -0
- data/test/gir_ffi/g_type_test.rb +29 -0
- data/test/gir_ffi/in_pointer_test.rb +28 -9
- data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -9
- data/test/gir_ffi/info_ext/i_callback_info_test.rb +19 -0
- data/test/gir_ffi/info_ext/i_function_info_test.rb +9 -0
- data/test/gir_ffi/info_ext/i_signal_info_test.rb +8 -11
- data/test/gir_ffi/info_ext/i_type_info_test.rb +140 -16
- data/test/gir_ffi/interface_base_test.rb +9 -3
- data/test/gir_ffi/object_base_test.rb +1 -2
- data/test/{ffi-glib → gir_ffi}/sized_array_test.rb +28 -28
- data/test/gir_ffi/type_map_test.rb +1 -1
- data/test/gir_ffi/user_defined_type_info_test.rb +36 -4
- data/test/gir_ffi_test.rb +5 -5
- data/test/gir_ffi_test_helper.rb +4 -0
- data/test/integration/generated_gimarshallingtests_test.rb +163 -59
- data/test/integration/generated_gobject_test.rb +21 -8
- data/test/integration/generated_pango_test.rb +2 -2
- data/test/integration/generated_regress_test.rb +361 -101
- data/test/lib/autogen.sh +5 -1
- metadata +51 -35
- data/TODO.rdoc +0 -63
- data/lib/gir_ffi-base/gir_ffi/library.rb +0 -17
- data/lib/gir_ffi-base/gir_ffi/struct.rb +0 -27
@@ -58,4 +58,13 @@ describe GirFFI::InfoExt::IFunctionInfo do
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
61
|
+
|
62
|
+
describe "#return_ffi_type" do
|
63
|
+
it "returns the ffi type of the return type" do
|
64
|
+
stub(return_type_info = Object.new).to_ffitype { :some_type }
|
65
|
+
stub(function_info).return_type { return_type_info }
|
66
|
+
|
67
|
+
function_info.return_ffi_type.must_equal :some_type
|
68
|
+
end
|
69
|
+
end
|
61
70
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'gir_ffi_test_helper'
|
2
2
|
|
3
|
+
GirFFI.setup :Regress
|
4
|
+
|
3
5
|
describe GirFFI::InfoExt::ISignalInfo do
|
4
6
|
let(:klass) { Class.new do
|
5
7
|
include GirFFI::InfoExt::ICallableInfo
|
@@ -7,31 +9,26 @@ describe GirFFI::InfoExt::ISignalInfo do
|
|
7
9
|
end }
|
8
10
|
let(:signal_info) { klass.new }
|
9
11
|
|
10
|
-
describe "#
|
12
|
+
describe "#arguments_to_gvalues" do
|
11
13
|
let(:object) { Regress::TestSubObj.new }
|
12
14
|
let(:boxed) { Regress::TestSimpleBoxedA.const_return }
|
13
15
|
let(:signal_info) { Regress::TestSubObj.find_signal "test-with-static-scope-arg" }
|
14
|
-
let(:result) { signal_info.
|
15
|
-
|
16
|
-
it "wraps its arguments in a GObject::ValueArray" do
|
17
|
-
result.must_be_instance_of GObject::ValueArray
|
18
|
-
result.n_values.must_equal 2
|
19
|
-
end
|
16
|
+
let(:result) { signal_info.arguments_to_gvalues(object, [boxed]) }
|
20
17
|
|
21
18
|
it "correctly wraps :object" do
|
22
|
-
result
|
19
|
+
result[0].get_value.must_equal object
|
23
20
|
end
|
24
21
|
|
25
22
|
it "correctly wraps :struct" do
|
26
|
-
result_boxed = result
|
23
|
+
result_boxed = result[1].get_value
|
27
24
|
result_boxed.some_int8.must_equal boxed.some_int8
|
28
25
|
result_boxed.some_int.must_equal boxed.some_int
|
29
26
|
end
|
30
27
|
end
|
31
28
|
|
32
29
|
describe "#return_ffi_type" do
|
33
|
-
#
|
34
|
-
# types.
|
30
|
+
# NOTE: This is needed because FFI callbacks are limited in the
|
31
|
+
# accepted types.
|
35
32
|
it "returns :bool for the :gboolean type" do
|
36
33
|
stub(return_type_info = Object.new).to_ffitype { GLib::Boolean }
|
37
34
|
stub(signal_info).return_type { return_type_info }
|
@@ -13,6 +13,9 @@ describe GirFFI::InfoExt::ITypeInfo do
|
|
13
13
|
|
14
14
|
let(:callback_type_info) {
|
15
15
|
get_introspection_data('Regress', 'test_callback').args[0].argument_type }
|
16
|
+
let(:ghash_type_info) {
|
17
|
+
get_introspection_data('Regress',
|
18
|
+
'test_ghash_nested_everything_return').return_type }
|
16
19
|
|
17
20
|
describe "#to_ffitype" do
|
18
21
|
it "returns an array with elements subtype and size for type :array" do
|
@@ -150,18 +153,6 @@ describe GirFFI::InfoExt::ITypeInfo do
|
|
150
153
|
end
|
151
154
|
end
|
152
155
|
|
153
|
-
describe "#subtype_tag_or_class" do
|
154
|
-
describe "without a parameter" do
|
155
|
-
it "returns the result of calling #tag_or_class on the first param_type" do
|
156
|
-
mock(elmtype_info).tag_or_class { :foo }
|
157
|
-
|
158
|
-
mock(type_info).param_type(0) { elmtype_info }
|
159
|
-
|
160
|
-
type_info.subtype_tag_or_class.must_equal :foo
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
156
|
describe "#tag_or_class" do
|
166
157
|
describe "for a simple type" do
|
167
158
|
it "returns the type's tag" do
|
@@ -210,10 +201,10 @@ describe GirFFI::InfoExt::ITypeInfo do
|
|
210
201
|
end
|
211
202
|
|
212
203
|
describe "when the interface type is :object" do
|
213
|
-
it "returns
|
204
|
+
it "returns the built interface class" do
|
214
205
|
stub(iface_info).info_type { :object }
|
215
206
|
|
216
|
-
type_info.tag_or_class.must_equal
|
207
|
+
type_info.tag_or_class.must_equal interface
|
217
208
|
end
|
218
209
|
end
|
219
210
|
|
@@ -228,8 +219,8 @@ describe GirFFI::InfoExt::ITypeInfo do
|
|
228
219
|
end
|
229
220
|
|
230
221
|
describe "for a callback" do
|
231
|
-
it "returns
|
232
|
-
callback_type_info.tag_or_class.must_equal
|
222
|
+
it "returns the callback's wrapper class" do
|
223
|
+
callback_type_info.tag_or_class.must_equal Regress::TestCallback
|
233
224
|
end
|
234
225
|
end
|
235
226
|
|
@@ -250,6 +241,17 @@ describe GirFFI::InfoExt::ITypeInfo do
|
|
250
241
|
type_info.tag_or_class.must_equal [:pointer, :void]
|
251
242
|
end
|
252
243
|
end
|
244
|
+
|
245
|
+
describe "for a complex nested hash type" do
|
246
|
+
it "returns a representeation of the nested structure" do
|
247
|
+
ghash_type_info.tag_or_class.must_equal(
|
248
|
+
[ :pointer,
|
249
|
+
[ :ghash,
|
250
|
+
:utf8,
|
251
|
+
[ :pointer,
|
252
|
+
[ :ghash, :utf8, :utf8 ] ] ] ])
|
253
|
+
end
|
254
|
+
end
|
253
255
|
end
|
254
256
|
|
255
257
|
describe "#to_callback_ffitype" do
|
@@ -564,4 +566,126 @@ describe GirFFI::InfoExt::ITypeInfo do
|
|
564
566
|
end
|
565
567
|
end
|
566
568
|
end
|
569
|
+
|
570
|
+
describe "#g_type" do
|
571
|
+
before do
|
572
|
+
stub(type_info).tag { tag }
|
573
|
+
stub(type_info).pointer? { pointer? }
|
574
|
+
end
|
575
|
+
|
576
|
+
describe "for :void" do
|
577
|
+
let(:tag) { :void }
|
578
|
+
let(:pointer?) { false }
|
579
|
+
|
580
|
+
it "equals the none type" do
|
581
|
+
GObject.type_name(type_info.g_type).must_equal "void"
|
582
|
+
end
|
583
|
+
end
|
584
|
+
|
585
|
+
describe "for :gboolean" do
|
586
|
+
let(:tag) { :gboolean }
|
587
|
+
let(:pointer?) { false }
|
588
|
+
|
589
|
+
it "equals the gboolean type" do
|
590
|
+
GObject.type_name(type_info.g_type).must_equal "gboolean"
|
591
|
+
end
|
592
|
+
end
|
593
|
+
|
594
|
+
describe "for :gint32" do
|
595
|
+
let(:tag) { :gint32 }
|
596
|
+
let(:pointer?) { false }
|
597
|
+
|
598
|
+
it "equals the gint type" do
|
599
|
+
GObject.type_name(type_info.g_type).must_equal "gint"
|
600
|
+
end
|
601
|
+
end
|
602
|
+
|
603
|
+
describe "for :gint64" do
|
604
|
+
let(:tag) { :gint64 }
|
605
|
+
let(:pointer?) { false }
|
606
|
+
|
607
|
+
it "equals the gint64 type" do
|
608
|
+
GObject.type_name(type_info.g_type).must_equal "gint64"
|
609
|
+
end
|
610
|
+
end
|
611
|
+
|
612
|
+
describe "for :guint64" do
|
613
|
+
let(:tag) { :guint64 }
|
614
|
+
let(:pointer?) { false }
|
615
|
+
|
616
|
+
it "equals the guint64 type" do
|
617
|
+
GObject.type_name(type_info.g_type).must_equal "guint64"
|
618
|
+
end
|
619
|
+
end
|
620
|
+
|
621
|
+
describe "for pointer to :utf8" do
|
622
|
+
let(:tag) { :utf8 }
|
623
|
+
let(:pointer?) { true }
|
624
|
+
|
625
|
+
it "equals the gchararray type" do
|
626
|
+
GObject.type_name(type_info.g_type).must_equal "gchararray"
|
627
|
+
end
|
628
|
+
end
|
629
|
+
|
630
|
+
describe "for pointer to :ghash" do
|
631
|
+
let(:tag) { :ghash }
|
632
|
+
let(:pointer?) { true }
|
633
|
+
|
634
|
+
it "equals the GHashTable type" do
|
635
|
+
GObject.type_name(type_info.g_type).must_equal "GHashTable"
|
636
|
+
end
|
637
|
+
end
|
638
|
+
|
639
|
+
describe "for arrays" do
|
640
|
+
let(:tag) { :array }
|
641
|
+
let(:pointer?) { true }
|
642
|
+
|
643
|
+
describe "for pointer to GArray" do
|
644
|
+
before do
|
645
|
+
stub(type_info).zero_terminated? { false }
|
646
|
+
stub(type_info).array_type { :array }
|
647
|
+
end
|
648
|
+
|
649
|
+
it "equals the GArray type" do
|
650
|
+
GObject.type_name(type_info.g_type).must_equal "GArray"
|
651
|
+
end
|
652
|
+
end
|
653
|
+
|
654
|
+
describe "for a C array" do
|
655
|
+
before do
|
656
|
+
stub(type_info).zero_terminated? { false }
|
657
|
+
stub(type_info).array_type { :c }
|
658
|
+
end
|
659
|
+
|
660
|
+
it "equals the gpointer type" do
|
661
|
+
GObject.type_name(type_info.g_type).must_equal "gpointer"
|
662
|
+
end
|
663
|
+
end
|
664
|
+
|
665
|
+
describe "for a zero-terminated array" do
|
666
|
+
before do
|
667
|
+
stub(type_info).param_type(0) { elmtype_info }
|
668
|
+
stub(type_info).zero_terminated? { true }
|
669
|
+
end
|
670
|
+
|
671
|
+
describe "of utf8" do
|
672
|
+
it "equals the GStrv type" do
|
673
|
+
stub(elmtype_info).tag { :utf8 }
|
674
|
+
stub(elmtype_info).pointer? { true }
|
675
|
+
|
676
|
+
GObject.type_name(type_info.g_type).must_equal "GStrv"
|
677
|
+
end
|
678
|
+
end
|
679
|
+
|
680
|
+
describe "of filename" do
|
681
|
+
it "equals the GStrv type" do
|
682
|
+
stub(elmtype_info).tag { :filename }
|
683
|
+
stub(elmtype_info).pointer? { true }
|
684
|
+
|
685
|
+
GObject.type_name(type_info.g_type).must_equal "GStrv"
|
686
|
+
end
|
687
|
+
end
|
688
|
+
end
|
689
|
+
end
|
690
|
+
end
|
567
691
|
end
|
@@ -1,12 +1,18 @@
|
|
1
1
|
require 'gir_ffi_test_helper'
|
2
2
|
|
3
3
|
describe GirFFI::InterfaceBase do
|
4
|
+
let(:interface) { Module.new { extend GirFFI::InterfaceBase } }
|
5
|
+
|
4
6
|
describe "#wrap" do
|
5
7
|
it "delegates conversion to the wrapped pointer" do
|
6
|
-
mod = Module.new { extend GirFFI::InterfaceBase }
|
7
8
|
mock(ptr = Object.new).to_object { "good-result" }
|
8
|
-
|
9
|
+
interface.wrap(ptr).must_equal "good-result"
|
9
10
|
end
|
10
11
|
end
|
11
|
-
end
|
12
12
|
|
13
|
+
describe ".to_ffitype" do
|
14
|
+
it "returns :pointer" do
|
15
|
+
interface.to_ffitype.must_equal :pointer
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -2,6 +2,7 @@ require 'gir_ffi_test_helper'
|
|
2
2
|
|
3
3
|
describe GirFFI::ObjectBase do
|
4
4
|
let(:derived_class) { Class.new GirFFI::ObjectBase }
|
5
|
+
|
5
6
|
describe ".wrap" do
|
6
7
|
it "delegates conversion to the wrapped pointer" do
|
7
8
|
mock(ptr = Object.new).to_object { "good-result" }
|
@@ -15,5 +16,3 @@ describe GirFFI::ObjectBase do
|
|
15
16
|
end
|
16
17
|
end
|
17
18
|
end
|
18
|
-
|
19
|
-
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require '
|
1
|
+
require 'gir_ffi_test_helper'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe GirFFI::SizedArray do
|
4
4
|
describe "::wrap" do
|
5
|
-
it "takes a type, size and pointer and returns a
|
5
|
+
it "takes a type, size and pointer and returns a GirFFI::SizedArray wrapping them" do
|
6
6
|
mock(ptr = Object.new).null? { false }
|
7
|
-
sarr =
|
8
|
-
assert_instance_of
|
7
|
+
sarr = GirFFI::SizedArray.wrap :gint32, 3, ptr
|
8
|
+
assert_instance_of GirFFI::SizedArray, sarr
|
9
9
|
assert_equal ptr, sarr.to_ptr
|
10
10
|
assert_equal 3, sarr.size
|
11
11
|
assert_equal :gint32, sarr.element_type
|
@@ -13,7 +13,7 @@ describe GLib::SizedArray do
|
|
13
13
|
|
14
14
|
it "returns nil if the wrapped pointer is null" do
|
15
15
|
mock(ptr = Object.new).null? { true }
|
16
|
-
sarr =
|
16
|
+
sarr = GirFFI::SizedArray.wrap :gint32, 3, ptr
|
17
17
|
sarr.must_be_nil
|
18
18
|
end
|
19
19
|
end
|
@@ -26,7 +26,7 @@ describe GLib::SizedArray do
|
|
26
26
|
block = FFI::MemoryPointer.new(:pointer, ptrs.length)
|
27
27
|
block.write_array_of_pointer ptrs
|
28
28
|
|
29
|
-
sarr =
|
29
|
+
sarr = GirFFI::SizedArray.new :utf8, 3, block
|
30
30
|
arr = []
|
31
31
|
sarr.each do |str|
|
32
32
|
arr << str
|
@@ -37,44 +37,44 @@ describe GLib::SizedArray do
|
|
37
37
|
|
38
38
|
describe "::from" do
|
39
39
|
describe "from a Ruby array" do
|
40
|
-
it "creates a
|
41
|
-
arr =
|
42
|
-
arr.must_be_instance_of
|
40
|
+
it "creates a GirFFI::SizedArray with the same elements" do
|
41
|
+
arr = GirFFI::SizedArray.from :gint32, 3, [3, 2, 1]
|
42
|
+
arr.must_be_instance_of GirFFI::SizedArray
|
43
43
|
assert_equal [3, 2, 1], arr.to_a
|
44
44
|
end
|
45
45
|
|
46
46
|
it "raises an error if the array has the wrong number of elements" do
|
47
|
-
lambda {
|
47
|
+
lambda { GirFFI::SizedArray.from :gint32, 4, [3, 2, 1] }.must_raise ArgumentError
|
48
48
|
end
|
49
49
|
|
50
50
|
it "uses the array's size if passed -1 as the size" do
|
51
|
-
arr =
|
51
|
+
arr = GirFFI::SizedArray.from :gint32, -1, [3, 2, 1]
|
52
52
|
arr.size.must_equal 3
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
describe "from a
|
56
|
+
describe "from a GirFFI::SizedArray" do
|
57
57
|
it "return its argument" do
|
58
|
-
arr =
|
59
|
-
arr2 =
|
58
|
+
arr = GirFFI::SizedArray.from :gint32, 3, [3, 2, 1]
|
59
|
+
arr2 = GirFFI::SizedArray.from :gint32, 3, arr
|
60
60
|
assert_equal arr, arr2
|
61
61
|
end
|
62
62
|
|
63
63
|
it "raises an error if the argument has the wrong number of elements" do
|
64
|
-
arr =
|
65
|
-
lambda {
|
64
|
+
arr = GirFFI::SizedArray.from :gint32, 3, [3, 2, 1]
|
65
|
+
lambda { GirFFI::SizedArray.from :gint32, 4, arr }.must_raise ArgumentError
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
69
|
it "returns nil when passed nil" do
|
70
|
-
arr =
|
70
|
+
arr = GirFFI::SizedArray.from :gint32, 0, nil
|
71
71
|
arr.must_be_nil
|
72
72
|
end
|
73
73
|
|
74
74
|
it "wraps its argument if given a pointer" do
|
75
|
-
arr =
|
76
|
-
arr2 =
|
77
|
-
assert_instance_of
|
75
|
+
arr = GirFFI::SizedArray.from :gint32, 3, [3, 2, 1]
|
76
|
+
arr2 = GirFFI::SizedArray.from :gint32, 3, arr.to_ptr
|
77
|
+
assert_instance_of GirFFI::SizedArray, arr2
|
78
78
|
refute arr2.equal? arr
|
79
79
|
arr2.to_ptr.must_equal arr.to_ptr
|
80
80
|
end
|
@@ -82,33 +82,33 @@ describe GLib::SizedArray do
|
|
82
82
|
|
83
83
|
describe "#==" do
|
84
84
|
it "returns true when comparing to an array with the same elements" do
|
85
|
-
sized =
|
85
|
+
sized = GirFFI::SizedArray.from :int32, 3, [1, 2, 3]
|
86
86
|
|
87
87
|
sized.must_be :==, [1, 2, 3]
|
88
88
|
end
|
89
89
|
|
90
90
|
it "returns false when comparing to an array with different elements" do
|
91
|
-
sized =
|
91
|
+
sized = GirFFI::SizedArray.from :int32, 3, [1, 2, 3]
|
92
92
|
|
93
93
|
sized.wont_be :==, [1, 2]
|
94
94
|
end
|
95
95
|
|
96
96
|
it "returns true when comparing to a sized array with the same elements" do
|
97
|
-
sized =
|
98
|
-
other =
|
97
|
+
sized = GirFFI::SizedArray.from :int32, 3, [1, 2, 3]
|
98
|
+
other = GirFFI::SizedArray.from :int32, 3, [1, 2, 3]
|
99
99
|
|
100
100
|
sized.must_be :==, other
|
101
101
|
end
|
102
102
|
|
103
103
|
it "returns false when comparing to a sized array with different elements" do
|
104
|
-
sized =
|
105
|
-
other =
|
104
|
+
sized = GirFFI::SizedArray.from :int32, 3, [1, 2, 3]
|
105
|
+
other = GirFFI::SizedArray.from :int32, 2, [1, 2]
|
106
106
|
|
107
107
|
sized.wont_be :==, other
|
108
108
|
end
|
109
109
|
end
|
110
110
|
|
111
111
|
it "includes Enumerable" do
|
112
|
-
|
112
|
+
GirFFI::SizedArray.must_include Enumerable
|
113
113
|
end
|
114
114
|
end
|
@@ -4,7 +4,7 @@ describe GirFFI::TypeMap do
|
|
4
4
|
describe ".type_specification_to_ffitype" do
|
5
5
|
it "returns the nested FFI::Enum for an Enum module" do
|
6
6
|
GirFFI::TypeMap.type_specification_to_ffitype(GLib::DateMonth).
|
7
|
-
must_equal GLib::DateMonth
|
7
|
+
must_equal GLib::DateMonth
|
8
8
|
end
|
9
9
|
|
10
10
|
it "returns the class itself for a Struct class" do
|
@@ -19,16 +19,48 @@ describe GirFFI::UserDefinedTypeInfo do
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
describe "#install_vfunc_implementation" do
|
23
|
+
let(:info) { GirFFI::UserDefinedTypeInfo.new :some_class }
|
24
|
+
let(:implementation) { Object.new }
|
25
|
+
|
26
|
+
it "adds to the list of vfunc implementations" do
|
27
|
+
info.vfunc_implementations.must_equal []
|
28
|
+
info.install_vfunc_implementation :foo, implementation
|
29
|
+
info.vfunc_implementations.map(&:name).must_equal [:foo]
|
30
|
+
end
|
31
|
+
|
32
|
+
it "stores the passed-in implementation in the implementation object" do
|
33
|
+
info.install_vfunc_implementation :foo, implementation
|
34
|
+
impl = info.vfunc_implementations.first
|
35
|
+
impl.implementation.must_equal implementation
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
22
39
|
describe "#initialize" do
|
23
|
-
it "
|
40
|
+
it "yields the new object to the block passed" do
|
24
41
|
mock(foo_spec = Object.new).get_name { :foo }
|
25
42
|
mock(bar_spec = Object.new).get_name { :bar }
|
26
43
|
|
27
|
-
info = GirFFI::UserDefinedTypeInfo.new :some_class do
|
28
|
-
install_property foo_spec
|
29
|
-
install_property bar_spec
|
44
|
+
info = GirFFI::UserDefinedTypeInfo.new :some_class do |inf|
|
45
|
+
inf.install_property foo_spec
|
46
|
+
inf.install_property bar_spec
|
30
47
|
end
|
31
48
|
info.properties.map(&:name).must_equal [:foo, :bar]
|
32
49
|
end
|
33
50
|
end
|
51
|
+
|
52
|
+
describe "#g_name" do
|
53
|
+
it "returns the described class' name by default" do
|
54
|
+
mock(klass = Object.new).name { "foo" }
|
55
|
+
info = GirFFI::UserDefinedTypeInfo.new klass
|
56
|
+
info.g_name.must_equal "foo"
|
57
|
+
end
|
58
|
+
|
59
|
+
it "returns the the name set by #g_name= if present" do
|
60
|
+
stub(klass = Object.new).name { "foo" }
|
61
|
+
info = GirFFI::UserDefinedTypeInfo.new klass
|
62
|
+
info.g_name = "bar"
|
63
|
+
info.g_name.must_equal "bar"
|
64
|
+
end
|
65
|
+
end
|
34
66
|
end
|