gir_ffi 0.15.3 → 0.15.4

Sign up to get free protection for your applications and to get access to all the features.
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