gir_ffi 0.15.1 → 0.15.6

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 +42 -0
  3. data/README.md +10 -10
  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/ffi-gobject_introspection/lib.rb +1 -1
  22. data/lib/gir_ffi-base/gobject/lib.rb +4 -0
  23. data/lib/gir_ffi/array_element_convertor.rb +2 -3
  24. data/lib/gir_ffi/boxed_base.rb +13 -11
  25. data/lib/gir_ffi/builder.rb +3 -4
  26. data/lib/gir_ffi/builder_helper.rb +10 -2
  27. data/lib/gir_ffi/builders/base_argument_builder.rb +2 -2
  28. data/lib/gir_ffi/builders/base_method_builder.rb +1 -1
  29. data/lib/gir_ffi/builders/base_type_builder.rb +1 -1
  30. data/lib/gir_ffi/builders/callback_argument_builder.rb +2 -0
  31. data/lib/gir_ffi/builders/callback_builder.rb +25 -11
  32. data/lib/gir_ffi/builders/callback_return_value_builder.rb +4 -6
  33. data/lib/gir_ffi/builders/enum_builder.rb +9 -5
  34. data/lib/gir_ffi/builders/field_builder.rb +2 -1
  35. data/lib/gir_ffi/builders/function_builder.rb +1 -1
  36. data/lib/gir_ffi/builders/interface_builder.rb +3 -1
  37. data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
  38. data/lib/gir_ffi/builders/marshalling_method_builder.rb +5 -2
  39. data/lib/gir_ffi/builders/method_template.rb +4 -4
  40. data/lib/gir_ffi/builders/module_builder.rb +4 -2
  41. data/lib/gir_ffi/builders/null_argument_builder.rb +0 -2
  42. data/lib/gir_ffi/builders/null_return_value_builder.rb +0 -2
  43. data/lib/gir_ffi/builders/object_builder.rb +18 -6
  44. data/lib/gir_ffi/builders/property_builder.rb +1 -2
  45. data/lib/gir_ffi/builders/signal_closure_builder.rb +3 -5
  46. data/lib/gir_ffi/builders/struct_builder.rb +34 -7
  47. data/lib/gir_ffi/builders/user_defined_builder.rb +8 -1
  48. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +1 -1
  49. data/lib/gir_ffi/callback_base.rb +7 -8
  50. data/lib/gir_ffi/class_base.rb +1 -0
  51. data/lib/gir_ffi/core.rb +17 -2
  52. data/lib/gir_ffi/glib_error.rb +1 -2
  53. data/lib/gir_ffi/in_pointer.rb +7 -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 -4038
  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,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GirFFI::Builders::InitializerBuilder do
