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,151 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GObject do
6
- before do
7
- GirFFI.setup :Regress
8
- end
9
-
10
- describe "::signal_emit" do
11
- it "emits a signal" do
12
- a = 1
13
- o = Regress::TestSubObj.new
14
- prc = proc { a = 2 }
15
- callback = GObject::Callback.from prc
16
- ::GObject::Lib.g_signal_connect_data o, "test", callback, nil, nil, 0
17
- GObject.signal_emit o, "test"
18
- assert_equal 2, a
19
- end
20
-
21
- it "handles return values" do
22
- s = Gio::SocketService.new
23
-
24
- argtypes = [:pointer, :pointer, :pointer, :pointer]
25
- callback = FFI::Function.new(:bool, argtypes) { |_a, _b, _c, _d| true }
26
- ::GObject::Lib.g_signal_connect_data s, "incoming", callback, nil, nil, 0
27
- rv = GObject.signal_emit s, "incoming"
28
- assert_equal true, rv
29
- end
30
-
31
- it "passes in extra arguments" do
32
- o = Regress::TestSubObj.new
33
- sb = Regress::TestSimpleBoxedA.new
34
- sb.some_int8 = 31
35
- sb.some_double = 2.42
36
- sb.some_enum = :value2
37
- b2 = nil
38
-
39
- argtypes = [:pointer, :pointer, :pointer]
40
- callback = FFI::Function.new(:void, argtypes) do |_a, b, _c|
41
- b2 = b
42
- end
43
- ::GObject::Lib.g_signal_connect_data o, "test-with-static-scope-arg", callback, nil, nil, 0
44
- GObject.signal_emit o, "test-with-static-scope-arg", sb
45
-
46
- sb2 = Regress::TestSimpleBoxedA.wrap b2
47
- assert sb.equals(sb2)
48
- end
49
-
50
- it "allows specifying signal detail" do
51
- a = 1
52
- o = Regress::TestSubObj.new
53
-
54
- callback = FFI::Function.new(:void, [:pointer, :pointer, :pointer]) { a = 2 }
55
- ::GObject::Lib.g_signal_connect_data o, "notify::detail", callback, nil, nil, 0
56
-
57
- GObject.signal_emit o, "notify::detail"
58
-
59
- _(a).must_equal 2
60
- end
61
- end
62
-
63
- describe "::signal_connect" do
64
- it "installs a signal handler" do
65
- a = 1
66
- o = Regress::TestSubObj.new
67
- GObject.signal_connect(o, "test") { a = 2 }
68
- GObject.signal_emit o, "test"
69
- assert_equal 2, a
70
- end
71
-
72
- it "passes user data to handler" do
73
- a = 1
74
- o = Regress::TestSubObj.new
75
- GObject.signal_connect(o, "test", 2) { |_i, d| a = d }
76
- GObject.signal_emit o, "test"
77
- assert_equal 2, a
78
- end
79
-
80
- it "passes object to handler" do
81
- o = Regress::TestSubObj.new
82
- o2 = nil
83
- GObject.signal_connect(o, "test") { |i, _d| o2 = i }
84
- GObject.signal_emit o, "test"
85
- assert_instance_of Regress::TestSubObj, o2
86
- assert_equal o.to_ptr, o2.to_ptr
87
- end
88
-
89
- it "does not allow connecting an invalid signal" do
90
- o = Regress::TestSubObj.new
91
- _(proc { GObject.signal_connect(o, "not-really-a-signal") {} })
92
- .must_raise GirFFI::SignalNotFoundError
93
- end
94
-
95
- it "handles return values" do
96
- s = Gio::SocketService.new
97
- GObject.signal_connect(s, "incoming") { true }
98
- rv = GObject.signal_emit s, "incoming"
99
- assert_equal true, rv
100
- end
101
-
102
- it "requires a block" do
103
- o = Regress::TestSubObj.new
104
- _(proc { GObject.signal_connect o, "test" }).must_raise ArgumentError
105
- end
106
-
107
- it "allows specifying signal detail" do
108
- a = 1
109
- o = Regress::TestSubObj.new
110
- GObject.signal_connect(o, "notify::detail", 2) { |_i, _, d| a = d }
111
- GObject.signal_emit o, "notify::detail"
112
- assert_equal 2, a
113
- end
114
-
115
- describe "connecting a signal with extra arguments" do
116
- before do
117
- @a = nil
118
- @b = 2
119
-
120
- o = Regress::TestSubObj.new
121
- sb = Regress::TestSimpleBoxedA.new
122
- sb.some_int = 23
123
-
124
- GObject.signal_connect(o, "test-with-static-scope-arg", 2) do |_instance, object, user_data|
125
- @a = user_data
126
- @b = object
127
- end
128
- GObject.signal_emit o, "test-with-static-scope-arg", sb
129
- end
130
-
131
- it "passes on the user data argument" do
132
- assert_equal 2, @a
133
- end
134
-
135
- it "passes on the extra arguments" do
136
- assert_instance_of Regress::TestSimpleBoxedA, @b
137
- assert_equal 23, @b.some_int
138
- end
139
- end
140
- end
141
-
142
- describe "::signal_connect_after" do
143
- it "installs a signal handler" do
144
- a = 1
145
- o = Regress::TestSubObj.new
146
- GObject.signal_connect_after(o, "test") { a = 2 }
147
- GObject.signal_emit o, "test"
148
- assert_equal 2, a
149
- end
150
- end
151
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GirFFI::AllocationHelper do
6
- describe ".free_after" do
7
- before do
8
- allow(GirFFI::LibC).to receive(:free)
9
- end
10
-
11
- it "frees the passed-in pointer" do
12
- ptr = double("pointer", null?: false)
13
- GirFFI::AllocationHelper.free_after(ptr) {}
14
- expect(GirFFI::LibC).to have_received(:free).with(ptr)
15
- end
16
-
17
- it "does not free a passed-in null pointer" do
18
- ptr = double("pointer", null?: true)
19
- GirFFI::AllocationHelper.free_after(ptr) {}
20
- expect(GirFFI::LibC).not_to have_received(:free)
21
- end
22
-
23
- it "yields ptr to the block" do
24
- ptr = double("pointer", null?: false)
25
- foo = nil
26
- GirFFI::AllocationHelper.free_after(ptr) { |it| foo = it }
27
- _(foo).must_equal ptr
28
- end
29
-
30
- it "returns the result of the block" do
31
- ptr = double("pointer", null?: false)
32
- result = GirFFI::AllocationHelper.free_after(ptr) { "bar" }
33
- _(result).must_equal "bar"
34
- end
35
- end
36
- end
@@ -1,139 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GirFFI::ArgHelper do
6
- describe ".cast_from_pointer" do
7
- it "handles class types" do
8
- klass = Class.new
9
- expect(klass).to receive(:wrap).with(:pointer_value).and_return :wrapped_value
10
- _(GirFFI::ArgHelper.cast_from_pointer(klass, :pointer_value)).must_equal :wrapped_value
11
- end
12
-
13
- describe "for :gint8" do
14
- it "handles negative :gint8" do
15
- ptr = FFI::Pointer.new(-127)
16
- _(GirFFI::ArgHelper.cast_from_pointer(:gint8, ptr)).must_equal(-127)
17
- end
18
-
19
- it "handles positive :gint8" do
20
- ptr = FFI::Pointer.new(128)
21
- _(GirFFI::ArgHelper.cast_from_pointer(:gint8, ptr)).must_equal(128)
22
- end
23
- end
24
-
25
- it "handles :guint32" do
26
- ptr = FFI::Pointer.new(0xffffffff)
27
- _(GirFFI::ArgHelper.cast_from_pointer(:guint32, ptr)).must_equal(0xffffffff)
28
- end
29
-
30
- describe "for :gint32" do
31
- it "handles positive :gint32" do
32
- ptr = FFI::Pointer.new(1)
33
- _(GirFFI::ArgHelper.cast_from_pointer(:gint32, ptr)).must_equal(1)
34
- end
35
-
36
- it "handles negative :gint32" do
37
- ptr = FFI::Pointer.new(0xffffffff)
38
- _(GirFFI::ArgHelper.cast_from_pointer(:gint32, ptr)).must_equal(-1)
39
- end
40
-
41
- it "handles largest negative :gint32" do
42
- ptr = FFI::Pointer.new(0x80000000)
43
- _(GirFFI::ArgHelper.cast_from_pointer(:gint32, ptr)).must_equal(-0x80000000)
44
- end
45
-
46
- it "handles largest positive :gint32" do
47
- ptr = FFI::Pointer.new(0x7fffffff)
48
- _(GirFFI::ArgHelper.cast_from_pointer(:gint32, ptr)).must_equal(0x7fffffff)
49
- end
50
- end
51
-
52
- it "handles :utf8" do
53
- ptr = FFI::MemoryPointer.from_string "foo"
54
- _(GirFFI::ArgHelper.cast_from_pointer(:utf8, ptr)).must_equal "foo"
55
- end
56
-
57
- it "handles :filename" do
58
- ptr = FFI::MemoryPointer.from_string "foo"
59
- _(GirFFI::ArgHelper.cast_from_pointer(:filename, ptr)).must_equal "foo"
60
- end
61
-
62
- it "handles GHashTable" do
63
- hash = GLib::HashTable.from [:utf8, :gint32], "foo" => 1, "bar" => 2
64
- ptr = hash.to_ptr
65
- result = GirFFI::ArgHelper.cast_from_pointer([:pointer, [:ghash, :utf8, :gint32]], ptr)
66
- _(result.to_hash).must_equal hash.to_hash
67
- end
68
-
69
- describe "when passing a broken typespec" do
70
- it "raises on unknown symbol" do
71
- ptr = FFI::Pointer.new(0xffffffff)
72
- exception = _(-> { GirFFI::ArgHelper.cast_from_pointer(:foo, ptr) }).must_raise RuntimeError
73
- _(exception.message).must_equal "Don't know how to cast foo"
74
- end
75
-
76
- it "raises on unexpected main type for complex type" do
77
- ptr = FFI::Pointer.new(0xffffffff)
78
- exception = _(-> { GirFFI::ArgHelper.cast_from_pointer([:utf8], ptr) }).must_raise RuntimeError
79
- _(exception.message).must_equal "Don't know how to cast [:utf8]"
80
- end
81
-
82
- it "raises on unexpected sub type for complex type" do
83
- ptr = FFI::Pointer.new(0xffffffff)
84
- exception = _(-> { GirFFI::ArgHelper.cast_from_pointer([:pointer, :utf8], ptr) }).must_raise RuntimeError
85
- _(exception.message).must_equal "Don't know how to cast [:pointer, :utf8]"
86
- end
87
-
88
- it "raises on unexpected container type for complex type" do
89
- ptr = FFI::Pointer.new(0xffffffff)
90
- exception = _(-> { GirFFI::ArgHelper.cast_from_pointer([:pointer, [:gint32]], ptr) }).must_raise RuntimeError
91
- _(exception.message).must_equal "Don't know how to cast [:pointer, [:gint32]]"
92
- end
93
- end
94
- end
95
-
96
- describe ".store" do
97
- describe "when called with nil" do
98
- it "returns a null pointer" do
99
- _(GirFFI::ArgHelper.store(nil)).must_be :null?
100
- end
101
- end
102
-
103
- describe "when called with a string" do
104
- it "stores the string in GirFFI::ArgHelper::OBJECT_STORE" do
105
- str = "Foo"
106
- ptr = GirFFI::ArgHelper.store(str)
107
- result = GirFFI::ArgHelper::OBJECT_STORE.fetch(ptr)
108
- _(result).must_equal str
109
- end
110
- end
111
- end
112
-
113
- describe ".check_fixed_array_size" do
114
- it "passes if array has the correct size" do
115
- GirFFI::ArgHelper.check_fixed_array_size(3, [1, 2, 3], "foo")
116
- pass
117
- end
118
-
119
- it "raises if array does not have the correct size" do
120
- result = _(-> { GirFFI::ArgHelper.check_fixed_array_size(3, [1, 2], "foo") })
121
- .must_raise ArgumentError
122
- _(result.message).must_equal "foo should have size 3"
123
- end
124
- end
125
-
126
- describe ".check_error" do
127
- it "does nothing if there is no error" do
128
- err_ptr = double("err_ptr", read_pointer: nil)
129
- GirFFI::ArgHelper.check_error err_ptr
130
- pass
131
- end
132
-
133
- it "raises an exception if there is an error" do
134
- err = GLib::Error.new
135
- err_ptr = double("err_ptr", read_pointer: err.to_ptr)
136
- _(-> { GirFFI::ArgHelper.check_error err_ptr }).must_raise GirFFI::GLibError
137
- end
138
- end
139
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GirFFI::Boolean do
6
- it "has the same native size as an int" do
7
- _(FFI.type_size(GirFFI::Boolean)).must_equal FFI.type_size :int
8
- end
9
-
10
- describe ".from_native" do
11
- it "converts 0 to false" do
12
- _(GirFFI::Boolean.from_native(0, "whatever")).must_equal false
13
- end
14
-
15
- it "converts 1 to true" do
16
- _(GirFFI::Boolean.from_native(1, "whatever")).must_equal true
17
- end
18
- end
19
-
20
- describe ".to_native" do
21
- it "converts false to 0" do
22
- _(GirFFI::Boolean.to_native(false, "whatever")).must_equal 0
23
- end
24
-
25
- it "converts true to 1" do
26
- _(GirFFI::Boolean.to_native(true, "whatever")).must_equal 1
27
- end
28
-
29
- it "converts nil to 0" do
30
- _(GirFFI::Boolean.to_native(nil, "whatever")).must_equal 0
31
- end
32
-
33
- it "converts truthy value to 1" do
34
- _(GirFFI::Boolean.to_native("i am truth!", "whatever")).must_equal 1
35
- end
36
- end
37
-
38
- describe ".size" do
39
- it "returns the correct type size" do
40
- _(GirFFI::Boolean.size).must_equal FFI.type_size :int
41
- end
42
- end
43
- end
@@ -1,65 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- GirFFI.setup :GIMarshallingTests
6
-
7
- describe GirFFI::BoxedBase do
8
- describe "initialize" do
9
- it "sets up the held struct pointer" do
10
- # NOTE: GObject::Value uses the generic constructor, unlike
11
- # GIMarshallingTests::BoxedStruct, which has its own constructor.
12
- value = GObject::Value.new
13
- _(value.to_ptr).wont_be_nil
14
- end
15
- end
16
-
17
- describe "copy_from" do
18
- it "returns a copy with owned false" do
19
- original = GIMarshallingTests::BoxedStruct.new
20
- copy = GIMarshallingTests::BoxedStruct.copy_from(original)
21
- ptr = copy.to_ptr
22
- _(ptr).wont_be :==, original.to_ptr
23
- _(ptr).wont_be :autorelease? if ptr.respond_to? :autorelease?
24
- _(copy.struct).wont_be :owned?
25
- end
26
- end
27
-
28
- describe "wrap_own" do
29
- it "wraps and owns the supplied pointer" do
30
- original = GIMarshallingTests::BoxedStruct.new
31
- copy = GIMarshallingTests::BoxedStruct.wrap_own(original.to_ptr)
32
- ptr = copy.to_ptr
33
- _(ptr).must_equal original.to_ptr
34
- _(ptr).wont_be :autorelease? if ptr.respond_to? :autorelease?
35
- _(copy.struct).must_be :owned?
36
- end
37
- end
38
-
39
- describe "upon garbage collection" do
40
- it "frees and disowns the underlying struct if it is owned" do
41
- skip "cannot be reliably tested on JRuby and Rubinius" if jruby? || rubinius?
42
-
43
- allow(GObject).to receive(:boxed_free)
44
- gtype = GIMarshallingTests::BoxedStruct.gtype
45
-
46
- owned_struct = GIMarshallingTests::BoxedStruct.new.struct
47
- owned_ptr = owned_struct.to_ptr
48
-
49
- unowned_struct = GIMarshallingTests::BoxedStruct.new.struct
50
- unowned_struct.owned = false
51
- unowned_ptr = unowned_struct.to_ptr
52
-
53
- GC.start
54
- # Creating a new object is sometimes needed to trigger enough garbage collection.
55
- GIMarshallingTests::BoxedStruct.new
56
- sleep 1
57
- GC.start
58
- GC.start
59
-
60
- expect(GObject).to have_received(:boxed_free).with(gtype, owned_ptr)
61
- expect(GObject).not_to have_received(:boxed_free).with(gtype, unowned_ptr)
62
- _(owned_struct).wont_be :owned?
63
- end
64
- end
65
- end
@@ -1,322 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- GirFFI.setup :Regress
6
- GirFFI.setup :GIMarshallingTests
7
-
8
- describe GirFFI::Builder do
9
- let(:gir) { GObjectIntrospection::IRepository.default }
10
-
11
- describe ".build_class" do
12
- it "does not replace existing classes" do
13
- oldclass = GObject::Object
14
- GirFFI::Builder.build_class get_introspection_data("GObject", "Object")
15
- _(GObject::Object).must_equal oldclass
16
- end
17
- end
18
-
19
- describe ".build_module" do
20
- it "refuses to build existing modules defined elsewhere" do
21
- result = _(-> { GirFFI::Builder.build_module("Array") }).must_raise RuntimeError
22
- _(result.message).must_equal "The module Array was already defined elsewhere"
23
- end
24
-
25
- describe "building a module for the first time" do
26
- before do
27
- save_module :Regress
28
- GirFFI::Builder.build_module "Regress"
29
- end
30
-
31
- it "creates a Lib module ready to attach functions from the shared library" do
32
- gir = GObjectIntrospection::IRepository.default
33
- expected = [gir.shared_library("Regress")]
34
- assert_equal expected, Regress::Lib.ffi_libraries.map(&:name)
35
- end
36
-
37
- after do
38
- restore_module :Regress
39
- end
40
- end
41
-
42
- describe "building a module that already exists" do
43
- it "does not replace the existing module" do
44
- oldmodule = Regress
45
- GirFFI::Builder.build_module "Regress"
46
- assert_equal oldmodule, Regress
47
- end
48
-
49
- it "does not replace the existing Lib module" do
50
- oldmodule = Regress::Lib
51
- GirFFI::Builder.build_module "Regress"
52
- assert_equal oldmodule, Regress::Lib
53
- end
54
- end
55
-
56
- it "passes the version on to ModuleBuilder" do
57
- builder = double(generate: nil)
58
- expect(GirFFI::Builders::ModuleBuilder).to receive(:new)
59
- .with("Foo", namespace: "Foo", version: "1.0")
60
- .and_return builder
61
-
62
- GirFFI::Builder.build_module "Foo", "1.0"
63
- end
64
- end
65
-
66
- describe ".build_by_gtype" do
67
- it "returns the class types known to the GIR" do
68
- result = GirFFI::Builder.build_by_gtype GObject::Object.gtype
69
- _(result).must_equal GObject::Object
70
- end
71
-
72
- it "returns the class for user-defined types" do
73
- klass = Class.new GIMarshallingTests::OverridesObject
74
- Object.const_set "Derived#{Sequence.next}", klass
75
- gtype = GirFFI.define_type klass
76
-
77
- found_klass = GirFFI::Builder.build_by_gtype gtype
78
- _(found_klass).must_equal klass
79
- end
80
-
81
- it "returns the class for user-defined types not derived from GObject" do
82
- klass = Class.new Regress::TestFundamentalObject
83
- Object.const_set "Derived#{Sequence.next}", klass
84
- gtype = GirFFI.define_type klass
85
-
86
- found_klass = GirFFI::Builder.build_by_gtype gtype
87
- _(found_klass).must_equal klass
88
- end
89
-
90
- it "returns a valid class for boxed classes unknown to GIR" do
91
- object_class = GIMarshallingTests::PropertiesObject.object_class
92
- property = object_class.find_property "some-boxed-glist"
93
- gtype = property.value_type
94
-
95
- _(gtype).wont_equal GObject::TYPE_NONE
96
-
97
- found_klass = GirFFI::Builder.build_by_gtype gtype
98
- _(found_klass.name).must_be_nil
99
- _(found_klass.superclass).must_equal GirFFI::BoxedBase
100
- end
101
-
102
- it "refuse to build classes for base types" do
103
- _(-> { GirFFI::Builder.build_by_gtype GObject::TYPE_INT })
104
- .must_raise RuntimeError, "Unable to handle type gint"
105
- end
106
- end
107
-
108
- describe ".attach_ffi_function" do
109
- let(:lib) { Module.new }
110
-
111
- it "calls attach_function with the correct types for Regress.test_callback_destroy_notify" do
112
- function_info = get_introspection_data "Regress", "test_callback_destroy_notify"
113
-
114
- expect(lib)
115
- .to receive(:attach_function)
116
- .with("regress_test_callback_destroy_notify",
117
- [Regress::TestCallbackUserData, :pointer, GLib::DestroyNotify],
118
- :int32)
119
- .and_return true
120
-
121
- GirFFI::Builder.attach_ffi_function(lib, function_info)
122
- end
123
-
124
- it "calls attach_function with the correct types for Regress::TestObj#torture_signature_0" do
125
- info = get_method_introspection_data "Regress", "TestObj", "torture_signature_0"
126
-
127
- expect(lib)
128
- .to receive(:attach_function)
129
- .with("regress_test_obj_torture_signature_0",
130
- [:pointer, :int32, :pointer, :pointer, :pointer, :pointer, :uint32],
131
- :void)
132
- .and_return true
133
-
134
- GirFFI::Builder.attach_ffi_function(lib, info)
135
- end
136
-
137
- it "calls attach_function with the correct types for Regress::TestObj#instance_method" do
138
- info = get_method_introspection_data "Regress", "TestObj", "instance_method"
139
- expect(lib).to receive(:attach_function)
140
- .with("regress_test_obj_instance_method", [:pointer], :int32)
141
- .and_return true
142
- GirFFI::Builder.attach_ffi_function(lib, info)
143
- end
144
-
145
- it "calls attach_function with the correct types for Regress.test_array_gint32_in" do
146
- info = get_introspection_data "Regress", "test_array_gint32_in"
147
- expect(lib).to receive(:attach_function)
148
- .with("regress_test_array_gint32_in", [:int32, :pointer], :int32)
149
- .and_return true
150
- GirFFI::Builder.attach_ffi_function(lib, info)
151
- end
152
-
153
- it "calls attach_function with the correct types for Regress.test_enum_param" do
154
- info = get_introspection_data "Regress", "test_enum_param"
155
- expect(lib).to receive(:attach_function)
156
- .with("regress_test_enum_param", [Regress::TestEnum], :pointer)
157
- .and_return true
158
- GirFFI::Builder.attach_ffi_function(lib, info)
159
- end
160
-
161
- it "does not attach the function if it is already defined" do
162
- info = get_introspection_data "Regress", "test_array_gint32_in"
163
- allow(lib).to receive(:method_defined?).and_return true
164
- expect(lib).not_to receive(:attach_function)
165
- GirFFI::Builder.attach_ffi_function(lib, info)
166
- end
167
- end
168
-
169
- #
170
- # NOTE: Legacy tests below.
171
- #
172
-
173
- describe "looking at Regress.test_callback_destroy_notify" do
174
- before do
175
- save_module :GObject
176
- save_module :Regress
177
- GirFFI::Builder.build_module "GObject"
178
- GirFFI::Builder.build_module "Regress"
179
- @go = get_introspection_data "Regress", "test_callback_destroy_notify"
180
- end
181
-
182
- it "defines ffi callback types :Callback and :ClosureNotify" do
183
- Regress.setup_method! "test_callback_destroy_notify"
184
- tcud = Regress::Lib.find_type :TestCallbackUserData
185
- dn = GLib::Lib.find_type :DestroyNotify
186
-
187
- assert_equal FFI.find_type(:int32), tcud.result_type
188
- assert_equal FFI.find_type(:void), dn.result_type
189
- assert_equal [FFI.find_type(:pointer)], tcud.param_types
190
- assert_equal [FFI.find_type(:pointer)], dn.param_types
191
- end
192
-
193
- after do
194
- restore_module :Regress
195
- restore_module :GObject
196
- end
197
- end
198
-
199
- describe "building Regress::TestBoxed" do
200
- before do
201
- GirFFI::Builder.build_class get_introspection_data("Regress", "TestBoxed")
202
- end
203
-
204
- it "sets up #wrap" do
205
- assert Regress::TestBoxed.respond_to? "wrap"
206
- end
207
-
208
- it "sets up #allocate" do
209
- assert Regress::TestBoxed.respond_to? "allocate"
210
- end
211
- end
212
-
213
- describe "built Regress module" do
214
- before do
215
- save_module :Regress
216
- GirFFI::Builder.build_module "Regress"
217
- end
218
-
219
- it "autocreates singleton methods" do
220
- refute_defines_singleton_method Regress, :test_uint
221
- Regress.test_uint 31
222
- assert_defines_singleton_method Regress, :test_uint
223
- end
224
-
225
- it "autocreates the TestObj class on first access" do
226
- assert !Regress.const_defined?(:TestObj)
227
- _(Regress::TestObj).must_be_instance_of Class
228
- assert Regress.const_defined? :TestObj
229
- end
230
-
231
- it "knows its own module builder" do
232
- _(Regress.gir_ffi_builder).must_be_instance_of GirFFI::Builders::ModuleBuilder
233
- end
234
-
235
- after do
236
- restore_module :Regress
237
- end
238
- end
239
-
240
- describe "having built Regress::TestObj" do
241
- before do
242
- GirFFI::Builder.build_class get_introspection_data("Regress", "TestObj")
243
- end
244
-
245
- it "C functions for called instance methods get attached to Regress::Lib" do
246
- o = Regress::TestObj.new_from_file("foo")
247
- o.instance_method
248
- _(Regress::Lib).must_respond_to :regress_test_obj_instance_method
249
- end
250
-
251
- it "the built class knows its own GIR info" do
252
- _(Regress::TestObj.gir_info.name).must_equal "TestObj"
253
- end
254
-
255
- it "the built class knows its own class builder" do
256
- _(Regress::TestObj.gir_ffi_builder).must_be_instance_of GirFFI::Builders::ObjectBuilder
257
- end
258
- end
259
-
260
- describe "built Regress::TestSubObj" do
261
- it "inherits #set_bare from its superclass" do
262
- o1 = Regress::TestSubObj.new
263
- o1.set_bare(nil)
264
- pass
265
- end
266
-
267
- it "overrides #instance_method" do
268
- obj = Regress::TestObj.new_from_file("foo")
269
- subobj = Regress::TestSubObj.new
270
-
271
- _(obj.instance_method).must_equal(-1)
272
- _(subobj.instance_method).must_equal 0
273
- end
274
- end
275
-
276
- describe "building Regress::TestSubObj" do
277
- before do
278
- save_module :Regress
279
- GirFFI::Builder.build_class get_introspection_data("Regress", "TestSubObj")
280
- end
281
-
282
- it "sets up the Regress namespace" do
283
- assert Regress.const_defined? :Lib
284
- assert Regress.respond_to? :gir_ffi_builder
285
- assert Regress.const_defined? :GIR_FFI_BUILDER
286
- end
287
-
288
- it "creates the Regress::Lib module ready to attach functions from the shared library" do
289
- expected = [gir.shared_library("Regress")]
290
- assert_equal expected, Regress::Lib.ffi_libraries.map(&:name)
291
- end
292
-
293
- it "builds parent classes also" do
294
- assert Regress.const_defined? :TestObj
295
- assert Object.const_defined? :GObject
296
- assert GObject.const_defined? :Object
297
- end
298
-
299
- it "sets up the inheritance chain" do
300
- # Introduced in version 1.59.1
301
- expected = if Regress::TestSubObj.find_property :boolean
302
- [Regress::TestSubObj,
303
- Regress::TestInterface,
304
- Regress::TestObj,
305
- GObject::Object]
306
- else
307
- [Regress::TestSubObj,
308
- Regress::TestObj,
309
- GObject::Object]
310
- end
311
- _(Regress::TestSubObj.registered_ancestors).must_equal expected
312
- end
313
-
314
- it "creates a Regress::TestSubObj#to_ptr method" do
315
- assert Regress::TestSubObj.public_method_defined? :to_ptr
316
- end
317
-
318
- after do
319
- restore_module :Regress
320
- end
321
- end
322
- end