gir_ffi 0.14.1 → 0.15.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +56 -0
  3. data/README.md +12 -12
  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 +26 -21
  8. data/lib/ffi-glib/array.rb +14 -4
  9. data/lib/ffi-glib/byte_array.rb +9 -3
  10. data/lib/ffi-glib/container_class_methods.rb +1 -1
  11. data/lib/ffi-glib/destroy_notify.rb +2 -2
  12. data/lib/ffi-glib/error.rb +1 -1
  13. data/lib/ffi-glib/hash_table.rb +4 -5
  14. data/lib/ffi-glib/list.rb +12 -6
  15. data/lib/ffi-glib/list_methods.rb +13 -1
  16. data/lib/ffi-glib/main_loop.rb +3 -3
  17. data/lib/ffi-glib/ptr_array.rb +30 -8
  18. data/lib/ffi-glib/s_list.rb +11 -5
  19. data/lib/ffi-glib/variant.rb +1 -1
  20. data/lib/ffi-gobject.rb +13 -16
  21. data/lib/ffi-gobject/object.rb +82 -87
  22. data/lib/ffi-gobject/object_class.rb +1 -1
  23. data/lib/ffi-gobject/param_spec.rb +1 -1
  24. data/lib/ffi-gobject/ruby_closure.rb +2 -2
  25. data/lib/ffi-gobject/value.rb +136 -126
  26. data/lib/ffi-gobject_introspection.rb +20 -20
  27. data/lib/ffi-gobject_introspection/gobject_type_init.rb +2 -2
  28. data/lib/ffi-gobject_introspection/i_arg_info.rb +2 -2
  29. data/lib/ffi-gobject_introspection/i_base_info.rb +34 -23
  30. data/lib/ffi-gobject_introspection/i_callable_info.rb +4 -4
  31. data/lib/ffi-gobject_introspection/i_constant_info.rb +2 -2
  32. data/lib/ffi-gobject_introspection/i_enum_info.rb +1 -0
  33. data/lib/ffi-gobject_introspection/i_field_info.rb +1 -1
  34. data/lib/ffi-gobject_introspection/i_function_info.rb +1 -1
  35. data/lib/ffi-gobject_introspection/i_interface_info.rb +1 -1
  36. data/lib/ffi-gobject_introspection/i_object_info.rb +2 -2
  37. data/lib/ffi-gobject_introspection/i_property_info.rb +2 -2
  38. data/lib/ffi-gobject_introspection/i_repository.rb +9 -6
  39. data/lib/ffi-gobject_introspection/i_struct_info.rb +2 -1
  40. data/lib/ffi-gobject_introspection/i_type_info.rb +13 -7
  41. data/lib/ffi-gobject_introspection/i_unresolved_info.rb +1 -1
  42. data/lib/ffi-gobject_introspection/i_vfunc_info.rb +1 -1
  43. data/lib/ffi-gobject_introspection/lib.rb +30 -19
  44. data/lib/ffi-gobject_introspection/strv.rb +1 -1
  45. data/lib/gir_ffi-base.rb +1 -1
  46. data/lib/gir_ffi-base/gobject.rb +26 -25
  47. data/lib/gir_ffi-base/gobject/lib.rb +7 -2
  48. data/lib/gir_ffi.rb +3 -3
  49. data/lib/gir_ffi/allocation_helper.rb +1 -1
  50. data/lib/gir_ffi/arg_helper.rb +4 -4
  51. data/lib/gir_ffi/{in_out_pointer.rb → array_element_convertor.rb} +16 -24
  52. data/lib/gir_ffi/boolean.rb +1 -1
  53. data/lib/gir_ffi/boxed_base.rb +2 -6
  54. data/lib/gir_ffi/builder.rb +19 -11
  55. data/lib/gir_ffi/builder_helper.rb +10 -2
  56. data/lib/gir_ffi/builders/argument_builder.rb +19 -19
  57. data/lib/gir_ffi/builders/argument_builder_collection.rb +2 -2
  58. data/lib/gir_ffi/builders/base_argument_builder.rb +2 -1
  59. data/lib/gir_ffi/builders/base_method_builder.rb +8 -8
  60. data/lib/gir_ffi/builders/base_return_value_builder.rb +1 -1
  61. data/lib/gir_ffi/builders/base_type_builder.rb +2 -2
  62. data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +5 -5
  63. data/lib/gir_ffi/builders/callback_argument_builder.rb +10 -8
  64. data/lib/gir_ffi/builders/callback_builder.rb +28 -14
  65. data/lib/gir_ffi/builders/callback_return_value_builder.rb +6 -8
  66. data/lib/gir_ffi/builders/class_struct_builder.rb +24 -0
  67. data/lib/gir_ffi/builders/closure_argument_builder.rb +1 -1
  68. data/lib/gir_ffi/builders/closure_return_value_builder.rb +1 -1
  69. data/lib/gir_ffi/builders/constant_builder.rb +1 -1
  70. data/lib/gir_ffi/builders/constructor_builder.rb +9 -9
  71. data/lib/gir_ffi/builders/enum_builder.rb +11 -7
  72. data/lib/gir_ffi/builders/field_builder.rb +20 -18
  73. data/lib/gir_ffi/builders/flags_builder.rb +2 -2
  74. data/lib/gir_ffi/builders/full_c_to_ruby_convertor.rb +1 -1
  75. data/lib/gir_ffi/builders/function_builder.rb +11 -5
  76. data/lib/gir_ffi/builders/initializer_builder.rb +3 -3
  77. data/lib/gir_ffi/builders/initializer_return_value_builder.rb +2 -2
  78. data/lib/gir_ffi/builders/interface_builder.rb +5 -3
  79. data/lib/gir_ffi/builders/mapping_method_builder.rb +10 -10
  80. data/lib/gir_ffi/builders/marshalling_method_builder.rb +12 -9
  81. data/lib/gir_ffi/builders/method_template.rb +5 -5
  82. data/lib/gir_ffi/builders/module_builder.rb +7 -7
  83. data/lib/gir_ffi/builders/null_argument_builder.rb +0 -2
  84. data/lib/gir_ffi/builders/null_return_value_builder.rb +0 -2
  85. data/lib/gir_ffi/builders/object_builder.rb +22 -12
  86. data/lib/gir_ffi/builders/property_argument_builder.rb +1 -1
  87. data/lib/gir_ffi/builders/property_builder.rb +14 -14
  88. data/lib/gir_ffi/builders/property_return_value_builder.rb +1 -1
  89. data/lib/gir_ffi/builders/registered_type_builder.rb +14 -5
  90. data/lib/gir_ffi/builders/return_value_builder.rb +4 -4
  91. data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +6 -6
  92. data/lib/gir_ffi/builders/signal_closure_builder.rb +5 -7
  93. data/lib/gir_ffi/builders/struct_builder.rb +8 -6
  94. data/lib/gir_ffi/builders/struct_like.rb +1 -1
  95. data/lib/gir_ffi/builders/type_builder.rb +12 -12
  96. data/lib/gir_ffi/builders/unintrospectable_boxed_builder.rb +2 -2
  97. data/lib/gir_ffi/builders/unintrospectable_builder.rb +2 -2
  98. data/lib/gir_ffi/builders/union_builder.rb +4 -4
  99. data/lib/gir_ffi/builders/user_defined_builder.rb +10 -3
  100. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +2 -2
  101. data/lib/gir_ffi/builders/vfunc_builder.rb +8 -8
  102. data/lib/gir_ffi/builders/with_layout.rb +2 -2
  103. data/lib/gir_ffi/callback_base.rb +7 -9
  104. data/lib/gir_ffi/class_base.rb +6 -5
  105. data/lib/gir_ffi/core.rb +36 -22
  106. data/lib/gir_ffi/enum_base.rb +1 -1
  107. data/lib/gir_ffi/enum_like_base.rb +2 -2
  108. data/lib/gir_ffi/error_argument_info.rb +2 -2
  109. data/lib/gir_ffi/error_type_info.rb +1 -1
  110. data/lib/gir_ffi/ffi_ext.rb +1 -1
  111. data/lib/gir_ffi/ffi_ext/pointer.rb +1 -1
  112. data/lib/gir_ffi/flags_base.rb +1 -1
  113. data/lib/gir_ffi/glib_error.rb +1 -2
  114. data/lib/gir_ffi/in_pointer.rb +17 -0
  115. data/lib/gir_ffi/info_ext.rb +15 -15
  116. data/lib/gir_ffi/info_ext/full_type_name.rb +3 -3
  117. data/lib/gir_ffi/info_ext/i_arg_info.rb +1 -1
  118. data/lib/gir_ffi/info_ext/i_callable_info.rb +1 -1
  119. data/lib/gir_ffi/info_ext/i_callback_info.rb +1 -1
  120. data/lib/gir_ffi/info_ext/i_field_info.rb +1 -1
  121. data/lib/gir_ffi/info_ext/i_function_info.rb +1 -1
  122. data/lib/gir_ffi/info_ext/i_property_info.rb +2 -2
  123. data/lib/gir_ffi/info_ext/i_registered_type_info.rb +4 -5
  124. data/lib/gir_ffi/info_ext/i_signal_info.rb +7 -3
  125. data/lib/gir_ffi/info_ext/i_type_info.rb +48 -26
  126. data/lib/gir_ffi/info_ext/i_unresolved_info.rb +1 -1
  127. data/lib/gir_ffi/info_ext/i_value_info.rb +2 -2
  128. data/lib/gir_ffi/info_ext/i_vfunc_info.rb +2 -2
  129. data/lib/gir_ffi/info_ext/safe_constant_name.rb +8 -8
  130. data/lib/gir_ffi/info_ext/safe_function_name.rb +2 -2
  131. data/lib/gir_ffi/interface_base.rb +3 -3
  132. data/lib/gir_ffi/lib_c.rb +1 -1
  133. data/lib/gir_ffi/method_stubber.rb +1 -1
  134. data/lib/gir_ffi/module_base.rb +1 -1
  135. data/lib/gir_ffi/object_base.rb +30 -4
  136. data/lib/gir_ffi/receiver_argument_info.rb +1 -1
  137. data/lib/gir_ffi/receiver_type_info.rb +2 -2
  138. data/lib/gir_ffi/registered_type_base.rb +1 -1
  139. data/lib/gir_ffi/return_value_info.rb +1 -2
  140. data/lib/gir_ffi/sized_array.rb +4 -2
  141. data/lib/gir_ffi/struct.rb +1 -1
  142. data/lib/gir_ffi/struct_base.rb +2 -10
  143. data/lib/gir_ffi/struct_like_base.rb +9 -5
  144. data/lib/gir_ffi/type_map.rb +2 -23
  145. data/lib/gir_ffi/unintrospectable_boxed_info.rb +2 -2
  146. data/lib/gir_ffi/unintrospectable_type_info.rb +6 -2
  147. data/lib/gir_ffi/union.rb +1 -1
  148. data/lib/gir_ffi/union_base.rb +2 -10
  149. data/lib/gir_ffi/user_defined_object_info.rb +9 -4
  150. data/lib/gir_ffi/user_defined_property_info.rb +33 -33
  151. data/lib/gir_ffi/version.rb +1 -1
  152. data/lib/gir_ffi/vfunc_implementation.rb +1 -0
  153. metadata +102 -155
  154. data/Gemfile +0 -12
  155. data/Rakefile +0 -9
  156. data/lib/ffi-glib/array_methods.rb +0 -16
  157. data/tasks/test.rake +0 -203
  158. data/test/base_test_helper.rb +0 -63
  159. data/test/ffi-glib/array_test.rb +0 -188
  160. data/test/ffi-glib/byte_array_test.rb +0 -22
  161. data/test/ffi-glib/bytes_test.rb +0 -56
  162. data/test/ffi-glib/closure_test.rb +0 -38
  163. data/test/ffi-glib/destroy_notify_test.rb +0 -18
  164. data/test/ffi-glib/hash_table_test.rb +0 -68
  165. data/test/ffi-glib/list_test.rb +0 -86
  166. data/test/ffi-glib/main_loop_test.rb +0 -53
  167. data/test/ffi-glib/ptr_array_test.rb +0 -112
  168. data/test/ffi-glib/ruby_closure_test.rb +0 -62
  169. data/test/ffi-glib/s_list_test.rb +0 -76
  170. data/test/ffi-glib/strv_test.rb +0 -60
  171. data/test/ffi-glib/variant_test.rb +0 -12
  172. data/test/ffi-gobject/gobject_test.rb +0 -72
  173. data/test/ffi-gobject/object_class_test.rb +0 -31
  174. data/test/ffi-gobject/object_test.rb +0 -140
  175. data/test/ffi-gobject/param_spec_test.rb +0 -32
  176. data/test/ffi-gobject/value_test.rb +0 -370
  177. data/test/ffi-gobject_introspection/gobject_type_init_test.rb +0 -26
  178. data/test/ffi-gobject_introspection/i_base_info_test.rb +0 -53
  179. data/test/ffi-gobject_introspection/i_constant_info_test.rb +0 -33
  180. data/test/ffi-gobject_introspection/i_enum_info_test.rb +0 -18
  181. data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -6
  182. data/test/ffi-gobject_introspection/i_interface_info_test.rb +0 -23
  183. data/test/ffi-gobject_introspection/i_object_info_test.rb +0 -49
  184. data/test/ffi-gobject_introspection/i_property_info_test.rb +0 -47
  185. data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +0 -27
  186. data/test/ffi-gobject_introspection/i_repository_test.rb +0 -81
  187. data/test/ffi-gobject_introspection/i_struct_info_test.rb +0 -23
  188. data/test/ffi-gobject_introspection/i_type_info_test.rb +0 -33
  189. data/test/ffi-gobject_introspection/i_union_info_test.rb +0 -17
  190. data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +0 -41
  191. data/test/ffi-gobject_introspection/lib_test.rb +0 -13
  192. data/test/ffi-gobject_introspection/strv_test.rb +0 -46
  193. data/test/ffi-gobject_test.rb +0 -151
  194. data/test/gir_ffi/allocation_helper_test.rb +0 -36
  195. data/test/gir_ffi/arg_helper_test.rb +0 -140
  196. data/test/gir_ffi/boolean_test.rb +0 -43
  197. data/test/gir_ffi/boxed_base_test.rb +0 -65
  198. data/test/gir_ffi/builder_test.rb +0 -300
  199. data/test/gir_ffi/builders/argument_builder_test.rb +0 -657
  200. data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -6
  201. data/test/gir_ffi/builders/callback_argument_builder_test.rb +0 -129
  202. data/test/gir_ffi/builders/callback_builder_test.rb +0 -118
  203. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +0 -85
  204. data/test/gir_ffi/builders/constant_builder_test.rb +0 -6
  205. data/test/gir_ffi/builders/constructor_builder_test.rb +0 -37
  206. data/test/gir_ffi/builders/enum_builder_test.rb +0 -23
  207. data/test/gir_ffi/builders/field_builder_test.rb +0 -134
  208. data/test/gir_ffi/builders/function_builder_test.rb +0 -538
  209. data/test/gir_ffi/builders/initializer_builder_test.rb +0 -54
  210. data/test/gir_ffi/builders/interface_builder_test.rb +0 -32
  211. data/test/gir_ffi/builders/module_builder_test.rb +0 -43
  212. data/test/gir_ffi/builders/object_builder_test.rb +0 -98
  213. data/test/gir_ffi/builders/property_builder_test.rb +0 -161
  214. data/test/gir_ffi/builders/registered_type_builder_test.rb +0 -30
  215. data/test/gir_ffi/builders/return_value_builder_test.rb +0 -440
  216. data/test/gir_ffi/builders/signal_closure_builder_test.rb +0 -188
  217. data/test/gir_ffi/builders/struct_builder_test.rb +0 -93
  218. data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +0 -35
  219. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +0 -73
  220. data/test/gir_ffi/builders/union_builder_test.rb +0 -31
  221. data/test/gir_ffi/builders/user_defined_builder_test.rb +0 -524
  222. data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +0 -101
  223. data/test/gir_ffi/builders/vfunc_builder_test.rb +0 -253
  224. data/test/gir_ffi/callback_base_test.rb +0 -22
  225. data/test/gir_ffi/class_base_test.rb +0 -168
  226. data/test/gir_ffi/core_test.rb +0 -98
  227. data/test/gir_ffi/enum_base_test.rb +0 -43
  228. data/test/gir_ffi/error_type_info_test.rb +0 -50
  229. data/test/gir_ffi/ffi_ext/pointer_test.rb +0 -20
  230. data/test/gir_ffi/g_type_test.rb +0 -31
  231. data/test/gir_ffi/in_out_pointer_test.rb +0 -56
  232. data/test/gir_ffi/in_pointer_test.rb +0 -183
  233. data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -26
  234. data/test/gir_ffi/info_ext/i_callback_info_test.rb +0 -21
  235. data/test/gir_ffi/info_ext/i_field_info_test.rb +0 -37
  236. data/test/gir_ffi/info_ext/i_function_info_test.rb +0 -74
  237. data/test/gir_ffi/info_ext/i_signal_info_test.rb +0 -32
  238. data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -697
  239. data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +0 -19
  240. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +0 -26
  241. data/test/gir_ffi/info_ext/safe_function_name_test.rb +0 -26
  242. data/test/gir_ffi/interface_base_test.rb +0 -20
  243. data/test/gir_ffi/method_stubber_test.rb +0 -65
  244. data/test/gir_ffi/object_base_test.rb +0 -64
  245. data/test/gir_ffi/object_store_test.rb +0 -41
  246. data/test/gir_ffi/receiver_argument_info_test.rb +0 -33
  247. data/test/gir_ffi/sized_array_test.rb +0 -206
  248. data/test/gir_ffi/struct_base_test.rb +0 -23
  249. data/test/gir_ffi/struct_like_base_test.rb +0 -167
  250. data/test/gir_ffi/type_map_test.rb +0 -17
  251. data/test/gir_ffi/unintrospectable_type_info_test.rb +0 -121
  252. data/test/gir_ffi/union_base_test.rb +0 -23
  253. data/test/gir_ffi/user_defined_object_info_test.rb +0 -119
  254. data/test/gir_ffi/user_defined_property_info_test.rb +0 -39
  255. data/test/gir_ffi/variable_name_generator_test.rb +0 -18
  256. data/test/gir_ffi/version_test.rb +0 -9
  257. data/test/gir_ffi/zero_terminated_test.rb +0 -108
  258. data/test/gir_ffi_test_helper.rb +0 -84
  259. data/test/integration/callback_exceptions_test.rb +0 -63
  260. data/test/integration/derived_classes_test.rb +0 -53
  261. data/test/integration/generated_everything_test.rb +0 -452
  262. data/test/integration/generated_gimarshallingtests_test.rb +0 -2995
  263. data/test/integration/generated_gio_test.rb +0 -116
  264. data/test/integration/generated_glib_test.rb +0 -12
  265. data/test/integration/generated_gobject_test.rb +0 -116
  266. data/test/integration/generated_gst_test.rb +0 -34
  267. data/test/integration/generated_gtk_source_test.rb +0 -27
  268. data/test/integration/generated_gtop_test.rb +0 -29
  269. data/test/integration/generated_pango_ft2_test.rb +0 -17
  270. data/test/integration/generated_pango_test.rb +0 -24
  271. data/test/integration/generated_regress_test.rb +0 -3850
  272. data/test/integration/generated_secret_test.rb +0 -17
  273. data/test/integration/generated_utility_test.rb +0 -174
  274. data/test/integration/generated_warnlib_test.rb +0 -49
  275. data/test/integration/method_lookup_test.rb +0 -34
  276. data/test/introspection_test_helper.rb +0 -52
  277. data/test/lib/Makefile.am +0 -110
  278. data/test/lib/autogen.sh +0 -4
  279. data/test/lib/configure.ac +0 -34
  280. data/test/lib/m4/jhflags.m4 +0 -21
  281. 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,140 +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 = lambda do