6
- describe "#method_definition" do
7
- let(:builder) { GirFFI::Builders::InitializerBuilder.new function_info }
8
- let(:code) { builder.method_definition }
9
-
10
- describe "for constructors with the default name" do
11
- let(:function_info) { get_method_introspection_data "Regress", "TestObj", "new" }
12
- it "builds an initializer" do
13
- _(code).must_equal <<~CODE
14
- def initialize(obj)
15
- _v1 = Regress::TestObj.from(obj)
16
- _v2 = Regress::Lib.regress_test_obj_new _v1
17
- store_pointer(_v2)
18
- end
19
- CODE
20
- end
21
- end
22
-
23
- describe "for constructors with a custom name" do
24
- let(:function_info) { get_method_introspection_data "Regress", "TestObj", "new_from_file" }
25
- it "builds a custom initializer" do
26
- _(code).must_equal <<~CODE
27
- def initialize_from_file(x)
28
- _v1 = GirFFI::InPointer.from_utf8(x)
29
- _v2 = FFI::MemoryPointer.new(:pointer).write_pointer nil
30
- _v3 = Regress::Lib.regress_test_obj_new_from_file _v1, _v2
31
- GirFFI::ArgHelper.check_error(_v2)
32
- store_pointer(_v3)
33
- end
34
- CODE
35
- end
36
- end
37
-
38
- describe "for constructors for boxed types" do
39
- let(:function_info) do
40
- get_method_introspection_data "GIMarshallingTests", "BoxedStruct", "new"
41
- end
42
-
43
- it "builds an initializer that sets owned to true" do
44
- _(code).must_equal <<~CODE
45
- def initialize
46
- _v1 = GIMarshallingTests::Lib.gi_marshalling_tests_boxed_struct_new
47
- store_pointer(_v1)
48
- @struct.owned = true
49
- end
50
- CODE
51
- end
52
- end
53
- end
54
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GirFFI::Builders::InterfaceBuilder do
6
- let(:interface_builder) do
7
- GirFFI::Builders::InterfaceBuilder.new(
8
- get_introspection_data("Regress", "TestInterface"))
9
- end
10
-
11
- describe "#build_class" do
12
- before do
13
- info = get_introspection_data "GObject", "TypePlugin"
14
- @bldr = GirFFI::Builders::InterfaceBuilder.new info
15
- @iface = @bldr.build_class
16
- end
17
-
18
- it "builds an interface as a module" do
19
- assert_instance_of Module, @iface
20
- end
21
-
22
- it "creates methods on the interface" do
23
- assert_defines_instance_method @iface, :complete_interface_info
24
- end
25
- end
26
-
27
- describe "#interface_struct" do
28
- it "returns the interface struct type" do
29
- _(interface_builder.interface_struct).must_equal Regress::TestInterfaceIface
30
- end
31
- end
32
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GirFFI::Builders::ModuleBuilder do
6
- let(:gir) { GObjectIntrospection::IRepository.default }
7
-
8
- describe "#find_namespaced_class_info" do
9
- it "finds the info in the GIR" do
10
- allow(gir).to receive(:require).with("Foo", nil)
11
-
12
- builder = GirFFI::Builders::ModuleBuilder.new "Foo"
13
-
14
- expect(gir).to receive(:find_by_name).with("Foo", "Bar").and_return "gir info"
15
-
16
- _(builder.find_namespaced_class_info(:Bar)).must_equal "gir info"
17
- end
18
-
19
- it "checks downcased class name as an alternative" do
20
- allow(gir).to receive(:require).with("Foo", nil)
21
-
22
- builder = GirFFI::Builders::ModuleBuilder.new "Foo"
23
-
24
- expect(gir).to receive(:find_by_name).with("Foo", "Bar").and_return nil
25
- expect(gir).to receive(:find_by_name).with("Foo", "bar").and_return "gir info"
26
-
27
- _(builder.find_namespaced_class_info(:Bar)).must_equal "gir info"
28
- end
29
-
30
- it "raises a clear error if the named class does not exist" do
31
- allow(gir).to receive(:require).with("Foo", nil)
32
-
33
- builder = GirFFI::Builders::ModuleBuilder.new "Foo"
34
-
35
- expect(gir).to receive(:find_by_name).with("Foo", "Bar").and_return nil
36
- expect(gir).to receive(:find_by_name).with("Foo", "bar").and_return nil
37
-
38
- assert_raises NameError do
39
- builder.find_namespaced_class_info :Bar
40
- end
41
- end
42
- end
43
- end
@@ -1,98 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GirFFI::Builders::ObjectBuilder do
6
- let(:obj_builder) do
7
- GirFFI::Builders::ObjectBuilder.new(
8
- get_introspection_data("Regress", "TestObj"))
9
- end
10
- let(:sub_obj_builder) do
11
- GirFFI::Builders::ObjectBuilder.new(
12
- get_introspection_data("Regress", "TestSubObj"))
13
- end
14
- let(:param_spec_builder) do
15
- GirFFI::Builders::ObjectBuilder.new(
16
- get_introspection_data("GObject", "ParamSpec"))
17
- end
18
-
19
- describe "#find_signal" do
20
- it 'finds the signal "test" for TestObj' do
21
- sig = obj_builder.find_signal "test"
22
- _(sig.name).must_equal "test"
23
- end
24
-
25
- it 'finds the signal "test" for TestSubObj' do
26
- sig = sub_obj_builder.find_signal "test"
27
- _(sig.name).must_equal "test"
28
- end
29
-
30
- it 'finds the signal "changed" for Gtk::Entry' do
31
- builder = GirFFI::Builders::ObjectBuilder.new get_introspection_data("Gtk", "Entry")
32
- sig = builder.find_signal "changed"
33
- _(sig.name).must_equal "changed"
34
- end
35
-
36
- it "returns nil for a signal that doesn't exist" do
37
- _(obj_builder.find_signal("foo")).must_be_nil
38
- end
39
- end
40
-
41
- describe "#find_property" do
42
- it "finds a property specified on the class itself" do
43
- prop = obj_builder.find_property("int")
44
- _(prop.name).must_equal "int"
45
- end
46
-
47
- it "finds a property specified on the parent class" do
48
- prop = sub_obj_builder.find_property("int")
49
- _(prop.name).must_equal "int"
50
- end
51
-
52
- it "returns nil if the property is not found" do
53
- _(sub_obj_builder.find_property("this-property-does-not-exist")).must_be_nil
54
- end
55
- end
56
-
57
- describe "#object_class_struct" do
58
- it "returns the class struct type" do
59
- _(obj_builder.object_class_struct).must_equal Regress::TestObjClass
60
- end
61
-
62
- it "returns the parent struct type for classes without their own struct" do
63
- binding_info = get_introspection_data "GObject", "Binding"
64
- builder = GirFFI::Builders::ObjectBuilder.new binding_info
65
- _(builder.object_class_struct).must_equal GObject::ObjectClass
66
- end
67
- end
68
-
69
- describe "for a struct without defined fields" do
70
- let(:info) { get_introspection_data "GObject", "Binding" }
71
-
72
- it "uses a single field of the parent struct type as the default layout" do
73
- _(info.n_fields).must_equal 0
74
-
75
- builder = GirFFI::Builders::ObjectBuilder.new info
76
-
77
- spec = builder.send :layout_specification
78
- assert_equal [:parent, GObject::Object::Struct, 0], spec
79
- end
80
- end
81
-
82
- describe "#eligible_properties" do
83
- let(:wi_builder) do
84
- GirFFI::Builders::ObjectBuilder.new(
85
- get_introspection_data("Regress", "TestWi8021x"))
86
- end
87
-
88
- it "includes properties that do not have a matching getter method" do
89
- result = obj_builder.eligible_properties
90
- _(result.map(&:name)).must_include "double"
91
- end
92
-
93
- it "skips properties that have a matching getter method" do
94
- result = wi_builder.eligible_properties
95
- _(result.map(&:name)).wont_include "testbool"
96
- end
97
- end
98
- end
@@ -1,158 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GirFFI::Builders::PropertyBuilder do
6
- let(:builder) { GirFFI::Builders::PropertyBuilder.new property_info }
7
-
8
- describe "for a property of type :glist" do
9
- let(:property_info) { get_property_introspection_data("Regress", "TestObj", "list") }
10
- it "generates the correct getter definition" do
11
- expected = <<~CODE
12
- def list
13
- _v1 = get_property('list')
14
- _v2 = GLib::List.wrap(:utf8, _v1)
15
- _v2
16
- end
17
- CODE
18
-
19
- _(builder.getter_def).must_equal expected
20
- end
21
-
22
- it "generates the correct setter definition" do
23
- expected = <<~CODE
24
- def list= value
25
- _v1 = GLib::List.from(:utf8, value)
26
- set_property("list", _v1)
27
- end
28
- CODE
29
-
30
- _(builder.setter_def).must_equal expected
31
- end
32
- end
33
-
34
- describe "for a property of type :ghash" do
35
- let(:property_info) { get_property_introspection_data("Regress", "TestObj", "hash-table") }
36
- it "generates the correct getter definition" do
37
- expected = <<~CODE
38
- def hash_table
39
- _v1 = get_property('hash-table')
40
- _v2 = GLib::HashTable.wrap([:utf8, :gint8], _v1)
41
- _v2
42
- end
43
- CODE
44
-
45
- _(builder.getter_def).must_equal expected
46
- end
47
-
48
- it "generates the correct setter definition" do
49
- expected = <<~CODE
50
- def hash_table= value
51
- _v1 = GLib::HashTable.from([:utf8, :gint8], value)
52
- set_property("hash-table", _v1)
53
- end
54
- CODE
55
-
56
- _(builder.setter_def).must_equal expected
57
- end
58
- end
59
-
60
- describe "for a property of type :strv" do
61
- let(:property_info) do
62
- get_property_introspection_data("GIMarshallingTests",
63
- "PropertiesObject",
64
- "some-strv")
65
- end
66
-
67
- it "generates the correct getter definition" do
68
- expected = <<~CODE
69
- def some_strv
70
- _v1 = get_property('some-strv')
71
- _v1
72
- end
73
- CODE
74
-
75
- _(builder.getter_def).must_equal expected
76
- end
77
-
78
- it "generates the correct setter definition" do
79
- expected = <<~CODE
80
- def some_strv= value
81
- _v1 = GLib::Strv.from(value)
82
- set_property("some-strv", _v1)
83
- end
84
- CODE
85
-
86
- _(builder.setter_def).must_equal expected
87
- end
88
- end
89
-
90
- describe "for a property of type :utf8" do
91
- let(:property_info) { get_property_introspection_data("Regress", "TestObj", "string") }
92
- it "generates the correct getter definition" do
93
- expected = <<~CODE
94
- def string
95
- _v1 = get_property('string')
96
- _v1
97
- end
98
- CODE
99
-
100
- _(builder.getter_def).must_equal expected
101
- end
102
-
103
- it "generates the correct setter definition" do
104
- expected = <<~CODE
105
- def string= value
106
- _v1 = value
107
- set_property("string", _v1)
108
- end
109
- CODE
110
-
111
- _(builder.setter_def).must_equal expected
112
- end
113
- end
114
-
115
- describe "for a property of a callback type" do
116
- let(:property_info) do
117
- get_property_introspection_data("Regress", "AnnotationObject", "function-property")
118
- end
119
-
120
- it "generates the correct getter definition" do
121
- expected = <<~CODE
122
- def function_property
123
- _v1 = get_property('function-property')
124
- _v2 = Regress::AnnotationCallback.wrap(_v1)
125
- _v2
126
- end
127
- CODE
128
-
129
- _(builder.getter_def).must_equal expected
130
- end
131
-
132
- it "generates the correct setter definition" do
133
- expected = <<~CODE
134
- def function_property= value
135
- _v1 = Regress::AnnotationCallback.from(value)
136
- set_property("function-property", _v1)
137
- end
138
- CODE
139
-
140
- _(builder.setter_def).must_equal expected
141
- end
142
- end
143
-
144
- describe "#container_defines_getter_method?" do
145
- let(:property_info) { Object.new.tap { |o| o.extend GirFFI::InfoExt::IPropertyInfo } }
146
- let(:container_info) { Object.new }
147
-
148
- before do
149
- allow(property_info).to receive(:container).and_return container_info
150
- allow(property_info).to receive(:name).and_return "foo-bar"
151
- allow(container_info).to receive(:find_instance_method).with("foo_bar").and_return true
152
- end
153
-
154
- it "finds methods with underscores for properties with dashes" do
155
- _(builder.container_defines_getter_method?).must_equal true
156
- end
157
- end
158
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- GirFFI.setup :Regress
6
-
7
- describe GirFFI::Builders::RegisteredTypeBuilder do
8
- describe "#setup_instance_method" do
9
- it "restores a method that was removed" do
10
- Regress::TestObj.class_eval { remove_method "instance_method" }
11
-
12
- builder = Regress::TestObj.gir_ffi_builder
13
-
14
- builder.setup_instance_method "instance_method"
15
-
16
- obj = Regress::TestObj.constructor
17
- _(obj).must_respond_to "instance_method"
18
- end
19
-
20
- it "returns the name of the generated method" do
21
- builder = Regress::TestObj.gir_ffi_builder
22
- result = builder.setup_instance_method "instance_method"
23
- _(result).must_equal "instance_method"
24
- end
25
-
26
- it "returns the name of the generated method if different from the info name" do
27
- skip "Need some way to test this now that GLib::IConv is gone"
28
- end
29
- end
30
-
31
- describe "#stub_methods" do
32
- it "adds getter method aliases" do
33
- instance = Regress::TestWi8021x.new
34
- _(instance).must_respond_to :testbool
35
- end
36
-
37
- it "adds setter method aliases" do
38
- instance = Regress::TestWi8021x.new
39
- _(instance).must_respond_to :testbool=
40
- end
41
-
42
- it "adds getter alias for method with arguments" do
43
- instance = Regress::TestObj.constructor
44
- _(instance).must_respond_to :get_qdata
45
- _(instance).must_respond_to :qdata
46
- end
47
-
48
- it "does not add setter alias for method with more than one argument" do
49
- instance = Regress::TestObj.constructor
50
- _(instance).must_respond_to :set_data
51
- _(instance).wont_respond_to :data=
52
- end
53
- end
54
- end
@@ -1,433 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GirFFI::Builders::ReturnValueBuilder do
6
- let(:var_gen) { GirFFI::VariableNameGenerator.new }
7
- let(:type_info) { method_info.return_type }
8
- let(:ownership_transfer) { method_info.caller_owns }
9
- let(:return_type_info) { GirFFI::ReturnValueInfo.new(type_info, ownership_transfer, false) }
10
- let(:builder) do
11
- GirFFI::Builders::ReturnValueBuilder.new(var_gen, return_type_info)
12
- end
13
-
14
- describe "for :gint32" do
15
- let(:method_info) do
16
- get_introspection_data("GIMarshallingTests",
17
- "int_return_min")
18
- end
19
-
20
- it "has no statements in #post_conversion" do
21
- _(builder.post_conversion).must_equal []
22
- end
23
-
24
- it "returns the result of the c function directly" do
25
- _(builder.capture_variable_name).must_equal "_v1"
26
- _(builder.return_value_name).must_equal "_v1"
27
- end
28
- end
29
-
30
- describe "for :struct" do
31
- describe "with transfer :nothing" do
32
- let(:method_info) do
33
- get_method_introspection_data("GIMarshallingTests",
34
- "BoxedStruct",
35
- "returnv")
36
- end
37
-
38
- it "wraps and copies the result in #post_conversion" do
39
- _(builder.capture_variable_name).must_equal "_v1"
40
- _(builder.post_conversion).must_equal ["_v2 = GIMarshallingTests::BoxedStruct.wrap_copy(_v1)"]
41
- end
42
-
43
- it "returns the copied result" do
44
- _(builder.capture_variable_name).must_equal "_v1"
45
- _(builder.return_value_name).must_equal "_v2"
46
- end
47
- end
48
- end
49
-
50
- describe "for :union" do
51
- let(:method_info) do
52
- get_method_introspection_data("GIMarshallingTests",
53
- "Union",
54
- "returnv")
55
- end
56
-
57
- it "wraps the result in #post_conversion" do
58
- _(builder.capture_variable_name).must_equal "_v1"
59
- _(builder.post_conversion).must_equal ["_v2 = GIMarshallingTests::Union.wrap_copy(_v1)"]
60
- end
61
-
62
- it "returns the wrapped result" do
63
- _(builder.capture_variable_name).must_equal "_v1"
64
- _(builder.return_value_name).must_equal "_v2"
65
- end
66
- end
67
-
68
- describe "for :interface" do
69
- let(:method_info) do
70
- get_method_introspection_data("Gio",
71
- "File",
72
- "new_for_commandline_arg")
73
- end
74
-
75
- it "wraps the result in #post_conversion" do
76
- _(builder.capture_variable_name).must_equal "_v1"
77
- _(builder.post_conversion).must_equal ["_v2 = Gio::File.wrap(_v1)"]
78
- end
79
-
80
- it "returns the wrapped result" do
81
- _(builder.capture_variable_name).must_equal "_v1"
82
- _(builder.return_value_name).must_equal "_v2"
83
- end
84
- end
85
-
86
- describe "for :object" do
87
- describe "with full ownership transfer" do
88
- let(:method_info) do
89
- get_method_introspection_data("GIMarshallingTests",
90
- "Object",
91
- "full_return")
92
- end
93
-
94
- it "wraps the result in #post_conversion" do
95
- _(builder.capture_variable_name).must_equal "_v1"
96
- _(builder.post_conversion).must_equal ["_v2 = GIMarshallingTests::Object.wrap(_v1)"]
97
- end
98
-
99
- it "returns the wrapped result" do
100
- _(builder.capture_variable_name).must_equal "_v1"
101
- _(builder.return_value_name).must_equal "_v2"
102
- end
103
- end
104
-
105
- describe "with no ownership transfer" do
106
- let(:method_info) do
107
- get_method_introspection_data("GIMarshallingTests",
108
- "Object",
109
- "none_return")
110
- end
111
-
112
- it "wraps the result in #post_conversion" do
113
- _(builder.capture_variable_name).must_equal "_v1"
114
- _(builder.post_conversion)
115
- .must_equal ["_v2 = GIMarshallingTests::Object.wrap(_v1).tap { |it| it && it.ref }"]
116
- end
117
-
118
- it "returns the wrapped result" do
119
- _(builder.capture_variable_name).must_equal "_v1"
120
- _(builder.return_value_name).must_equal "_v2"
121
- end
122
- end
123
- end
124
-
125
- describe "for :strv" do
126
- let(:method_info) do
127
- get_method_introspection_data("GLib",
128
- "KeyFile",
129
- "get_locale_string_list")
130
- end
131
-
132
- it "wraps the result in #post_conversion" do
133
- _(builder.capture_variable_name).must_equal "_v1"
134
- _(builder.post_conversion).must_equal ["_v2 = GLib::Strv.wrap(_v1)"]
135
- end
136
-
137
- it "returns the wrapped result" do
138
- _(builder.capture_variable_name).must_equal "_v1"
139
- _(builder.return_value_name).must_equal "_v2"
140
- end
141
- end
142
-
143
- describe "for :zero_terminated" do
144
- let(:method_info) do
145
- get_method_introspection_data("GLib",
146
- "Variant",
147
- "dup_bytestring")
148
- end
149
-
150
- it "wraps the result in #post_conversion" do
151
- _(builder.capture_variable_name).must_equal "_v1"
152
- _(builder.post_conversion).must_equal ["_v2 = GirFFI::ZeroTerminated.wrap(:guint8, _v1)"]
153
- end
154
-
155
- it "returns the wrapped result" do
156
- _(builder.capture_variable_name).must_equal "_v1"
157
- _(builder.return_value_name).must_equal "_v2"
158
- end
159
- end
160
-
161
- describe "for :byte_array" do
162
- let(:method_info) do
163
- get_introspection_data("GIMarshallingTests",
164
- "bytearray_full_return")
165
- end
166
-
167
- it "wraps the result in #post_conversion" do
168
- _(builder.capture_variable_name).must_equal "_v1"
169
- _(builder.post_conversion).must_equal ["_v2 = GLib::ByteArray.wrap(_v1)"]
170
- end
171
-
172
- it "returns the wrapped result" do
173
- _(builder.capture_variable_name).must_equal "_v1"
174
- _(builder.return_value_name).must_equal "_v2"
175
- end
176
- end
177
-
178
- describe "for :ptr_array" do
179
- let(:method_info) do
180
- get_introspection_data("GIMarshallingTests",
181
- "gptrarray_utf8_none_return")
182
- end
183
-
184
- it "wraps the result in #post_conversion" do
185
- _(builder.capture_variable_name).must_equal "_v1"
186
- _(builder.post_conversion).must_equal ["_v2 = GLib::PtrArray.wrap(:utf8, _v1)"]
187
- end
188
-
189
- it "returns the wrapped result" do
190
- _(builder.capture_variable_name).must_equal "_v1"
191
- _(builder.return_value_name).must_equal "_v2"
192
- end
193
- end
194
-
195
- describe "for :glist" do
196
- let(:method_info) do
197
- get_introspection_data("GIMarshallingTests",
198
- "glist_int_none_return")
199
- end
200
-
201
- it "wraps the result in #post_conversion" do
202
- _(builder.capture_variable_name).must_equal "_v1"
203
- _(builder.post_conversion).must_equal ["_v2 = GLib::List.wrap(:gint32, _v1)"]
204
- end
205
-
206
- it "returns the wrapped result" do
207
- _(builder.capture_variable_name).must_equal "_v1"
208
- _(builder.return_value_name).must_equal "_v2"
209
- end
210
- end
211
-
212
- describe "for :gslist" do
213
- let(:method_info) do
214
- get_introspection_data("GIMarshallingTests",
215
- "gslist_int_none_return")
216
- end
217
-
218
- it "wraps the result in #post_conversion" do
219
- _(builder.capture_variable_name).must_equal "_v1"
220
- _(builder.post_conversion).must_equal ["_v2 = GLib::SList.wrap(:gint32, _v1)"]
221
- end
222
-
223
- it "returns the wrapped result" do
224
- _(builder.capture_variable_name).must_equal "_v1"
225
- _(builder.return_value_name).must_equal "_v2"
226
- end
227
- end
228
-
229
- describe "for :ghash" do
230
- let(:method_info) do
231
- get_introspection_data("GIMarshallingTests",
232
- "ghashtable_int_none_return")
233
- end
234
-
235
- it "wraps the result in #post_conversion" do
236
- _(builder.capture_variable_name).must_equal "_v1"
237
- _(builder.post_conversion).must_equal ["_v2 = GLib::HashTable.wrap([:gint32, :gint32], _v1)"]
238
- end
239
-
240
- it "returns the wrapped result" do
241
- _(builder.capture_variable_name).must_equal "_v1"
242
- _(builder.return_value_name).must_equal "_v2"
243
- end
244
- end
245
-
246
- describe "for :array" do
247
- let(:method_info) do
248
- get_introspection_data("GIMarshallingTests",
249
- "garray_int_none_return")
250
- end
251
-
252
- it "wraps the result in #post_conversion" do
253
- _(builder.capture_variable_name).must_equal "_v1"
254
- _(builder.post_conversion).must_equal ["_v2 = GLib::Array.wrap(:gint32, _v1)"]
255
- end
256
-
257
- it "returns the wrapped result" do
258
- _(builder.capture_variable_name).must_equal "_v1"
259
- _(builder.return_value_name).must_equal "_v2"
260
- end
261
- end
262
-
263
- describe "for :error" do
264
- let(:method_info) do
265
- get_introspection_data("GIMarshallingTests",
266
- "gerror_return")
267
- end
268
-
269
- it "wraps the result in #post_conversion" do
270
- _(builder.capture_variable_name).must_equal "_v1"
271
- _(builder.post_conversion).must_equal ["_v2 = GLib::Error.wrap(_v1)"]
272
- end
273
-
274
- it "returns the wrapped result" do
275
- _(builder.capture_variable_name).must_equal "_v1"
276
- _(builder.return_value_name).must_equal "_v2"
277
- end
278
- end
279
-
280
- describe "for :c" do
281
- describe "with fixed size" do
282
- let(:method_info) do
283
- get_introspection_data("GIMarshallingTests",
284
- "array_fixed_int_return")
285
- end
286
-
287
- it "converts the result in #post_conversion" do
288
- _(builder.capture_variable_name).must_equal "_v1"
289
- _(builder.post_conversion).must_equal ["_v2 = GirFFI::SizedArray.wrap(:gint32, 4, _v1)"]
290
- end
291
-
292
- it "returns the wrapped result" do
293
- _(builder.capture_variable_name).must_equal "_v1"
294
- _(builder.return_value_name).must_equal "_v2"
295
- end
296
- end
297
-
298
- describe "with separate size parameter" do
299
- let(:length_argument) { Object.new }
300
- let(:method_info) do
301
- get_method_introspection_data("GIMarshallingTests",
302
- "Object",
303
- "method_array_return")
304
- end
305
-
306
- before do
307
- allow(length_argument).to receive(:post_converted_name).and_return "bar"
308
- builder.length_arg = length_argument
309
- end
310
-
311
- it "converts the result in #post_conversion" do
312
- _(builder.capture_variable_name).must_equal "_v1"
313
- _(builder.post_conversion).must_equal ["_v2 = GirFFI::SizedArray.wrap(:gint32, bar, _v1)"]
314
- end
315
-
316
- it "returns the wrapped result" do
317
- _(builder.capture_variable_name).must_equal "_v1"
318
- _(builder.return_value_name).must_equal "_v2"
319
- end
320
- end
321
- end
322
-
323
- describe "for :utf8" do
324
- describe "with no transfer" do
325
- let(:method_info) do
326
- get_introspection_data("GIMarshallingTests", "utf8_none_return")
327
- end
328
-
329
- it "converts the result in #post_conversion" do
330
- _(builder.capture_variable_name).must_equal "_v1"
331
- _(builder.post_conversion).must_equal ["_v2 = _v1.to_utf8"]
332
- end
333
-
334
- it "returns the converted result" do
335
- _(builder.capture_variable_name).must_equal "_v1"
336
- _(builder.return_value_name).must_equal "_v2"
337
- end
338
- end
339
-
340
- describe "with full transfer" do
341
- let(:method_info) do
342
- get_introspection_data("GIMarshallingTests", "utf8_full_return")
343
- end
344
-
345
- it "autoreleases and converts the result in #post_conversion" do
346
- _(builder.capture_variable_name).must_equal "_v1"
347
- _(builder.post_conversion)
348
- .must_equal ["_v2 = GirFFI::AllocationHelper.free_after _v1, &:to_utf8"]
349
- end
350
-
351
- it "returns the converted result" do
352
- _(builder.capture_variable_name).must_equal "_v1"
353
- _(builder.return_value_name).must_equal "_v2"
354
- end
355
- end
356
- end
357
-
358
- describe "for :void pointer" do
359
- let(:ownership_transfer) { :nothing }
360
- let(:callback_info) do
361
- get_introspection_data("GIMarshallingTests", "CallbackIntInt")
362
- end
363
- let(:type_info) { callback_info.args[1].argument_type }
364
-
365
- it "has no statements in #post_conversion" do
366
- _(builder.post_conversion).must_equal []
367
- end
368
-
369
- it "returns the result of the c function directly" do
370
- _(builder.capture_variable_name).must_equal "_v1"
371
- _(builder.return_value_name).must_equal "_v1"
372
- end
373
- end
374
-
375
- describe "for :void" do
376
- let(:method_info) do
377
- get_method_introspection_data("Regress", "TestObj", "null_out")
378
- end
379
-
380
- it "has no statements in #post_conversion" do
381
- _(builder.post_conversion).must_equal []
382
- end
383
-
384
- it "marks itself as irrelevant" do
385
- _(builder.relevant?).must_equal false
386
- end
387
-
388
- it "returns nothing" do
389
- _(builder.return_value_name).must_be_nil
390
- end
391
- end
392
-
393
- describe "for a closure argument" do
394
- let(:ownership_transfer) { :nothing }
395
- let(:callback_info) do
396
- get_introspection_data("Regress", "TestCallbackUserData")
397
- end
398
- let(:type_info) { callback_info.args[0].argument_type }
399
-
400
- before do
401
- builder.mark_as_user_data :dummy
402
- end
403
-
404
- it "fetches the stored object in #post_conversion" do
405
- _(builder.capture_variable_name).must_equal "_v1"
406
- _(builder.post_conversion).must_equal ["_v2 = GirFFI::ArgHelper::OBJECT_STORE.fetch(_v1)"]
407
- end
408
-
409
- it "returns the stored object" do
410
- _(builder.capture_variable_name).must_equal "_v1"
411
- _(builder.return_value_name).must_equal "_v2"
412
- end
413
- end
414
-
415
- describe "for a skipped return value" do
416
- let(:method_info) do
417
- get_method_introspection_data("Regress", "TestObj", "skip_return_val")
418
- end
419
- let(:return_type_info) { GirFFI::ReturnValueInfo.new(type_info, :nothing, true) }
420
-
421
- it "has no statements in #post_conversion" do
422
- _(builder.post_conversion).must_equal []
423
- end
424
-
425
- it "marks itself as irrelevant" do
426
- _(builder.relevant?).must_equal false
427
- end
428
-
429
- it "returns nothing" do
430
- _(builder.return_value_name).must_be_nil
431
- end
432
- end
433
- end