gir_ffi 0.15.3 → 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 (183) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +15 -0
  3. data/README.md +5 -6
  4. data/TODO.md +14 -35
  5. data/docs/Documentation.md +6 -0
  6. data/docs/Subclassing.md +38 -0
  7. data/lib/ffi-glib.rb +8 -3
  8. data/lib/ffi-glib/byte_array.rb +2 -1
  9. data/lib/ffi-glib/destroy_notify.rb +2 -2
  10. data/lib/ffi-glib/hash_table.rb +1 -2
  11. data/lib/ffi-glib/list.rb +11 -5
  12. data/lib/ffi-glib/list_methods.rb +12 -0
  13. data/lib/ffi-glib/s_list.rb +10 -4
  14. data/lib/ffi-gobject.rb +0 -3
  15. data/lib/ffi-gobject/object.rb +77 -73
  16. data/lib/ffi-gobject/object_class.rb +1 -1
  17. data/lib/ffi-gobject/value.rb +107 -108
  18. data/lib/ffi-gobject_introspection/i_base_info.rb +20 -19
  19. data/lib/gir_ffi-base/gobject/lib.rb +4 -0
  20. data/lib/gir_ffi/array_element_convertor.rb +1 -2
  21. data/lib/gir_ffi/boxed_base.rb +1 -5
  22. data/lib/gir_ffi/builder.rb +1 -1
  23. data/lib/gir_ffi/builder_helper.rb +7 -4
  24. data/lib/gir_ffi/builders/base_argument_builder.rb +2 -2
  25. data/lib/gir_ffi/builders/base_method_builder.rb +1 -1
  26. data/lib/gir_ffi/builders/base_type_builder.rb +1 -1
  27. data/lib/gir_ffi/builders/callback_argument_builder.rb +2 -0
  28. data/lib/gir_ffi/builders/callback_builder.rb +14 -12
  29. data/lib/gir_ffi/builders/callback_return_value_builder.rb +4 -6
  30. data/lib/gir_ffi/builders/class_struct_builder.rb +24 -0
  31. data/lib/gir_ffi/builders/enum_builder.rb +3 -3
  32. data/lib/gir_ffi/builders/interface_builder.rb +3 -1
  33. data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
  34. data/lib/gir_ffi/builders/marshalling_method_builder.rb +5 -2
  35. data/lib/gir_ffi/builders/method_template.rb +4 -4
  36. data/lib/gir_ffi/builders/null_argument_builder.rb +0 -2
  37. data/lib/gir_ffi/builders/null_return_value_builder.rb +0 -2
  38. data/lib/gir_ffi/builders/object_builder.rb +16 -6
  39. data/lib/gir_ffi/builders/property_builder.rb +1 -2
  40. data/lib/gir_ffi/builders/signal_closure_builder.rb +3 -5
  41. data/lib/gir_ffi/builders/struct_builder.rb +5 -5
  42. data/lib/gir_ffi/builders/user_defined_builder.rb +8 -1
  43. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +1 -1
  44. data/lib/gir_ffi/callback_base.rb +3 -3
  45. data/lib/gir_ffi/core.rb +17 -2
  46. data/lib/gir_ffi/glib_error.rb +1 -2
  47. data/lib/gir_ffi/in_pointer.rb +7 -0
  48. data/lib/gir_ffi/object_base.rb +27 -0
  49. data/lib/gir_ffi/return_value_info.rb +1 -2
  50. data/lib/gir_ffi/struct_base.rb +1 -9
  51. data/lib/gir_ffi/struct_like_base.rb +9 -5
  52. data/lib/gir_ffi/unintrospectable_type_info.rb +1 -1
  53. data/lib/gir_ffi/union_base.rb +1 -9
  54. data/lib/gir_ffi/user_defined_object_info.rb +3 -2
  55. data/lib/gir_ffi/version.rb +1 -1
  56. data/lib/gir_ffi/vfunc_implementation.rb +1 -0
  57. metadata +86 -136
  58. data/Gemfile +0 -14
  59. data/Rakefile +0 -9
  60. data/tasks/test.rake +0 -204
  61. data/test/base_test_helper.rb +0 -70
  62. data/test/ffi-glib/array_test.rb +0 -203
  63. data/test/ffi-glib/byte_array_test.rb +0 -28
  64. data/test/ffi-glib/bytes_test.rb +0 -61
  65. data/test/ffi-glib/closure_test.rb +0 -38
  66. data/test/ffi-glib/destroy_notify_test.rb +0 -18
  67. data/test/ffi-glib/hash_table_test.rb +0 -68
  68. data/test/ffi-glib/list_test.rb +0 -86
  69. data/test/ffi-glib/main_loop_test.rb +0 -53
  70. data/test/ffi-glib/ptr_array_test.rb +0 -112
  71. data/test/ffi-glib/ruby_closure_test.rb +0 -62
  72. data/test/ffi-glib/s_list_test.rb +0 -76
  73. data/test/ffi-glib/strv_test.rb +0 -60
  74. data/test/ffi-glib/variant_test.rb +0 -12
  75. data/test/ffi-gobject/gobject_test.rb +0 -76
  76. data/test/ffi-gobject/object_class_test.rb +0 -31
  77. data/test/ffi-gobject/object_test.rb +0 -123
  78. data/test/ffi-gobject/param_spec_test.rb +0 -32
  79. data/test/ffi-gobject/value_test.rb +0 -390
  80. data/test/ffi-gobject_introspection/gobject_type_init_test.rb +0 -26
  81. data/test/ffi-gobject_introspection/i_base_info_test.rb +0 -52
  82. data/test/ffi-gobject_introspection/i_constant_info_test.rb +0 -29
  83. data/test/ffi-gobject_introspection/i_enum_info_test.rb +0 -18
  84. data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -6
  85. data/test/ffi-gobject_introspection/i_interface_info_test.rb +0 -23
  86. data/test/ffi-gobject_introspection/i_object_info_test.rb +0 -49
  87. data/test/ffi-gobject_introspection/i_property_info_test.rb +0 -47
  88. data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +0 -27
  89. data/test/ffi-gobject_introspection/i_repository_test.rb +0 -81
  90. data/test/ffi-gobject_introspection/i_struct_info_test.rb +0 -23
  91. data/test/ffi-gobject_introspection/i_type_info_test.rb +0 -30
  92. data/test/ffi-gobject_introspection/i_union_info_test.rb +0 -17
  93. data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +0 -41
  94. data/test/ffi-gobject_introspection/lib_test.rb +0 -13
  95. data/test/ffi-gobject_introspection/strv_test.rb +0 -46
  96. data/test/ffi-gobject_test.rb +0 -153
  97. data/test/gir_ffi/allocation_helper_test.rb +0 -36
  98. data/test/gir_ffi/arg_helper_test.rb +0 -146
  99. data/test/gir_ffi/boolean_test.rb +0 -43
  100. data/test/gir_ffi/boxed_base_test.rb +0 -65
  101. data/test/gir_ffi/builder_test.rb +0 -168
  102. data/test/gir_ffi/builders/argument_builder_test.rb +0 -691
  103. data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -6
  104. data/test/gir_ffi/builders/callback_argument_builder_test.rb +0 -130
  105. data/test/gir_ffi/builders/callback_builder_test.rb +0 -117
  106. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +0 -84
  107. data/test/gir_ffi/builders/constant_builder_test.rb +0 -6
  108. data/test/gir_ffi/builders/constructor_builder_test.rb +0 -39
  109. data/test/gir_ffi/builders/enum_builder_test.rb +0 -23
  110. data/test/gir_ffi/builders/field_builder_test.rb +0 -140
  111. data/test/gir_ffi/builders/function_builder_test.rb +0 -570
  112. data/test/gir_ffi/builders/initializer_builder_test.rb +0 -56
  113. data/test/gir_ffi/builders/interface_builder_test.rb +0 -32
  114. data/test/gir_ffi/builders/module_builder_test.rb +0 -43
  115. data/test/gir_ffi/builders/object_builder_test.rb +0 -98
  116. data/test/gir_ffi/builders/property_builder_test.rb +0 -161
  117. data/test/gir_ffi/builders/registered_type_builder_test.rb +0 -54
  118. data/test/gir_ffi/builders/return_value_builder_test.rb +0 -444
  119. data/test/gir_ffi/builders/signal_closure_builder_test.rb +0 -199
  120. data/test/gir_ffi/builders/struct_builder_test.rb +0 -96
  121. data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +0 -29
  122. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +0 -84
  123. data/test/gir_ffi/builders/union_builder_test.rb +0 -28
  124. data/test/gir_ffi/builders/user_defined_builder_test.rb +0 -528
  125. data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +0 -107
  126. data/test/gir_ffi/builders/vfunc_builder_test.rb +0 -245
  127. data/test/gir_ffi/callback_base_test.rb +0 -22
  128. data/test/gir_ffi/class_base_test.rb +0 -171
  129. data/test/gir_ffi/core_test.rb +0 -99
  130. data/test/gir_ffi/enum_base_test.rb +0 -43
  131. data/test/gir_ffi/error_type_info_test.rb +0 -50
  132. data/test/gir_ffi/ffi_ext/pointer_test.rb +0 -22
  133. data/test/gir_ffi/g_type_test.rb +0 -31
  134. data/test/gir_ffi/in_pointer_test.rb +0 -203
  135. data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -26
  136. data/test/gir_ffi/info_ext/i_callback_info_test.rb +0 -22
  137. data/test/gir_ffi/info_ext/i_field_info_test.rb +0 -37
  138. data/test/gir_ffi/info_ext/i_function_info_test.rb +0 -74
  139. data/test/gir_ffi/info_ext/i_signal_info_test.rb +0 -32
  140. data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -712
  141. data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +0 -19
  142. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +0 -26
  143. data/test/gir_ffi/info_ext/safe_function_name_test.rb +0 -26
  144. data/test/gir_ffi/interface_base_test.rb +0 -20
  145. data/test/gir_ffi/method_stubber_test.rb +0 -67
  146. data/test/gir_ffi/object_base_test.rb +0 -64
  147. data/test/gir_ffi/object_store_test.rb +0 -41
  148. data/test/gir_ffi/receiver_argument_info_test.rb +0 -33
  149. data/test/gir_ffi/sized_array_test.rb +0 -206
  150. data/test/gir_ffi/struct_base_test.rb +0 -23
  151. data/test/gir_ffi/struct_like_base_test.rb +0 -167
  152. data/test/gir_ffi/type_map_test.rb +0 -17
  153. data/test/gir_ffi/unintrospectable_type_info_test.rb +0 -121
  154. data/test/gir_ffi/union_base_test.rb +0 -23
  155. data/test/gir_ffi/user_defined_object_info_test.rb +0 -119
  156. data/test/gir_ffi/user_defined_property_info_test.rb +0 -39
  157. data/test/gir_ffi/variable_name_generator_test.rb +0 -18
  158. data/test/gir_ffi/version_test.rb +0 -9
  159. data/test/gir_ffi/zero_terminated_test.rb +0 -108
  160. data/test/gir_ffi_test_helper.rb +0 -84
  161. data/test/integration/callback_exceptions_test.rb +0 -59
  162. data/test/integration/derived_classes_test.rb +0 -54
  163. data/test/integration/generated_everything_test.rb +0 -453
  164. data/test/integration/generated_gimarshallingtests_test.rb +0 -3109
  165. data/test/integration/generated_gio_test.rb +0 -116
  166. data/test/integration/generated_glib_test.rb +0 -10
  167. data/test/integration/generated_gobject_test.rb +0 -124
  168. data/test/integration/generated_gst_test.rb +0 -38
  169. data/test/integration/generated_gtk_source_test.rb +0 -21
  170. data/test/integration/generated_gtop_test.rb +0 -22
  171. data/test/integration/generated_pango_ft2_test.rb +0 -17
  172. data/test/integration/generated_pango_test.rb +0 -24
  173. data/test/integration/generated_regress_test.rb +0 -4076
  174. data/test/integration/generated_secret_test.rb +0 -14
  175. data/test/integration/generated_utility_test.rb +0 -174
  176. data/test/integration/generated_warnlib_test.rb +0 -45
  177. data/test/integration/method_lookup_test.rb +0 -34
  178. data/test/introspection_test_helper.rb +0 -94
  179. data/test/lib/Makefile.am +0 -110
  180. data/test/lib/autogen.sh +0 -4
  181. data/test/lib/configure.ac +0 -34
  182. data/test/lib/m4/jhflags.m4 +0 -21
  183. data/test/minitest/stats_plugin.rb +0 -30
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- describe GLib::Variant do
6
- describe "#get_string" do
7
- it "returns just the contained string" do
8
- var = GLib::Variant.new_string("Foo")
9
- _(var.get_string).must_equal "Foo"
10
- end
11
- end
12
- end
@@ -1,76 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- require "ffi-gobject"
6
-
7
- GirFFI.setup :GIMarshallingTests
8
-
9
- describe GObject do
10
- describe ".type_init" do
11
- it "does not raise an error" do
12
- GObject.type_init
13
- pass
14
- end
15
- end
16
-
17
- it "has constants for the fundamental GTypes" do
18
- _(GObject::TYPE_INVALID).must_equal GObject.type_from_name("invalid")
19
- _(GObject.type_name(GObject::TYPE_INVALID)).must_be_nil
20
-
21
- _(GObject.type_name(GObject::TYPE_NONE)).must_equal "void"
22
- _(GObject.type_name(GObject::TYPE_INTERFACE)).must_equal "GInterface"
23
- _(GObject.type_name(GObject::TYPE_CHAR)).must_equal "gchar"
24
- _(GObject.type_name(GObject::TYPE_UCHAR)).must_equal "guchar"
25
- _(GObject.type_name(GObject::TYPE_BOOLEAN)).must_equal "gboolean"
26
- _(GObject.type_name(GObject::TYPE_INT)).must_equal "gint"
27
- _(GObject.type_name(GObject::TYPE_UINT)).must_equal "guint"
28
- _(GObject.type_name(GObject::TYPE_LONG)).must_equal "glong"
29
- _(GObject.type_name(GObject::TYPE_ULONG)).must_equal "gulong"
30
- _(GObject.type_name(GObject::TYPE_INT64)).must_equal "gint64"
31
- _(GObject.type_name(GObject::TYPE_UINT64)).must_equal "guint64"
32
- _(GObject.type_name(GObject::TYPE_ENUM)).must_equal "GEnum"
33
- _(GObject.type_name(GObject::TYPE_FLAGS)).must_equal "GFlags"
34
- _(GObject.type_name(GObject::TYPE_FLOAT)).must_equal "gfloat"
35
- _(GObject.type_name(GObject::TYPE_DOUBLE)).must_equal "gdouble"
36
- _(GObject.type_name(GObject::TYPE_STRING)).must_equal "gchararray"
37
- _(GObject.type_name(GObject::TYPE_POINTER)).must_equal "gpointer"
38
- _(GObject.type_name(GObject::TYPE_BOXED)).must_equal "GBoxed"
39
- _(GObject.type_name(GObject::TYPE_PARAM)).must_equal "GParam"
40
- _(GObject.type_name(GObject::TYPE_OBJECT)).must_equal "GObject"
41
- _(GObject.type_name(GObject::TYPE_GTYPE)).must_equal "GType"
42
- _(GObject.type_name(GObject::TYPE_VARIANT)).must_equal "GVariant"
43
-
44
- _(GObject.type_name(GObject::TYPE_ARRAY)).must_equal "GArray"
45
- _(GObject.type_name(GObject::TYPE_BYTE_ARRAY)).must_equal "GByteArray"
46
- _(GObject.type_name(GObject::TYPE_ERROR)).must_equal "GError"
47
- _(GObject.type_name(GObject::TYPE_HASH_TABLE)).must_equal "GHashTable"
48
- _(GObject.type_name(GObject::TYPE_STRV)).must_equal "GStrv"
49
- end
50
-
51
- describe "::object_class_from_instance" do
52
- it "returns a GObject::ObjectClass with the correct GType" do
53
- obj = GIMarshallingTests::OverridesObject.new
54
- object_class = GObject.object_class_from_instance obj
55
- gtype = object_class.g_type_class.g_type
56
-
57
- _(object_class).must_be_instance_of GObject::ObjectClass
58
- _(gtype).must_equal GIMarshallingTests::OverridesObject.gtype
59
- end
60
- end
61
-
62
- describe "creating ParamSpecs" do
63
- describe "#param_spec_int" do
64
- it "creates a GObject::ParamSpecInt" do
65
- spec = GObject.param_spec_int("foo", "foo bar",
66
- "The Foo Bar Property",
67
- 10, 20, 15,
68
- 3)
69
- _(spec).must_be_instance_of GObject::ParamSpecInt
70
- _(spec.struct[:minimum]).must_equal 10
71
- _(spec.struct[:maximum]).must_equal 20
72
- _(spec.get_default_value).must_equal 15
73
- end
74
- end
75
- end
76
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- require "ffi-gobject"
6
-
7
- describe GObject::ObjectClass do
8
- describe "#list_properties" do
9
- it "returns GIMarshallingTests::OverridesObject's properties" do
10
- obj = GIMarshallingTests::OverridesObject.new
11
- object_class = GObject.object_class_from_instance obj
12
-
13
- info = get_introspection_data "GIMarshallingTests", "OverridesObject"
14
- expected_props = info.properties.map(&:name)
15
- expected_props += info.parent.properties.map(&:name)
16
-
17
- props = object_class.list_properties
18
- prop_names = props.map(&:get_name)
19
-
20
- _(prop_names.sort).must_equal expected_props.sort
21
- end
22
- end
23
-
24
- describe "#gtype" do
25
- it "returns the correct GType" do
26
- obj = GIMarshallingTests::OverridesObject.new
27
- object_class = GObject.object_class_from_instance obj
28
- _(object_class.gtype).must_equal GIMarshallingTests::OverridesObject.gtype
29
- end
30
- end
31
- end
@@ -1,123 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- require "ffi-gobject"
6
- GirFFI.setup :GIMarshallingTests
7
-
8
- describe GObject::Object do
9
- describe ".new" do
10
- it "is overridden to take only one argument" do
11
- _(GObject::Object.new({})).must_be_instance_of GObject::Object
12
- end
13
-
14
- it "can be used to create objects with properties" do
15
- obj = GIMarshallingTests::SubObject.new(int: 13)
16
- _(obj.int).must_equal 13
17
- end
18
-
19
- it "allows omission of the first argument" do
20
- _(GObject::Object.new).must_be_instance_of GObject::Object
21
- end
22
-
23
- it "raises an error for properties that do not exist" do
24
- _(proc { GObject::Object.new(dog: "bark") }).must_raise GirFFI::PropertyNotFoundError
25
- end
26
- end
27
-
28
- describe "#get_property" do
29
- it "is overridden to have arity 1" do
30
- _(GObject::Object.instance_method("get_property").arity).must_equal 1
31
- end
32
-
33
- it "raises an error for a property that does not exist" do
34
- instance = GObject::Object.new
35
- _(proc { instance.get_property "foo-bar" }).must_raise GirFFI::PropertyNotFoundError
36
- end
37
-
38
- it "raises an error for a property that does not exist" do
39
- instance = GObject::Object.new
40
- _(proc { instance.get_property "foo-bar" })
41
- .must_raise GirFFI::PropertyNotFoundError
42
- end
43
- end
44
-
45
- describe "#get_property_extended" do
46
- it "raises an error for a property that does not exist" do
47
- instance = GObject::Object.new
48
- _(proc { instance.get_property_extended "foo-bar" })
49
- .must_raise GirFFI::PropertyNotFoundError
50
- end
51
- end
52
-
53
- describe "#set_property" do
54
- it "raises an error for a property that does not exist" do
55
- instance = GObject::Object.new
56
- _(proc { instance.set_property "foo-bar", 123 })
57
- .must_raise GirFFI::PropertyNotFoundError
58
- end
59
- end
60
-
61
- describe "#set_property_extended" do
62
- it "raises an error for a property that does not exist" do
63
- instance = GObject::Object.new
64
- _(proc { instance.set_property_extended "foo-bar", 123 })
65
- .must_raise GirFFI::PropertyNotFoundError
66
- end
67
- end
68
-
69
- describe "#signal_connect" do
70
- subject { GObject::Object.new }
71
-
72
- it "delegates to GObject" do
73
- expect(GObject).to receive(:signal_connect).with(subject, "some-event", nil)
74
- subject.signal_connect("some-event") do
75
- nothing
76
- end
77
- end
78
-
79
- it "delegates to GObject if an optional data argument is passed" do
80
- expect(GObject).to receive(:signal_connect).with(subject, "some-event", "data")
81
- subject.signal_connect("some-event", "data") do
82
- nothing
83
- end
84
- end
85
- end
86
-
87
- describe "#signal_connect_after" do
88
- subject { GObject::Object.new }
89
-
90
- it "delegates to GObject" do
91
- expect(GObject).to receive(:signal_connect_after).with(subject, "some-event", nil)
92
- subject.signal_connect_after("some-event") do
93
- nothing
94
- end
95
- end
96
-
97
- it "delegates to GObject if an optional data argument is passed" do
98
- expect(GObject).to receive(:signal_connect_after).with(subject, "some-event", "data")
99
- subject.signal_connect_after("some-event", "data") do
100
- nothing
101
- end
102
- end
103
- end
104
-
105
- describe "upon garbage collection" do
106
- it "lowers the reference count" do
107
- skip "cannot be reliably tested on JRuby" if jruby?
108
-
109
- ptr = GObject::Object.new.to_ptr
110
- _(object_ref_count(ptr)).must_equal 1
111
-
112
- GC.start
113
- # Creating a new object is sometimes needed to trigger enough garbage collection.
114
- GObject::Object.new
115
- sleep 1
116
-
117
- GC.start
118
- GC.start
119
-
120
- _(object_ref_count(ptr)).must_equal 0
121
- end
122
- end
123
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- require "ffi-gobject"
6
- describe GObject::ParamSpec do
7
- let(:pspec) do
8
- GObject.param_spec_int("foo-bar", "foo bar",
9
- "Foo Bar",
10
- 1, 3, 2,
11
- readable: true, writable: true)
12
- end
13
- let(:pspec_struct) { GObject::ParamSpec::Struct.new(pspec.to_ptr) }
14
-
15
- describe "#ref" do
16
- it "increases the ref count" do
17
- old = pspec_struct[:ref_count]
18
- pspec.ref
19
- _(pspec_struct[:ref_count]).must_equal old + 1
20
- end
21
- end
22
-
23
- describe "#accessor_name" do
24
- it "returns a safe ruby method name" do
25
- _(pspec.accessor_name).must_equal "foo_bar"
26
- end
27
- end
28
-
29
- it "cannot be instantiated directly" do
30
- _(proc { GObject::ParamSpec.new }).must_raise NoMethodError
31
- end
32
- end
@@ -1,390 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "gir_ffi_test_helper"
4
-
5
- GirFFI.setup :Regress
6
- GirFFI.setup :Gio
7
-
8
- describe GObject::Value do
9
- describe "::Struct" do
10
- describe "layout" do
11
- let(:layout) { GObject::Value::Struct.layout }
12
-
13
- it "consists of :g_type and :data" do
14
- _(layout.members).must_equal [:g_type, :data]
15
- end
16
-
17
- it "has an array as its second element" do
18
- types = layout.fields.map(&:type)
19
- _(types[1].class).must_equal FFI::Type::Array
20
- end
21
- end
22
- end
23
-
24
- describe ".for_gtype" do
25
- it "handles char" do
26
- gv = GObject::Value.for_gtype GObject::TYPE_CHAR
27
- _(gv.current_gtype).must_equal GObject::TYPE_CHAR
28
- end
29
-
30
- it "handles invalid type" do
31
- gv = GObject::Value.for_gtype GObject::TYPE_INVALID
32
- _(gv.current_gtype).must_equal GObject::TYPE_INVALID
33
- end
34
-
35
- it "handles void type" do
36
- gv = GObject::Value.for_gtype GObject::TYPE_NONE
37
- _(gv.current_gtype).must_equal GObject::TYPE_INVALID
38
- end
39
- end
40
-
41
- describe "::wrap_ruby_value" do
42
- it "wraps a boolean false" do
43
- gv = GObject::Value.wrap_ruby_value false
44
- assert_instance_of GObject::Value, gv
45
- _(gv.get_boolean).must_equal false
46
- end
47
-
48
- it "wraps a boolean true" do
49
- gv = GObject::Value.wrap_ruby_value true
50
- assert_instance_of GObject::Value, gv
51
- _(gv.get_boolean).must_equal true
52
- end
53
-
54
- it "wraps an Integer" do
55
- gv = GObject::Value.wrap_ruby_value 42
56
- _(gv.get_int).must_equal 42
57
- end
58
-
59
- it "wraps a String" do
60
- gv = GObject::Value.wrap_ruby_value "Some Random String"
61
- _(gv.get_string).must_equal "Some Random String"
62
- end
63
-
64
- it "wraps nil" do
65
- gv = GObject::Value.wrap_ruby_value nil
66
- assert_instance_of GObject::Value, gv
67
- _(gv.get_value).must_be_nil
68
- end
69
-
70
- it "wraps object values" do
71
- value = GObject::Object.new({})
72
- gv = GObject::Value.wrap_ruby_value value
73
- _(object_ref_count(value)).must_equal 2
74
- _(gv.get_value).must_equal value
75
- _(object_ref_count(value)).must_equal 3
76
- end
77
- end
78
-
79
- describe "#set_value" do
80
- it "handles signed char values" do
81
- value = -83
82
- gv = GObject::Value.for_gtype GObject::TYPE_CHAR
83
- gv.set_value value
84
- _(gv.get_schar).must_equal value
85
- end
86
-
87
- it "handles unsigned char values" do
88
- value = 174
89
- gv = GObject::Value.for_gtype GObject::TYPE_UCHAR
90
- gv.set_value value
91
- _(gv.get_uchar).must_equal value
92
- end
93
-
94
- it "handles enum values presented as symbols" do
95
- value = :value2
96
- gv = GObject::Value.for_gtype Regress::TestEnum.gtype
97
- gv.set_value value
98
- _(gv.get_value).must_equal value
99
- end
100
-
101
- it "handles enum values presented as numbers" do
102
- value = :value2
103
- gv = GObject::Value.for_gtype Regress::TestEnum.gtype
104
- gv.set_value Regress::TestEnum[value]
105
- _(gv.get_value).must_equal value
106
- end
107
-
108
- it "handles flag values presented as hashes" do
109
- value = { flag2: true }
110
- gv = GObject::Value.for_gtype Regress::TestFlags.gtype
111
- gv.set_value value
112
- _(gv.get_value).must_equal value
113
- end
114
-
115
- it "handles flag values presented as symbols" do
116
- gv = GObject::Value.for_gtype Regress::TestFlags.gtype
117
- gv.set_value :flag2
118
- _(gv.get_value).must_equal(flag2: true)
119
- end
120
-
121
- it "handles flag values presented as numbers" do
122
- value = { flag2: true }
123
- gv = GObject::Value.for_gtype Regress::TestFlags.gtype
124
- gv.set_value Regress::TestFlags.to_native(value, nil)
125
- _(gv.get_value).must_equal value
126
- end
127
-
128
- it "handles GType values" do
129
- value = GObject::TYPE_STRING
130
- gv = GObject::Value.for_gtype GObject::TYPE_GTYPE
131
- gv.set_value value
132
- _(gv.get_gtype).must_equal value
133
- end
134
-
135
- it "handles int64 values" do
136
- value = 0x1234_5678_9012_3456
137
- gv = GObject::Value.for_gtype GObject::TYPE_INT64
138
- gv.set_value value
139
- _(gv.get_int64).must_equal value
140
- end
141
-
142
- it "handles long values" do
143
- value = FFI.type_size(:long) == 8 ? 0x1234_5678_9012_3456 : 0x1234_5678
144
- gv = GObject::Value.for_gtype GObject::TYPE_LONG
145
- gv.set_value value
146
- _(gv.get_long).must_equal value
147
- end
148
-
149
- it "handles uchar values" do
150
- value = 83
151
- gv = GObject::Value.for_gtype GObject::TYPE_UCHAR
152
- gv.set_value value
153
- _(gv.get_uchar).must_equal value
154
- end
155
-
156
- it "handles uint values" do
157
- value = 0x1234_5678
158
- gv = GObject::Value.for_gtype GObject::TYPE_UINT
159
- gv.set_value value
160
- _(gv.get_uint).must_equal value
161
- end
162
-
163
- it "handles uint64 values" do
164
- value = 0x1234_5678_9012_3456
165
- gv = GObject::Value.for_gtype GObject::TYPE_UINT64
166
- gv.set_value value
167
- _(gv.get_uint64).must_equal value
168
- end
169
-
170
- it "handles ulong values" do
171
- value = FFI.type_size(:long) == 8 ? 0x1234_5678_9012_3456 : 0x1234_5678
172
- gv = GObject::Value.for_gtype GObject::TYPE_ULONG
173
- gv.set_value value
174
- _(gv.get_ulong).must_equal value
175
- end
176
-
177
- it "handles variant values" do
178
- value = GLib::Variant.new_string("Foo")
179
- gv = GObject::Value.for_gtype GObject::TYPE_VARIANT
180
- gv.set_value value
181
- _(gv.get_variant).must_equal value
182
- end
183
-
184
- it "handles object values" do
185
- value = GObject::Object.new({})
186
- gv = GObject::Value.for_gtype GObject::Object.gtype
187
- gv.set_value value
188
- _(gv.get_object).must_equal value
189
- end
190
-
191
- it "handles interface values" do
192
- value = Gio.file_new_for_path("/")
193
- gv = GObject::Value.for_gtype Gio::File.gtype
194
- gv.set_value value
195
- _(gv.get_object).must_equal value
196
- end
197
- end
198
-
199
- describe "#get_value" do
200
- it "unwraps a boolean false" do
201
- gv = GObject::Value.wrap_ruby_value false
202
- result = gv.get_value
203
- _(result).must_equal false
204
- end
205
-
206
- it "unwraps a boolean true" do
207
- gv = GObject::Value.wrap_ruby_value true
208
- result = gv.get_value
209
- _(result).must_equal true
210
- end
211
-
212
- it "unwraps a signed char" do
213
- value = -42
214
- gv = GObject::Value.for_gtype GObject::TYPE_CHAR
215
- gv.set_schar value
216
- _(gv.get_value).must_equal value
217
- end
218
-
219
- it "unwraps an unsigned char" do
220
- value = 173
221
- gv = GObject::Value.for_gtype GObject::TYPE_UCHAR
222
- gv.set_uchar value
223
- _(gv.get_value).must_equal value
224
- end
225
-
226
- it "unwraps an enum value" do
227
- value = :value2
228
- gv = GObject::Value.for_gtype Regress::TestEnum.gtype
229
- gv.set_enum Regress::TestEnum[value]
230
- _(gv.get_value).must_equal value
231
- end
232
-
233
- it "unwraps a flags value" do
234
- value = { flag1: true, flag3: true }
235
- gv = GObject::Value.for_gtype Regress::TestFlags.gtype
236
- gv.set_flags Regress::TestFlags.to_native(value, nil)
237
- _(gv.get_value).must_equal value
238
- end
239
-
240
- it "unwraps a GType" do
241
- value = GObject::TYPE_STRING
242
- gv = GObject::Value.for_gtype GObject::TYPE_GTYPE
243
- gv.set_gtype value
244
- _(gv.get_value).must_equal value
245
- end
246
-
247
- it "unwraps an int64" do
248
- value = 0x1234_5678_9012_3456
249
- gv = GObject::Value.for_gtype GObject::TYPE_INT64
250
- gv.set_int64 value
251
- _(gv.get_value).must_equal value
252
- end
253
-
254
- it "unwraps a long" do
255
- value = FFI.type_size(:long) == 8 ? 0x1234_5678_9012_3456 : 0x1234_5678
256
- gv = GObject::Value.for_gtype GObject::TYPE_LONG
257
- gv.set_long value
258
- _(gv.get_value).must_equal value
259
- end
260
-
261
- it "unwraps an uchar" do
262
- value = 3
263
- gv = GObject::Value.for_gtype GObject::TYPE_UCHAR
264
- gv.set_uchar value
265
- _(gv.get_value).must_equal value
266
- end
267
-
268
- it "unwraps an uint" do
269
- value = 0x1234_5678
270
- gv = GObject::Value.for_gtype GObject::TYPE_UINT
271
- gv.set_uint value
272
- _(gv.get_value).must_equal value
273
- end
274
-
275
- it "unwraps an uint64" do
276
- value = 0x1234_5678_9012_3456
277
- gv = GObject::Value.for_gtype GObject::TYPE_UINT64
278
- gv.set_uint64 value
279
- _(gv.get_value).must_equal value
280
- end
281
-
282
- it "unwraps an ulong" do
283
- value = FFI.type_size(:long) == 8 ? 0x1234_5678_9012_3456 : 0x1234_5678
284
- gv = GObject::Value.for_gtype GObject::TYPE_ULONG
285
- gv.set_ulong value
286
- _(gv.get_value).must_equal value
287
- end
288
-
289
- it "unwraps a variant" do
290
- value = GLib::Variant.new_string("Foo")
291
- gv = GObject::Value.for_gtype GObject::TYPE_VARIANT
292
- gv.set_variant value
293
- _(gv.get_value).must_equal value
294
- end
295
-
296
- it "works with a ByteArray" do
297
- ba = GLib::ByteArray.new.append("some bytes")
298
- v = GObject::Value.for_gtype GObject::TYPE_BYTE_ARRAY
299
- v.set_boxed ba
300
-
301
- result = v.get_value
302
-
303
- _(result.to_string).must_equal "some bytes"
304
- _(result).must_be_kind_of GLib::ByteArray
305
- end
306
-
307
- it "works with an Array" do
308
- arr = GLib::Array.from(:uint, [1, 2, 3])
309
- v = GObject::Value.for_gtype GObject::TYPE_ARRAY
310
- v.set_boxed arr
311
-
312
- result = v.get_value
313
-
314
- _(result).must_be_kind_of GLib::Array
315
- _(result.reset_typespec(:uint).to_a).must_equal [1, 2, 3]
316
- end
317
-
318
- it "unwraps a Strv" do
319
- strv = GLib::Strv.from %w(foo bar)
320
- val = GObject::Value.for_gtype GObject::TYPE_STRV
321
- val.set_boxed strv
322
-
323
- result = val.get_value
324
-
325
- _(result).must_be_kind_of GLib::Strv
326
- _(result.to_a).must_equal %w(foo bar)
327
- end
328
- end
329
-
330
- describe "::from" do
331
- it "creates a gint GValue from a Ruby Integer" do
332
- gv = GObject::Value.from 21
333
- _(gv.current_gtype_name).must_equal "gint"
334
- _(gv.get_value).must_equal 21
335
- end
336
-
337
- it "returns its argument if given a GValue" do
338
- gv = GObject::Value.from 21
339
- gv2 = GObject::Value.from gv
340
- _(gv2.current_gtype_name).must_equal "gint"
341
- _(gv2.get_value).must_equal 21
342
- end
343
-
344
- it "creates a null GValue from a Ruby nil" do
345
- gv = GObject::Value.from nil
346
- _(gv.current_gtype).must_equal GObject::TYPE_INVALID
347
- _(gv.get_value).must_be_nil
348
- end
349
- end
350
-
351
- describe "#set_value" do
352
- before do
353
- GirFFI.setup :GIMarshallingTests
354
- end
355
-
356
- it "raises an error when setting an incompatible object type" do
357
- o = GIMarshallingTests::Object.new 1
358
- v = GObject::Value.new.init(GIMarshallingTests::OverridesObject.gtype)
359
- _(proc { v.set_value o }).must_raise ArgumentError
360
- end
361
-
362
- it "works with a ByteArray" do
363
- ba = GLib::ByteArray.new.append("some bytes")
364
- v = GObject::Value.new.init(GObject.type_from_name("GByteArray"))
365
- v.set_value ba
366
- _(v.get_value.to_string).must_equal "some bytes"
367
- end
368
- end
369
-
370
- describe "upon garbage collection" do
371
- it "restores the underlying GValue to its pristine state" do
372
- skip "cannot be reliably tested on JRuby" if jruby?
373
-
374
- value = GObject::Value.from 42
375
-
376
- # Drop reference to original GObject::Value
377
- value = GObject::Value.wrap value.to_ptr
378
- _(value.current_gtype_name).must_equal "gint"
379
-
380
- GC.start
381
- # Creating a new object is sometimes needed to trigger enough garbage collection.
382
- GObject::Value.new
383
- sleep 1
384
- GC.start
385
- GC.start
386
-
387
- _(value.current_gtype_name).wont_equal "gint"
388
- end
389
- end
390
- end