gir_ffi 0.15.2 → 0.15.7

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