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.
Files changed (183) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +15 -0
  3. data/README.md +5 -6
  4. data/TODO.md +14 -35
  5. data/docs/Documentation.md +6 -0
  6. data/docs/Subclassing.md +38 -0
  7. data/lib/ffi-glib.rb +8 -3
  8. data/lib/ffi-glib/byte_array.rb +2 -1
  9. data/lib/ffi-glib/destroy_notify.rb +2 -2
  10. data/lib/ffi-glib/hash_table.rb +1 -2
  11. data/lib/ffi-glib/list.rb +11 -5
  12. data/lib/ffi-glib/list_methods.rb +12 -0
  13. data/lib/ffi-glib/s_list.rb +10 -4
  14. data/lib/ffi-gobject.rb +0 -3
  15. data/lib/ffi-gobject/object.rb +77 -73
  16. data/lib/ffi-gobject/object_class.rb +1 -1
  17. data/lib/ffi-gobject/value.rb +107 -108
  18. data/lib/ffi-gobject_introspection/i_base_info.rb +20 -19
  19. data/lib/gir_ffi-base/gobject/lib.rb +4 -0
  20. data/lib/gir_ffi/array_element_convertor.rb +1 -2
  21. data/lib/gir_ffi/boxed_base.rb +1 -5
  22. data/lib/gir_ffi/builder.rb +1 -1
  23. data/lib/gir_ffi/builder_helper.rb +7 -4
  24. data/lib/gir_ffi/builders/base_argument_builder.rb +2 -2
  25. data/lib/gir_ffi/builders/base_method_builder.rb +1 -1
  26. data/lib/gir_ffi/builders/base_type_builder.rb +1 -1
  27. data/lib/gir_ffi/builders/callback_argument_builder.rb +2 -0
  28. data/lib/gir_ffi/builders/callback_builder.rb +14 -12
  29. data/lib/gir_ffi/builders/callback_return_value_builder.rb +4 -6
  30. data/lib/gir_ffi/builders/class_struct_builder.rb +24 -0
  31. data/lib/gir_ffi/builders/enum_builder.rb +3 -3
  32. data/lib/gir_ffi/builders/interface_builder.rb +3 -1
  33. data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
  34. data/lib/gir_ffi/builders/marshalling_method_builder.rb +5 -2
  35. data/lib/gir_ffi/builders/method_template.rb +4 -4
  36. data/lib/gir_ffi/builders/null_argument_builder.rb +0 -2
  37. data/lib/gir_ffi/builders/null_return_value_builder.rb +0 -2
  38. data/lib/gir_ffi/builders/object_builder.rb +16 -6
  39. data/lib/gir_ffi/builders/property_builder.rb +1 -2
  40. data/lib/gir_ffi/builders/signal_closure_builder.rb +3 -5
  41. data/lib/gir_ffi/builders/struct_builder.rb +5 -5
  42. data/lib/gir_ffi/builders/user_defined_builder.rb +8 -1
  43. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +1 -1
  44. data/lib/gir_ffi/callback_base.rb +3 -3
  45. data/lib/gir_ffi/core.rb +17 -2
  46. data/lib/gir_ffi/glib_error.rb +1 -2
  47. data/lib/gir_ffi/in_pointer.rb +7 -0
  48. data/lib/gir_ffi/object_base.rb +27 -0
  49. data/lib/gir_ffi/return_value_info.rb +1 -2
  50. data/lib/gir_ffi/struct_base.rb +1 -9
  51. data/lib/gir_ffi/struct_like_base.rb +9 -5
  52. data/lib/gir_ffi/unintrospectable_type_info.rb +1 -1
  53. data/lib/gir_ffi/union_base.rb +1 -9
  54. data/lib/gir_ffi/user_defined_object_info.rb +3 -2
  55. data/lib/gir_ffi/version.rb +1 -1
  56. data/lib/gir_ffi/vfunc_implementation.rb +1 -0
  57. metadata +86 -136
  58. data/Gemfile +0 -14
  59. data/Rakefile +0 -9
  60. data/tasks/test.rake +0 -204
  61. data/test/base_test_helper.rb +0 -70
  62. data/test/ffi-glib/array_test.rb +0 -203
  63. data/test/ffi-glib/byte_array_test.rb +0 -28
  64. data/test/ffi-glib/bytes_test.rb +0 -61
  65. data/test/ffi-glib/closure_test.rb +0 -38
  66. data/test/ffi-glib/destroy_notify_test.rb +0 -18
  67. data/test/ffi-glib/hash_table_test.rb +0 -68
  68. data/test/ffi-glib/list_test.rb +0 -86
  69. data/test/ffi-glib/main_loop_test.rb +0 -53
  70. data/test/ffi-glib/ptr_array_test.rb +0 -112
  71. data/test/ffi-glib/ruby_closure_test.rb +0 -62
  72. data/test/ffi-glib/s_list_test.rb +0 -76
  73. data/test/ffi-glib/strv_test.rb +0 -60
  74. data/test/ffi-glib/variant_test.rb +0 -12
  75. data/test/ffi-gobject/gobject_test.rb +0 -76
  76. data/test/ffi-gobject/object_class_test.rb +0 -31
  77. data/test/ffi-gobject/object_test.rb +0 -123
  78. data/test/ffi-gobject/param_spec_test.rb +0 -32
  79. data/test/ffi-gobject/value_test.rb +0 -390
  80. data/test/ffi-gobject_introspection/gobject_type_init_test.rb +0 -26
  81. data/test/ffi-gobject_introspection/i_base_info_test.rb +0 -52
  82. data/test/ffi-gobject_introspection/i_constant_info_test.rb +0 -29
  83. data/test/ffi-gobject_introspection/i_enum_info_test.rb +0 -18
  84. data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -6
  85. data/test/ffi-gobject_introspection/i_interface_info_test.rb +0 -23
  86. data/test/ffi-gobject_introspection/i_object_info_test.rb +0 -49
  87. data/test/ffi-gobject_introspection/i_property_info_test.rb +0 -47
  88. data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +0 -27
  89. data/test/ffi-gobject_introspection/i_repository_test.rb +0 -81
  90. data/test/ffi-gobject_introspection/i_struct_info_test.rb +0 -23
  91. data/test/ffi-gobject_introspection/i_type_info_test.rb +0 -30
  92. data/test/ffi-gobject_introspection/i_union_info_test.rb +0 -17
  93. data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +0 -41
  94. data/test/ffi-gobject_introspection/lib_test.rb +0 -13
  95. data/test/ffi-gobject_introspection/strv_test.rb +0 -46
  96. data/test/ffi-gobject_test.rb +0 -153
  97. data/test/gir_ffi/allocation_helper_test.rb +0 -36
  98. data/test/gir_ffi/arg_helper_test.rb +0 -146
  99. data/test/gir_ffi/boolean_test.rb +0 -43
  100. data/test/gir_ffi/boxed_base_test.rb +0 -65
  101. data/test/gir_ffi/builder_test.rb +0 -168
  102. data/test/gir_ffi/builders/argument_builder_test.rb +0 -691
  103. data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -6
  104. data/test/gir_ffi/builders/callback_argument_builder_test.rb +0 -130
  105. data/test/gir_ffi/builders/callback_builder_test.rb +0 -117
  106. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +0 -84
  107. data/test/gir_ffi/builders/constant_builder_test.rb +0 -6
  108. data/test/gir_ffi/builders/constructor_builder_test.rb +0 -39
  109. data/test/gir_ffi/builders/enum_builder_test.rb +0 -23
  110. data/test/gir_ffi/builders/field_builder_test.rb +0 -140
  111. data/test/gir_ffi/builders/function_builder_test.rb +0 -570
  112. data/test/gir_ffi/builders/initializer_builder_test.rb +0 -56
  113. data/test/gir_ffi/builders/interface_builder_test.rb +0 -32
  114. data/test/gir_ffi/builders/module_builder_test.rb +0 -43
  115. data/test/gir_ffi/builders/object_builder_test.rb +0 -98
  116. data/test/gir_ffi/builders/property_builder_test.rb +0 -161
  117. data/test/gir_ffi/builders/registered_type_builder_test.rb +0 -54
  118. data/test/gir_ffi/builders/return_value_builder_test.rb +0 -444
  119. data/test/gir_ffi/builders/signal_closure_builder_test.rb +0 -199
  120. data/test/gir_ffi/builders/struct_builder_test.rb +0 -96
  121. data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +0 -29
  122. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +0 -84
  123. data/test/gir_ffi/builders/union_builder_test.rb +0 -28
  124. data/test/gir_ffi/builders/user_defined_builder_test.rb +0 -528
  125. data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +0 -107
  126. data/test/gir_ffi/builders/vfunc_builder_test.rb +0 -245
  127. data/test/gir_ffi/callback_base_test.rb +0 -22
  128. data/test/gir_ffi/class_base_test.rb +0 -171
  129. data/test/gir_ffi/core_test.rb +0 -99
  130. data/test/gir_ffi/enum_base_test.rb +0 -43
  131. data/test/gir_ffi/error_type_info_test.rb +0 -50
  132. data/test/gir_ffi/ffi_ext/pointer_test.rb +0 -22
  133. data/test/gir_ffi/g_type_test.rb +0 -31
  134. data/test/gir_ffi/in_pointer_test.rb +0 -203
  135. data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -26
  136. data/test/gir_ffi/info_ext/i_callback_info_test.rb +0 -22
  137. data/test/gir_ffi/info_ext/i_field_info_test.rb +0 -37
  138. data/test/gir_ffi/info_ext/i_function_info_test.rb +0 -74
  139. data/test/gir_ffi/info_ext/i_signal_info_test.rb +0 -32
  140. data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -712
  141. data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +0 -19
  142. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +0 -26
  143. data/test/gir_ffi/info_ext/safe_function_name_test.rb +0 -26
  144. data/test/gir_ffi/interface_base_test.rb +0 -20
  145. data/test/gir_ffi/method_stubber_test.rb +0 -67
  146. data/test/gir_ffi/object_base_test.rb +0 -64
  147. data/test/gir_ffi/object_store_test.rb +0 -41
  148. data/test/gir_ffi/receiver_argument_info_test.rb +0 -33
  149. data/test/gir_ffi/sized_array_test.rb +0 -206
  150. data/test/gir_ffi/struct_base_test.rb +0 -23
  151. data/test/gir_ffi/struct_like_base_test.rb +0 -167
  152. data/test/gir_ffi/type_map_test.rb +0 -17
  153. data/test/gir_ffi/unintrospectable_type_info_test.rb +0 -121
  154. data/test/gir_ffi/union_base_test.rb +0 -23
  155. data/test/gir_ffi/user_defined_object_info_test.rb +0 -119
  156. data/test/gir_ffi/user_defined_property_info_test.rb +0 -39
  157. data/test/gir_ffi/variable_name_generator_test.rb +0 -18
  158. data/test/gir_ffi/version_test.rb +0 -9
  159. data/test/gir_ffi/zero_terminated_test.rb +0 -108
  160. data/test/gir_ffi_test_helper.rb +0 -84
  161. data/test/integration/callback_exceptions_test.rb +0 -59
  162. data/test/integration/derived_classes_test.rb +0 -54
  163. data/test/integration/generated_everything_test.rb +0 -453
  164. data/test/integration/generated_gimarshallingtests_test.rb +0 -3109
  165. data/test/integration/generated_gio_test.rb +0 -116
  166. data/test/integration/generated_glib_test.rb +0 -10
  167. data/test/integration/generated_gobject_test.rb +0 -124
  168. data/test/integration/generated_gst_test.rb +0 -38
  169. data/test/integration/generated_gtk_source_test.rb +0 -21
  170. data/test/integration/generated_gtop_test.rb +0 -22
  171. data/test/integration/generated_pango_ft2_test.rb +0 -17
  172. data/test/integration/generated_pango_test.rb +0 -24
  173. data/test/integration/generated_regress_test.rb +0 -4076
  174. data/test/integration/generated_secret_test.rb +0 -14
  175. data/test/integration/generated_utility_test.rb +0 -174
  176. data/test/integration/generated_warnlib_test.rb +0 -45
  177. data/test/integration/method_lookup_test.rb +0 -34
  178. data/test/introspection_test_helper.rb +0 -94
  179. data/test/lib/Makefile.am +0 -110
  180. data/test/lib/autogen.sh +0 -4
  181. data/test/lib/configure.ac +0 -34
  182. data/test/lib/m4/jhflags.m4 +0 -21
  183. data/test/minitest/stats_plugin.rb +0 -30
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GirFFI::InfoExt::ICallableInfo do
6
- let(:info_class) do
7
- Class.new do
8
- include GirFFI::InfoExt::ICallableInfo
9
- end
10
- end
11
- let(:callable_info) { info_class.new }
12
-
13
- describe "#argument_ffi_types" do
14
- describe "for a simple callable with several arguments" do
15
- before do
16
- allow(arg_info1 = Object.new).to receive(:to_ffi_type).and_return :type1
17
- allow(arg_info2 = Object.new).to receive(:to_ffi_type).and_return :type2
18
- allow(callable_info).to receive(:args).and_return [arg_info1, arg_info2]
19
- end
20
-
21
- it "returns the ffi types of the arguments" do
22
- _(callable_info.argument_ffi_types).must_equal [:type1, :type2]
23
- end
24
- end
25
- end
26
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GirFFI::InfoExt::ICallbackInfo do
6
- let(:callback_class) do
7
- Class.new do
8
- include GirFFI::InfoExt::ICallbackInfo
9
- end
10
- end
11
- let(:callback_info) { callback_class.new }
12
-
13
- describe "#return_ffi_type" do
14
- it "returns the callback ffi type of the return type" do
15
- allow(return_type_info = Object.new)
16
- .to receive(:to_callback_ffi_type).and_return :some_type
17
- allow(callback_info).to receive(:return_type).and_return return_type_info
18
-
19
- _(callback_info.return_ffi_type).must_equal :some_type
20
- end
21
- end
22
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GirFFI::InfoExt::IFieldInfo do
6
- let(:info_class) do
7
- Class.new do
8
- include GirFFI::InfoExt::IFieldInfo
9
- end
10
- end
11
- let(:field_info) { info_class.new }
12
- describe "#layout_specification" do
13
- it "returns an array of name, typespec and offset" do
14
- expect(type = Object.new).to receive(:to_ffi_type).and_return :bar
15
-
16
- expect(field_info).to receive(:name).and_return "foo"
17
- expect(field_info).to receive(:field_type).and_return type
18
- expect(field_info).to receive(:offset).and_return 0
19
-
20
- result = field_info.layout_specification
21
-
22
- assert_equal [:foo, :bar, 0], result
23
- end
24
-
25
- it "keeps a complex typespec intact" do
26
- expect(type = Object.new).to receive(:to_ffi_type).and_return [:bar, 2]
27
-
28
- expect(field_info).to receive(:name).and_return "foo"
29
- expect(field_info).to receive(:field_type).and_return type
30
- expect(field_info).to receive(:offset).and_return 0
31
-
32
- result = field_info.layout_specification
33
-
34
- assert_equal [:foo, [:bar, 2], 0], result
35
- end
36
- end
37
- end
@@ -1,74 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GirFFI::InfoExt::IFunctionInfo do
6
- let(:info_class) do
7
- Class.new do
8
- include GirFFI::InfoExt::ICallableInfo
9
- include GirFFI::InfoExt::IFunctionInfo
10
- end
11
- end
12
- let(:function_info) { info_class.new }
13
-
14
- describe "#argument_ffi_types" do
15
- before do
16
- allow(arg_info1 = Object.new).to receive(:to_ffi_type).and_return :type1
17
- allow(arg_info2 = Object.new).to receive(:to_ffi_type).and_return :type2
18
- allow(function_info).to receive(:args).and_return [arg_info1, arg_info2]
19
- end
20
-
21
- describe "for a simple function with several arguments" do
22
- before do
23
- allow(function_info).to receive(:method?).and_return false
24
- allow(function_info).to receive(:throws?).and_return false
25
- end
26
-
27
- it "returns the ffi types of the arguments" do
28
- _(function_info.argument_ffi_types).must_equal [:type1, :type2]
29
- end
30
- end
31
-
32
- describe "for a throwing function with several arguments" do
33
- before do
34
- allow(function_info).to receive(:method?).and_return false
35
- allow(function_info).to receive(:throws?).and_return true
36
- end
37
-
38
- it "appends :pointer to represent the error argument" do
39
- _(function_info.argument_ffi_types).must_equal [:type1, :type2, :pointer]
40
- end
41
- end
42
-
43
- describe "for a method with several arguments" do
44
- before do
45
- allow(function_info).to receive(:method?).and_return true
46
- allow(function_info).to receive(:throws?).and_return false
47
- end
48
-
49
- it "prepends :pointer to represent the method reciever" do
50
- _(function_info.argument_ffi_types).must_equal [:pointer, :type1, :type2]
51
- end
52
- end
53
-
54
- describe "for a throwing method with several arguments" do
55
- before do
56
- allow(function_info).to receive(:method?).and_return true
57
- allow(function_info).to receive(:throws?).and_return true
58
- end
59
-
60
- it "adds :pointer for both the reciever and the error argument" do
61
- _(function_info.argument_ffi_types).must_equal [:pointer, :type1, :type2, :pointer]
62
- end
63
- end
64
- end
65
-
66
- describe "#return_ffi_type" do
67
- it "returns the ffi type of the return type" do
68
- allow(return_type_info = Object.new).to receive(:to_ffi_type).and_return :some_type
69
- allow(function_info).to receive(:return_type).and_return return_type_info
70
-
71
- _(function_info.return_ffi_type).must_equal :some_type
72
- end
73
- end
74
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- GirFFI.setup :Regress
6
-
7
- describe GirFFI::InfoExt::ISignalInfo do
8
- let(:signal_class) do
9
- Class.new do
10
- include GirFFI::InfoExt::ICallableInfo
11
- include GirFFI::InfoExt::ISignalInfo
12
- end
13
- end
14
- let(:signal_info) { signal_class.new }
15
-
16
- describe "#arguments_to_gvalues" do
17
- let(:object) { Regress::TestSubObj.new }
18
- let(:boxed) { Regress::TestSimpleBoxedA.const_return }
19
- let(:signal_info) { Regress::TestSubObj.find_signal "test-with-static-scope-arg" }
20
- let(:result) { signal_info.arguments_to_gvalues(object, [boxed]) }
21
-
22
- it "correctly wraps :object" do
23
- _(result[0].get_value).must_equal object
24
- end
25
-
26
- it "correctly wraps :struct" do
27
- result_boxed = result[1].get_value
28
- _(result_boxed.some_int8).must_equal boxed.some_int8
29
- _(result_boxed.some_int).must_equal boxed.some_int
30
- end
31
- end
32
- end
@@ -1,712 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GirFFI::InfoExt::ITypeInfo do
6
- let(:info_class) do
7
- Class.new do
8
- include GirFFI::InfoExt::ITypeInfo
9
- end
10
- end
11
-
12
- let(:type_info) { info_class.new }
13
- let(:elmtype_info) { info_class.new }
14
- let(:keytype_info) { info_class.new }
15
- let(:valtype_info) { info_class.new }
16
- let(:iface_info) { Object.new }
17
-
18
- let(:callback_type_info) do
19
- get_introspection_data("Regress", "test_callback").args[0].argument_type
20
- end
21
- let(:ghash_type_info) do
22
- get_introspection_data("Regress",
23
- "test_ghash_nested_everything_return").return_type
24
- end
25
-
26
- describe "#to_ffi_type" do
27
- it "returns an array with elements subtype and size for type :array" do
28
- expect(type_info).to receive(:pointer?).and_return false
29
- allow(type_info).to receive(:tag).and_return :array
30
- expect(type_info).to receive(:array_fixed_size).and_return 2
31
-
32
- expect(elmtype_info).to receive(:to_ffi_type).and_return :foo
33
- expect(type_info).to receive(:param_type).with(0).and_return elmtype_info
34
-
35
- result = type_info.to_ffi_type
36
- assert_equal [:foo, 2], result
37
- end
38
-
39
- describe "for an :interface type" do
40
- before do
41
- allow(type_info).to receive(:interface).and_return iface_info
42
- allow(type_info).to receive(:tag).and_return :interface
43
- allow(type_info).to receive(:pointer?).and_return false
44
- end
45
-
46
- it "maps a the interface's ffi_type" do
47
- allow(iface_info).to receive(:to_ffi_type).and_return :foo
48
-
49
- _(type_info.to_ffi_type).must_equal :foo
50
- end
51
- end
52
- end
53
-
54
- describe "#element_type" do
55
- it "returns the element type for lists" do
56
- allow(elmtype_info).to receive(:tag).and_return :foo
57
- expect(elmtype_info).to receive(:pointer?).and_return false
58
-
59
- expect(type_info).to receive(:tag).and_return :glist
60
- expect(type_info).to receive(:param_type).with(0).and_return elmtype_info
61
-
62
- result = type_info.element_type
63
- _(result).must_equal :foo
64
- end
65
-
66
- it "returns the key and value types for ghashes" do
67
- allow(keytype_info).to receive(:tag).and_return :foo
68
- expect(keytype_info).to receive(:pointer?).and_return false
69
- allow(valtype_info).to receive(:tag).and_return :bar
70
- expect(valtype_info).to receive(:pointer?).and_return false
71
-
72
- expect(type_info).to receive(:tag).and_return :ghash
73
- expect(type_info).to receive(:param_type).with(0).and_return keytype_info
74
- expect(type_info).to receive(:param_type).with(1).and_return valtype_info
75
-
76
- result = type_info.element_type
77
- _(result).must_equal [:foo, :bar]
78
- end
79
-
80
- it "returns nil for other types" do
81
- expect(type_info).to receive(:tag).and_return :foo
82
-
83
- result = type_info.element_type
84
- _(result).must_be_nil
85
- end
86
-
87
- it "returns [:pointer, :void] if the element type is a pointer with tag :void" do
88
- allow(elmtype_info).to receive(:tag_or_class).and_return [:pointer, :void]
89
-
90
- expect(type_info).to receive(:tag).and_return :glist
91
- expect(type_info).to receive(:param_type).with(0).and_return elmtype_info
92
-
93
- assert_equal [:pointer, :void], type_info.element_type
94
- end
95
- end
96
-
97
- describe "#flattened_tag" do
98
- describe "for a simple type" do
99
- it "returns the type tag" do
100
- allow(type_info).to receive(:tag).and_return :uint32
101
-
102
- _(type_info.flattened_tag).must_equal :uint32
103
- end
104
- end
105
-
106
- describe "for a zero-terminated array" do
107
- before do
108
- allow(type_info).to receive(:tag).and_return :array
109
- allow(type_info).to receive(:param_type).with(0).and_return elmtype_info
110
- allow(type_info).to receive(:zero_terminated?).and_return true
111
- end
112
-
113
- describe "of utf8" do
114
- it "returns :strv" do
115
- allow(elmtype_info).to receive(:tag).and_return :utf8
116
- allow(elmtype_info).to receive(:pointer?).and_return true
117
-
118
- _(type_info.flattened_tag).must_equal :strv
119
- end
120
- end
121
-
122
- describe "of filename" do
123
- it "returns :strv" do
124
- allow(elmtype_info).to receive(:tag).and_return :filename
125
- allow(elmtype_info).to receive(:pointer?).and_return true
126
-
127
- _(type_info.flattened_tag).must_equal :strv
128
- end
129
- end
130
-
131
- describe "of another type" do
132
- it "returns :zero_terminated" do
133
- allow(elmtype_info).to receive(:tag).and_return :foo
134
- allow(elmtype_info).to receive(:pointer?).and_return false
135
-
136
- _(type_info.flattened_tag).must_equal :zero_terminated
137
- end
138
- end
139
- end
140
-
141
- describe "for a fixed length c-like array" do
142
- it "returns :c" do
143
- expect(type_info).to receive(:tag).and_return :array
144
- expect(type_info).to receive(:zero_terminated?).and_return false
145
- expect(type_info).to receive(:array_type).and_return :c
146
-
147
- _(type_info.flattened_tag).must_equal :c
148
- end
149
- end
150
-
151
- describe "for a GLib array" do
152
- it "returns :c" do
153
- expect(type_info).to receive(:tag).and_return :array
154
- expect(type_info).to receive(:zero_terminated?).and_return false
155
- expect(type_info).to receive(:array_type).and_return :array
156
-
157
- _(type_info.flattened_tag).must_equal :array
158
- end
159
- end
160
- end
161
-
162
- describe "#tag_or_class" do
163
- describe "for a simple type" do
164
- it "returns the type's tag" do
165
- allow(type_info).to receive(:tag).and_return :foo
166
- expect(type_info).to receive(:pointer?).and_return false
167
-
168
- _(type_info.tag_or_class).must_equal :foo
169
- end
170
- end
171
-
172
- describe "for utf8 strings" do
173
- it "returns the tag :utf8" do
174
- allow(type_info).to receive(:tag).and_return :utf8
175
- expect(type_info).to receive(:pointer?).and_return true
176
-
177
- _(type_info.tag_or_class).must_equal :utf8
178
- end
179
- end
180
-
181
- describe "for filename strings" do
182
- it "returns the tag :filename" do
183
- allow(type_info).to receive(:tag).and_return :filename
184
- expect(type_info).to receive(:pointer?).and_return true
185
-
186
- _(type_info.tag_or_class).must_equal :filename
187
- end
188
- end
189
-
190
- describe "for an interface class" do
191
- let(:interface) { Object.new }
192
-
193
- before do
194
- allow(type_info).to receive(:tag).and_return :interface
195
- allow(type_info).to receive(:interface).and_return iface_info
196
- expect(type_info).to receive(:pointer?).and_return false
197
-
198
- expect(GirFFI::Builder)
199
- .to receive(:build_class).with(iface_info).and_return interface
200
- end
201
-
202
- describe "when the interface type is :enum" do
203
- it "returns the built interface module" do
204
- allow(iface_info).to receive(:info_type).and_return :enum
205
-
206
- _(type_info.tag_or_class).must_equal interface
207
- end
208
- end
209
-
210
- describe "when the interface type is :object" do
211
- it "returns the built interface class" do
212
- allow(iface_info).to receive(:info_type).and_return :object
213
-
214
- _(type_info.tag_or_class).must_equal interface
215
- end
216
- end
217
-
218
- describe "when the interface type is :struct" do
219
- it "returns the built interface class" do
220
- allow(iface_info).to receive(:info_type).and_return :struct
221
-
222
- _(type_info.tag_or_class).must_equal interface
223
- end
224
- end
225
- end
226
-
227
- describe "for a callback" do
228
- it "returns the callback's wrapper class" do
229
- _(callback_type_info.tag_or_class).must_equal Regress::TestCallback
230
- end
231
- end
232
-
233
- describe "for a pointer to simple type :foo" do
234
- it "returns [:pointer, :foo]" do
235
- allow(type_info).to receive(:tag).and_return :foo
236
- expect(type_info).to receive(:pointer?).and_return true
237
-
238
- _(type_info.tag_or_class).must_equal [:pointer, :foo]
239
- end
240
- end
241
-
242
- describe "for a pointer to :void" do
243
- it "returns [:pointer, :void]" do
244
- allow(type_info).to receive(:tag).and_return :void
245
- allow(type_info).to receive(:pointer?).and_return true
246
-
247
- _(type_info.tag_or_class).must_equal [:pointer, :void]
248
- end
249
- end
250
-
251
- describe "for a complex nested hash type" do
252
- it "returns a representeation of the nested structure" do
253
- _(ghash_type_info.tag_or_class).must_equal(
254
- [:pointer,
255
- [:ghash,
256
- :utf8,
257
- [:pointer,
258
- [:ghash, :utf8, :utf8]]]])
259
- end
260
- end
261
- end
262
-
263
- describe "#to_callback_ffi_type" do
264
- describe "for an :interface argument" do
265
- before do
266
- allow(type_info).to receive(:interface).and_return iface_info
267
- allow(type_info).to receive(:tag).and_return :interface
268
- allow(type_info).to receive(:pointer?).and_return false
269
- end
270
-
271
- it "delegates to interface info" do
272
- allow(iface_info).to receive(:to_callback_ffi_type).and_return :some_ffi_type
273
-
274
- _(type_info.to_callback_ffi_type).must_equal :some_ffi_type
275
- end
276
- end
277
- end
278
-
279
- describe "#extra_conversion_arguments" do
280
- describe "for normal types" do
281
- before do
282
- allow(type_info).to receive(:tag).and_return :foo
283
- end
284
-
285
- it "returns an empty array" do
286
- _(type_info.extra_conversion_arguments).must_equal []
287
- end
288
- end
289
-
290
- describe "for a fixed-size array" do
291
- before do
292
- allow(type_info).to receive(:tag).and_return :array
293
- allow(type_info).to receive(:zero_terminated?).and_return false
294
- allow(type_info).to receive(:array_type).and_return :c
295
- allow(type_info).to receive(:array_fixed_size).and_return 3
296
-
297
- allow(type_info).to receive(:param_type).with(0).and_return elmtype_info
298
- allow(elmtype_info).to receive(:tag_or_class).and_return :foo
299
- end
300
-
301
- it "returns an array containing the element type" do
302
- _(type_info.extra_conversion_arguments).must_equal [:foo, 3]
303
- end
304
- end
305
-
306
- describe "for a zero-terminated array" do
307
- before do
308
- allow(type_info).to receive(:tag).and_return :array
309
- allow(type_info).to receive(:zero_terminated?).and_return true
310
-
311
- allow(type_info).to receive(:param_type).with(0).and_return elmtype_info
312
- allow(elmtype_info).to receive(:tag_or_class).and_return :foo
313
- end
314
-
315
- it "returns an array containing the element type" do
316
- _(type_info.extra_conversion_arguments).must_equal [:foo]
317
- end
318
- end
319
-
320
- describe "for a GArray" do
321
- before do
322
- allow(type_info).to receive(:tag).and_return :array
323
- allow(type_info).to receive(:zero_terminated?).and_return false
324
- allow(type_info).to receive(:array_type).and_return :array
325
-
326
- allow(type_info).to receive(:param_type).with(0).and_return elmtype_info
327
- allow(elmtype_info).to receive(:tag_or_class).and_return :foo
328
- end
329
-
330
- it "returns an array containing the element type" do
331
- _(type_info.extra_conversion_arguments).must_equal [:foo]
332
- end
333
- end
334
-
335
- describe "for a GHashTable" do
336
- before do
337
- allow(type_info).to receive(:tag).and_return :ghash
338
- allow(type_info).to receive(:param_type).with(0).and_return keytype_info
339
- allow(type_info).to receive(:param_type).with(1).and_return valtype_info
340
-
341
- allow(keytype_info).to receive(:tag_or_class).and_return :foo
342
- allow(valtype_info).to receive(:tag_or_class).and_return :bar
343
- end
344
-
345
- it "returns an array containing the element type pair" do
346
- _(type_info.extra_conversion_arguments).must_equal [[:foo, :bar]]
347
- end
348
- end
349
-
350
- describe "for a GList" do
351
- before do
352
- allow(type_info).to receive(:tag).and_return :glist
353
-
354
- allow(type_info).to receive(:param_type).with(0).and_return elmtype_info
355
- allow(elmtype_info).to receive(:tag_or_class).and_return :foo
356
- end
357
-
358
- it "returns an array containing the element type" do
359
- _(type_info.extra_conversion_arguments).must_equal [:foo]
360
- end
361
- end
362
-
363
- describe "for a GSList" do
364
- before do
365
- allow(type_info).to receive(:tag).and_return :gslist
366
-
367
- allow(type_info).to receive(:param_type).with(0).and_return elmtype_info
368
- allow(elmtype_info).to receive(:tag_or_class).and_return :foo
369
- end
370
-
371
- it "returns an array containing the element type" do
372
- _(type_info.extra_conversion_arguments).must_equal [:foo]
373
- end
374
- end
375
-
376
- describe "for a GPtrArray" do
377
- before do
378
- allow(type_info).to receive(:tag).and_return :array
379
- allow(type_info).to receive(:zero_terminated?).and_return false
380
- allow(type_info).to receive(:array_type).and_return :ptr_array
381
-
382
- allow(type_info).to receive(:param_type).with(0).and_return elmtype_info
383
- allow(elmtype_info).to receive(:tag_or_class).and_return :foo
384
- end
385
-
386
- it "returns an array containing the element type" do
387
- _(type_info.extra_conversion_arguments).must_equal [:foo]
388
- end
389
- end
390
-
391
- describe "for a :callback" do
392
- before do
393
- allow(interface_type_info = Object.new).to receive(:namespace).and_return "Bar"
394
- allow(interface_type_info).to receive(:name).and_return "Foo"
395
-
396
- allow(type_info).to receive(:tag).and_return :callback
397
- allow(type_info).to receive(:interface).and_return interface_type_info
398
- end
399
-
400
- it "returns an empty array" do
401
- _(type_info.extra_conversion_arguments).must_equal []
402
- end
403
- end
404
- end
405
-
406
- describe "#argument_class_name" do
407
- before do
408
- allow(type_info).to receive(:tag).and_return tag
409
- end
410
-
411
- describe "for :gint32" do
412
- let(:tag) { :gint32 }
413
-
414
- it "is nil" do
415
- _(type_info.argument_class_name).must_be_nil
416
- end
417
- end
418
-
419
- describe "for interfaces" do
420
- let(:tag) { :interface }
421
-
422
- before do
423
- allow(type_info).to receive(:interface).and_return iface_info
424
- allow(iface_info).to receive(:info_type).and_return interface_type
425
- allow(iface_info).to receive(:full_type_name).and_return "Bar::Foo"
426
- end
427
-
428
- describe "for :struct" do
429
- let(:interface_type) { :struct }
430
- it "equals the struct class name" do
431
- _(type_info.argument_class_name).must_equal "Bar::Foo"
432
- end
433
- end
434
-
435
- describe "for :union" do
436
- let(:interface_type) { :union }
437
- it "equals the union class name" do
438
- _(type_info.argument_class_name).must_equal "Bar::Foo"
439
- end
440
- end
441
-
442
- describe "for :interface" do
443
- let(:interface_type) { :interface }
444
-
445
- it "equals the interface module name" do
446
- _(type_info.argument_class_name).must_equal "Bar::Foo"
447
- end
448
- end
449
-
450
- describe "for :object" do
451
- let(:interface_type) { :object }
452
-
453
- it "equals the object class name" do
454
- _(type_info.argument_class_name).must_equal "Bar::Foo"
455
- end
456
- end
457
-
458
- describe "for :callback" do
459
- let(:interface_type) { :callback }
460
-
461
- it "equals the callback type name" do
462
- _(type_info.argument_class_name).must_equal "Bar::Foo"
463
- end
464
- end
465
- end
466
-
467
- describe "for :strv" do
468
- let(:tag) { :strv }
469
-
470
- it "equals GLib::Strv" do
471
- _(type_info.argument_class_name).must_equal "GLib::Strv"
472
- end
473
- end
474
-
475
- describe "for arrays" do
476
- let(:tag) { :array }
477
- before do
478
- allow(type_info).to receive(:param_type).with(0).and_return elmtype_info
479
- allow(elmtype_info).to receive(:tag_or_class).and_return :foo
480
- end
481
-
482
- describe "for :zero_terminated" do
483
- before do
484
- allow(type_info).to receive(:zero_terminated?).and_return true
485
- end
486
-
487
- it "equals GirFFI::ZeroTerminated" do
488
- _(type_info.argument_class_name).must_equal "GirFFI::ZeroTerminated"
489
- end
490
- end
491
-
492
- describe "for :byte_array" do
493
- before do
494
- allow(type_info).to receive(:zero_terminated?).and_return false
495
- allow(type_info).to receive(:array_type).and_return :byte_array
496
- end
497
-
498
- it "equals GLib::ByteArray" do
499
- _(type_info.argument_class_name).must_equal "GLib::ByteArray"
500
- end
501
- end
502
-
503
- describe "for :ptr_array" do
504
- before do
505
- allow(type_info).to receive(:zero_terminated?).and_return false
506
- allow(type_info).to receive(:array_type).and_return :ptr_array
507
- end
508
-
509
- it "equals GLib::PtrArray" do
510
- _(type_info.argument_class_name).must_equal "GLib::PtrArray"
511
- end
512
- end
513
-
514
- describe "for :array" do
515
- before do
516
- allow(type_info).to receive(:zero_terminated?).and_return false
517
- allow(type_info).to receive(:array_type).and_return :array
518
- end
519
-
520
- it "equals GLib::Array" do
521
- _(type_info.argument_class_name).must_equal "GLib::Array"
522
- end
523
- end
524
- end
525
-
526
- describe "for :glist" do
527
- let(:tag) { :glist }
528
-
529
- it "equals GLib::List" do
530
- _(type_info.argument_class_name).must_equal "GLib::List"
531
- end
532
- end
533
-
534
- describe "for :gslist" do
535
- let(:tag) { :gslist }
536
-
537
- it "equals GLib::SList" do
538
- _(type_info.argument_class_name).must_equal "GLib::SList"
539
- end
540
- end
541
-
542
- describe "for :ghash" do
543
- let(:tag) { :ghash }
544
-
545
- it "equals GLib::HashTable" do
546
- _(type_info.argument_class_name).must_equal "GLib::HashTable"
547
- end
548
- end
549
-
550
- describe "for :error" do
551
- let(:tag) { :error }
552
-
553
- it "equals GLib::Error" do
554
- _(type_info.argument_class_name).must_equal "GLib::Error"
555
- end
556
- end
557
- end
558
-
559
- describe "#gtype" do
560
- before do
561
- allow(type_info).to receive(:tag).and_return tag
562
- allow(type_info).to receive(:pointer?).and_return pointer?
563
- end
564
-
565
- describe "for non-pointers" do
566
- let(:pointer?) { false }
567
- describe "for :void" do
568
- let(:tag) { :void }
569
-
570
- it "equals the none type" do
571
- _(GObject.type_name(type_info.gtype)).must_equal "void"
572
- end
573
- end
574
-
575
- describe "for :gboolean" do
576
- let(:tag) { :gboolean }
577
-
578
- it "equals the gboolean type" do
579
- _(GObject.type_name(type_info.gtype)).must_equal "gboolean"
580
- end
581
- end
582
-
583
- describe "for :gint32" do
584
- let(:tag) { :gint32 }
585
-
586
- it "equals the gint type" do
587
- _(GObject.type_name(type_info.gtype)).must_equal "gint"
588
- end
589
- end
590
-
591
- describe "for :gint64" do
592
- let(:tag) { :gint64 }
593
-
594
- it "equals the gint64 type" do
595
- _(GObject.type_name(type_info.gtype)).must_equal "gint64"
596
- end
597
- end
598
-
599
- describe "for :guint64" do
600
- let(:tag) { :guint64 }
601
-
602
- it "equals the guint64 type" do
603
- _(GObject.type_name(type_info.gtype)).must_equal "guint64"
604
- end
605
- end
606
- end
607
-
608
- describe "for pointers" do
609
- let(:pointer?) { true }
610
-
611
- describe "to :void" do
612
- let(:tag) { :void }
613
-
614
- it "equals the gpointer type" do
615
- _(GObject.type_name(type_info.gtype)).must_equal "gpointer"
616
- end
617
- end
618
-
619
- describe "to :utf8" do
620
- let(:tag) { :utf8 }
621
-
622
- it "equals the gchararray type" do
623
- _(GObject.type_name(type_info.gtype)).must_equal "gchararray"
624
- end
625
- end
626
-
627
- describe "to :ghash" do
628
- let(:tag) { :ghash }
629
-
630
- it "equals the GHashTable type" do
631
- _(GObject.type_name(type_info.gtype)).must_equal "GHashTable"
632
- end
633
- end
634
-
635
- describe "to :glist" do
636
- let(:tag) { :glist }
637
-
638
- it "equals the pointer type" do
639
- _(GObject.type_name(type_info.gtype)).must_equal "gpointer"
640
- end
641
- end
642
-
643
- describe "to :error" do
644
- let(:tag) { :error }
645
-
646
- it "equals the gpointer type" do
647
- _(GObject.type_name(type_info.gtype)).must_equal "gpointer"
648
- end
649
- end
650
-
651
- describe "to :guint32" do
652
- let(:tag) { :guint32 }
653
-
654
- it "equals the gpointer type" do
655
- _(GObject.type_name(type_info.gtype)).must_equal "gpointer"
656
- end
657
- end
658
- end
659
-
660
- describe "for arrays" do
661
- let(:tag) { :array }
662
- let(:pointer?) { true }
663
-
664
- describe "for pointer to GArray" do
665
- before do
666
- allow(type_info).to receive(:zero_terminated?).and_return false
667
- allow(type_info).to receive(:array_type).and_return :array
668
- end
669
-
670
- it "equals the GArray type" do
671
- _(GObject.type_name(type_info.gtype)).must_equal "GArray"
672
- end
673
- end
674
-
675
- describe "for a C array" do
676
- before do
677
- allow(type_info).to receive(:zero_terminated?).and_return false
678
- allow(type_info).to receive(:array_type).and_return :c
679
- end
680
-
681
- it "equals the gpointer type" do
682
- _(GObject.type_name(type_info.gtype)).must_equal "gpointer"
683
- end
684
- end
685
-
686
- describe "for a zero-terminated array" do
687
- before do
688
- allow(type_info).to receive(:param_type).with(0).and_return elmtype_info
689
- allow(type_info).to receive(:zero_terminated?).and_return true
690
- end
691
-
692
- describe "of utf8" do
693
- it "equals the GStrv type" do
694
- allow(elmtype_info).to receive(:tag).and_return :utf8
695
- allow(elmtype_info).to receive(:pointer?).and_return true
696
-
697
- _(GObject.type_name(type_info.gtype)).must_equal "GStrv"
698
- end
699
- end
700
-
701
- describe "of filename" do
702
- it "equals the GStrv type" do
703
- allow(elmtype_info).to receive(:tag).and_return :filename
704
- allow(elmtype_info).to receive(:pointer?).and_return true
705
-
706
- _(GObject.type_name(type_info.gtype)).must_equal "GStrv"
707
- end
708
- end
709
- end
710
- end
711
- end
712
- end