121
- GirFFI::ArgHelper.check_fixed_array_size(3, [1, 2], 'foo')
122
- end.must_raise ArgumentError
123
- result.message.must_equal 'foo should have size 3'
124
- end
125
- end
126
-
127
- describe '.check_error' do
128
- it 'does nothing if there is no error' do
129
- err_ptr = double('err_ptr', read_pointer: nil)
130
- GirFFI::ArgHelper.check_error err_ptr
131
- pass
132
- end
133
-
134
- it 'raises an exception if there is an error' do
135
- err = GLib::Error.new
136
- err_ptr = double('err_ptr', read_pointer: err.to_ptr)
137
- -> { GirFFI::ArgHelper.check_error err_ptr }.must_raise GirFFI::GLibError
138
- end
139
- end
140
- 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,300 +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 a valid class for boxed classes unknown to GIR' do
82
- object_class = GIMarshallingTests::PropertiesObject.object_class
83
- property = object_class.find_property 'some-boxed-glist'
84
- gtype = property.value_type
85
-
86
- gtype.wont_equal GObject::TYPE_NONE
87
-
88
- found_klass = GirFFI::Builder.build_by_gtype gtype
89
- found_klass.name.must_be_nil
90
- found_klass.superclass.must_equal GirFFI::BoxedBase
91
- end
92
- end
93
-
94
- describe '.attach_ffi_function' do
95
- let(:lib) { Module.new }
96
-
97
- it 'calls attach_function with the correct types for Regress.test_callback_destroy_notify' do
98
- function_info = get_introspection_data 'Regress', 'test_callback_destroy_notify'
99
-
100
- expect(lib).
101
- to receive(:attach_function).
102
- with('regress_test_callback_destroy_notify',
103
- [Regress::TestCallbackUserData, :pointer, GLib::DestroyNotify],
104
- :int32).
105
- and_return true
106
-
107
- GirFFI::Builder.attach_ffi_function(lib, function_info)
108
- end
109
-
110
- it 'calls attach_function with the correct types for Regress::TestObj#torture_signature_0' do
111
- info = get_method_introspection_data 'Regress', 'TestObj', 'torture_signature_0'
112
-
113
- expect(lib).
114
- to receive(:attach_function).
115
- with('regress_test_obj_torture_signature_0',
116
- [:pointer, :int32, :pointer, :pointer, :pointer, :pointer, :uint32],
117
- :void).
118
- and_return true
119
-
120
- GirFFI::Builder.attach_ffi_function(lib, info)
121
- end
122
-
123
- it 'calls attach_function with the correct types for Regress::TestObj#instance_method' do
124
- info = get_method_introspection_data 'Regress', 'TestObj', 'instance_method'
125
- expect(lib).to receive(:attach_function).
126
- with('regress_test_obj_instance_method', [:pointer], :int32).
127
- and_return true
128
- GirFFI::Builder.attach_ffi_function(lib, info)
129
- end
130
-
131
- it 'calls attach_function with the correct types for Regress.test_array_gint32_in' do
132
- info = get_introspection_data 'Regress', 'test_array_gint32_in'
133
- expect(lib).to receive(:attach_function).
134
- with('regress_test_array_gint32_in', [:int32, :pointer], :int32).
135
- and_return true
136
- GirFFI::Builder.attach_ffi_function(lib, info)
137
- end
138
-
139
- it 'calls attach_function with the correct types for Regress.test_enum_param' do
140
- info = get_introspection_data 'Regress', 'test_enum_param'
141
- expect(lib).to receive(:attach_function).
142
- with('regress_test_enum_param', [Regress::TestEnum], :pointer).
143
- and_return true
144
- GirFFI::Builder.attach_ffi_function(lib, info)
145
- end
146
-
147
- it 'does not attach the function if it is already defined' do
148
- info = get_introspection_data 'Regress', 'test_array_gint32_in'
149
- allow(lib).to receive(:method_defined?).and_return true
150
- expect(lib).not_to receive(:attach_function)
151
- GirFFI::Builder.attach_ffi_function(lib, info)
152
- end
153
- end
154
-
155
- #
156
- # NOTE: Legacy tests below.
157
- #
158
-
159
- describe 'looking at Regress.test_callback_destroy_notify' do
160
- before do
161
- save_module :GObject
162
- save_module :Regress
163
- GirFFI::Builder.build_module 'GObject'
164
- GirFFI::Builder.build_module 'Regress'
165
- @go = get_introspection_data 'Regress', 'test_callback_destroy_notify'
166
- end
167
-
168
- it 'defines ffi callback types :Callback and :ClosureNotify' do
169
- Regress.setup_method! 'test_callback_destroy_notify'
170
- tcud = Regress::Lib.find_type :TestCallbackUserData
171
- dn = GLib::Lib.find_type :DestroyNotify
172
-
173
- assert_equal FFI.find_type(:int32), tcud.result_type
174
- assert_equal FFI.find_type(:void), dn.result_type
175
- assert_equal [FFI.find_type(:pointer)], tcud.param_types
176
- assert_equal [FFI.find_type(:pointer)], dn.param_types
177
- end
178
-
179
- after do
180
- restore_module :Regress
181
- restore_module :GObject
182
- end
183
- end
184
-
185
- describe 'building Regress::TestBoxed' do
186
- before do
187
- GirFFI::Builder.build_class get_introspection_data('Regress', 'TestBoxed')
188
- end
189
-
190
- it 'sets up #wrap' do
191
- assert Regress::TestBoxed.respond_to? 'wrap'
192
- end
193
-
194
- it 'sets up #allocate' do
195
- assert Regress::TestBoxed.respond_to? 'allocate'
196
- end
197
- end
198
-
199
- describe 'built Regress module' do
200
- before do
201
- save_module :Regress
202
- GirFFI::Builder.build_module 'Regress'
203
- end
204
-
205
- it 'autocreates singleton methods' do
206
- refute_defines_singleton_method Regress, :test_uint
207
- Regress.test_uint 31
208
- assert_defines_singleton_method Regress, :test_uint
209
- end
210
-
211
- it 'autocreates the TestObj class on first access' do
212
- assert !Regress.const_defined?(:TestObj)
213
- Regress::TestObj.must_be_instance_of Class
214
- assert Regress.const_defined? :TestObj
215
- end
216
-
217
- it 'knows its own module builder' do
218
- Regress.gir_ffi_builder.must_be_instance_of GirFFI::Builders::ModuleBuilder
219
- end
220
-
221
- after do
222
- restore_module :Regress
223
- end
224
- end
225
-
226
- describe 'having built Regress::TestObj' do
227
- before do
228
- GirFFI::Builder.build_class get_introspection_data('Regress', 'TestObj')
229
- end
230
-
231
- it 'C functions for called instance methods get attached to Regress::Lib' do
232
- o = Regress::TestObj.new_from_file('foo')
233
- o.instance_method
234
- Regress::Lib.must_respond_to :regress_test_obj_instance_method
235
- end
236
-
237
- it 'the built class knows its own GIR info' do
238
- Regress::TestObj.gir_info.name.must_equal 'TestObj'
239
- end
240
-
241
- it 'the built class knows its own class builder' do
242
- Regress::TestObj.gir_ffi_builder.must_be_instance_of GirFFI::Builders::ObjectBuilder
243
- end
244
- end
245
-
246
- describe 'built Regress::TestSubObj' do
247
- it 'inherits #set_bare from its superclass' do
248
- o1 = Regress::TestSubObj.new
249
- o1.set_bare(nil)
250
- pass
251
- end
252
-
253
- it 'overrides #instance_method' do
254
- obj = Regress::TestObj.new_from_file('foo')
255
- subobj = Regress::TestSubObj.new
256
-
257
- obj.instance_method.must_equal(-1)
258
- subobj.instance_method.must_equal 0
259
- end
260
- end
261
-
262
- describe 'building Regress::TestSubObj' do
263
- before do
264
- save_module :Regress
265
- GirFFI::Builder.build_class get_introspection_data('Regress', 'TestSubObj')
266
- end
267
-
268
- it 'sets up the Regress namespace' do
269
- assert Regress.const_defined? :Lib
270
- assert Regress.respond_to? :gir_ffi_builder
271
- assert Regress.const_defined? :GIR_FFI_BUILDER
272
- end
273
-
274
- it 'creates the Regress::Lib module ready to attach functions from the shared library' do
275
- expected = [gir.shared_library('Regress')]
276
- assert_equal expected, Regress::Lib.ffi_libraries.map(&:name)
277
- end
278
-
279
- it 'builds parent classes also' do
280
- assert Regress.const_defined? :TestObj
281
- assert Object.const_defined? :GObject
282
- assert GObject.const_defined? :Object
283
- end
284
-
285
- it 'sets up the inheritance chain' do
286
- Regress::TestSubObj.registered_ancestors.
287
- must_equal [Regress::TestSubObj,
288
- Regress::TestObj,
289
- GObject::Object]
290
- end
291
-
292
- it 'creates a Regress::TestSubObj#to_ptr method' do
293
- assert Regress::TestSubObj.public_method_defined? :to_ptr
294
- end
295
-
296
- after do
297
- restore_module :Regress
298
- end
299
- end
300
- end